Преглед на файлове

Merge branch 'iteration-20241126' into dev

lex-xin преди 8 месеца
родител
ревизия
8081ec89e3
променени са 92 файла, в които са добавени 1138 реда и са изтрити 635 реда
  1. 2 0
      src/business-components/course-video-item/index.module.less
  2. 4 0
      src/business-components/subject-list/index.module.less
  3. 2 2
      src/business-components/subject-list/index.tsx
  4. 2 2
      src/business-components/user-detail/index.tsx
  5. 2 2
      src/components/col-cropper/index.module.less
  6. 4 0
      src/components/col-header/index.tsx
  7. BIN
      src/components/col-result/images/emptyBook.png
  8. 1 1
      src/components/col-result/index.module.less
  9. 5 1
      src/components/col-result/index.tsx
  10. 12 26
      src/components/col-upload-video/index.tsx
  11. 2 2
      src/helpers/hooks.ts
  12. 2 2
      src/router/routes-teacher.ts
  13. 1 0
      src/student/activePage/double12Active/index.tsx
  14. BIN
      src/student/discount-card/images/title1.png
  15. 20 3
      src/student/discount-card/index.module.less
  16. 0 1
      src/student/discount-card/index.tsx
  17. 2 2
      src/student/home/components/recommend-sage/index.tsx
  18. 1 1
      src/student/home/components/talent-style/index.tsx
  19. 3 3
      src/student/home/index.tsx
  20. 27 55
      src/student/live-class/live-detail.tsx
  21. 1 1
      src/student/member-center/member-record.tsx
  22. 1 0
      src/student/share-active/track-review-activity/index.tsx
  23. 3 7
      src/student/teacher-dependent/components/live.tsx
  24. 8 0
      src/student/teacher-dependent/components/practice.module.less
  25. 14 10
      src/student/teacher-dependent/components/practice.tsx
  26. 8 0
      src/student/teacher-dependent/components/vip.module.less
  27. 14 10
      src/student/teacher-dependent/components/vip.tsx
  28. BIN
      src/student/teacher-dependent/images/icon-add-star.png
  29. BIN
      src/student/teacher-dependent/images/icon-small-live.png
  30. 1 1
      src/student/teacher-dependent/model/fans-list/index.tsx
  31. 5 6
      src/student/teacher-dependent/model/teacher-header.module.less
  32. 6 6
      src/student/teacher-dependent/model/teacher-header.tsx
  33. 1 1
      src/student/teacher-dependent/teacher-elegant.tsx
  34. 1 1
      src/student/teacher-dependent/teacher-home.module.less
  35. 6 2
      src/student/teacher-dependent/teacher-home.tsx
  36. 5 0
      src/student/teacher-dependent/teacher-style/index.module.less
  37. 2 2
      src/student/teacher-dependent/teacher-style/index.tsx
  38. 8 4
      src/student/trade/tradeOrder.ts
  39. 1 0
      src/student/video-class/video-class-detail.tsx
  40. 34 24
      src/student/video-class/video-detail.tsx
  41. 26 3
      src/teacher/income-consus/echarts.ts
  42. 6 0
      src/teacher/income-consus/index.module.less
  43. 24 1
      src/teacher/income-consus/index.tsx
  44. BIN
      src/teacher/layout/images/icon_checkbox.png
  45. 9 0
      src/teacher/layout/login-cert.module.less
  46. 39 22
      src/teacher/layout/login-cert.tsx
  47. 15 3
      src/teacher/live-class/create-components/detail.tsx
  48. 16 0
      src/teacher/live-class/create.module.less
  49. 32 2
      src/teacher/live-class/create.tsx
  50. 6 6
      src/teacher/music-cert/index.tsx
  51. 2 2
      src/teacher/open-live/index.tsx
  52. 1 0
      src/teacher/piano-room/account-recharge-timer/index.tsx
  53. 1 1
      src/teacher/piano-room/index.tsx
  54. 43 11
      src/teacher/practice-class/practice-setting.module.less
  55. 117 61
      src/teacher/practice-class/practice-setting.tsx
  56. 2 1
      src/teacher/practice-class/timer/timer.module.less
  57. 1 1
      src/teacher/practice-class/timer/timer.tsx
  58. BIN
      src/teacher/practice-class/tip-model/images/close.png
  59. BIN
      src/teacher/practice-class/tip-model/images/icon-question.png
  60. BIN
      src/teacher/practice-class/tip-model/images/top_bg.png
  61. 35 0
      src/teacher/practice-class/tip-model/index.module.less
  62. 33 0
      src/teacher/practice-class/tip-model/index.tsx
  63. 1 1
      src/teacher/share-page/share-live-room/index.tsx
  64. 12 10
      src/teacher/teacher-cert/cert-info.tsx
  65. 81 76
      src/teacher/teacher-cert/index.tsx
  66. 2 2
      src/teacher/teacher-cert/teacher-cert-update/index.tsx
  67. 6 6
      src/teacher/teacher-dependent/model/teacher-header.tsx
  68. 17 0
      src/teacher/video-class/create.module.less
  69. 36 2
      src/teacher/video-class/create.tsx
  70. 1 0
      src/tenant/music/music-detail/new-index.tsx
  71. 2 0
      src/views/member-center/index.tsx
  72. 1 3
      src/views/order-detail/add-discount/index.module.less
  73. 3 8
      src/views/order-detail/add-discount/index.tsx
  74. 189 110
      src/views/order-detail/index.tsx
  75. 1 1
      src/views/order-detail/order-album/index.module.less
  76. 2 2
      src/views/order-detail/order-live/index.module.less
  77. 11 5
      src/views/order-detail/order-practice/index.module.less
  78. 2 2
      src/views/order-detail/order-practice/index.tsx
  79. 5 2
      src/views/order-detail/order-video/index.module.less
  80. 2 3
      src/views/order-detail/order-video/index.tsx
  81. 9 3
      src/views/order-detail/order-vip-course/index.module.less
  82. 2 2
      src/views/order-detail/order-vip-course/index.tsx
  83. 3 3
      src/views/order-detail/order-vip/index.tsx
  84. 46 59
      src/views/order-detail/use-coupons/choice-coupon.tsx
  85. 17 12
      src/views/order-detail/use-coupons/index.tsx
  86. 1 1
      src/views/protocol/privacy.tsx
  87. 2 2
      src/views/protocol/register.tsx
  88. 5 0
      src/views/shop-mall/components/TheHomeHeader/index.module.less
  89. 12 0
      src/views/shop-mall/components/TheHomeHeader/index.tsx
  90. BIN
      src/views/shop-mall/images/icon-back.png
  91. 16 1
      src/views/trade/trade-detail.module.less
  92. 32 27
      src/views/trade/trade-detail.tsx

+ 2 - 0
src/business-components/course-video-item/index.module.less

@@ -98,6 +98,8 @@
     overflow: hidden;
     white-space: nowrap;
     text-overflow: ellipsis;
+    line-height: 1;
+    padding-top: 2px;
   }
 
   .song {

+ 4 - 0
src/business-components/subject-list/index.module.less

@@ -103,4 +103,8 @@
       }
     }
   }
+}
+
+.subjectBtnGroup {
+  padding-bottom: 30px;
 }

+ 2 - 2
src/business-components/subject-list/index.tsx

@@ -285,7 +285,7 @@ export default defineComponent({
 
         {this.subjectList.length > 0 && (
           <Sticky offsetBottom={0} position="bottom">
-            <div class={'btnGroup'}>
+            <div class={['btnGroup', styles.subjectBtnGroup]}>
               <Button
                 round
                 block
@@ -297,7 +297,7 @@ export default defineComponent({
                   )
                 }
               >
-                确
+                确
               </Button>
             </div>
           </Sticky>

+ 2 - 2
src/business-components/user-detail/index.tsx

@@ -120,14 +120,14 @@ export default defineComponent({
                 >
                   <div class={styles.username}>
                     {this.userInfo.username || `游客${this.userInfo.id || ''}`}
-                    <div>
+                    {/* <div>
                       {(this.userInfo as any).isDegree && (
                         <img class={styles.iconTeacher} src={IconXueli} />
                       )}
                       {(this.userInfo as any).isTeacher && (
                         <img class={styles.iconTeacher} src={IconJiaozi} />
                       )}
-                    </div>
+                    </div> */}
                   </div>
                 </div>
               ),

+ 2 - 2
src/components/col-cropper/index.module.less

@@ -12,7 +12,7 @@
 .bg {
   position: fixed;
   top: 0;
-  height: 100vh;
+  height: 100%;
   width: 100%;
   background-color: #000;
   left: 0;
@@ -62,7 +62,7 @@
   position: relative;
 }
 .wrapper {
-  height: calc(100vh - 21.333vw);
+  height: calc(100% - 21.333vw);
   padding: 4vw;
   :global {
     .crop-point {

+ 4 - 0
src/components/col-header/index.tsx

@@ -128,6 +128,10 @@ export default defineComponent({
     },
     onClickLeft() {
       this.$emit('leftClick', null)
+      postMessage({
+        api: 'setStatusBarTextColor',
+        content: { statusBarTextColor: false }
+      })
       if(this.leftClickDefault) {
         if (browser().isApp) {
           postMessage({ api: 'goBack' })

BIN
src/components/col-result/images/emptyBook.png


+ 1 - 1
src/components/col-result/index.module.less

@@ -23,7 +23,7 @@
     .van-empty__description {
       margin-top: 8px;
       padding: 0 30px;
-      color: #fff;
+      color: #999;
     }
   }
 

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

@@ -18,7 +18,7 @@ export default defineComponent({
       type: String
     },
     type: {
-      // 空 | 达人认证 | 音乐人认证 | 直播认证
+      // 空 | 老师认证 | 音乐人认证 | 直播认证
       type: String as PropType<
         | 'empty'
         | 'teacherCert'
@@ -29,6 +29,7 @@ export default defineComponent({
         | 'search'
         | 'emptyContent'
         | 'notFond'
+        | 'emptyBook'
       >,
       default: 'empty'
     },
@@ -75,6 +76,9 @@ export default defineComponent({
         case 'emptyContent':
           image = getAssetsHomeFile('emptyContent.png')
           break
+        case 'emptyBook':
+          image = getAssetsHomeFile('emptyBook.png')
+          break
         case 'error':
           image = 'error'
           break

+ 12 - 26
src/components/col-upload-video/index.tsx

@@ -85,13 +85,15 @@ export default defineComponent({
             acl: 'public-read',
             key: key
           }
-        })
+        }, true)
+        setTimeout(() => {
         Toast.loading({
-          message: '加载中...',
-          forbidClick: true,
-          loadingType: 'spinner',
-          duration: 0
-        })
+            message: '加载中...',
+            forbidClick: true,
+            loadingType: 'spinner',
+            duration: 0
+          })
+        }, 100);
         const obj = {
           policy: data.policy,
           signature: data.signature,
@@ -105,26 +107,8 @@ export default defineComponent({
           getOssUploadUrl(this.bucket),
           obj
         )
-        // const formData = new FormData()
-        // for (const key in obj) {
-        //   formData.append(key, obj[key])
-        // }
-        // formData.append('file', file.file)
-        // await umiRequest(getOssUploadUrl(this.bucket), {
-        //   method: 'POST',
-        //   data: formData
-        // })
-        // const uploadUrl = getOssUploadUrl(this.bucket) + key
-        Toast.clear()
+        Toast.clear() 
         this.$emit('update:modelValue', uploadUrl)
-        // this.onUploadChange(uploadUrl)
-        // let formData = new FormData()
-        // formData.append('file', file.file)
-        // let res = await request.post('/api-teacher/uploadFile', {
-        //   data: formData
-        // })
-        // const url = res.data.url
-        // this.$emit('update:modelValue', uploadUrl)
       } catch (error) {
         //
         console.log(error)
@@ -211,7 +195,9 @@ export default defineComponent({
                       ref="videoUpload"
                       class={styles.uploadImg}
                       src={this.modelValue + '#t=1,4'}
-                      // poster={this.posterUrl || ''}
+                      // onLoad={() => {
+                      //   Toast.clear()
+                      // }}
                     />
                   ) : (
                     <div class={styles.uploader}>

+ 2 - 2
src/helpers/hooks.ts

@@ -90,7 +90,7 @@ const eventTracks = {
   专辑: 'klx_album',
   视频课: 'klx_videoClass',
   直播课: 'klx_liveClass',
-  达人风采: 'klx_talentElegant',
+  老师风采: 'klx_talentElegant',
   热门资讯: 'klx_hotInformation',
   小酷AI功能埋点: 'klx_xiaokuAI',
   我的乐谱: 'klx_myMusic',
@@ -108,7 +108,7 @@ type eventName =
   | '专辑'
   | '视频课'
   | '直播课'
-  | '达人风采'
+  | '老师风采'
   | '热门资讯'
   | '小酷AI功能埋点'
   | '我的乐谱'

+ 2 - 2
src/router/routes-teacher.ts

@@ -61,7 +61,7 @@ const noLoginRouter = [
     component: () => import('@/teacher/layout/login-cert'),
     meta: {
       isRegister: false,
-      title: '老师入驻'
+      title: '酷乐秀学院老师入驻'
     } as metaType
   }
 ]
@@ -90,7 +90,7 @@ export default [
         name: 'teacherCert',
         component: () => import('@/teacher/teacher-cert/index'),
         meta: {
-          title: '达人认证'
+          title: '老师认证'
         }
       },
       {

+ 1 - 0
src/student/activePage/double12Active/index.tsx

@@ -190,6 +190,7 @@ export default defineComponent({
           recomUserId: '',
           activityBuyCount: 0, // 活动购买限制次数
           activityList: [], // 活动赠送的东西
+          discountCardFlag: userInfo.value.discountCardFlag,
           discountEndTime: userInfo.value.discountEndTime, // 畅学卡结束时间
           discountStartTime: userInfo.value.discountStartTime // 畅学卡开始时间
         }

BIN
src/student/discount-card/images/title1.png


+ 20 - 3
src/student/discount-card/index.module.less

@@ -2,6 +2,21 @@
   min-height: 100vh;
   background: url('./images/bg.png') no-repeat top center #cbf3ff;
   background-size: contain;
+
+  img {
+    -moz-user-select: none;
+    /* 火狐浏览器 */
+    -webkit-user-drag: none;
+    /* 谷歌、Safari和Opera浏览器 */
+    -webkit-user-select: none;
+    /* 谷歌、Safari和Opera浏览器 */
+    -ms-user-select: none;
+    /* IE10+浏览器 */
+    user-select: none;
+    /* 通用 */
+    -webkit-touch-callout: none;
+    /* iOS Safari */
+  }
 }
 
 .cardContainer {
@@ -111,7 +126,7 @@
 
     .member_time {
       font-size: 12px;
-      color: #777777;
+      color: rgba(0, 0, 0, 0.6);
       line-height: 17px;
 
       span {
@@ -138,7 +153,7 @@
     padding-left: 26px;
     .iconTitle1 {
       // width: 63px;
-      height: 25px;
+      height: 23px;
       margin-right: 6px;
     }
 
@@ -146,6 +161,7 @@
       flex-shrink: 0;
       display: flex;
       align-items: center;
+      margin-top: -1px;
       .currentPrice {
         display: flex;
         align-items: flex-end;
@@ -170,6 +186,7 @@
         }
       }
       .originPrice {
+        padding-top: 2px;
         padding-left: 6px;
         font-size: 12px;
         color: rgba(19, 20, 21, 0.4)
@@ -221,7 +238,7 @@
 
 .btnGroup {
   background-color: #fff;
-  padding: 10px 30px 30px;
+  padding: 10px 30px 23px;
 
   .submitBtn {
     background: url('./images/btn-bg.png') no-repeat center;

+ 0 - 1
src/student/discount-card/index.tsx

@@ -28,7 +28,6 @@ export default defineComponent({
     })
     const userInfo = computed(() => {
       const users = baseState.user.data
-      console.log(users, 'users')
       return {
         username: users?.username,
         phone: users?.phone,

+ 2 - 2
src/student/home/components/recommend-sage/index.tsx

@@ -13,7 +13,7 @@ export default defineComponent({
   props: {
     title: {
       type: String,
-      default: '推荐达人'
+      default: '推荐老师'
     },
     sage: {
       type: Array,
@@ -87,7 +87,7 @@ export default defineComponent({
                 {item.living && <span class={styles.living}>直播中</span>}
               </div>
               <p class={styles.username}>{item.username}</p>
-              <p class={styles.cert}>认证达人</p>
+              <p class={styles.cert}>认证老师</p>
 
               <Button
                 round

+ 1 - 1
src/student/home/components/talent-style/index.tsx

@@ -183,7 +183,7 @@ export default defineComponent({
           <ColResult
             btnStatus={false}
             classImgSize="SMALL"
-            tips="暂无达人风采"
+            tips="暂无老师风采"
           />
         )}
       </>

+ 3 - 3
src/student/home/index.tsx

@@ -46,7 +46,7 @@ export default defineComponent({
         newMusicSheet: [] as any,
         hotMusicSheet: [] as any
       },
-      sageList: [], // 推荐达人
+      sageList: [], // 推荐老师
       videoList: [], // 视频课
       headerHeight: 0,
       downloadStatus: false
@@ -228,7 +228,7 @@ export default defineComponent({
           <Music title="最新曲目" music={this.musicList?.newMusicSheet || []} />
           <Music title="最热曲目" music={this.musicList?.hotMusicSheet || []} />
 
-          {/* 推荐达人 */}
+          {/* 推荐老师 */}
           <RecommendSage sage={this.sageList} />
 
           {/* 精品视频课 */}
@@ -241,7 +241,7 @@ export default defineComponent({
             sticky
             offsetTop={this.headerHeight + 'px'}
           >
-            <Tab title="达人风采" name="sage">
+            <Tab title="老师风采" name="sage">
               <TalentStyle />
             </Tab>
             <Tab title="热门资讯" name="info">

+ 27 - 55
src/student/live-class/live-detail.tsx

@@ -16,8 +16,7 @@ import LiveItem from '@/views/live-class/live-item'
 import iconShare from '@/views/shop-mall/images/icon-share.svg'
 import { state } from '@/state'
 import { browser } from '@/helpers/utils'
-import { goodsType } from '@/constant';
-import { discountTimer, tradeOrder } from '../trade/tradeOrder'
+import { tradeOrder } from '../trade/tradeOrder'
 interface IProps {
   courseTime: string
   coursePlan: string
@@ -176,11 +175,36 @@ export default defineComponent({
         }
       } catch {}
     },
+    initLive () {
+      const live = this.live
+      orderStatus.orderObject.orderType = 'LIVE'
+      orderStatus.orderObject.orderName = '直播课购买'
+      orderStatus.orderObject.orderDesc = '直播课购买'
+      orderStatus.orderObject.actualPrice = live.coursePrice
+      orderStatus.orderObject.recomUserId = this.recomUserId
+      orderStatus.orderObject.orderNo = ''
+      orderStatus.orderObject.orderList = [
+        {
+          orderType: 'LIVE',
+          goodsName: '直播课购买',
+          courseGroupId: live.courseGroupId,
+          courseGroupName: live.courseGroupName,
+          coursePrice: live.coursePrice,
+          price: live.coursePrice,
+          teacherName: live.userName || `游客${live.teacherId || ''}`,
+          teacherId: live.teacherId,
+          avatar: live.avatar,
+          courseInfo: this.courseInfo,
+          recomUserId: this.recomUserId
+        }
+      ]
+    },
     async onBuy() {
       try {
         const live = this.live
         // 判断是否是0无订单
         if (live.coursePrice <= 0) {
+          this.initLive()
           await onSubmitZero(() => {
             Dialog.alert({
               message: '领取成功',
@@ -212,39 +236,6 @@ export default defineComponent({
             confirmButtonText: '继续支付'
           })
             .then(async () => {
-              // orderStatus.orderObject.orderNo = result.orderNo
-              // orderStatus.orderObject.actualPrice = result.actualPrice
-              // orderStatus.orderObject.discountPrice = result.discountPrice
-              // orderStatus.orderObject.paymentConfig = {
-              //   ...result.paymentConfig,
-              //   paymentVendor: result.paymentVendor,
-              //   paymentVersion: result.paymentVersion
-              // }
-
-              // const orderDetailList = result.orderDetailList || []
-              
-              // let tempObj: any = {}
-              // let discountJson: any = {}
-              // orderDetailList.forEach((item: any) => {
-              //   if(item.goodType === "DISCOUNT") { 
-              //     const users = state.user.data || {}
-              //     tempObj ={
-              //       orderType: item.goodType,
-              //       goodsName: item.goodName,
-              //       id: item.bizId,
-              //       title: item.goodName,
-              //       num: item.goodNum,
-              //       salePrice: item.actualPrice,
-              //       price: item.actualPrice,
-              //       period: item.period,
-              //       ...discountTimer(users.discountEndTime, item.period)
-              //     }
-              //   } else if(item.goodType === 'LIVE') {
-              //     discountJson = item.discountJson ? JSON.parse(item.discountJson) : {}
-              //   }
-              // })
-              // tempObj.discountPrice = discountJson.DISCOUNT || 0
-              // orderStatus.orderObject.orderList.push(tempObj)
               tradeOrder(result, this.routerTo)
             })
             .catch(() => {
@@ -253,26 +244,7 @@ export default defineComponent({
               this.cancelPayment(result.orderNo)
             })
         } else {
-          orderStatus.orderObject.orderType = 'LIVE'
-          orderStatus.orderObject.orderName = '直播课购买'
-          orderStatus.orderObject.orderDesc = '直播课购买'
-          orderStatus.orderObject.actualPrice = live.coursePrice
-          orderStatus.orderObject.recomUserId = this.recomUserId
-          orderStatus.orderObject.orderNo = ''
-          orderStatus.orderObject.orderList = [
-            {
-              orderType: 'LIVE',
-              goodsName: '直播课购买',
-              courseGroupId: live.courseGroupId,
-              courseGroupName: live.courseGroupName,
-              coursePrice: live.coursePrice,
-              teacherName: live.userName || `游客${live.teacherId || ''}`,
-              teacherId: live.teacherId,
-              avatar: live.avatar,
-              courseInfo: this.courseInfo,
-              recomUserId: this.recomUserId
-            }
-          ]
+          this.initLive()
           this.routerTo()
         }
       } catch {

+ 1 - 1
src/student/member-center/member-record.tsx

@@ -135,7 +135,7 @@ export default defineComponent({
                 </div>
               </div>
               //   <div class={[styles.certHeader, this.headStatus ? styles.certWhite : null]}>
-              //     达人认证
+              //     老师认证
               //   </div>
             )
           }}

+ 1 - 0
src/student/share-active/track-review-activity/index.tsx

@@ -235,6 +235,7 @@ export default defineComponent({
               goodsName: activeInfo.activityName,
               activityId: activeInfo.id,
               actualPrice: activeInfo.registrationPrice,
+              price: activeInfo.registrationPrice,
               recomUserId: this.recomUserId
             }
           ]

+ 3 - 7
src/student/teacher-dependent/components/live.tsx

@@ -127,13 +127,9 @@ export default defineComponent({
                       <span>{item.teacherName || `游客${item.teacherId || ''}`}</span>
                     </div> */}
                     <div class={styles.lean}>
-                      {item.existBuy === 1 ? (
-                        <span class={styles.buyNum}>学习</span>
-                      ) : (
-                        <span class={styles.num}>
-                          {item.studentCount}人学习
-                        </span>
-                      )}
+                      <span class={styles.num}>
+                        {item.studentCount}人学习
+                      </span>
                     </div>
                     <div class={styles.price}>
                       {item.coursePrice > 0 && (

+ 8 - 0
src/student/teacher-dependent/components/practice.module.less

@@ -1,3 +1,11 @@
+.tipSection {
+  padding: 4px 14px 0;
+}
+:global {
+  .col-result-container {
+    padding-top: 0;
+  }
+}
 .practice {
   padding: 4px 14px 80px;
   overflow: hidden;

+ 14 - 10
src/student/teacher-dependent/components/practice.tsx

@@ -99,19 +99,21 @@ export default defineComponent({
         this.onBuy(true)
 
         this.settingStatus = true
+
+        // 判断如果是审核的则不显示
+        const resVersion = await request.post('/api-teacher/open/appVersion', {
+          data: {
+            platform:
+              state.platformType === 'STUDENT' ? 'ios-student' : 'ios-teacher',
+            version: state.version
+          }
+        })
+        this.settingStatus =  resVersion.data.check ? false : true
       } else {
         this.settingStatus = false
       }
 
-      // 判断如果是审核的则不显示
-      const resVersion = await request.post('/api-teacher/open/appVersion', {
-        data: {
-          platform:
-            state.platformType === 'STUDENT' ? 'ios-student' : 'ios-teacher',
-          version: state.version
-        }
-      })
-      this.settingStatus =  resVersion.data.check ? false : true
+      
       this.loadDataStatus = false
     } catch {
       this.loadDataStatus = false
@@ -332,6 +334,7 @@ export default defineComponent({
             teacherSubjectPriceId: subjectInfo.id,
             courseNum: this.courseNum,
             coursePrice: (this.courseNum * subjectInfo.subjectPrice).toFixed(2),
+            price: (this.courseNum * subjectInfo.subjectPrice).toFixed(2),
             teacherName:
               this.userInfo.username || `游客${this.userInfo.userId || ''}`,
             teacherId: this.userInfo.userId,
@@ -385,11 +388,12 @@ export default defineComponent({
   render() {
     return (
       <>
+        <div class={styles.tipSection}><Tips type="PRACTICE" title="什么是趣纠课?" content="趣纠课以一对一专属、高度针对性的形式进行,每次课程时长为25分钟。本课程专为解决学生日常练习中的疑问与误区设计,尤其适合那些在自我练习后感到困惑或不确定自己方法是否正确的学生。不同于传统的教学模式,趣纠课不侧重于新知识或新技能的传授,而是全心全意致力于检查学生现有的练习成果,并及时纠正其中出现的问题。这种方式不仅有助于学生巩固已掌握的知识和技能,还能有效防止错误习惯的形成和发展,为他们今后的学习打下更加坚实的基础。" /></div>
         {!this.loadDataStatus &&
           (this.settingStatus ? (
             <>
               <div class={styles.practice}>
-                <Tips type="PRACTICE" title="什么是趣纠课?" content="趣纠课以一对一专属、高度针对性的形式进行,每次课程时长为25分钟。本课程专为解决学生日常练习中的疑问与误区设计,尤其适合那些在自我练习后感到困惑或不确定自己方法是否正确的学生。不同于传统的教学模式,趣纠课不侧重于新知识或新技能的传授,而是全心全意致力于检查学生现有的练习成果,并及时纠正其中出现的问题。这种方式不仅有助于学生巩固已掌握的知识和技能,还能有效防止错误习惯的形成和发展,为他们今后的学习打下更加坚实的基础。" />
+                
 
                 <CellGroup class={styles.group} border={false}>
                   <Cell

+ 8 - 0
src/student/teacher-dependent/components/vip.module.less

@@ -1,3 +1,11 @@
+.tipSection {
+  padding: 4px 14px 0;
+}
+:global {
+  .col-result-container {
+    padding-top: 0;
+  }
+}
 .practice {
   padding: 4px 14px 80px;
   overflow: hidden;

+ 14 - 10
src/student/teacher-dependent/components/vip.tsx

@@ -100,19 +100,21 @@ export default defineComponent({
         this.onBuy(true)
 
         this.settingStatus = true
+
+         // 判断如果是审核的则不显示
+        const resVersion = await request.post('/api-teacher/open/appVersion', {
+          data: {
+            platform:
+              state.platformType === 'STUDENT' ? 'ios-student' : 'ios-teacher',
+            version: state.version
+          }
+        })
+        this.settingStatus =  resVersion.data.check ? false : true
       } else {
         this.settingStatus = false
       }
 
-      // 判断如果是审核的则不显示
-      const resVersion = await request.post('/api-teacher/open/appVersion', {
-        data: {
-          platform:
-            state.platformType === 'STUDENT' ? 'ios-student' : 'ios-teacher',
-          version: state.version
-        }
-      })
-      this.settingStatus =  resVersion.data.check ? false : true
+     
       this.loadDataStatus = false
     } catch {
       this.loadDataStatus = false
@@ -333,6 +335,7 @@ export default defineComponent({
             teacherSubjectPriceId: subjectInfo.id,
             courseNum: this.courseNum,
             coursePrice: (this.courseNum * subjectInfo.subjectPrice).toFixed(2),
+            price: (this.courseNum * subjectInfo.subjectPrice).toFixed(2),
             teacherName:
               this.userInfo.username || `游客${this.userInfo.userId || ''}`,
             teacherId: this.userInfo.userId,
@@ -386,11 +389,11 @@ export default defineComponent({
   render() {
     return (
       <>
+        <div class={styles.tipSection}><Tips type="LIVE_COURSE" title='什么是VIP定制课?' content='VIP定制课程采用一对一专属授课模式,每节课时长为45分钟。课程内容根据学生的具体需求量身打造,旨在全面提升学生的个人技能与表现。不论是希望在乐器演奏技巧上取得突破,如提高指法精准度、气息控制能力或节奏掌握等;还是为即将到来的重要活动、比赛或考级做充分准备,我们都能提供高度匹配的教学方案。此外,教学进度将根据每位学员的学习吸收情况灵活调整,确保每个人都能在最适合自己的节奏中稳步前进,扎实提升个人能力。' /></div>
         {!this.loadDataStatus &&
           (this.settingStatus ? (
             <>
               <div class={styles.practice}>
-                <Tips type="LIVE_COURSE" title='什么是VIP定制课?' content='VIP定制课程采用一对一专属授课模式,每节课时长为45分钟。课程内容根据学生的具体需求量身打造,旨在全面提升学生的个人技能与表现。不论是希望在乐器演奏技巧上取得突破,如提高指法精准度、气息控制能力或节奏掌握等;还是为即将到来的重要活动、比赛或考级做充分准备,我们都能提供高度匹配的教学方案。此外,教学进度将根据每位学员的学习吸收情况灵活调整,确保每个人都能在最适合自己的节奏中稳步前进,扎实提升个人能力。' />
                 <CellGroup class={styles.group} border={false}>
                   <Cell
                     title="选择专业"
@@ -578,6 +581,7 @@ export default defineComponent({
           ) : (
             <ColResult
               btnStatus={false}
+              // type="emptyBook"
               classImgSize="SMALL"
               tips="老师暂未开放VIP定制课"
             />

BIN
src/student/teacher-dependent/images/icon-add-star.png


BIN
src/student/teacher-dependent/images/icon-small-live.png


+ 1 - 1
src/student/teacher-dependent/model/fans-list/index.tsx

@@ -79,6 +79,6 @@ export default defineComponent({
           />
         ))}
       </div>
-    ) : <div class={styles.noFans}>还没有粉丝群哦!</div>}</div>
+    ) : <div class={styles.noFans}>暂时还没有粉丝群哦!</div>}</div>
   }
 })

+ 5 - 6
src/student/teacher-dependent/model/teacher-header.module.less

@@ -26,7 +26,7 @@
     width: 78px;
     height: 78px;
     box-sizing: border-box;
-    border: 2px solid #fff;
+    border: 1px solid #fff;
     background-color: #fff;
   }
 
@@ -73,7 +73,6 @@
   line-height: 16px;
   color: #666;
   font-weight: 500;
-  padding-top: 4px;
   padding-left: 8px;
 
   .score {
@@ -114,15 +113,15 @@
       margin-right: 6px;
 
     }
+    &:first-child {
+      margin-right: 13px;
+    }
   }
 
 
   .btnStar {
-    
-    
     color: #F8F9FC;
     background: #2DC7AA;
-    margin-right: 13px;
     // &::before {
     //   background: #2DC7AA;
     // }
@@ -137,7 +136,7 @@
 }
 
 .teacher-bottom {
-  padding: 17px 0 0 0;
+  padding: 11px 0 0 0;
   display: flex;
   align-items: center;
 

+ 6 - 6
src/student/teacher-dependent/model/teacher-header.tsx

@@ -112,22 +112,22 @@ export default defineComponent({
     const iconList = [
       {
         icon: 'cert_active.png',
-        title: '演奏Mlog达人',
+        title: '演奏Mlog老师',
         des: '个人风采中上传老师风采视频并通过审核'
       },
       {
         icon: 'video_active.png',
-        title: '教学视频达人',
+        title: '教学视频老师',
         des: '发布您制作的教学视频课程并通过审核'
       },
       {
         icon: 'live_active.png',
-        title: '直播up达人',
+        title: '直播up老师',
         des: '达到开通直播权限标准并开通直播功能'
       },
       {
         icon: 'music_active.png',
-        title: '乐谱歌单达人',
+        title: '乐谱歌单老师',
         des: '上传您制作的乐谱并通过审核'
       }
     ]
@@ -234,10 +234,10 @@ export default defineComponent({
               <Button
                 type="primary"
                 size="small"
-                class={[styles.btn, styles.btnStar]}
+                class={[styles.btn, !this.userInfo.isStar && styles.btnStar]}
                 onClick={this.onStart}
               >
-                {!this.userInfo.isStar ? <img src={getAssetsHomeFile('icon-add.png')} /> : ''}
+                {!this.userInfo.isStar ? <img src={getAssetsHomeFile('icon-add.png')} /> : <img src={getAssetsHomeFile('icon-add-star.png')} />}
                 {/* <img src={getAssetsHomeFile('icon-add.png')} /> */}
                 {this.userInfo.isStar ? '已关注' : '关注'}
               </Button>

+ 1 - 1
src/student/teacher-dependent/teacher-elegant.tsx

@@ -123,7 +123,7 @@ export default defineComponent({
       // this.params.subjectId &&
       //   sessionStorage.setItem('elegantSubjectId', this.params.subjectId)
       this.$router.push({
-        path: '/teacherHome',
+        path: '/teacher-style',
         query: {
           teacherId: item.userId
         }

+ 1 - 1
src/student/teacher-dependent/teacher-home.module.less

@@ -44,7 +44,7 @@
   top: 0;
   left: 0;
   width: 100%;
-  height: 188px;
+  height: 298px;
   object-fit: cover;
 }
 .bg{

+ 6 - 2
src/student/teacher-dependent/teacher-home.tsx

@@ -47,7 +47,11 @@ export default defineComponent({
       chatStatus: false,
     }
   },
-  async mounted() {
+  async mounted() { 
+    postMessage({
+      api: 'setStatusBarTextColor',
+      content: { statusBarTextColor: true }
+    })
     this.$nextTick(() => {
       const { height } = useRect(document.querySelector('.van-tabs__wrap') as any)
       this.tabsHeight = height
@@ -71,7 +75,7 @@ export default defineComponent({
         this.backIconColor = 'white'
       }
     })
-    useEventTracking('达人风采')
+    useEventTracking('老师风采')
   },
   methods: {
     stickyHeight() {

+ 5 - 0
src/student/teacher-dependent/teacher-style/index.module.less

@@ -2,6 +2,11 @@
   display: flex;
   // column-count: 2; /* 设置列数 */
   padding: 14px;
+  justify-content: space-between;
+
+  .line {
+    width: 168px;
+  }
 
   .line:first-child {
     .tedeoItem:first-child {

+ 2 - 2
src/student/teacher-dependent/teacher-style/index.tsx

@@ -90,7 +90,7 @@ export default defineComponent({
                         <div class={styles.info}>
                           <div class={styles.teUserInfo}>
                             <Image
-                              src={item.avatar || iconTeacher}
+                              src={state.userInfo?.heardUrl || iconTeacher}
                               class={styles.teUserLogo}
                             />
                             <span
@@ -136,7 +136,7 @@ export default defineComponent({
                         <div class={styles.info}>
                           <div class={styles.teUserInfo}>
                             <Image
-                              src={item.avatar || iconTeacher}
+                              src={state.userInfo?.heardUrl || iconTeacher}
                               class={styles.teUserLogo}
                             />
                             <span

+ 8 - 4
src/student/trade/tradeOrder.ts

@@ -13,7 +13,7 @@ const apiSuffix =
 // MUSIC: '单曲点播'
 
 /** 计算畅学卡时间 */
-export const discountTimer = (discountEndTime: any, period: string) => {
+export const discountTimer = (discountEndTime: any, period: string, isFlag?: false) => {
   const startTime = discountEndTime || new Date()
   let endTime = dayjs(new Date()).format('YYYY-MM-DD')
   if (period === 'MONTH') {
@@ -26,7 +26,7 @@ export const discountTimer = (discountEndTime: any, period: string) => {
     endTime = dayjs(startTime).add(1, 'year').format('YYYY-MM-DD')
   }
   return {
-    startTime: dayjs(startTime).format('YYYY-MM-DD'),
+    startTime: isFlag ?  dayjs(startTime).add(1, 'day').format('YYYY-MM-DD') : dayjs(startTime).format('YYYY-MM-DD'),
     endTime
   }
 }
@@ -64,6 +64,7 @@ export const formatOrderDetail = async (item: any, amount?: IAmount) => {
             courseGroupId: live.courseGroupId,
             courseGroupName: live.courseGroupName,
             coursePrice: live.coursePrice,
+            price: live.coursePrice,
             teacherName: live.userName || `游客${live.teacherId || ''}`,
             teacherId: live.teacherId,
             avatar: live.avatar,
@@ -94,6 +95,7 @@ export const formatOrderDetail = async (item: any, amount?: IAmount) => {
           courseGroupId: lessonGroup.id,
           courseGroupName: lessonGroup.lessonName,
           coursePrice: lessonGroup.lessonPrice,
+          price: lessonGroup.lessonPrice,
           teacherName: lessonGroup.username,
           teacherId: lessonGroup.teacherId,
           avatar: lessonGroup.avatar,
@@ -186,6 +188,7 @@ export const formatOrderDetail = async (item: any, amount?: IAmount) => {
             startTime: dayjs(startTime).format('YYYY-MM-DD'),
             endTime: dayjs(endTime).format('YYYY-MM-DD'),
             activityList: [], // 活动赠送的东西
+            discountCardFlag: state.user.data.discountCardFlag,
             discountEndTime: state.user.data.discountEndTime, // 畅学卡结束时间
             discountStartTime: state.user.data.discountStartTime // 畅学卡开始时间
           }
@@ -222,6 +225,7 @@ export const formatOrderDetail = async (item: any, amount?: IAmount) => {
     case 'DISCOUNT':
       {
         const users = state.user.data || {}
+        const endTime = users.discountCardFlag ? dayjs(users.discountEndTime || new Date()).add(1, 'day').toDate() : new Date()
         tempList = {
           orderType: item.goodType,
           goodName: item.goodName,
@@ -230,7 +234,7 @@ export const formatOrderDetail = async (item: any, amount?: IAmount) => {
           title: item.goodName || '',
           // 判断是否有优惠金额
           price: item.expectPrice,
-          ...discountTimer(users.discountEndTime, item.period)
+          ...discountTimer(endTime, item.period, users.discountCardFlag)
         }
       }
       break
@@ -431,7 +435,7 @@ export const tradeOrder = async (result: any, callBack?: any) => {
       }
     })
     orderDetails[0] && (orderDetails[0].activityList = orderDetailsActivity)
-    console.log(orderDetails, 'orderDetails')
+    // console.log(orderDetails, 'orderDetails')
     orderDetails.forEach(async (item: any) => {
       const child = await formatOrderDetail(item, {
         couponAmount,

+ 1 - 0
src/student/video-class/video-class-detail.tsx

@@ -287,6 +287,7 @@ export default defineComponent({
                             courseGroupId: userInfo.id,
                             courseGroupName: userInfo.lessonName,
                             coursePrice: userInfo.lessonPrice,
+                            price: userInfo.lessonPrice,
                             teacherName:
                               userInfo.username ||
                               `游客${userInfo.teacherId || ''}`,

+ 34 - 24
src/student/video-class/video-detail.tsx

@@ -64,7 +64,7 @@ export default defineComponent({
         )
         const result = res.data || {}
         const lessonGroup = result.lessonGroup || {}
-        const teachertTag = result.teachertTag || ''
+        // const teachertTag = result.teachertTag || ''
         const userInfo = state.user.data as any
         const alreadyBuy =
           lessonGroup.payType === 'VIP'
@@ -107,6 +107,31 @@ export default defineComponent({
         }
       })
     },
+    initVideo () {
+      const userInfo = this.userInfo
+      orderStatus.orderObject.orderType = 'VIDEO'
+      orderStatus.orderObject.orderName = '视频课购买'
+      orderStatus.orderObject.orderDesc = '视频课购买'
+      orderStatus.orderObject.actualPrice = userInfo.lessonPrice
+      orderStatus.orderObject.recomUserId = this.recomUserId
+      orderStatus.orderObject.orderNo = ''
+      orderStatus.orderObject.orderList = [
+        {
+          orderType: 'VIDEO',
+          goodsName: '视频课购买',
+          courseGroupId: userInfo.id,
+          courseGroupName: userInfo.lessonName,
+          coursePrice: userInfo.lessonPrice,
+          price: userInfo.lessonPrice,
+          teacherName: userInfo.username || `游客${userInfo.teacherId || ''}`,
+          teacherId: userInfo.teacherId,
+          avatar: userInfo.headUrl,
+          relationType: this.userInfo.relationType,
+          courseInfo: this.detailList,
+          recomUserId: this.recomUserId
+        }
+      ]
+    },
     async onBuy() {
       try {
         if (this.userInfo.payType === 'VIP') {
@@ -131,6 +156,7 @@ export default defineComponent({
 
         // 判断是否是0无订单
         if (userInfo.lessonPrice <= 0) {
+          this.initVideo()
           await onSubmitZero(() => {
             Dialog.alert({
               message: '领取成功',
@@ -170,27 +196,7 @@ export default defineComponent({
               this.cancelPayment(result.orderNo)
             })
         } else {
-          orderStatus.orderObject.orderType = 'VIDEO'
-          orderStatus.orderObject.orderName = '视频课购买'
-          orderStatus.orderObject.orderDesc = '视频课购买'
-          orderStatus.orderObject.actualPrice = userInfo.lessonPrice
-          orderStatus.orderObject.recomUserId = this.recomUserId
-          orderStatus.orderObject.orderNo = ''
-          orderStatus.orderObject.orderList = [
-            {
-              orderType: 'VIDEO',
-              goodsName: '视频课购买',
-              courseGroupId: userInfo.id,
-              courseGroupName: userInfo.lessonName,
-              coursePrice: userInfo.lessonPrice,
-              teacherName: userInfo.username || `游客${userInfo.teacherId || ''}`,
-              teacherId: userInfo.teacherId,
-              avatar: userInfo.headUrl,
-              relationType: this.userInfo.relationType,
-              courseInfo: this.detailList,
-              recomUserId: this.recomUserId
-            }
-          ]
+          this.initVideo()
           this.routerTo()
         }
       } catch {}
@@ -220,14 +226,18 @@ export default defineComponent({
       if (this.userInfo.payType !== 'VIP') {
         return
       }
-      request
+      if(this.pageVisibility === 'visible') {
+        request
         .get('/api-student/student/queryUserInfo', {
           initRequest: true // 初始化接口
         })
         .then((res: any) => {
           setLogin(res.data)
-          this.userInfo.alreadyBuy = res.data?.isVip ? true : false
+          this.userInfo.alreadyBuy = this.userInfo.alreadyBuy || res.data.userVip?.vipType !== 'NOT_VIP'
+            ? true
+            : false
         })
+      }
     }
   },
   render() {

+ 26 - 3
src/teacher/income-consus/echarts.ts

@@ -266,7 +266,28 @@ export const lineChartOption = {
       name: '活动报名',
       type: 'line',
       emphasis: { lineStyle: { width: 1 } }
-    }
+    },
+    {
+      lineStyle: { width: 1 },
+      data: [
+        '0.00',
+        '0.00',
+        '0.00',
+        '0.00',
+        '0.00',
+        '0.00',
+        '0.00',
+        '0.00',
+        '0.00',
+        '0.00',
+        '0.00',
+        '0.00'
+      ],
+      symbol: 'circle',
+      name: 'VIP定制课',
+      type: 'line',
+      emphasis: { lineStyle: { width: 1 } }
+    },
   ],
   title: { show: false },
   grid: {
@@ -355,7 +376,8 @@ export const pieChartOption = {
         { name: '商品推荐', value: '0.00' },
         { name: '乐谱推荐', value: '0.00' },
         { name: '专辑推荐', value: '0.00' },
-        { name: '活动报名', value: '0.00' }
+        { name: '活动报名', value: '0.00' },
+        { name: 'VIP定制课', value: '0.00' },
       ],
       type: 'pie',
       radius: ['50%', '80%']
@@ -380,6 +402,7 @@ export const pieChartOption = {
     '#FF3C3C',
     '#1AEE3E',
     '#00c9ff',
-    '#7c47ff'
+    '#7c47ff',
+    '#FF6600'
   ]
 }

+ 6 - 0
src/teacher/income-consus/index.module.less

@@ -92,6 +92,9 @@
   .color10 {
     background: #00c9ff;
   }
+  .color10 {
+    background: #FF6600;
+  }
 
   .type {
     span {
@@ -242,6 +245,9 @@
   .pie7 {
     background: #00c9ff !important;
   }
+  .pie8 {
+    background: #FF6600 !important;
+  }
   .pieTitle {
     display: inline-block;
     padding-left: 9px;

+ 24 - 1
src/teacher/income-consus/index.tsx

@@ -100,6 +100,8 @@ export default defineComponent({
         totalInAmount: 0,
         practiceAmount: 0,
         practiceRate: 0,
+        vipCourseAmount: 0,
+        vipCourseRate: 0,
         liveAmount: 0,
         liveRate: 0,
         videoAmount: 0,
@@ -158,7 +160,8 @@ export default defineComponent({
               result.practiceRate +
               result.liveRate +
               result.videoRate +
-              result.musicRate
+              result.musicRate + 
+              result.vipCourseRate
             ).toFixed(2)
           ),
           totalShareRate: Number(
@@ -175,6 +178,8 @@ export default defineComponent({
           totalInAmount: result.totalInAmount || 0,
           practiceAmount: result.practiceAmount || 0,
           practiceRate: result.practiceRate || 0,
+          vipCourseAmount: result.vipCourseAmount || 0,
+          vipCourseRate: result.vipCourseRate || 0,
           liveAmount: result.liveAmount || 0,
           liveRate: result.liveRate || 0,
           videoAmount: result.videoAmount || 0,
@@ -201,6 +206,7 @@ export default defineComponent({
         const lineData = {
           xAxis: [] as any,
           practiceAmount: [] as any,
+          vipCourseAmount: [] as any,
           liveAmount: [] as any,
           videoAmount: [] as any,
           musicAmount: [] as any,
@@ -229,6 +235,7 @@ export default defineComponent({
           lineData.musicShareAmount.push(item.musicShareAmount)
           lineData.albumShareAmount.push(item.albumShareAmount || 0)
           lineData.actiRegistShareAmount.push(item.actiRegistShareAmount)
+          lineData.vipCourseAmount.push(item.vipCourseAmount)
         })
         // 初始化折线图
         lineChartOption.xAxis.data = lineData.xAxis
@@ -243,6 +250,7 @@ export default defineComponent({
         lineChartOption.series[8].data = lineData.musicShareAmount
         lineChartOption.series[9].data = lineData.albumShareAmount
         lineChartOption.series[10].data = lineData.actiRegistShareAmount
+        lineChartOption.series[11].data = lineData.vipCourseAmount
         // console.log(lineChartOption)
         this.myChart.clear()
         this.myChart.setOption(lineChartOption)
@@ -259,6 +267,7 @@ export default defineComponent({
         pieChartOption.series[0].data[8].value = result.musicShareAmount
         pieChartOption.series[0].data[9].value = result.albumShareAmount
         pieChartOption.series[0].data[10].value = result.actiRegistShareAmount
+        pieChartOption.series[0].data[11].value = result.vipCourseAmount
         console.log(pieChartOption)
         this.myChart2.clear()
         this.myChart2.setOption(pieChartOption)
@@ -295,6 +304,15 @@ export default defineComponent({
           <div class={styles.section}>
             <Row class={styles.numberCount}>
               <Col span={6}>
+                <i class={styles.color11}></i>
+                <div class={styles.type}>
+                  <span>VIP定制课</span>
+                  <span class={styles.price}>
+                    {moneyFormat(this.moneyInfo.vipCourseAmount)}
+                  </span>
+                </div>
+              </Col>
+              <Col span={6}>
                 <i></i>
                 <div class={styles.type}>
                   <span>趣纠课</span>
@@ -425,6 +443,11 @@ export default defineComponent({
 
           <div class={styles.pieData}>
             <div>
+              <i class={styles.pie8}></i>
+              <span class={styles.pieTitle}>VIP定制课</span>
+              <span>{this.moneyInfo.vipCourseRate}%</span>
+            </div>
+            <div>
               <i class={styles.piePractice}></i>
               <span class={styles.pieTitle}>趣纠课</span>
               <span>{this.moneyInfo.practiceRate}%</span>

BIN
src/teacher/layout/images/icon_checkbox.png


+ 9 - 0
src/teacher/layout/login-cert.module.less

@@ -44,6 +44,9 @@
   }
 
   :global {
+    input{
+      caret-color: #2dc7aa;
+    }
     .van-field {
       padding-left: 0;
       padding-right: 0;
@@ -74,6 +77,7 @@
     .van-checkbox__label {
       line-height: 14px;
       color: #999;
+      vertical-align: text-bottom;
     }
   }
 }
@@ -84,6 +88,10 @@
   text-align: center;
   color: #999;
 
+  .lastText {
+    vertical-align: text-bottom;
+  }
+
   .protocolText {
     color: var(--van-primary);
     line-height: 14px;
@@ -95,5 +103,6 @@
     height: 14px;
     font-size: 14px;
     border: transparent !important;
+    vertical-align: text-top;
   }
 }

+ 39 - 22
src/teacher/layout/login-cert.tsx

@@ -8,7 +8,7 @@ import { removeAuth, setAuth } from '@/helpers/utils'
 import styles from './login-cert.module.less'
 import topBg from './image-cert/top.png'
 import activeButtonIcon from '@common/images/icon_checkbox.png'
-import inactiveButtonIcon from '@common/images/icon_checkbox_default.png'
+import inactiveButtonIcon from './images/icon_checkbox.png'
 
 export default defineComponent({
   name: 'login',
@@ -20,7 +20,6 @@ export default defineComponent({
       smsCode: '',
       countDownStatus: true, // 是否发送验证码
       countDownTime: 1000 * 120, // 倒计时时间
-      countDownRef: null as any, // 倒计时实例
       imgCodeStatus: false
     }
   },
@@ -32,12 +31,26 @@ export default defineComponent({
       return status
     }
   },
+  created() {
+    document.title = '酷乐秀学院老师入驻'
+  },
   mounted() {
     removeAuth()
+    const userInfo = sessionStorage.getItem('login-cert-store')
+    if(userInfo) {
+      const parseUser = JSON.parse(userInfo)
+      this.username = parseUser.username;
+      this.smsCode = parseUser.smsCode
+      sessionStorage.removeItem('login-cert-store')
+    }
     this.directNext()
   },
   methods: {
     previewProtocol(type: string) {
+      sessionStorage.setItem('login-cert-store', JSON.stringify({
+        username: this.username,
+        smsCode: this.smsCode,
+      }))
       if (type === 'user') {
         this.$router.push({
           path: '/registerProtocol',
@@ -98,12 +111,14 @@ export default defineComponent({
     },
     onCodeSend() {
       this.countDownStatus = false
-      this.countDownRef.start()
+      this.$nextTick(() => {
+        ;(this.$refs.countDownRef as any).start()
+      })
     },
     onFinished() {
       this.countDownStatus = true
-      this.countDownRef.reset()
-    }
+      ;(this.$refs.countDownRef as any).reset()
+    },
   },
   render() {
     return (
@@ -146,7 +161,7 @@ export default defineComponent({
                         </span>
                       ) : (
                         <CountDown
-                          ref={this.countDownRef}
+                          ref='countDownRef'
                           auto-start={false}
                           time={this.countDownTime}
                           onFinish={this.onFinished}
@@ -175,22 +190,24 @@ export default defineComponent({
             >
               我已阅读并同意
             </Checkbox>
-            <span
-              class={styles.protocolText}
-              onClick={() => {
-                this.previewProtocol('user')
-              }}
-            >
-              《用户注册协议》
-            </span>
-            和
-            <span
-              class={styles.protocolText}
-              onClick={() => {
-                this.previewProtocol('privacy')
-              }}
-            >
-              《隐私政策》
+            <span class={styles.lastText}>
+              <span
+                class={styles.protocolText}
+                onClick={() => {
+                  this.previewProtocol('user')
+                }}
+              >
+                《用户注册协议》
+              </span>
+              和
+              <span
+                class={styles.protocolText}
+                onClick={() => {
+                  this.previewProtocol('privacy')
+                }}
+              >
+                《隐私政策》
+              </span>
             </span>
           </div>
           <Button

+ 15 - 3
src/teacher/live-class/create-components/detail.tsx

@@ -59,8 +59,16 @@ export default defineComponent({
       return tempArr || []
     }
   },
+  data() {
+    return {
+      submitLoading: false
+    }
+  },
   methods: {
     async onSubmit() {
+      if(this.submitLoading) return
+      this.submitLoading = true;
+      
       try {
         const params = {
           ...createState.live,
@@ -97,9 +105,12 @@ export default defineComponent({
           createState.coursePlanStatus = false
         })
       }
+      this.submitLoading = false;
     },
 
-    async onUpdate(){
+    async onUpdate() {
+      if(this.submitLoading) return
+      this.submitLoading = true;
       
       const params = {
         id: createState.live.courseGroupId,
@@ -113,6 +124,7 @@ export default defineComponent({
       await request.post('/api-teacher/courseGroup/updateLiveCourse', {
         data: params
       })
+      this.submitLoading = false
       Toast({
         type: 'success',
         message: '编辑成功',
@@ -155,11 +167,11 @@ export default defineComponent({
               返回编辑
             </Button>
             {createState.live.courseGroupId ? (
-              <Button block round type="primary" onClick={this.onUpdate}>
+              <Button block round type="primary" disabled={this.submitLoading} onClick={this.onUpdate}>
                 确认修改
               </Button>
             ) : (
-              <Button block round type="primary" onClick={this.onSubmit}>
+              <Button block round type="primary" disabled={this.submitLoading} onClick={this.onSubmit}>
                 创建成功
               </Button>
             )}

+ 16 - 0
src/teacher/live-class/create.module.less

@@ -2,4 +2,20 @@
   :global(.van-sticky--fixed) {
     // box-shadow: 10px 10px 10px var(--box-shadow-color);
   }
+}
+.iconQuestion {
+  width: 24px;
+  height: 24px;
+  flex-shrink: 0;
+}
+
+.tipPopup {
+  background: transparent;
+
+  :global {
+    .van-popup__close-icon {
+      font-size: 18px;
+      color: #CCCCCC;
+    }
+  }
 }

+ 32 - 2
src/teacher/live-class/create.tsx

@@ -5,15 +5,22 @@ import Course from './create-components/course'
 import CoursePlan from './create-components/course-plan'
 import CourseStart from './create-components/course-start'
 import Detail from './create-components/detail'
-import { Sticky } from 'vant'
+import { Popup, Sticky } from 'vant'
 import Arrange from './create-components/arrange'
 import request from '@/helpers/request'
 import styles from './create.module.less'
 import ColHeader from '@/components/col-header'
 import TheSticky from '@/components/the-sticky'
+import iconQuestion from '@/teacher/practice-class/tip-model/images/icon-question.png'
+import TipModel from '../practice-class/tip-model'
 
 export default defineComponent({
   name: 'LiveCreate',
+  data() {
+    return {
+      tipStatus: false
+    }
+  },
   async mounted() {
     try {
       // 获取手续费和分钟数
@@ -86,7 +93,15 @@ export default defineComponent({
     return (
       <div class={styles['live-create']}>
         <TheSticky position="top">
-          <ColHeader border={false} />
+          <ColHeader border={false} v-slots={{
+                right: () => (
+                  <img
+                    src={iconQuestion}
+                    class={styles.iconQuestion}
+                    onClick={() => (this.tipStatus = true)}
+                  />
+                )
+              }} />
           {createState.active !== 5 && (
             <Steps
               style={{ backgroundColor: '#f6f8f9', paddingBottom: '12px' }}
@@ -103,6 +118,21 @@ export default defineComponent({
         {createState.active == 4 && <CourseStart />}
 
         {createState.active == 5 && <Detail />}
+
+        <Popup
+          show={this.tipStatus}
+          class={styles.tipPopup}
+          closeable
+          onClose={() => (this.tipStatus = false)}
+        >
+          <TipModel
+            onClose={() => (this.tipStatus = false)}
+            title={'什么是直播课?'}
+            content={
+              '直播课是现代教育领域中一种广受欢迎的课程形式,它集实时互动、多媒体展示和高度便利性于一体,为学习者带来了独特且丰富的学习体验。特别是在管乐直播课中,教师可以通过播放经典音乐作品,加深学生对音乐之美的感知与理解。对于那些需要具体操作演示的教学内容,直播课能够提供清晰直观的视角,让教师的每一个动作细节都展现在学生面前,确保学习效果。直播课程的内容围绕特定主题精心设计,旨在满足不同学习者的需求,促进知识与技能的有效传递。'
+            }
+          />
+        </Popup>
       </div>
     )
   }

+ 6 - 6
src/teacher/music-cert/index.tsx

@@ -41,10 +41,10 @@ export default defineComponent({
       postMessage({ api: 'setBarStatus', content: { status: 1 } })
     }
 
-    // 如果没有达人认证,则需要先去认证
+    // 如果没有老师认证,则需要先去认证
     if (!state.user.data?.entryFlag) {
       Dialog.alert({
-        message: '您尚未完成达人认证,达人认证后才可开通音乐人权限哦!',
+        message: '您尚未完成老师认证,老师认证后才可开通音乐人权限哦!',
         confirmButtonColor: '#2DC7AA'
       }).then(() => {
         this.$router.replace('/teacherCert')
@@ -97,7 +97,7 @@ export default defineComponent({
                   <div class={styles.content}>
                     <div class={styles.subTitle}>
                       <img src={getAssetsHomeFile('1.png')} />
-                      <span>教学视频分享达人</span>
+                      <span>教学视频分享老师</span>
                     </div>
                     <div class={styles.subConent}>
                       发布您制作的教学视频内容,展现不同类型的学习方式
@@ -113,7 +113,7 @@ export default defineComponent({
                   <div class={styles.content}>
                     <div class={styles.subTitle}>
                       <img src={getAssetsHomeFile('2.png')} />
-                      <span>演奏Mlog达人</span>
+                      <span>演奏Mlog老师</span>
                     </div>
                     <div class={styles.subConent}>
                       发布自己演奏的音乐Mlog,让学员深入了解您的专业技能,从而提升您的关注率
@@ -129,7 +129,7 @@ export default defineComponent({
                   <div class={styles.content}>
                     <div class={styles.subTitle}>
                       <img src={getAssetsHomeFile('3.png')} />
-                      <span>直播up达人</span>
+                      <span>直播up老师</span>
                     </div>
                     <div class={styles.subConent}>
                       利用平台专为器乐演奏研发的直播教室,可进行一对一或开启直播间在线分内容,技巧等
@@ -145,7 +145,7 @@ export default defineComponent({
                   <div class={styles.content}>
                     <div class={styles.subTitle}>
                       <img src={getAssetsHomeFile('4.png')} />
-                      <span>乐谱歌单达人</span>
+                      <span>乐谱歌单老师</span>
                     </div>
                     <div class={styles.subConent}>
                       上传您制作的MIDI乐谱,结合小酷Ai给音乐爱好者自主练习的途径

+ 2 - 2
src/teacher/open-live/index.tsx

@@ -58,10 +58,10 @@ export default defineComponent({
         }
       })
 
-      // 如果没有达人认证,则需要先去认证
+      // 如果没有老师认证,则需要先去认证
       if (!state.user.data?.entryFlag) {
         Dialog.alert({
-          message: '您尚未完成达人认证,达人认证后才可开通直播权限哦!',
+          message: '您尚未完成老师认证,认证后才可开通直播权限哦!',
           confirmButtonColor: '#2DC7AA'
         }).then(() => {
           this.$router.replace('/teacherCert')

+ 1 - 0
src/teacher/piano-room/account-recharge-timer/index.tsx

@@ -97,6 +97,7 @@ export default defineComponent({
         {
           orderType: 'PIANO_ROOM',
           goodsName: selectItem.times + '分钟琴房时长充值',
+          price: selectItem.salePrice,
           ...selectItem
         }
       ]

+ 1 - 1
src/teacher/piano-room/index.tsx

@@ -248,7 +248,7 @@ export default defineComponent({
       } catch {}
     },
     onTeacherAuth(callBack: any) {
-      // 是否达人认证
+      // 是否老师认证
       // 老师入驻状态 0、未申请 UNPAALY、未申请 DOING、审核中 PASS、通过 UNPASS、不通过,可用值:UNPAALY,DOING,PASS,UNPASS
       const data = state.user.data
       if (data.entryStatus === 'PASS') {

+ 43 - 11
src/teacher/practice-class/practice-setting.module.less

@@ -16,8 +16,9 @@
 .showPrice {
   background: #FFFAEE;
   border-radius: 4px;
-  border: 1px solid;
-  border-image: linear-gradient(180deg, rgba(250, 237, 215, 1), rgba(251, 233, 206, 1)) 1 1;
+  border: 1px solid rgba(250, 237, 215, 1);
+  border-radius: 4px;
+  // border-image: linear-gradient(180deg, rgba(250, 237, 215, 1), rgba(251, 233, 206, 1)) 1 1;
   padding: 9px 6px;
   line-height: 1;
   font-size: 13px;
@@ -33,14 +34,14 @@
 .tipsAccount {
   padding-top: 12px;
   font-size: 14px;
-color: #999999;
-line-height: 24px;
-padding: 0 14px;
-span {
-  color: #FF4E19;
-  font-weight: bold;
-  padding: 0 4px;
-}
+  color: #999999;
+  line-height: 24px;
+  padding: 0 14px;
+  span {
+    color: #FF4E19;
+    font-weight: bold;
+    padding: 0 4px;
+  }
 }
 
 .radio-group,
@@ -73,15 +74,28 @@ span {
 }
 
 .checkbox-group {
-  padding-bottom: 12px;
+  padding: 6px 0;
+  :global {
+    .van-tag--large {
+      font-size: 12px;
+      line-height: 1.2;
+      padding: 3px 6px 2px;
+      text-align: center;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+  }
 }
 
+
 .radio-group {
   :global {
     .van-tag--large {
       width: 94px;
       height: 30px;
       font-size: 16px;
+      line-height: 1.2;
       text-align: center;
       display: flex;
       align-items: center;
@@ -109,9 +123,27 @@ span {
 }
 
 .PracticeSettingBtns {
+  padding-bottom: 30px;
   :global {
     .van-button {
       font-size: 18px;
     }
   }
+}
+
+.iconQuestion {
+  width: 24px;
+  height: 24px;
+  flex-shrink: 0;
+}
+
+.tipPopup {
+  background: transparent;
+
+  :global {
+    .van-popup__close-icon {
+      font-size: 18px;
+      color: #CCCCCC;
+    }
+  }
 }

+ 117 - 61
src/teacher/practice-class/practice-setting.tsx

@@ -14,7 +14,8 @@ import {
   CheckboxGroup,
   Checkbox,
   Dialog,
-  Toast
+  Toast,
+  Popup
 } from 'vant'
 import { defineComponent } from 'vue'
 import styles from './practice-setting.module.less'
@@ -23,6 +24,8 @@ import ColHeader from '@/components/col-header'
 import { state } from '@/state'
 import TheSticky from '@/components/the-sticky'
 import { moneyFormat } from '@/helpers/utils'
+import TipModel from './tip-model'
+import iconQuestion from './tip-model/images/icon-question.png'
 
 /** 保留两位小数向上取整 */
 export const numberToTwoUp = (num: number | string) => {
@@ -36,6 +39,7 @@ export default defineComponent({
   data() {
     const query = this.$route.query
     return {
+      tipStatus: false,
       courseType: query.tabs == 'vip' ? 'VIP' : 'PRACTICE',
       text: query.tabs == 'vip' ? 'VIP定制课' : '趣纠课',
       subjectList: [],
@@ -43,7 +47,7 @@ export default defineComponent({
         0: '否',
         1: '是'
       },
-      checkStatus:false, // 是否审核版本
+      checkStatus: false, // 是否审核版本
       classTimeStatus: false,
       subjectStatus: false,
       form: {
@@ -54,11 +58,11 @@ export default defineComponent({
         freeMinutes: 0,
         subjectIdTemp: '',
         subjectId: [] as any[],
-        subjectPrice: [] as any[],
+        subjectPrice: [] as any[]
       },
       minutes: [] as any,
       rate: 0,
-      accountPeriod: 0, // 账期
+      accountPeriod: 0 // 账期
     }
   },
   computed: {
@@ -83,7 +87,12 @@ export default defineComponent({
       )
       const configData = config.data || []
       configData.forEach((item: any) => {
-        if (item.paramName === (this.courseType === 'VIP' ? 'vip_course_times_setting' : 'practice_times_setting')) {
+        if (
+          item.paramName ===
+          (this.courseType === 'VIP'
+            ? 'vip_course_times_setting'
+            : 'practice_times_setting')
+        ) {
           const mins = item.paramValue ? JSON.parse(item.paramValue) : []
           const tempArr = [] as any
           mins.forEach((item: any) => {
@@ -93,7 +102,7 @@ export default defineComponent({
             })
           })
           this.minutes = [...tempArr]
-          if(this.minutes.length > 0) {
+          if (this.minutes.length > 0) {
             const minute = this.minutes[0]
             this.form.coursePrice = minute.price
             this.form.courseMinutes = minute.courseMinutes
@@ -102,10 +111,20 @@ export default defineComponent({
             this.form.highestPrice = minute.highestPrice || 0
           }
         }
-        if (item.paramName === (this.courseType === 'VIP' ? 'vip_course_service_fee' : 'practice_service_fee')) {
+        if (
+          item.paramName ===
+          (this.courseType === 'VIP'
+            ? 'vip_course_service_fee'
+            : 'practice_service_fee')
+        ) {
           this.rate = item.paramValue
         }
-        if (item.paramName === (this.courseType === 'VIP' ? 'vip_course_account_period' : 'practice_account_period')) {
+        if (
+          item.paramName ===
+          (this.courseType === 'VIP'
+            ? 'vip_course_account_period'
+            : 'practice_account_period')
+        ) {
           this.accountPeriod = item.paramValue
         }
       })
@@ -123,7 +142,7 @@ export default defineComponent({
         }
       )
       const sr = setting.data
-      if(Array.isArray(sr)) {
+      if (Array.isArray(sr)) {
         const tempSubjects: any = []
         sr.forEach((item: any) => {
           this.form.courseMinutes = item.courseMinutes
@@ -138,7 +157,6 @@ export default defineComponent({
         this.form.subjectIdTemp = this.form.subjectId.join(',')
         this.form.subjectPrice = tempSubjects
       }
-      
 
       // 判断如果是审核的则不显示
       const resVersion = await request.post('/api-teacher/open/appVersion', {
@@ -148,15 +166,16 @@ export default defineComponent({
           version: state.version
         }
       })
-      this.checkStatus =  resVersion.data.check ? true : false
-      
+      this.checkStatus = resVersion.data.check ? true : false
     } catch {}
   },
   methods: {
     onCalcCoursePrice(price: number | string) {
-      if(!price) { return '-' }
+      if (!price) {
+        return '-'
+      }
       const money = Number(price)
-      return moneyFormat(numberToTwoUp(money - (this.rate * money / 100)))
+      return moneyFormat(numberToTwoUp(money - (this.rate * money) / 100))
     },
     onSelect(item: any) {
       this.form.courseMinutes = item.courseMinutes
@@ -197,7 +216,10 @@ export default defineComponent({
       return subject ? subject.name : ''
     },
     validatePrice(rule?: any) {
-      if(Number(rule) > Number(this.form.highestPrice) || Number(rule) < Number(this.form.lowestPrice)) {
+      if (
+        Number(rule) > Number(this.form.highestPrice) ||
+        Number(rule) < Number(this.form.lowestPrice)
+      ) {
         return false
       } else {
         return true
@@ -219,16 +241,15 @@ export default defineComponent({
             courseType: this.courseType,
             freeMinutes: this.form.freeMinutes,
             subjectName
-            
           })
         })
-        console.log(params,'foparamsrm')
+        console.log(params, 'foparamsrm')
         await request.post('/api-teacher/teacherSubjectPrice/saveOrUpdate', {
           data: params
         })
         setTimeout(() => {
           Toast('设置成功')
-        }, 100);
+        }, 100)
         setTimeout(() => {
           postMessage({ api: 'back', content: {} })
         }, 500)
@@ -238,7 +259,9 @@ export default defineComponent({
   render() {
     return (
       <Form style={{ paddingTop: '15px' }} onSubmit={this.onSubmit}>
-        <ColHeader title={`${this.text}设置`} />
+        <ColHeader title={`${this.text}设置`} v-slots={{
+          right: () => <img src={iconQuestion} class={styles.iconQuestion} onClick={() => this.tipStatus = true} />
+        }} />
         <ColFieldGroup>
           <ColField title="可教授乐器" required>
             {this.form.subjectPrice && this.form.subjectPrice.length > 0 && (
@@ -327,49 +350,65 @@ export default defineComponent({
             />
           </ColField>
         </ColFieldGroup>
-        {this.form.subjectPrice && this.form.subjectPrice.length > 0 && !this.checkStatus && (
-          <ColFieldGroup>
-            {this.form.subjectPrice.map((item: any) => (
-              <ColField
-                title={`${this.getSubjectName(item.subjectId)}声部${this.text}价格`}
-                required
-              >
-                <Field
-                  v-model={item.subjectPrice}
-                  name="singleMins"
-                  type="number"
-                  labelWidth={'auto'}
-                  readonly={this.courseType === 'PRACTICE' ? true : false}
-                  label={`${this.form.courseMinutes || 0}分钟 / `}
-                  rules={[
-                    {
-                      required: true,
-                      message: `请输入${this.getSubjectName(item.subjectId)}声部${this.text}价格`
-                    },
-                    this.courseType === "VIP" ? {
-                      validator: this.validatePrice,
-                      message: `请输入价格在${this.form.lowestPrice}~${this.form.highestPrice}范围内`
-                    } : {} as any
-                  ]}
-                  formatter={this.onFormatter}
-                  maxlength={8}
-                  placeholder={this.courseType === 'VIP' ? `${this.form.lowestPrice}~${this.form.highestPrice}` :`请选择声部${this.text}价格`}
-                  v-slots={{
-                    button: () => <span>元</span>
-                  }}
-                />
-                <div class={styles.showPrice}>
-                课程预计收入:<span>¥ {this.onCalcCoursePrice(item.subjectPrice)}</span>
-              </div>
-              </ColField>
-            ))}
-          </ColFieldGroup>
-        )}
+        {this.form.subjectPrice &&
+          this.form.subjectPrice.length > 0 &&
+          !this.checkStatus && (
+            <ColFieldGroup>
+              {this.form.subjectPrice.map((item: any) => (
+                <ColField
+                  title={`${this.getSubjectName(item.subjectId)}声部${
+                    this.text
+                  }价格`}
+                  required
+                >
+                  <Field
+                    v-model={item.subjectPrice}
+                    name="singleMins"
+                    type="number"
+                    labelWidth={'auto'}
+                    border={false}
+                    readonly={this.courseType === 'PRACTICE' ? true : false}
+                    label={`${this.form.courseMinutes || 0}分钟 / `}
+                    rules={[
+                      {
+                        required: true,
+                        message: `请输入${this.getSubjectName(
+                          item.subjectId
+                        )}声部${this.text}价格`
+                      },
+                      this.courseType === 'VIP'
+                        ? {
+                            validator: this.validatePrice,
+                            message: `请输入价格在${this.form.lowestPrice}~${this.form.highestPrice}范围内`
+                          }
+                        : ({} as any)
+                    ]}
+                    formatter={this.onFormatter}
+                    maxlength={8}
+                    placeholder={
+                      this.courseType === 'VIP'
+                        ? `${this.form.lowestPrice}~${this.form.highestPrice}`
+                        : `请选择声部${this.text}价格`
+                    }
+                    v-slots={{
+                      button: () => <span>元</span>
+                    }}
+                  />
+                  <div class={styles.showPrice}>
+                    课程预计收入:
+                    <span>¥ {this.onCalcCoursePrice(item.subjectPrice)}</span>
+                  </div>
+                </ColField>
+              ))}
+            </ColFieldGroup>
+          )}
 
         <div class={styles.tipsAccount}>
           扣除应缴税金和平台服务费后 <br />
-          实际课程收入按学生实际付款金额计算<br />
-          您的课程收入将在课程结束<span>{this.accountPeriod}</span>天后结算到您的账户
+          实际课程收入按学生实际付款金额计算
+          <br />
+          您的课程收入将在课程结束<span>{this.accountPeriod}</span>
+          天后结算到您的账户
         </div>
 
         <TheSticky position="bottom">
@@ -391,8 +430,6 @@ export default defineComponent({
           />
         </ColPopup>
 
-
-
         <ActionSheet
           v-model:show={this.classTimeStatus}
           actions={this.minutes}
@@ -400,6 +437,25 @@ export default defineComponent({
           closeOnClickAction
           onSelect={this.onSelect}
         />
+
+        <Popup
+          show={this.tipStatus}
+          class={styles.tipPopup}
+          closeable
+          onClose={() => (this.tipStatus = false)}
+        >
+          <TipModel
+            onClose={() => (this.tipStatus = false)}
+            title={
+              this.courseType === 'VIP' ? '什么是VIP定制课?' : '什么是趣纠课?'
+            }
+            content={
+              this.courseType === 'VIP'
+                ? 'VIP定制课采用一对一专属授课模式,每节课时长为45分钟。课程内容根据学生的具体需求量身打造,旨在全面提升学生的个人技能与表现。不论是希望在乐器演奏技巧上取得突破,如提高指法精准度、气息控制能力或节奏掌握等;还是为即将到来的重要活动、比赛或考级做充分准备,我们都能提供高度匹配的教学方案。此外,教学进度将根据每位学员的学习吸收情况灵活调整,确保每个人都能在最适合自己的节奏中稳步前进,扎实提升个人能力。'
+                : '趣纠课以一对一专属、高度针对性的形式进行,每次课程时长为25分钟。本课程专为解决学生日常练习中的疑问与误区设计,尤其适合那些在自我练习后感到困惑或不确定自己方法是否正确的学生。不同于传统的教学模式,趣纠课不侧重于新知识或新技能的传授,而是全心全意致力于检查学生现有的练习成果,并及时纠正其中出现的问题。这种方式不仅有助于学生巩固已掌握的知识和技能,还能有效防止错误习惯的形成和发展,为他们今后的学习打下更加坚实的基础。'
+            }
+          />
+        </Popup>
       </Form>
     )
   }

+ 2 - 1
src/teacher/practice-class/timer/timer.module.less

@@ -72,7 +72,7 @@
       .van-tag--large {
         width: 94px;
         height: 30px;
-        font-size: 16px;
+        font-size: 15px;
         text-align: center;
         display: flex;
         align-items: center;
@@ -137,4 +137,5 @@
 .btnGroupTimer {
   padding-top: 20px;
   background: #F6F8F9;
+  padding-bottom: 30px;
 }

+ 1 - 1
src/teacher/practice-class/timer/timer.tsx

@@ -300,7 +300,7 @@ export default defineComponent({
         <TheSticky position='bottom' >
           <div class={['btnGroup', styles.btnGroupTimer]}>
             <Button block round type="primary" onClick={this.onSubmit}>
-              确
+              确
             </Button>
           </div>
         </TheSticky>

BIN
src/teacher/practice-class/tip-model/images/close.png


BIN
src/teacher/practice-class/tip-model/images/icon-question.png


BIN
src/teacher/practice-class/tip-model/images/top_bg.png


+ 35 - 0
src/teacher/practice-class/tip-model/index.module.less

@@ -0,0 +1,35 @@
+.tipModel {
+  width: 300px;
+  background: #ffffff;
+  border-radius: 10px;
+  overflow: hidden;
+
+  .fansBg {
+    height: 113px;
+  }
+
+  h2 {
+    padding: 16px 20px 10px;
+    font-weight: 500;
+    font-size: 15px;
+    color: #333333;
+    line-height: 18px;
+  }
+
+  .content {
+    padding: 0 20px;
+    font-size: 13px;
+    color: #777777;
+    line-height: 22px;
+  }
+
+  .btnPrimary {
+    border-radius: 8px;
+    width: calc(100% - 40px);
+    margin: 20px;
+    font-weight: 500;
+    font-size: 15px;
+    color: #FFFFFF;
+    height: 40px;
+  }
+}

+ 33 - 0
src/teacher/practice-class/tip-model/index.tsx

@@ -0,0 +1,33 @@
+import { defineComponent } from 'vue'
+import styles from './index.module.less'
+import topBg from './images/top_bg.png'
+import { Button } from 'vant'
+
+export default defineComponent({
+  name: 'tip-model',
+  props: {
+    /** 标题 */
+    title: {
+      type: String,
+      default: '',
+    },
+    /** 内容 */
+    content: {
+      type: String,
+      default: ''
+    },
+  },
+  emits: ['close'],
+  setup(props, {emit}) {
+    return () => (
+      <div class={styles.tipModel}>
+        <img src={topBg} class={styles.fansBg} />
+
+        <h2>{props.title}</h2>
+        <div class={styles.content}>{props.content}</div>
+
+        <Button type="primary" block class={styles.btnPrimary} onClick={() => emit('close')}>我知道了</Button>
+      </div>
+    )
+  }
+})

+ 1 - 1
src/teacher/share-page/share-live-room/index.tsx

@@ -139,7 +139,7 @@ export default defineComponent({
               </div>
               <div>
                 <div class={styles.comentTitle}>
-                  快进入达人的直播间一起围观~
+                  快进入老师的直播间一起围观~
                 </div>
                 <div class={styles.comentDes}>
                   {this.teacher.realName || this.student.username} 为您推荐

+ 12 - 10
src/teacher/teacher-cert/cert-info.tsx

@@ -4,6 +4,7 @@ import { Button, Icon, Image, Sticky } from 'vant'
 import { defineComponent, Transition } from 'vue'
 import styles from './cert-info.module.less'
 import { teacherState } from './teacherState'
+import { browser } from '@/helpers/utils'
 /**
  * 动态引入文件
  * @param fileName 文件名
@@ -33,21 +34,22 @@ export default defineComponent({
   render() {
     return (
       <div class={styles['cert-info']}>
-        <ColHeader
+        {browser().isApp ? <ColHeader
           background="transparent"
           border={false}
           title=" "
           // color="white"
-        />
+        /> : ''}
+        
         <div class={styles.certWrapper}>
           <div class={styles.section}>
             <div class={styles.title}>
               <img src={getAssetsHomeFile('1.png')} />
-              什么是酷乐秀音乐达人
+              什么是酷乐秀音乐老师
             </div>
 
             <p class={styles.content}>
-              酷乐秀音乐人是酷乐秀优质的内容创作提供者,包含乐谱歌单达人,教学视频分享达人,演奏MLog达人,直播up达人
+              酷乐秀音乐人是酷乐秀优质的内容创作提供者,包含乐谱歌单老师,教学视频分享老师,演奏MLog老师,直播up老师
             </p>
 
             <div class={styles.operation}>
@@ -65,7 +67,7 @@ export default defineComponent({
               </div>
               <div class={styles.item}>
                 <img src={getAssetsHomeFile('logo4.png')} />
-                <p>直播up达人</p>
+                <p>直播up老师</p>
               </div>
             </div>
           </div>
@@ -73,23 +75,23 @@ export default defineComponent({
           <div class={styles.section}>
             <div class={styles.title}>
               <img src={getAssetsHomeFile('2.png')} />
-              酷乐秀能为达人提供哪些服务?
+              酷乐秀能为老师提供哪些服务?
             </div>
 
             <p class={styles.content}>
-              酷乐秀提供现金激励,商业分成等福利政策,帮助达人内容变现,
-              提供流量扶持等政策,帮助达人推广优质內容。
+              酷乐秀提供现金激励,商业分成等福利政策,帮助老师内容变现,
+              提供流量扶持等政策,帮助老师推广优质內容。
             </p>
           </div>
 
           <div class={styles.section}>
             <div class={styles.title}>
               <img src={getAssetsHomeFile('3.png')} />
-              成为酷乐秀达人的意义是什么?
+              成为酷乐秀老师的意义是什么?
             </div>
 
             <p class={styles.content}>
-              酷乐秀给所有热爱音乐热爱分享热爱转播技能的达人一个分享交流创作的平台,让音乐圈无圈,让爱好者无界。
+              酷乐秀给所有热爱音乐热爱分享热爱转播技能的老师一个分享交流创作的平台,让音乐圈无圈,让爱好者无界。
             </p>
           </div>
         </div>

+ 81 - 76
src/teacher/teacher-cert/index.tsx

@@ -13,6 +13,7 @@ import request from '@/helpers/request'
 import ColResult from '@/components/col-result'
 import { state } from '@/state'
 import ColHeader from '@/components/col-header'
+import { browser } from '@/helpers/utils'
 
 export default defineComponent({
   name: 'teacherCert',
@@ -157,83 +158,87 @@ export default defineComponent({
   render() {
     return (
       <div class={styles['teacher-cert']}>
-        {!teacherState.authStatus ? (
-          <CertInfo />
-        ) : (
-          <div>
-            {teacherState.active != 4 ? (
-              <>
-                <ColHeader />
-                <Steps style={{ marginBottom: '12px' }} />
-              </>
-            ) : null}
-            {teacherState.active === 1 ? (
-              <>
-                <CertOne />
-                <div class={'btnGroup'}>
-                  <ColProtocol
-                    v-model={this.agreeStatus}
-                    prototcolType="REGISTER"
-                    style={{ paddingLeft: 0, paddingRight: 0 }}
-                  />
-                  <Button
-                    block
-                    round
-                    onClick={this.next}
-                    type="primary"
-                    text="下一步"
-                  />
-                </div>
-              </>
-            ) : null}
-            {teacherState.active === 2 ? (
-              <>
-                <CertTwo />
-                <div class={['btnGroup', 'btnMore']}>
-                  <Button block round type="primary" plain onClick={this.prev}>
-                    上一步
-                  </Button>
-                  <Button
-                    block
-                    round
-                    onClick={this.next2}
-                    type="primary"
-                    text="下一步"
-                  />
-                </div>
-              </>
-            ) : null}
-            {teacherState.active === 3 ? (
-              <>
-                <CertThree />
-                <div class={['btnGroup', 'btnMore']}>
-                  <Button block round type="primary" plain onClick={this.prev}>
-                    上一步
-                  </Button>
-                  <Button
-                    block
-                    round
-                    onClick={this.onSubmit}
-                    type="primary"
-                    text="提交审核"
-                  />
-                </div>
-              </>
-            ) : null}
-
-            {teacherState.active === 4 ? (
-              <>
-                <ColHeader />
-                <ColResult
-                  type="teacherCert"
-                  style={{ paddingTop: '60px' }}
-                  classImgSize="CERT"
-                  tips="感谢您的申请,小酷将在24小时内完成审核,请留意APP消息及短信获取审核结果。"
+        <div>
+          {teacherState.active != 4 ? (
+            <>
+              {browser().isApp ? <ColHeader /> : ''}
+              <Steps style={{ marginBottom: '12px' }} />
+            </>
+          ) : null}
+          {teacherState.active === 1 ? (
+            <>
+              <CertOne />
+              <div class={'btnGroup'}>
+                <ColProtocol
+                  v-model={this.agreeStatus}
+                  prototcolType="REGISTER"
+                  style={{ paddingLeft: 0, paddingRight: 0 }}
+                />
+                <Button
+                  block
+                  round
+                  onClick={this.next}
+                  type="primary"
+                  text="下一步"
+                />
+              </div>
+            </>
+          ) : null}
+          {teacherState.active === 2 ? (
+            <>
+              <CertTwo />
+              <div class={['btnGroup', 'btnMore']}>
+                <Button block round type="primary" plain onClick={this.prev}>
+                  上一步
+                </Button>
+                <Button
+                  block
+                  round
+                  onClick={this.next2}
+                  type="primary"
+                  text="下一步"
                 />
-              </>
-            ) : null}
-          </div>
-        )}
+              </div>
+            </>
+          ) : null}
+          {teacherState.active === 3 ? (
+            <>
+              <CertThree />
+              <div class={['btnGroup', 'btnMore']}>
+                <Button block round type="primary" plain onClick={this.prev}>
+                  上一步
+                </Button>
+                <Button
+                  block
+                  round
+                  onClick={this.onSubmit}
+                  type="primary"
+                  text="提交审核"
+                />
+              </div>
+            </>
+          ) : null}
+
+          {teacherState.active === 4 ? (
+            <>
+              <ColHeader />
+              <ColResult
+                type="teacherCert"
+                style={{ paddingTop: '60px' }}
+                classImgSize="CERT"
+                buttonText={browser().isApp ? '我知道了' : '下载酷乐秀学院'}
+                tips="感谢您的申请,小酷将在24小时内完成审核,请留意APP消息及短信获取审核结果。"
+                onClick={() => {
+                  if (browser().isApp) {
+                    postMessage({ api: 'back', content: {} })
+                  } else {
+                    window.open(location.origin + '/student/#/download?type=teacher')
+                  }
+                }}
+              />
+            </>
+          ) : null}
+        </div>
       </div>
     )
   }

+ 2 - 2
src/teacher/teacher-cert/teacher-cert-update/index.tsx

@@ -18,10 +18,10 @@ export default defineComponent({
   },
   async mounted() {
     try {
-      // 判断是否达人认证
+      // 判断是否老师认证
       if (!state.user.data?.entryFlag) {
         Dialog.alert({
-          message: '您尚未完成达人认证,达人认证后才可更新资料哦!',
+          message: '您尚未完成老师认证,老师认证后才可更新资料哦!',
           confirmButtonColor: '#2DC7AA'
         }).then(() => {
           this.$router.replace('/teacherCert')

+ 6 - 6
src/teacher/teacher-dependent/model/teacher-header.tsx

@@ -82,22 +82,22 @@ export default defineComponent({
     const iconList = [
       {
         icon: 'cert_active.png',
-        title: '演奏Mlog达人',
+        title: '演奏Mlog老师',
         des: '个人风采中上传老师风采视频并通过审核'
       },
       {
         icon: 'video_active.png',
-        title: '教学视频达人',
+        title: '教学视频老师',
         des: '发布您制作的教学视频课程并通过审核'
       },
       {
         icon: 'live_active.png',
-        title: '直播up达人',
+        title: '直播up老师',
         des: '达到开通直播权限标准并开通直播功能'
       },
       {
         icon: 'music_active.png',
-        title: '乐谱歌单达人',
+        title: '乐谱歌单老师',
         des: '上传您制作的乐谱并通过审核'
       }
     ]
@@ -155,8 +155,8 @@ export default defineComponent({
                   {this.userInfo.username ||
                     `游客${this.userInfo.userId || ''}`}
                 </div>
-                {this.userInfo.degreeFlag ? <img src={IconXueli} /> : null}
-                {this.userInfo.teacherFlag ? <img src={IconJiaozi} /> : null}
+                {/* {this.userInfo.degreeFlag ? <img src={IconXueli} /> : null}
+                {this.userInfo.teacherFlag ? <img src={IconJiaozi} /> : null} */}
               </div>
             </div>
 

+ 17 - 0
src/teacher/video-class/create.module.less

@@ -47,4 +47,21 @@
       align-items: center;
     }
   }
+}
+
+.iconQuestion {
+  width: 24px;
+  height: 24px;
+  flex-shrink: 0;
+}
+
+.tipPopup {
+  background: transparent;
+
+  :global {
+    .van-popup__close-icon {
+      font-size: 18px;
+      color: #CCCCCC;
+    }
+  }
 }

+ 36 - 2
src/teacher/video-class/create.tsx

@@ -1,4 +1,4 @@
-import { Grid, GridItem, Icon, Sticky } from 'vant'
+import { Grid, GridItem, Icon, Popup, Sticky } from 'vant'
 import { defineComponent } from 'vue'
 import styles from './create.module.less'
 import ClassInfo from './class-info'
@@ -11,9 +11,16 @@ import education from './images/icon_education.png'
 import educationActive from './images/icon_education_active.png'
 import CreateSubmit from './create-submit'
 import ColHeader from '@/components/col-header'
+import iconQuestion from '@/teacher/practice-class/tip-model/images/icon-question.png'
+import TipModel from '../practice-class/tip-model'
 
 export default defineComponent({
   name: 'Create',
+  data() {
+    return {
+      tipStatus: false
+    }
+  },
   async created() {
     const query = this.$route.query
     createState.groupId = Number(query.groupId) || 0
@@ -121,7 +128,19 @@ export default defineComponent({
       <div class={styles['video-create']}>
         {createState.active <= 2 ? (
           <Sticky position="top" offsetTop={0} zIndex={999999}>
-            <ColHeader border={false} isFixed={false} />
+            <ColHeader
+              border={false}
+              isFixed={false}
+              v-slots={{
+                right: () => (
+                  <img
+                    src={iconQuestion}
+                    class={styles.iconQuestion}
+                    onClick={() => (this.tipStatus = true)}
+                  />
+                )
+              }}
+            />
             <Grid
               border={false}
               style={{ paddingTop: '15px' }}
@@ -189,6 +208,21 @@ export default defineComponent({
             <CreateSubmit />
           </>
         ) : null}
+
+        <Popup
+          show={this.tipStatus}
+          class={styles.tipPopup}
+          closeable
+          onClose={() => (this.tipStatus = false)}
+        >
+          <TipModel
+            onClose={() => (this.tipStatus = false)}
+            title={'什么是视频课?'}
+            content={
+              '视频课是由教师事先精心准备并录制的课程内容。教师依据教学大纲和目标,系统规划每一节视频的主题与内容,确保教学的连贯性和完整性。在录制过程中,采用专业设备如高清摄像机和录屏软件,保障视频画质清晰、音频质量优良。视频课为学生提供了极大的学习灵活性,他们可以依据个人的时间安排自由选择学习时间,不受地点限制。特别适用于系统化学习体系的内容,视频课能够帮助学生按部就班地掌握知识,实现自主高效学习。'
+            }
+          />
+        </Popup>
       </div>
     )
   }

+ 1 - 0
src/tenant/music/music-detail/new-index.tsx

@@ -344,6 +344,7 @@ export default defineComponent({
           orderType: 'MUSIC',
           goodsName: music.musicSheetName,
           actualPrice: music.musicPrice,
+          price: music.musicPrice,
           ...music
         }
       ]

+ 2 - 0
src/views/member-center/index.tsx

@@ -80,6 +80,7 @@ export default defineComponent({
         avatar: users?.heardUrl,
         id: users?.userId,
         userVip: users?.userVip,
+        discountCardFlag: users?.discountCardFlag,
         discountEndTime: users?.discountEndTime,
         discountStartTime: users?.discountStartTime
       }
@@ -319,6 +320,7 @@ export default defineComponent({
           recomUserId: state.recomUserId,
           activityBuyCount: 0, // 活动购买限制次数
           activityList: [], // 活动赠送的东西
+          discountCardFlag: userInfo.value.discountCardFlag, // 畅学卡结束时间
           discountEndTime: userInfo.value.discountEndTime, // 畅学卡结束时间
           discountStartTime: userInfo.value.discountStartTime // 畅学卡开始时间
         }

+ 1 - 3
src/views/order-detail/add-discount/index.module.less

@@ -49,10 +49,8 @@
       justify-content: space-between;
       font-size: 14px;
         color: #131415;
-        line-height: 22px;
-      .title {
         font-weight: 600;
-      }
+        line-height: 22px;
     }
 
     .center {

+ 3 - 8
src/views/order-detail/add-discount/index.tsx

@@ -62,10 +62,6 @@ export default defineComponent({
       vipType: 'DISCOUNT'
     })
 
-    // watch(() => props.orderGoodsType, () => {
-    //   console.log('watch ---- ')
-    //   productChange()
-    // })
 
     // 格式化显示
     const formatShowTime = () => {
@@ -75,7 +71,7 @@ export default defineComponent({
           (props.actualPrice * discountDetail.value.discountRate / 100)
         ))
         const users = state.user.data
-        const startTime = users.discountCardFlag ? users.discountEndTime || new Date() : new Date()
+        const startTime = users.discountCardFlag ? dayjs(users.discountEndTime || new Date()).add(1, 'day').toDate() : new Date()
         let endTime = dayjs(new Date()).format('YYYY-MM-DD')
         if (discountDetail.value.period === 'MONTH') {
           endTime = dayjs(startTime).add(1, 'month').format('YYYY-MM-DD')
@@ -122,8 +118,7 @@ export default defineComponent({
       // 判断是否需要购买畅学卡
       let status = false
       props.orderGoodsType.forEach((item: any) => {
-        
-        if (productType.includes(item)) {
+        if (productType.includes(item.orderType)) {
           status = true
         }
       })
@@ -149,7 +144,7 @@ export default defineComponent({
       const nowTime = dayjs()
       const endTime = users.discountEndTime || new Date()
       // console.log(endTime, 'endTime', users, nowTime)
-      if(dayjs(nowTime).isBefore(dayjs(endTime)) && isDisplay.value) {
+      if(users.discountCardFlag && dayjs(nowTime).isBefore(dayjs(endTime)) && isDisplay.value) {
         isDiscountApply.value = true
         onDiscountChange2()
       }

+ 189 - 110
src/views/order-detail/index.tsx

@@ -40,7 +40,6 @@ import OrderAlbum from './order-album'
 import { useRect } from '@vant/use'
 import QrcodePayment from './qrcode-payment'
 import OrderTennatAlbum from './order-tennat-album'
-import { orderType } from '@/constant'
 import OrderDiscount from './order-discount'
 import OrderVipCourse from './order-vip-course'
 import AddDiscount from './add-discount'
@@ -122,7 +121,14 @@ export default defineComponent({
     },
     countDiscountPrice() {
       const orderObject = orderStatus.orderObject
-      return orderObject.couponAmount || numberToTwoDown(orderObject.couponDiscountPrice + orderObject.discountPrice + orderObject.discountCardPrice)
+      return (
+        orderObject.couponAmount ||
+        numberToTwoDown(
+          orderObject.couponDiscountPrice +
+            orderObject.discountPrice +
+            orderObject.discountCardPrice
+        )
+      )
     }
   },
   async mounted() {
@@ -163,7 +169,11 @@ export default defineComponent({
     const orderList = orderStatus.orderObject.orderList || []
     const tempGoodsType: any = []
     orderList.forEach((order: any) => {
-      tempGoodsType.push(order.orderType)
+      tempGoodsType.push({
+        orderType: order.orderType,
+        basePrice: order.price,
+        price: order.price
+      })
     })
     this.orderGoodsType = tempGoodsType
 
@@ -171,7 +181,6 @@ export default defineComponent({
 
     this.orderAmount = orderStatus.orderObject.actualPrice || 0
     this.orderPrice = orderStatus.orderObject.actualPrice || 0
-    console.log(this.orderAmount, this.orderPrice, 'orderPrice')
 
     this.disabledCoupon = orderStatus.orderObject.orderNo ? true : false
     this.dataLoading = false
@@ -217,48 +226,49 @@ export default defineComponent({
     async getOrderPayType() {
       try {
         const orderObject = orderStatus.orderObject
-        // 单独处理其它支付类型下面用的bizId
-        let bizId =
-          orderObject.orderList.length > 0 ? orderObject.orderList[0].id : ''
-        if (orderObject.orderType === 'PRACTICE') {
-          bizId =
-            orderObject.orderList.length > 0
-              ? orderObject.orderList[0].teacherId
-              : ''
-        }
-        if (
-          orderObject.orderType === 'LIVE' ||
-          orderObject.orderType === 'VIDEO'
-        ) {
-          bizId =
-            orderObject.orderList.length > 0
-              ? orderObject.orderList[0].courseGroupId
-              : ''
-        }
-        const { data } = await request.post(
-          state.platformApi + '/userOrder/orderPayType',
-          {
-            data: {
-              goodType: orderObject.orderType,
-              bizId,
-              recomUserId: orderObject.recomUserId
-                ? orderObject.recomUserId
-                : null
-            }
-          }
-        )
-
         // 判断是否已经有支付方式了
         const paymentConfig = orderStatus.orderObject.paymentConfig || {}
         if (paymentConfig.paymentVersion && orderStatus.orderObject.orderNo) {
           this.paymentVersion = paymentConfig.paymentVersion || 'V1'
           this.paymentVendor = paymentConfig.paymentVendor
         } else {
+          // 单独处理其它支付类型下面用的bizId
+          const orderItem = orderObject.orderList.find(
+            (item: any) => item.orderType === this.orderType
+          )
+          let bizId = orderItem ? orderItem.id : ''
+          if (orderObject.orderType === 'PRACTICE') {
+            const orderItem = orderObject.orderList.find(
+              (item: any) => item.orderType === 'PRACTICE'
+            )
+            bizId = orderItem ? orderItem.teacherId : ''
+          }
+          if (
+            orderObject.orderType === 'LIVE' ||
+            orderObject.orderType === 'VIDEO'
+          ) {
+            const orderItem = orderObject.orderList.find(
+              (item: any) =>
+                item.orderType === 'VIDEO' || item.orderType === 'LIVE'
+            )
+            bizId = orderItem ? orderItem.courseGroupId : ''
+          }
+          const { data } = await request.post(
+            state.platformApi + '/userOrder/orderPayType',
+            {
+              data: {
+                goodType: orderObject.orderType,
+                bizId,
+                recomUserId: orderObject.recomUserId
+                  ? orderObject.recomUserId
+                  : null
+              }
+            }
+          )
           this.paymentVersion = data.paymentVersion || 'V1'
           this.paymentVendor = data.paymentVendor
+          this.paymentChannels = data.paymentChannels // 可以选择的支付类型
         }
-
-        this.paymentChannels = data.paymentChannels // 可以选择的支付类型
       } catch {
         //
       }
@@ -290,7 +300,7 @@ export default defineComponent({
         } else {
           this.orderInfo = orderStatus.orderObject || {}
           this.orderNo = orderStatus.orderObject.orderNo
-          const paymentChannel =  this.orderInfo.paymentConfig.paymentChannel
+          const paymentChannel = this.orderInfo.paymentConfig.paymentChannel
           // 判断是否为原生支付
           if (
             this.orderInfo.paymentVendor?.indexOf('wxpay') > -1 ||
@@ -360,13 +370,14 @@ export default defineComponent({
               : '/api-student/userOrder/executeOrder/v2'
 
           const goods: any = orderTenantInfos()
-          if(this.selectGoods && this.selectGoods.length > 0) {
+          if (this.selectGoods && this.selectGoods.length > 0) {
             goods.push(...orderTenantInfos(this.selectGoods))
           }
 
           const res = await request.post(url, {
             data: {
-              activityId: orderObject.activityId > 0 ? orderObject.activityId : null,
+              activityId:
+                orderObject.activityId > 0 ? orderObject.activityId : null,
               couponIds: orderObject.couponId,
               goodsInfos: goods,
               orderDesc: orderObject.orderDesc,
@@ -439,7 +450,6 @@ export default defineComponent({
       resestState()
     },
     onCouponSelect(item: any) {
-      console.log('onCouponSelect', item)
       let discountCount = 0
       ;(item || []).forEach((item: any) => {
         discountCount += Number(item.discountPrice)
@@ -448,8 +458,8 @@ export default defineComponent({
       const lastAmount = Number(
         numberToTwoUp(
           Number(this.orderAmount) -
-          orderStatus.orderObject.discountCardPrice -
-          Number(discountCount)
+            orderStatus.orderObject.discountCardPrice -
+            Number(discountCount)
         )
       )
       this.orderPrice = lastAmount >= 0 ? lastAmount : 0
@@ -461,33 +471,33 @@ export default defineComponent({
       orderStatus.orderObject.couponDiscountPrice = discountCount
     },
     onConfirm(val: any) {
-        // debugger
-        const config: any = this.orderInfo.paymentConfig || {}
-        this.pay_channel = val.pay_channel
-        const params = qs.stringify({
-          pay_channel: val.pay_channel,
-          wxAppId: config.wxAppId,
-          alipayAppId: config.alipayAppId,
-          paymentType: this.orderInfo.paymentType,
-          body: config.body,
-          price: config.price,
-          orderNo: config.merOrderNo,
-          userId: config.userId
-        })
-        orderStatus.orderObject.paymentConfig.paymentChannel = val.pay_channel
-        if (val.payCode === 'payResult') {
-          window.location.href =
-            window.location.origin + state.payBackPath + '#/payResult?' + params
-        } else {
-          this.qrCodeUrl =
-            window.location.origin + state.payBackPath + '#/payDefine?' + params
-          this.showQrcode = true
-          this.paymentStatus = false
-
-          setTimeout(() => {
-            this.getPaymentOrderStatus()
-          }, 300)
-        }
+      // debugger
+      const config: any = this.orderInfo.paymentConfig || {}
+      this.pay_channel = val.pay_channel
+      const params = qs.stringify({
+        pay_channel: val.pay_channel,
+        wxAppId: config.wxAppId,
+        alipayAppId: config.alipayAppId,
+        paymentType: this.orderInfo.paymentType,
+        body: config.body,
+        price: config.price,
+        orderNo: config.merOrderNo,
+        userId: config.userId
+      })
+      orderStatus.orderObject.paymentConfig.paymentChannel = val.pay_channel
+      if (val.payCode === 'payResult') {
+        window.location.href =
+          window.location.origin + state.payBackPath + '#/payResult?' + params
+      } else {
+        this.qrCodeUrl =
+          window.location.origin + state.payBackPath + '#/payDefine?' + params
+        this.showQrcode = true
+        this.paymentStatus = false
+
+        setTimeout(() => {
+          this.getPaymentOrderStatus()
+        }, 300)
+      }
     },
     // 轮询查询订单状态
     async getPaymentOrderStatus() {
@@ -564,15 +574,31 @@ export default defineComponent({
                     item={item}
                     disabled={this.disabledCoupon}
                     onPriceChange={(price: number) => {
+                      
+                      // 畅学卡变更状态时需要重新选择优惠券
+                      orderStatus.orderObject.couponId = ''
+                      orderStatus.orderObject.couponDiscountPrice = 0
                       // 重置金额
                       this.orderAmount = Number(price)
                       const lastAmount = Number(
                         numberToTwoUp(
                           Number(this.orderAmount) -
-                          Number(orderStatus.orderObject.couponDiscountPrice)
+                            Number(item.discountPrice) -
+                            Number(orderStatus.orderObject.couponDiscountPrice)
                         )
                       )
                       this.orderPrice = lastAmount >= 0 ? lastAmount : 0
+
+                      this.orderGoodsType.forEach((child: any) => {
+                        if (child.orderType === item.orderType) {
+                          child.price = Number(price)
+                        }
+                      })
+                      // 更新优惠券列表
+                      const useCouponRef: any = this.$refs.useCouponRef
+                      if (useCouponRef) {
+                        useCouponRef.resetCouponList()
+                      }
                     }}
                   />
                 )
@@ -592,15 +618,29 @@ export default defineComponent({
                     disabled={this.disabledCoupon}
                     item={item}
                     onPriceChange={(price: number) => {
+                      // 畅学卡变更状态时需要重新选择优惠券
+                      orderStatus.orderObject.couponId = ''
+                      orderStatus.orderObject.couponDiscountPrice = 0
                       // 重置金额
                       this.orderAmount = Number(price)
                       const lastAmount = Number(
                         numberToTwoUp(
                           Number(this.orderAmount) -
-                          Number(orderStatus.orderObject.couponDiscountPrice)
+                            Number(orderStatus.orderObject.couponDiscountPrice)
                         )
                       )
                       this.orderPrice = lastAmount >= 0 ? lastAmount : 0
+
+                      this.orderGoodsType.forEach((child: any) => {
+                        if (child.orderType === item.orderType) {
+                          child.price = Number(price)
+                        }
+                      })
+                      // 更新优惠券列表
+                      const useCouponRef: any = this.$refs.useCouponRef
+                      if (useCouponRef) {
+                        useCouponRef.resetCouponList()
+                      }
                     }}
                   />
                 )
@@ -626,11 +666,25 @@ export default defineComponent({
                   orderStatus.orderObject.discountCardPrice = Number(
                     item.discountPrice
                   )
+
+                  this.orderGoodsType.forEach((child: any) => {
+                    if (child.orderType !== 'DISCOUNT') {
+                      child.price = numberToTwoUp(
+                        child.price - Number(item.discountPrice)
+                      )
+                    }
+                  })
+
+                  // 更新优惠券列表
+                  const useCouponRef: any = this.$refs.useCouponRef
+                  if (useCouponRef) {
+                    useCouponRef.resetCouponList()
+                  }
                   this.orderPrice = Number(
                     numberToTwoUp(
                       Number(this.orderAmount) -
-                      Number(item.discountPrice) -
-                      Number(orderStatus.orderObject.couponDiscountPrice)
+                        Number(item.discountPrice) -
+                        Number(orderStatus.orderObject.couponDiscountPrice)
                     )
                   )
                 }}
@@ -643,7 +697,6 @@ export default defineComponent({
                   vipType: string
                 }) => {
                   // 畅学卡变更状态时需要重新选择优惠券
-                  // debugger
                   orderStatus.orderObject.couponId = ''
                   orderStatus.orderObject.couponDiscountPrice = 0
                   // 是否选中畅学卡
@@ -655,6 +708,13 @@ export default defineComponent({
                     orderStatus.orderObject.discountCardPrice = Number(
                       item.discountPrice
                     )
+                    this.orderGoodsType.forEach((child: any) => {
+                      if (child.orderType !== 'DISCOUNT') {
+                        child.price = numberToTwoUp(
+                          child.price - Number(item.discountPrice)
+                        )
+                      }
+                    })
                     if (index === -1) {
                       this.orderAmount = this.orderAmount + item.salePrice
                       this.selectGoods.push({
@@ -663,9 +723,14 @@ export default defineComponent({
                         num: 1,
                         id: item.id
                       })
-                      const typeIndex = tempType.findIndex((child: any) => child === item.vipType)
-                      if(typeIndex === -1) {
-                        tempType.push(item.vipType)
+                      const typeIndex = tempType.findIndex(
+                        (child: any) => child.orderType === item.vipType
+                      )
+                      if (typeIndex === -1) {
+                        tempType.push({
+                          orderType: item.vipType,
+                          price: item.salePrice
+                        })
                       }
                     }
                   } else {
@@ -673,29 +738,32 @@ export default defineComponent({
                     if (index !== -1) {
                       this.selectGoods.splice(index, 1)
                       this.orderAmount = this.orderAmount - item.salePrice
-
-                      const typeIndex = tempType.findIndex((child: any) => child === item.vipType)
-                      if(typeIndex !== -1) {
+                      this.orderGoodsType.forEach((child: any) => {
+                        if (child.orderType !== 'DISCOUNT') {
+                          child.price = child.basePrice
+                        }
+                      })
+                      const typeIndex = tempType.findIndex(
+                        (child: any) => child.orderType === item.vipType
+                      )
+                      if (typeIndex !== -1) {
                         tempType.splice(typeIndex, 1)
                       }
                     }
                   }
                   this.orderGoodsType = tempType
 
-                  console.log(item, this.orderAmount, '-----------------', Number(this.orderAmount) -
-                  Number(item.discountPrice) -
-                  Number(orderStatus.orderObject.couponDiscountPrice))
                   // 更新优惠券列表
-                  const useCouponRef: any =  this.$refs.useCouponRef
-                  if(useCouponRef) {
-                    console.log(useCouponRef, 'useCouponRef')
+                  const useCouponRef: any = this.$refs.useCouponRef
+                  if (useCouponRef) {
+                    // console.log(useCouponRef, 'useCouponRef')
                     useCouponRef.resetCouponList()
                   }
                   this.orderPrice = Number(
                     numberToTwoUp(
                       Number(this.orderAmount) -
-                      Number(item.discountPrice) -
-                      Number(orderStatus.orderObject.couponDiscountPrice)
+                        Number(item.discountPrice) -
+                        Number(orderStatus.orderObject.couponDiscountPrice)
                     )
                   )
                   this.$forceUpdate()
@@ -707,23 +775,32 @@ export default defineComponent({
 
             {/* 只做显示用 - 不参与逻辑 */}
             {state.platformType === 'STUDENT' &&
-              !this.dataLoading &&
-              this.disabledCoupon && orderStatus.orderObject.discountCardPrice > 0 ? <CellGroup class={['mb12', styles.cellGroup]} border={false}>
-              <Cell
-                center
-                v-slots={{
-                  title: () => (
-                    <div class={styles.timerCell}>
-                      <div class={styles.timerTitle}>
-                        <span>畅学卡优惠</span>
+            !this.dataLoading &&
+            this.disabledCoupon &&
+            orderStatus.orderObject.discountCardPrice > 0 ? (
+              <CellGroup class={['mb12', styles.cellGroup]} border={false}>
+                <Cell
+                  center
+                  v-slots={{
+                    title: () => (
+                      <div class={styles.timerCell}>
+                        <div class={styles.timerTitle}>
+                          <span>畅学卡优惠</span>
+                        </div>
+                        <div class={styles.timer}>
+                          -¥
+                          {(this as any).$filters.moneyFormat(
+                            orderStatus.orderObject.discountCardPrice
+                          )}
+                        </div>
                       </div>
-                      <div class={styles.timer}>-¥{(this as any).$filters.moneyFormat(orderStatus.orderObject.discountCardPrice)}</div>
-                    </div>
-                  )
-                }}
-              />
-            </CellGroup> : '' }
-        
+                    )
+                  }}
+                />
+              </CellGroup>
+            ) : (
+              ''
+            )}
 
             {/* 优惠券使用 */}
             {!this.dataLoading && (
@@ -754,7 +831,6 @@ export default defineComponent({
                     showHeader
                     style={{ paddingLeft: 0, paddingRight: 0 }}
                     onProtocolExists={(val: any) => {
-                      console.log(val, 'al')
                       this.exists = val
                     }}
                   />
@@ -774,7 +850,13 @@ export default defineComponent({
                         </span>
                       </div>
                     </div>
-                    {this.countDiscountPrice > 0 ? <div class={styles.isDiscountPrice}>已优惠 ¥{moneyFormat(this.countDiscountPrice)}</div> : ''}
+                    {this.countDiscountPrice > 0 ? (
+                      <div class={styles.isDiscountPrice}>
+                        已优惠 ¥{moneyFormat(this.countDiscountPrice)}
+                      </div>
+                    ) : (
+                      ''
+                    )}
                   </div>
                 </div>
                 <Button
@@ -813,9 +895,6 @@ export default defineComponent({
               onBackOut={this.onBackOut}
             />
           ) : (
-            //      this.paymentVersion = data.paymentVersion || 'V1'
-            // this.paymentVendor = data.paymentVendor
-            // this.paymentChannels = data.paymentChannels // 可以选择的支付类型
             <UrlPayment
               paymentConfig={{
                 ...orderStatus.orderObject,

+ 1 - 1
src/views/order-detail/order-album/index.module.less

@@ -1,5 +1,5 @@
 .album {
-  margin: 12px 14px;
+  margin: 12px 0;
   padding: 10px;
   background-color: var(--music-list-item-background-color);
   border-radius: 10px;

+ 2 - 2
src/views/order-detail/order-live/index.module.less

@@ -4,9 +4,9 @@
     padding: 2px 5px;
     font-size: 11px;
     font-weight: 500;
-    color: var(--van-primary);
+    color: #FF3535;
     line-height: 16px;
-    background: #e0f7f3;
+    background: #FFECE6;
     border-radius: 4px;
     vertical-align: middle;
   }

+ 11 - 5
src/views/order-detail/order-practice/index.module.less

@@ -4,9 +4,9 @@
     padding: 2px 5px;
     font-size: 11px;
     font-weight: 500;
-    color: #ff3535;
+    color: #18B99A;
     line-height: 16px;
-    background: #ffece6;
+    background: #E0F7F3;
     border-radius: 4px;
     vertical-align: middle;
   }
@@ -15,6 +15,12 @@
     font-weight: 500;
     color: #333333;
   }
+  .courseGroupName {
+    max-width: 250px;
+    display: inline-block;
+    vertical-align: middle;
+    line-height: 1.2;
+  }
 
   .collapseItem {
     :global(.van-cell) {
@@ -32,9 +38,9 @@
   }
 
   .price {
-    font-size: 16px;
-    font-weight: 500;
-    color: #ff3535;
+    font-size: 14px;
+    font-weight: 600;
+    color: #131415;
     line-height: 20px;
     i {
       font-style: normal;

+ 2 - 2
src/views/order-detail/order-practice/index.tsx

@@ -29,9 +29,9 @@ export default defineComponent({
             center
             v-slots={{
               title: () => (
-                <div class={[styles.title, 'van-ellipsis']}>
+                <div class={[styles.title]}>
                   <span class={styles.tag}>趣纠课</span>
-                  {item.courseGroupName}
+                  <span class={[styles.courseGroupName, 'van-ellipsis']}>{item.courseGroupName}</span>
                 </div>
               )
             }}

+ 5 - 2
src/views/order-detail/order-video/index.module.less

@@ -4,9 +4,9 @@
     padding: 2px 5px;
     font-size: 11px;
     font-weight: 500;
-    color: #ff8900;
+    color: #0088FF;
     line-height: 16px;
-    background: #fff0d9;
+    background: #E7F1FF;
     border-radius: 4px;
     vertical-align: middle;
   }
@@ -15,6 +15,9 @@
     font-weight: 500;
     color: #333333;
   }
+  .courseGroupName {
+    max-width: 250px;
+  }
   .titleSong {
     font-size: 14px;
     color: #ff802c;

+ 2 - 3
src/views/order-detail/order-video/index.tsx

@@ -52,7 +52,6 @@ export default defineComponent({
   },
   render() {
     const item = this.item
-    console.log(item)
     return (
       <div class={styles.videoOrder}>
         <CellGroup border={false}>
@@ -60,9 +59,9 @@ export default defineComponent({
             center
             v-slots={{
               title: () => (
-                <div class={[styles.title, 'van-ellipsis']}>
+                <div class={[styles.title]}>
                   <span class={styles.tag}>视频课</span>
-                  {item.courseGroupName}
+                  <span class={[styles.courseGroupName, 'van-ellipsis']}>{item.courseGroupName}</span>
                 </div>
               )
             }}

+ 9 - 3
src/views/order-detail/order-vip-course/index.module.less

@@ -15,6 +15,12 @@
     font-weight: 500;
     color: #333333;
   }
+  .courseGroupName {
+    max-width: 250px;
+    display: inline-block;
+    vertical-align: middle;
+    line-height: 1.2;
+  }
 
   .collapseItem {
     :global(.van-cell) {
@@ -32,9 +38,9 @@
   }
 
   .price {
-    font-size: 16px;
-    font-weight: 500;
-    color: #ff3535;
+    font-size: 14px;
+    font-weight: 600;
+    color: #131415;
     line-height: 20px;
     i {
       font-style: normal;

+ 2 - 2
src/views/order-detail/order-vip-course/index.tsx

@@ -29,9 +29,9 @@ export default defineComponent({
             center
             v-slots={{
               title: () => (
-                <div class={[styles.title, 'van-ellipsis']}>
+                <div class={[styles.title]}>
                   <span class={styles.tag}>VIP定制课</span>
-                  {item.courseGroupName}
+                  <span class={[styles.courseGroupName, 'van-ellipsis']}>{item.courseGroupName}</span>
                 </div>
               )
             }}

+ 3 - 3
src/views/order-detail/order-vip/index.tsx

@@ -60,12 +60,12 @@ export default defineComponent({
     },
     // 畅学卡 活动计算
     studyCardTimes() {
-      const { activityList, discountEndTime } = this.item
+      const { activityList, discountEndTime, discountCardFlag } = this.item
       const studyCardVals = (activityList || []).filter(item => {
         return item.goodType === 'DISCOUNT'
       })
       if (studyCardVals.length) {
-        const startTime = dayjs(discountEndTime || new Date()).toDate()
+        const startTime = discountCardFlag ? dayjs(discountEndTime || new Date()).toDate() : dayjs(new Date()).toDate()
         let endTime = startTime
         studyCardVals.map(studyCardVal => {
           if (studyCardVal.unit === 'MONTH') {
@@ -87,7 +87,7 @@ export default defineComponent({
           }
         })
         return {
-          startTime: dayjs(startTime).format('YYYY-MM-DD'),
+          startTime: discountCardFlag ? dayjs(startTime).add(1, 'day').format('YYYY-MM-DD') : dayjs(startTime).format('YYYY-MM-DD'),
           endTime: dayjs(endTime).format('YYYY-MM-DD')
         }
       } else {

+ 46 - 59
src/views/order-detail/use-coupons/choice-coupon.tsx

@@ -6,6 +6,7 @@ import Item from '@/views/coupons/item'
 import { Button, Loading } from 'vant'
 import { defineComponent, PropType } from 'vue'
 import styles from './index.module.less'
+import { couponEnum } from '.'
 
 export default defineComponent({
   name: 'choice-coupon',
@@ -14,6 +15,10 @@ export default defineComponent({
       type: Number,
       default: 0
     },
+    orderGoodsType: {
+      type: Array,
+      default: () => []
+    },
     useCoupon: {
       type: Array,
       default: () => []
@@ -63,52 +68,6 @@ export default defineComponent({
     useEventTracking('优惠券')
   },
   methods: {
-    // async getList() {
-    //   if (this.dataLoading) return
-    //   this.dataLoading = true
-    //   try {
-    //     const res = await request.post(`${state.platformApi}/couponInfo/page`, {
-    //       data: {
-    //         couponCategory: this.couponCategory,
-    //         couponType: 'FULL_DISCOUNT',
-    //         useState: 'USABLE',
-    //         page: 1,
-    //         rows: 100
-    //       }
-    //     })
-    //     this.dataLoading = false
-    //     const result = res.data || {}
-    //     // 处理重复请求数据
-    //     if (this.list.length > 0 && result.pageNo === 1) return
-    //     this.list = result.rows || []
-
-    //     // 处理可用优惠券是否支付使用
-    //     this.list.forEach((item: any) => {
-    //       item.checked = false
-    //       // 如果使用金额大于订单金额则优惠券不可用
-    //       if (item.useLimit > this.orderAmount) {
-    //         item.disabled = true
-    //       } else {
-    //         item.disabled = false
-    //       }
-
-    //       // 处理显示已选择的优惠券
-    //       this.useCoupon.forEach((coupon: any) => {
-    //         if (item.couponIssueId === coupon.couponIssueId) {
-    //           item.checked = true
-    //         }
-    //       })
-    //     })
-    //     // 初始化排序
-    //     const canUsable = this.list.filter((list: any) => !list.disabled)
-    //     const canUsed = this.list.filter((list: any) => list.disabled)
-    //     this.list = [...canUsable, ...canUsed]
-
-    //     this.calcCoupon()
-    //   } catch {
-    //     //
-    //   }
-    // },
     onSubmit() {
       // 返回选中的优惠券
       this.$emit(
@@ -125,30 +84,58 @@ export default defineComponent({
       this.calcCoupon()
     },
     calcCoupon() {
-      // 计算优惠券
       // 已使用的优惠券
       const useList = this.list.filter((list: any) => list.checked)
-      const limitCount = useList.map((list: any) => {
-        return Number(list.useLimit || 0)
-      })
-      const usePrice =
-        limitCount.length > 0
-          ? limitCount.reduce((sum: any, list: any) => {
-              return sum + list
-            })
-          : 0
-      // 使用优惠券后,可判断的金额
-      const useLastAmount = this.orderAmount - usePrice
       if(this.usedLength === 'SINGLE') {
+        let usedMap: any = new Map()
+        useList.forEach((item: any) => {
+          const price = usedMap.get(item.couponCategory)
+          usedMap.set(item.couponCategory, (price || 0) + item.useLimit)
+        })
+
+        usedMap.values()
         // 判断使用优惠券之后还有没有其它优惠券可用
         this.list.forEach((item: any) => {
-          if (!item.checked && (useList.length > 0  || Number(item.useLimit) > useLastAmount)) {
+          let disabled = true
+          if(item.couponCategory === 'UNIVERSAL') {
+            // 订单总金额 
+            let allAmount = 0
+            this.orderGoodsType.forEach((goods: any) => {
+              allAmount += goods.price
+            })
+            // 已使用优惠券总金额
+            let useCouponMoney = 0
+            if(usedMap.size > 0) {
+              useCouponMoney = usedMap.values().reduce((a: any, b: any) => {
+                return a + b
+             })
+            }
+            disabled = item.useLimit > allAmount - useCouponMoney
+          } else {
+            const disItem: any = this.orderGoodsType.find((goods: any) => couponEnum[goods.orderType] === item.couponCategory)
+            const useLastAmount = disItem ? disItem.price - (usedMap.get(item.couponCategory) || 0) : 0
+            disabled = Number(item.useLimit) > useLastAmount
+          }
+          if (!item.checked && (useList.length > 0  || disabled)) {
             item.disabled = true
           } else {
             item.disabled = false
           }
         })
+        usedMap = null
       } else {
+        // 计算优惠券
+        const limitCount = useList.map((list: any) => {
+          return Number(list.useLimit || 0)
+        })
+        const usePrice =
+          limitCount.length > 0
+            ? limitCount.reduce((sum: any, list: any) => {
+                return sum + list
+              })
+            : 0
+        // 使用优惠券后,可判断的金额
+        const useLastAmount = this.orderAmount - usePrice
         // 判断使用优惠券之后还有没有其它优惠券可用
         this.list.forEach((item: any) => {
           if (Number(item.useLimit) > useLastAmount && !item.checked) {

+ 17 - 12
src/views/order-detail/use-coupons/index.tsx

@@ -91,8 +91,8 @@ export default defineComponent({
       // 如果订单类型不在优惠券类型里面,则默认查询通用券
       const temp: any[] = []
       this.orderGoodsType.forEach((item: any) => {
-        if(couponEnum[item]) {
-          temp.push(couponEnum[item])
+        if(couponEnum[item.orderType]) {
+          temp.push(couponEnum[item.orderType])
         }
       })
       return  temp.join(',') + (temp.length ? ',UNIVERSAL' : 'UNIVERSAL')
@@ -109,14 +109,9 @@ export default defineComponent({
         }
       });
       this.useCouponList = selectCouponList
-    },
-    orderGoodsType(val: any) {
-      console.log(val, '121221')
-      this.getList()
     }
   },
   mounted() {
-    // this.getUseableCoupon()
     this.getList()
   },
   methods: {
@@ -147,12 +142,21 @@ export default defineComponent({
         // 处理可用优惠券是否支付使用
         this.list.forEach((item: any) => {
           item.checked = false
-          // 如果使用金额大于订单金额则优惠券不可用
-          if (item.useLimit > this.orderAmount) {
-            item.disabled = true
-            console.log(this.orderAmount, item.useLimit)
+          if(item.couponCategory === 'UNIVERSAL') {
+            let allAmount = 0
+            this.orderGoodsType.forEach((goods: any) => {
+              allAmount += Number(goods.price)
+            })
+            item.disabled = item.useLimit <= allAmount ? false : true
           } else {
-            item.disabled = false
+            const disItem: any = this.orderGoodsType.find((goods: any) => couponEnum[goods.orderType] === item.couponCategory)
+            const useLastAmount = disItem.price || 0
+            // 如果使用金额大于订单金额则优惠券不可用
+            if (item.useLimit > useLastAmount) {
+              item.disabled = true
+            } else {
+              item.disabled = false
+            }
           }
         })
 
@@ -245,6 +249,7 @@ export default defineComponent({
               couponCategory={this.couponCategory}
               useCoupon={this.useCouponList}
               orderAmount={this.orderAmount}
+              orderGoodsType={this.orderGoodsType}
               couponList={this.list}
               onClose={() => (this.popupStatus = false)}
               onSubmit={(item: any) => this.onSubmit(item)}

+ 1 - 1
src/views/protocol/privacy.tsx

@@ -23,7 +23,7 @@ export default defineComponent({
   render() {
     return (
       <>
-        <ColHeader />
+        <ColHeader hideHeader={this.showHeader ? false : true} />
         <div class={styles.container}>
           <h2 style={{ textAlign: 'center' }}>《{this.name}隐私协议》</h2>
           版本更新时间 <br />

+ 2 - 2
src/views/protocol/register.tsx

@@ -20,7 +20,7 @@ export default defineComponent({
   render() {
     return (
       <>
-        <ColHeader />
+        <ColHeader hideHeader={this.showHeader ? false : true} />
         <div class={styles.container}>
           欢迎来到酷乐秀,酷乐秀 隶属于武汉酷乐秀网络科技有限公司。我们开发并运营的程序有:酷乐秀、酷乐秀学院,以上app均符合遵守本协议。以下协议中所指的酷乐秀,代表以上程序中的任意程序。
           <br />
@@ -37,7 +37,7 @@ export default defineComponent({
           <br />
           4.酷乐秀是一个信息分享、传播及获取的平台,用户通过酷乐秀发表的信息为公开的信息,其他第三方均可以通过酷乐秀获取用户发表的信息,用户对任何信息的发表即认可该信息为公开的信息,并单独对此行为承担法律责任;任何用户不愿被其他第三人获知的信息都不应该在酷乐秀上进行发表。
           <br />
-          5.为了更好地维护乐谱,酷乐秀会将认证为“达人”的用户上传的高质量乐谱设置成VIP。
+          5.为了更好地维护乐谱,酷乐秀会将认证为“老师”的用户上传的高质量乐谱设置成VIP。
           <br />
           6.您的上传行为代表您同意您上传的作品在本站内的公开发布与传播并授权本站使用您上传的作品。任何第三方的转载行为与本站无关。
           <br />

+ 5 - 0
src/views/shop-mall/components/TheHomeHeader/index.module.less

@@ -7,6 +7,11 @@
   .content {
     display: flex;
     align-items: center;
+    .iconBack {
+      width: 19px;
+      height: 19px;
+      margin-right: 6px;
+    }
     .mall {
       width: 72px;
       height: 28px;

+ 12 - 0
src/views/shop-mall/components/TheHomeHeader/index.tsx

@@ -1,6 +1,7 @@
 import { defineComponent, nextTick, onMounted, ref } from 'vue'
 import styles from './index.module.less'
 
+import iconBack from '../../images/icon-back.png'
 import IconMall from '../../images/icon-mall.png'
 import IconSearch from '../../images/icon-search.png'
 import IconCart from '../../images/icon-cart.png'
@@ -13,11 +14,14 @@ import { cartCount } from '../../shop-mall'
 import { useRect } from '@vant/use'
 import { state } from '@/state'
 import ColHeader from '@/components/col-header'
+import { browser } from '@/helpers/utils'
+import { useRouter } from 'vue-router'
 
 export default defineComponent({
   name: 'TheHomeHeader',
   emits: ['cart', 'more', 'search', 'headerDom'],
   setup(props, { emit }) {
+    const router = useRouter()
     const navBarHeight = ref(sessionStorage.getItem('navHeight'))
     const homeHeaderDom = ref(null)
     const init = () => {
@@ -71,6 +75,14 @@ export default defineComponent({
         )}
 
         <div class={styles.content}>
+          {state.sourcType !== 'kt' && state.platformType !== 'TEACHER' ? <img class={styles.iconBack} src={iconBack} onClick={() => {
+            if (browser().isApp) {
+              postMessage({ api: 'goBack' })
+            } else {
+              router.back()
+            }
+          }} />: ''}
+          
           <img class={styles.mall} src={IconMall} />
           <div class={styles.searchBox} onClick={() => emit('search')}>
             <img class={styles.iconSearch} src={IconSearch} />

BIN
src/views/shop-mall/images/icon-back.png


+ 16 - 1
src/views/trade/trade-detail.module.less

@@ -86,12 +86,27 @@
     }
   }
 
+  .goodsItem {
+    :global {
+      .van-cell__title {
+        flex-basis: 40%;
+      }
+    }
+  }
+
   .tradeLogo {
+    flex-shrink: 0;
     width: 35px;
     height: 35px;
-    border-radius: 50%;
+    // margin-bottom: 10px;
+   
     margin-right: 10px;
     overflow: hidden;
+    :global {
+      img {
+        border-radius: 50%;
+      }
+    }
   }
 
   .title,

+ 32 - 27
src/views/trade/trade-detail.tsx

@@ -59,28 +59,24 @@ export default defineComponent({
   },
   computed: {
     orderDetailList() {
-
       const result: any = this.result
       const orderDetailList = result.orderDetailList || []
-
       orderDetailList.forEach((item: any) => {
         let tempPrice = item?.expectPrice || item.actualPrice
         if (item?.couponAmount) {
-            tempPrice = Number(
-              (
-                (tempPrice - result.couponAmount) / item.goodNum
-              ).toFixed(2)
-            )
+          tempPrice = Number((tempPrice / item.goodNum).toFixed(2))
         } else {
-          tempPrice = Number(
-            tempPrice / item.goodNum
-            ).toFixed(2)
+          tempPrice = Number(tempPrice / item.goodNum).toFixed(2)
         }
 
         item.showPrice = tempPrice || 0
       })
 
       return orderDetailList || []
+    },
+    discountAllPrice() {
+      const result: any = this.result
+      return (result.cardDiscountPrice + result.discountPrice).toFixed(2)
     }
   },
   async mounted() {
@@ -88,7 +84,6 @@ export default defineComponent({
       this.loading = true
       this.orderNo && (await this.getOrder())
       this.loading = false
-
       this.type === 'ING' && this.path !== 'tradeRecord' && this.interval()
     }, 0)
   },
@@ -206,12 +201,13 @@ export default defineComponent({
                 <Cell
                   border={false}
                   style={{ paddingBottom: '15px' }}
+                  class={styles.goodsItem}
                   v-slots={{
                     icon: () => (
                       <Image
                         class={styles.tradeLogo}
                         src={item.goodUrl || iconTeacher}
-                        fit="cover"
+                        fit="contain"
                       />
                     ),
                     title: () => (
@@ -224,13 +220,15 @@ export default defineComponent({
                     ),
                     default: () => (
                       <div class={styles.content}>
-                        {item.giftFlag ? <span class={styles.price}>
-                          赠送
-                        </span>: <span class={styles.price}>
-                          ¥
-                          {(this as any).$filters.moneyFormat(item.showPrice)}
-                        </span>}
-                        
+                        {item.giftFlag ? (
+                          <span class={styles.price}>赠送</span>
+                        ) : (
+                          <span class={styles.price}>
+                            ¥
+                            {(this as any).$filters.moneyFormat(item.showPrice)}
+                          </span>
+                        )}
+
                         <span class={styles.num}>x{item.goodNum}</span>
                       </div>
                     )
@@ -238,14 +236,21 @@ export default defineComponent({
                 />
               ))}
 
-              {this.result.couponAmount > 0 && <Row class={styles.optionRow}>
-                <Col span="8" offset={1}>
-                  优惠金额:
-                </Col>
-                <Col span="14">¥{(this as any).$filters.moneyFormat(this.result.couponAmount)}</Col>
-                <Col span="1"> </Col>
-              </Row>}
-              
+              {this.discountAllPrice > 0 && (
+                <Row class={styles.optionRow}>
+                  <Col span="8" offset={1}>
+                    优惠金额:
+                  </Col>
+                  <Col span="14">
+                    ¥
+                    {(this as any).$filters.moneyFormat(
+                      this.discountAllPrice
+                    )}
+                  </Col>
+                  <Col span="1"> </Col>
+                </Row>
+              )}
+
               <Row class={styles.optionRow}>
                 <Col span="8" offset={1}>
                   订单号: