lex-xin 4 місяців тому
батько
коміт
7e98b8c6d9
69 змінених файлів з 661 додано та 247 видалено
  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. 4 0
      src/components/col-header/index.tsx
  6. BIN
      src/components/col-result/images/emptyBook.png
  7. 1 0
      src/components/col-result/index.module.less
  8. 4 0
      src/components/col-result/index.tsx
  9. 1 1
      src/router/routes-teacher.ts
  10. 19 3
      src/student/discount-card/index.module.less
  11. 2 35
      src/student/live-class/live-detail.tsx
  12. 1 0
      src/student/share-active/track-review-activity/index.tsx
  13. 8 0
      src/student/teacher-dependent/components/practice.module.less
  14. 14 10
      src/student/teacher-dependent/components/practice.tsx
  15. 8 0
      src/student/teacher-dependent/components/vip.module.less
  16. 14 10
      src/student/teacher-dependent/components/vip.tsx
  17. BIN
      src/student/teacher-dependent/images/icon-add-star.png
  18. BIN
      src/student/teacher-dependent/images/icon-small-live.png
  19. 5 6
      src/student/teacher-dependent/model/teacher-header.module.less
  20. 2 2
      src/student/teacher-dependent/model/teacher-header.tsx
  21. 1 1
      src/student/teacher-dependent/teacher-elegant.tsx
  22. 1 1
      src/student/teacher-dependent/teacher-home.module.less
  23. 5 1
      src/student/teacher-dependent/teacher-home.tsx
  24. 5 0
      src/student/teacher-dependent/teacher-style/index.module.less
  25. 4 1
      src/student/trade/tradeOrder.ts
  26. 1 0
      src/student/video-class/video-class-detail.tsx
  27. 1 0
      src/student/video-class/video-detail.tsx
  28. 26 3
      src/teacher/income-consus/echarts.ts
  29. 6 0
      src/teacher/income-consus/index.module.less
  30. 24 1
      src/teacher/income-consus/index.tsx
  31. BIN
      src/teacher/layout/images/icon_checkbox.png
  32. 9 0
      src/teacher/layout/login-cert.module.less
  33. 25 22
      src/teacher/layout/login-cert.tsx
  34. 15 3
      src/teacher/live-class/create-components/detail.tsx
  35. 16 0
      src/teacher/live-class/create.module.less
  36. 32 2
      src/teacher/live-class/create.tsx
  37. 1 1
      src/teacher/open-live/index.tsx
  38. 1 0
      src/teacher/piano-room/account-recharge-timer/index.tsx
  39. 43 11
      src/teacher/practice-class/practice-setting.module.less
  40. 117 61
      src/teacher/practice-class/practice-setting.tsx
  41. 2 1
      src/teacher/practice-class/timer/timer.module.less
  42. 1 1
      src/teacher/practice-class/timer/timer.tsx
  43. BIN
      src/teacher/practice-class/tip-model/images/close.png
  44. BIN
      src/teacher/practice-class/tip-model/images/icon-question.png
  45. BIN
      src/teacher/practice-class/tip-model/images/top_bg.png
  46. 35 0
      src/teacher/practice-class/tip-model/index.module.less
  47. 33 0
      src/teacher/practice-class/tip-model/index.tsx
  48. 2 2
      src/teacher/teacher-dependent/model/teacher-header.tsx
  49. 17 0
      src/teacher/video-class/create.module.less
  50. 36 2
      src/teacher/video-class/create.tsx
  51. 1 0
      src/tenant/music/music-detail/new-index.tsx
  52. 1 3
      src/views/order-detail/add-discount/index.module.less
  53. 2 7
      src/views/order-detail/add-discount/index.tsx
  54. 12 10
      src/views/order-detail/index.tsx
  55. 2 2
      src/views/order-detail/order-live/index.module.less
  56. 11 5
      src/views/order-detail/order-practice/index.module.less
  57. 2 2
      src/views/order-detail/order-practice/index.tsx
  58. 5 2
      src/views/order-detail/order-video/index.module.less
  59. 2 3
      src/views/order-detail/order-video/index.tsx
  60. 9 3
      src/views/order-detail/order-vip-course/index.module.less
  61. 2 2
      src/views/order-detail/order-vip-course/index.tsx
  62. 1 1
      src/views/order-detail/order-vip/index.module.less
  63. 25 12
      src/views/order-detail/use-coupons/choice-coupon.tsx
  64. 6 9
      src/views/order-detail/use-coupons/index.tsx
  65. 5 0
      src/views/shop-mall/components/TheHomeHeader/index.module.less
  66. 12 0
      src/views/shop-mall/components/TheHomeHeader/index.tsx
  67. BIN
      src/views/shop-mall/images/icon-back.png
  68. 9 0
      src/views/trade/trade-detail.module.less
  69. 2 1
      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>
               ),

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

@@ -122,6 +122,10 @@ export default defineComponent({
       !browser().isApp && callBack && callBack()
     },
     onClickLeft() {
+      postMessage({
+        api: 'setStatusBarTextColor',
+        content: { statusBarTextColor: false }
+      })
       if (browser().isApp) {
         postMessage({ api: 'goBack' })
       } else {

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


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

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

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

@@ -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

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

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

+ 19 - 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;
@@ -221,7 +237,7 @@
 
 .btnGroup {
   background-color: #fff;
-  padding: 10px 30px 30px;
+  padding: 10px 30px 23px;
 
   .submitBtn {
     background: url('./images/btn-bg.png') no-repeat center;

+ 2 - 35
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
@@ -212,39 +211,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(() => {
@@ -266,6 +232,7 @@ export default defineComponent({
               courseGroupId: live.courseGroupId,
               courseGroupName: live.courseGroupName,
               coursePrice: live.coursePrice,
+              price: live.coursePrice,
               teacherName: live.userName || `游客${live.teacherId || ''}`,
               teacherId: live.teacherId,
               avatar: live.avatar,

+ 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
             }
           ]

+ 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


+ 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;
 

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

@@ -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{

+ 5 - 1
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

+ 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 {

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

@@ -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,
@@ -222,6 +224,7 @@ export const formatOrderDetail = async (item: any, amount?: IAmount) => {
     case 'DISCOUNT':
       {
         const users = state.user.data || {}
+        const endTime = users.discountCardFlag ? users.discountEndTime : new Date()
         tempList = {
           orderType: item.goodType,
           goodName: item.goodName,
@@ -230,7 +233,7 @@ export const formatOrderDetail = async (item: any, amount?: IAmount) => {
           title: item.goodName || '',
           // 判断是否有优惠金额
           price: item.expectPrice,
-          ...discountTimer(users.discountEndTime, item.period)
+          ...discountTimer(endTime, item.period)
         }
       }
       break

+ 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 || ''}`,

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

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

+ 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;
   }
 }

+ 25 - 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
     }
   },
@@ -98,12 +97,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 +147,7 @@ export default defineComponent({
                         </span>
                       ) : (
                         <CountDown
-                          ref={this.countDownRef}
+                          ref='countDownRef'
                           auto-start={false}
                           time={this.countDownTime}
                           onFinish={this.onFinished}
@@ -175,22 +176,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>
     )
   }

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

@@ -61,7 +61,7 @@ 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
         }
       ]

+ 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>
+    )
+  }
+})

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

@@ -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
         }
       ]

+ 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 {

+ 2 - 7
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 = () => {
@@ -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()
       }

+ 12 - 10
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'
@@ -162,8 +161,12 @@ export default defineComponent({
     // 初始化所有商品的类型
     const orderList = orderStatus.orderObject.orderList || []
     const tempGoodsType: any = []
+    console.log(orderList, 'orderList, ')
     orderList.forEach((order: any) => {
-      tempGoodsType.push(order.orderType)
+      tempGoodsType.push({
+        orderType: order.orderType,
+        price: order.price
+      })
     })
     this.orderGoodsType = tempGoodsType
 
@@ -663,9 +666,12 @@ export default defineComponent({
                         num: 1,
                         id: item.id
                       })
-                      const typeIndex = tempType.findIndex((child: any) => child === item.vipType)
+                      const typeIndex = tempType.findIndex((child: any) => child.orderType === item.vipType)
                       if(typeIndex === -1) {
-                        tempType.push(item.vipType)
+                        tempType.push({
+                          orderType: item.vipType,
+                          price: item.salePrice
+                        })
                       }
                     }
                   } else {
@@ -674,7 +680,7 @@ export default defineComponent({
                       this.selectGoods.splice(index, 1)
                       this.orderAmount = this.orderAmount - item.salePrice
 
-                      const typeIndex = tempType.findIndex((child: any) => child === item.vipType)
+                      const typeIndex = tempType.findIndex((child: any) => child.orderType === item.vipType)
                       if(typeIndex !== -1) {
                         tempType.splice(typeIndex, 1)
                       }
@@ -682,13 +688,10 @@ export default defineComponent({
                   }
                   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')
+                    // console.log(useCouponRef, 'useCouponRef')
                     useCouponRef.resetCouponList()
                   }
                   this.orderPrice = Number(
@@ -754,7 +757,6 @@ export default defineComponent({
                     showHeader
                     style={{ paddingLeft: 0, paddingRight: 0 }}
                     onProtocolExists={(val: any) => {
-                      console.log(val, 'al')
                       this.exists = val
                     }}
                   />

+ 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>
               )
             }}

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

@@ -25,7 +25,7 @@
 
 .price {
   padding-top: 8px;
-  font-size: 25px;
+  font-size: 23px;
   font-family: DINAlternate-Bold, DINAlternate;
   font-weight: bold;
   color: #EF2F56;

+ 25 - 12
src/views/order-detail/use-coupons/choice-coupon.tsx

@@ -14,6 +14,10 @@ export default defineComponent({
       type: Number,
       default: 0
     },
+    orderGoodsType: {
+      type: Array,
+      default: () => []
+    },
     useCoupon: {
       type: Array,
       default: () => []
@@ -125,30 +129,39 @@ 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)
+        })
+
         // 判断使用优惠券之后还有没有其它优惠券可用
         this.list.forEach((item: any) => {
+          const disItem: any = this.orderGoodsType.find((goods: any) => goods.orderType === item.couponCategory)
+          const useLastAmount = disItem.price - (usedMap.get(item.couponCategory) || 0)
           if (!item.checked && (useList.length > 0  || Number(item.useLimit) > useLastAmount)) {
             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) {

+ 6 - 9
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: {
@@ -146,11 +141,12 @@ export default defineComponent({
 
         // 处理可用优惠券是否支付使用
         this.list.forEach((item: any) => {
+          const disItem: any = this.orderGoodsType.find((goods: any) => goods.orderType === item.couponCategory)
+          const useLastAmount = disItem.price || 0
           item.checked = false
           // 如果使用金额大于订单金额则优惠券不可用
-          if (item.useLimit > this.orderAmount) {
+          if (item.useLimit > useLastAmount) {
             item.disabled = true
-            console.log(this.orderAmount, item.useLimit)
           } else {
             item.disabled = false
           }
@@ -245,6 +241,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)}

+ 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


+ 9 - 0
src/views/trade/trade-detail.module.less

@@ -86,7 +86,16 @@
     }
   }
 
+  .goodsItem {
+    :global {
+      .van-cell__title {
+        flex-basis: 40%;
+      }
+    }
+  }
+
   .tradeLogo {
+    flex-shrink: 0;
     width: 35px;
     height: 35px;
     border-radius: 50%;

+ 2 - 1
src/views/trade/trade-detail.tsx

@@ -206,12 +206,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: () => (