Jelajahi Sumber

Merge branch 'iteration-tenant-album' into jenkins

lex 1 tahun lalu
induk
melakukan
90b5b09a0c

+ 5 - 1
src/components/col-header/index.tsx

@@ -49,6 +49,10 @@ export default defineComponent({
       // 头部高度设置后返回
       type: Function,
       default: () => {}
+    },
+    hideHeader: {
+      type: Boolean,
+      default: true
     }
   },
   watch: {
@@ -130,7 +134,7 @@ export default defineComponent({
   },
   render() {
     // 只有app里面才显示头部
-    return browser().isApp ? (
+    return browser().isApp || !this.hideHeader ? (
       <div>
         {this.$slots.content ? (
           <div

TEMPAT SAMPAH
src/tenant/layout/images/bottom_bg.png


TEMPAT SAMPAH
src/tenant/layout/images/top_bg.png


+ 4 - 3
src/tenant/layout/login.tsx

@@ -35,13 +35,14 @@ export default defineComponent({
     }
   },
   mounted() {
-    if (this.$route.query.returnUrl === '/train-tool') {
+    if (
+      this.$route.query.returnUrl === '/train-tool' &&
+      this.$route.query.taId
+    ) {
       this.isTrainGroup = true
     }
     removeAuth()
     this.directNext()
-
-    console.log(this.$route.query)
   },
   methods: {
     directNext() {

+ 34 - 28
src/tenant/music/music-detail/new-index.tsx

@@ -130,7 +130,10 @@ export default defineComponent({
       try {
         const res = await request.get(`/music/sheet/detail/${route.query.id}`, {
           prefix:
-            state.platformType === 'TEACHER' ? '/api-teacher' : '/api-student'
+            state.platformType === 'TEACHER' ? '/api-teacher' : '/api-student',
+          params: {
+            tenantAlbumId: route.query.tenantAlbumId || null
+          }
         })
         musicDetail.value = res.data
         // 取原音,如果有多个则默认第一个
@@ -504,6 +507,7 @@ export default defineComponent({
     const buyState = computed(() => {
       const music = musicDetail.value
       return {
+        hasTenantAlbum: route.query?.tenantAlbumId ? true : false, // 是否从专辑来的
         play: music.play ? true : false, // 是否可以播放
         free: music?.paymentType.includes('FREE'),
         charge: music?.paymentType.includes('CHARGE'),
@@ -515,7 +519,6 @@ export default defineComponent({
     const shareStatus = ref(false)
     const shareUrl = ref('')
     const shareDiscount = ref(0)
-    // console.log(data)
     const onShare = async () => {
       try {
         const res = await request.post('/api-teacher/open/musicShareProfit', {
@@ -750,32 +753,35 @@ export default defineComponent({
               <span>{musicDetail.value?.favoriteCount}</span>
             </div>
           </div>
-          {musicDetail.value?.id && !buyState.value.play && (
-            <div class={styles.albumTips}>
-              {buyState.value.charge && buyState.value.vip ? (
-                <>
-                  <span>开通会员或点播单曲,即可自由练习该曲谱</span>
-                  <span class={styles.albumPrice}>
-                    ¥{moneyFormat(musicDetail.value?.musicPrice)}
-                  </span>
-                </>
-              ) : buyState.value.vip ? (
-                <span>
-                  <img src={iconMemberSmall} class={styles.iconMemberSmall} />
-                  此曲谱为会员专享,开通会员即可自由练习该曲谱
-                </span>
-              ) : buyState.value.charge ? (
-                <>
-                  <span>此曲谱为点播曲谱,点播即可自由练习该曲谱</span>
-                  <span class={styles.albumPrice}>
-                    ¥{moneyFormat(musicDetail.value?.musicPrice)}
+          {/* {buyState.value.hasTenantAlbum ? 'true' : 'false'} */}
+          {musicDetail.value?.id &&
+            !buyState.value.play &&
+            !buyState.value.hasTenantAlbum && (
+              <div class={styles.albumTips}>
+                {buyState.value.charge && buyState.value.vip ? (
+                  <>
+                    <span>开通会员或点播单曲,即可自由练习该曲谱</span>
+                    <span class={styles.albumPrice}>
+                      ¥{moneyFormat(musicDetail.value?.musicPrice)}
+                    </span>
+                  </>
+                ) : buyState.value.vip ? (
+                  <span>
+                    <img src={iconMemberSmall} class={styles.iconMemberSmall} />
+                    此曲谱为会员专享,开通会员即可自由练习该曲谱
                   </span>
-                </>
-              ) : (
-                ''
-              )}
-            </div>
-          )}
+                ) : buyState.value.charge ? (
+                  <>
+                    <span>此曲谱为点播曲谱,点播即可自由练习该曲谱</span>
+                    <span class={styles.albumPrice}>
+                      ¥{moneyFormat(musicDetail.value?.musicPrice)}
+                    </span>
+                  </>
+                ) : (
+                  ''
+                )}
+              </div>
+            )}
         </div>
 
         <div class={styles.musicContent}>
@@ -855,7 +861,7 @@ export default defineComponent({
           )}
         </div>
 
-        {musicDetail.value?.id && (
+        {musicDetail.value?.id && !buyState.value.hasTenantAlbum && (
           <TheSticky position="bottom">
             <div style={{ backgroundColor: '#fff' }}>
               <div class={styles.videoOperation}>

+ 2 - 1
src/tenant/music/train-list/index.module.less

@@ -91,8 +91,9 @@
   .albumLogo {
     width: 48px;
     height: 48px;
-    border-radius: 12px;
+    border-radius: 8px;
     margin-right: 10px;
+    overflow: hidden;
   }
 
   .albumContent {

+ 106 - 49
src/tenant/music/train-list/index.tsx

@@ -16,12 +16,13 @@ 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 { openDefaultWebView, state as baseState, state } from '@/state'
 import { SubjectEnum, useSubjectId } from '@/helpers/hooks'
 import Song from '../component/song'
 import ColHeader from '@/components/col-header'
 import bgImg from '../../images/bg-image.png'
 import TheSticky from '@/components/the-sticky'
+import dayjs from 'dayjs'
 
 const noop = () => {
   //
@@ -59,6 +60,8 @@ export default defineComponent({
       subjectType: subjectType,
       page: 1,
       subjectId: null,
+      albumId: null,
+      albumName: '',
       level: '',
       type: '',
       title: title
@@ -69,6 +72,7 @@ export default defineComponent({
     const isError = ref(false)
     const searchObj = ref<any>({})
     const searchRef = ref()
+    const albumRecord = ref<any>([])
 
     const apiSuffix = ref(
       baseState.platformType === 'STUDENT' ? '/api-student' : '/api-teacher'
@@ -123,13 +127,55 @@ export default defineComponent({
       searchObj.value = data || {}
     }
 
+    const getAlbumRecordPage = async () => {
+      isError.value = false
+      try {
+        const { data } = await request.post('/userTenantAlbumRecord/list', {
+          prefix:
+            state.platformType === 'TEACHER' ? '/api-teacher' : '/api-student',
+          data: {
+            page: 1,
+            rows: 999
+          }
+        })
+        albumRecord.value = data || []
+        if (albumRecord.value.length > 0) {
+          const albumCatchType = localStorage.getItem(
+            'albumCatch' + subjectType
+          )
+          if (albumCatchType) {
+            const item = albumRecord.value.find(
+              (item: any) => item.tenantAlbumId == albumCatchType
+            )
+            if (item) {
+              params.albumId = item.tenantAlbumId
+              params.albumName = item.tenantAlbumName
+            } else {
+              params.albumId = albumRecord.value[0].tenantAlbumId
+              params.albumName = albumRecord.value[0].tenantAlbumName
+            }
+          } else {
+            params.albumId = albumRecord.value[0].tenantAlbumId
+            params.albumName = albumRecord.value[0].tenantAlbumName
+          }
+        }
+      } catch (error) {
+        isError.value = true
+      }
+    }
+
     onMounted(async () => {
       // SUBJECT: '声部练习',
       // MUSIC: '独奏曲目',
       // ENSEMBLE: '合奏练习'
       loading.value = true
       await getSelectCondition()
-      await FetchList()
+      await getAlbumRecordPage()
+      if (params.albumId) {
+        await FetchList()
+      } else {
+        loading.value = false
+      }
     })
 
     return () => {
@@ -138,6 +184,7 @@ export default defineComponent({
           <div class={styles.sticky}>
             <TheSticky>
               <ColHeader
+                hideHeader={false}
                 background="transparent"
                 isFixed={false}
                 border={false}
@@ -145,54 +192,63 @@ export default defineComponent({
                 color="#131415"
               >
                 {{
-                  right: () => (
-                    <DropdownMenu class={styles.albumSearchSection}>
-                      <DropdownItem
-                        titleClass={styles.albumSearchTitle}
-                        title="宫崎骏合集 | 一起感受宫崎骏的"
-                      >
-                        <div
-                          class={styles.albumSearchResult}
-                          style={{ maxHeight: '45vh', overflowY: 'auto' }}
+                  right: () =>
+                    albumRecord.value.length > 1 &&
+                    params.albumId && (
+                      <DropdownMenu class={styles.albumSearchSection}>
+                        <DropdownItem
+                          titleClass={styles.albumSearchTitle}
+                          title={params.albumName}
                         >
-                          <Cell
-                            class={[
-                              styles.albumSearchCell,
-                              styles.albumSearchCellActive
-                            ]}
-                            center
+                          <div
+                            class={styles.albumSearchResult}
+                            style={{ maxHeight: '45vh', overflowY: 'auto' }}
                           >
-                            {{
-                              icon: () => <Image class={styles.albumLogo} />,
-                              title: () => (
-                                <div class={styles.albumContent}>
-                                  <h2>宫崎骏合集 | 一起感受宫崎骏的夏…</h2>
-                                  <p>到期时间:2025-03-14</p>
-                                </div>
-                              ),
-                              'right-icon': () => (
-                                <div class={styles.iconSelect}></div>
-                              )
-                            }}
-                          </Cell>
-                          <Cell class={styles.albumSearchCell} center>
-                            {{
-                              icon: () => <Image class={styles.albumLogo} />,
-                              title: () => (
-                                <div class={styles.albumContent}>
-                                  <h2>宫崎骏合集 | 一起感受宫崎骏的夏…</h2>
-                                  <p>到期时间:2025-03-14</p>
-                                </div>
-                              ),
-                              'right-icon': () => (
-                                <div class={styles.iconSelect}></div>
-                              )
-                            }}
-                          </Cell>
-                        </div>
-                      </DropdownItem>
-                    </DropdownMenu>
-                  )
+                            {albumRecord.value.map((item: any) => (
+                              <Cell
+                                class={[
+                                  styles.albumSearchCell,
+                                  item.tenantAlbumId === params.albumId &&
+                                    styles.albumSearchCellActive
+                                ]}
+                                center
+                                onClick={() => {
+                                  localStorage.setItem(
+                                    'albumCatch' + subjectType,
+                                    item.tenantAlbumId
+                                  )
+                                  params.albumId = item.tenantAlbumId
+                                  params.albumName = item.tenantAlbumName
+                                }}
+                              >
+                                {{
+                                  icon: () => (
+                                    <Image
+                                      src={item.tenantAlbumCoverImg}
+                                      class={styles.albumLogo}
+                                    />
+                                  ),
+                                  title: () => (
+                                    <div class={styles.albumContent}>
+                                      <h2>{item.tenantAlbumName}</h2>
+                                      <p>
+                                        到期时间:
+                                        {dayjs(item.endTime).format(
+                                          'YYYY-MM-DD'
+                                        )}
+                                      </p>
+                                    </div>
+                                  ),
+                                  'right-icon': () => (
+                                    <div class={styles.iconSelect}></div>
+                                  )
+                                }}
+                              </Cell>
+                            ))}
+                          </div>
+                        </DropdownItem>
+                      </DropdownMenu>
+                    )
                 }}
               </ColHeader>
               <Search
@@ -380,7 +436,8 @@ export default defineComponent({
                       path: '/music-detail',
                       query: {
                         subjectType,
-                        id: item.id
+                        id: item.id,
+                        tenantAlbumId: item.tenantAlbumId
                       }
                     })
                   }}

+ 233 - 183
src/tenant/music/train-tool/index.tsx

@@ -62,7 +62,7 @@ export default defineComponent({
       ablumStatus: false,
       heightV: 0,
       hasBuyStatus: true, // 是否能继续购买
-      albumList: [] // 专辑列表
+      albumList: [] as any // 专辑列表
     })
     const params = reactive({
       page: 1,
@@ -84,17 +84,27 @@ export default defineComponent({
     const getDetails = async () => {
       try {
         // tenantGroupAlbum/buyAlbumInfo
-        const url =
-          apiSuffix.value +
-          '/tenantGroupAlbum/buyAlbumInfo?tenantGroupAlbumId=' +
-          (route.query.taId || '')
-        // if (state.albumId) {
-        //   url = url + '?albumId=' + state.albumId
-        // }
-        const { data } = await request.get(url)
-        state.albumList = data || []
-        if (state.albumList.length > 0) {
-          state.details = state.albumList[0]
+        if (state.albumId) {
+          let url = apiSuffix.value + '/userTenantAlbumRecord/detail'
+          if (state.albumId) {
+            url = url + '?albumId=' + state.albumId
+          }
+          const { data } = await request.post(url)
+          state.albumList = [data || {}]
+          state.details = data || {}
+        } else {
+          const url =
+            apiSuffix.value +
+            '/tenantGroupAlbum/buyAlbumInfo?tenantGroupAlbumId=' +
+            (route.query.taId || '')
+          // if (state.albumId) {
+          //   url = url + '?albumId=' + state.albumId
+          // }
+          const { data } = await request.get(url)
+          state.albumList = data || []
+          if (state.albumList.length > 0) {
+            state.details = state.albumList[0]
+          }
         }
 
         // state.tenantAlbumStatus = data.tenantAlbumStatus
@@ -293,204 +303,244 @@ export default defineComponent({
 
     return () => (
       <div class={styles.trainTool}>
-        {!route.query.taId && (
-          <TheSticky
-            position="top"
-            onBarHeight={(height: any) => {
-              state.heightV = height
-            }}
-          >
-            <ColHeader
-              background={background.value}
-              border={false}
-              isFixed={false}
-              color={color.value}
-              backIconColor="white"
-            />
-          </TheSticky>
-        )}
-        {/* <img class={styles.bgImg} src={state.details?.coverImg} /> */}
-        <div class={styles.musicContent}></div>
-        <div class={styles.bg}>
-          <div class={styles.alumWrap}>
-            {isSingleAlbum.value ? (
-              <div class={styles.singleAlbum}>
-                <div class={styles.img}>
-                  {state.details?.buyTimesFlag && (
-                    <span class={styles.quota}>
-                      限购:{state.details?.buyedTimes}/{state.details?.buyTimes}
-                      次
-                    </span>
-                  )}
-                  <Image
-                    class={styles.image}
-                    width="100%"
-                    height="100%"
-                    fit="cover"
-                    src={state.details?.coverImg || iconAlbumCover}
-                    errorIcon={iconAlbumCover}
-                  />
-                  <div class={styles.iconPian}></div>
-                </div>
-              </div>
-            ) : (
-              <Swiper
-                watchSlidesProgress={true}
-                slidesPerView={'auto'}
-                centeredSlides={true}
-                modules={[Pagination]}
-                pagination={{ clickable: true }}
-                onSlideChange={(swiper: any) => {
-                  state.details = state.albumList[swiper.activeIndex]
+        {!state.loading && !state.details.id && state.buy != '1' ? (
+          <>
+            <TheSticky
+              position="top"
+              onBarHeight={(height: any) => {
+                console.log(height, 'height', height)
+                state.heightV = height
+              }}
+            >
+              <ColHeader border={false} isFixed={false} />
+            </TheSticky>
+            {!state.loading && (
+              <div
+                style={{
+                  height: 'calc(100vh - var(--header-height))',
+                  display: 'flex',
+                  alignItems: 'center'
                 }}
-                onTransitionEnd={() => {
-                  params.page = 1
-                  state.list = []
-                  FetchList()
+              >
+                <ColResult
+                  tips="暂无专辑"
+                  classImgSize="SMALL"
+                  btnStatus={false}
+                />
+              </div>
+            )}
+          </>
+        ) : (
+          <>
+            {!route.query.taId && (
+              <TheSticky
+                position="top"
+                onBarHeight={(height: any) => {
+                  state.heightV = height
                 }}
               >
-                {state.albumList.map((album: any) => (
-                  <SwiperSlide>
+                <ColHeader
+                  background={background.value}
+                  border={false}
+                  isFixed={false}
+                  color={color.value}
+                  backIconColor="white"
+                />
+              </TheSticky>
+            )}
+            {/* <img class={styles.bgImg} src={state.details?.coverImg} /> */}
+            <div class={styles.musicContent}></div>
+            <div class={styles.bg}>
+              <div class={styles.alumWrap}>
+                {isSingleAlbum.value ? (
+                  <div class={styles.singleAlbum}>
                     <div class={styles.img}>
-                      {album.buyTimesFlag && (
+                      {state.details?.buyTimesFlag && (
                         <span class={styles.quota}>
-                          限购:{album.buyedTimes}/{album.buyTimes}次
+                          限购:{state.details?.buyedTimes}/
+                          {state.details?.buyTimes}次
                         </span>
                       )}
-
                       <Image
                         class={styles.image}
                         width="100%"
                         height="100%"
                         fit="cover"
-                        src={album?.coverImg || iconAlbumCover}
+                        src={state.details?.coverImg || iconAlbumCover}
                         errorIcon={iconAlbumCover}
                       />
                       <div class={styles.iconPian}></div>
                     </div>
-                  </SwiperSlide>
-                ))}
-              </Swiper>
-            )}
+                  </div>
+                ) : (
+                  <Swiper
+                    watchSlidesProgress={true}
+                    slidesPerView={'auto'}
+                    centeredSlides={true}
+                    modules={[Pagination]}
+                    pagination={{ clickable: true }}
+                    onSlideChange={(swiper: any) => {
+                      state.details = state.albumList[swiper.activeIndex]
+                    }}
+                    onTransitionEnd={() => {
+                      params.page = 1
+                      state.list = []
+                      FetchList()
+                    }}
+                  >
+                    {state.albumList.map((album: any) => (
+                      <SwiperSlide>
+                        <div class={styles.img}>
+                          {album.buyTimesFlag && (
+                            <span class={styles.quota}>
+                              限购:{album.buyedTimes}/{album.buyTimes}次
+                            </span>
+                          )}
 
-            <div class={styles.alumDes}>
-              <div class={[styles.alumTitle, 'van-ellipsis']}>
-                {state.details?.name}
-              </div>
-              <div
-                class={[styles.des, 'van-multi-ellipsis--l2']}
-                style={{
-                  height: '32px',
-                  lineHeight: '16px'
-                }}
-              >
-                {state.details?.describe}
-              </div>
-            </div>
+                          <Image
+                            class={styles.image}
+                            width="100%"
+                            height="100%"
+                            fit="cover"
+                            src={album?.coverImg || iconAlbumCover}
+                            errorIcon={iconAlbumCover}
+                          />
+                          <div class={styles.iconPian}></div>
+                        </div>
+                      </SwiperSlide>
+                    ))}
+                  </Swiper>
+                )}
 
-            {state.buy != '1' && (
-              <div class={styles.albumPriceGroup}>
-                <div class={styles.albumTimer}>
-                  <img src={iconTimer} class={styles.iconTimer} />
-                  <span>有效期:{state.details?.purchaseNum || 0}天</span>
+                <div class={styles.alumDes}>
+                  <div class={[styles.alumTitle, 'van-ellipsis']}>
+                    {state.details?.name}
+                  </div>
+                  <div
+                    class={[styles.des, 'van-multi-ellipsis--l2']}
+                    style={{
+                      height: '32px',
+                      lineHeight: '16px'
+                    }}
+                  >
+                    {state.details?.describe}
+                  </div>
                 </div>
-                <div class={styles.albumPriceList}>
-                  {(state.details?.originalPrice || 0) >
-                    (state.details?.actualPrice || 0) && (
-                    <span class={styles.originPrice}>
-                      原价:¥{moneyFormat(state.details?.originalPrice || 0)}
-                    </span>
-                  )}
 
-                  <span class={styles.currentPrice}>
-                    <span>¥{moneyFormat(state.details?.actualPrice || 0)}</span>
-                  </span>
-                </div>
+                {state.buy != '1' && baseState.platformType === 'STUDENT' && (
+                  <div class={styles.albumPriceGroup}>
+                    <div class={styles.albumTimer}>
+                      <img src={iconTimer} class={styles.iconTimer} />
+                      <span>有效期:{state.details?.purchaseNum || 0}天</span>
+                    </div>
+                    <div class={styles.albumPriceList}>
+                      {(state.details?.originalPrice || 0) >
+                        (state.details?.actualPrice || 0) && (
+                        <span class={styles.originPrice}>
+                          原价:¥
+                          {moneyFormat(state.details?.originalPrice || 0)}
+                        </span>
+                      )}
+
+                      <span class={styles.currentPrice}>
+                        <span>
+                          ¥{moneyFormat(state.details?.actualPrice || 0)}
+                        </span>
+                      </span>
+                    </div>
+                  </div>
+                )}
               </div>
-            )}
-          </div>
-        </div>
+            </div>
 
-        <div class={styles.musicList}>
-          <Sticky position="top" offsetTop={state.heightV}>
-            <Tabs
-              color="var(--van-primary)"
-              background="transparent"
-              lineWidth={20}
-              shrink
-              v-model:active={state.activeTab}
-              onChange={val => {
-                state.activeTab = val
+            <div class={styles.musicList}>
+              <Sticky position="top" offsetTop={state.heightV}>
+                <Tabs
+                  color="var(--van-primary)"
+                  background="transparent"
+                  lineWidth={20}
+                  shrink
+                  v-model:active={state.activeTab}
+                  onChange={val => {
+                    state.activeTab = val
 
-                params.page = 1
-                state.list = []
-                FetchList()
-              }}
-            >
-              {state.subjectCounts && (
-                <Tab title="声部练习" name="SUBJECT"></Tab>
-              )}
-              {state.musicCounts && <Tab title="独奏曲目" name="MUSIC"></Tab>}
-              {state.ensembleCounts && (
-                <Tab title="合奏练习" name="ENSEMBLE"></Tab>
-              )}
-            </Tabs>
-          </Sticky>
+                    params.page = 1
+                    state.list = []
+                    FetchList()
+                  }}
+                >
+                  {state.subjectCounts && (
+                    <Tab title="声部练习" name="SUBJECT"></Tab>
+                  )}
+                  {state.musicCounts && (
+                    <Tab title="独奏曲目" name="MUSIC"></Tab>
+                  )}
+                  {state.ensembleCounts && (
+                    <Tab title="合奏练习" name="ENSEMBLE"></Tab>
+                  )}
+                </Tabs>
+              </Sticky>
 
-          <div class={styles.alumnList}>
-            <List
-              loading={state.loading}
-              finished={state.finished}
-              finished-text={' '}
-              onLoad={FetchList}
-              immediateCheck={false}
-              error={state.isError}
-            >
-              {state.list && state.list.length ? (
-                <Song
-                  showNumber
-                  list={state.list}
-                  onDetail={(item: any) => {
-                    sessionStorage.setItem(
-                      'tool-subject-type',
-                      state.activeTab as any
+              <div class={styles.alumnList}>
+                <List
+                  loading={state.loading}
+                  finished={state.finished}
+                  finished-text={' '}
+                  onLoad={FetchList}
+                  immediateCheck={false}
+                  error={state.isError}
+                >
+                  {state.list && state.list.length ? (
+                    <Song
+                      showNumber
+                      list={state.list}
+                      onDetail={(item: any) => {
+                        sessionStorage.setItem(
+                          'tool-subject-type',
+                          state.activeTab as any
+                        )
+                        router.push({
+                          path: '/music-detail',
+                          query: {
+                            id: item.id,
+                            tenantAlbumId: item.tenantAlbumId
+                            // albumId: route.params.id
+                          }
+                        })
+                      }}
+                    />
+                  ) : (
+                    !state.loading && (
+                      <ColResult
+                        tips="暂无曲目"
+                        classImgSize="SMALL"
+                        btnStatus={false}
+                      />
                     )
-                    router.push({
-                      path: '/music-detail',
-                      query: {
-                        id: item.id
-                        // albumId: route.params.id
-                      }
-                    })
-                  }}
-                />
-              ) : (
-                !state.loading && (
-                  <ColResult
-                    tips="暂无曲目"
-                    classImgSize="SMALL"
-                    btnStatus={false}
-                  />
-                )
-              )}
-            </List>
-          </div>
-        </div>
-        {baseState.platformType === 'STUDENT' && state.buy != '1' && (
-          <TheSticky position="bottom">
-            <div class={styles.btnGroup}>
-              <Button
-                round
-                block
-                disabled={state.details?.musicNum <= 0 && !state.hasBuyStatus}
-                color="linear-gradient(270deg, #FF204B 0%, #FE5B71 100%)"
-                onClick={onSubmit}
-              >
-                购买教程
-              </Button>
+                  )}
+                </List>
+              </div>
             </div>
-          </TheSticky>
+            {baseState.platformType === 'STUDENT' && state.buy != '1' && (
+              <TheSticky position="bottom">
+                <div class={styles.btnGroup}>
+                  <Button
+                    round
+                    block
+                    disabled={
+                      state.details?.musicNum <= 0 && !state.hasBuyStatus
+                    }
+                    color="linear-gradient(270deg, #FF204B 0%, #FE5B71 100%)"
+                    onClick={onSubmit}
+                  >
+                    购买教程
+                  </Button>
+                </div>
+              </TheSticky>
+            )}
+          </>
         )}
+        {/**/}
       </div>
     )
   }

+ 11 - 0
src/views/order-detail/index.tsx

@@ -311,6 +311,17 @@ export default defineComponent({
           })
           const result = res.data || {}
           // 支付成功
+          if (res.code === 999) {
+            Dialog.alert({
+              title: '提示',
+              message: '商品信息已更新,请返回后重新购买',
+              confirmButtonText: '确定',
+              confirmButtonColor: '#2dc7aa'
+            }).then(() => {
+              this.$router.back()
+            })
+            return
+          }
           if (result.status == 'PAID') {
             this.$router.replace({
               path: '/tradeDetail',