Bladeren bron

Merge branch 'master' of http://git.dayaedu.com/lex/orchestra-app

skyblued 2 jaren geleden
bovenliggende
commit
cec5d96d3d
36 gewijzigde bestanden met toevoegingen van 443 en 397 verwijderingen
  1. 34 32
      src/router/routes-student.ts
  2. 2 14
      src/school/approval-manage/course-adjust.tsx
  3. 8 3
      src/school/manage-teacher/index.tsx
  4. 3 22
      src/school/mass-message/create-message.tsx
  5. 1 1
      src/school/mass-message/select-sned.tsx
  6. 17 11
      src/school/orchestra/compontent/information.tsx
  7. 19 12
      src/school/orchestra/compontent/photo-detail.tsx
  8. 2 1
      src/school/orchestra/compontent/photo.module.less
  9. 24 14
      src/school/orchestra/compontent/photo.tsx
  10. 1 1
      src/school/orchestra/modal/add-information.tsx
  11. 7 2
      src/school/orchestra/orchestra-detail.tsx
  12. 5 0
      src/school/orchestra/orchestra-information.module.less
  13. 17 11
      src/school/orchestra/orchestra-information.tsx
  14. 1 8
      src/school/train-planning/component/course-preview/index.tsx
  15. 1 1
      src/school/train-planning/component/practice/index.tsx
  16. 1 1
      src/school/train-planning/component/standard/index.tsx
  17. 1 1
      src/school/train-planning/component/train-content/index.tsx
  18. 1 8
      src/school/train-planning/modal/class-list/index.tsx
  19. 0 1
      src/school/train-planning/modal/timer/index.tsx
  20. 3 4
      src/student/music-group/layout/auth.tsx
  21. 2 2
      src/student/music-group/layout/login.tsx
  22. 4 5
      src/student/music-group/pre-apply/component/apply.tsx
  23. 2 2
      src/student/music-group/pre-apply/component/order.tsx
  24. 1 1
      src/student/music-group/pre-apply/component/payment.tsx
  25. 50 0
      src/student/music-group/pre-apply/component/user-auth.module.less
  26. 100 0
      src/student/music-group/pre-apply/component/user-auth.tsx
  27. 21 2
      src/student/music-group/pre-apply/index.tsx
  28. 30 1
      src/student/music-group/pre-apply/order-detail.tsx
  29. 43 18
      src/student/my-orchestra/apply-withdrawal.tsx
  30. 1 1
      src/student/my-orchestra/index.module.less
  31. 32 19
      src/student/my-orchestra/index.tsx
  32. 1 1
      src/student/my-orchestra/photo-detail.tsx
  33. 2 2
      src/student/payment-result/index.tsx
  34. 6 2
      src/styles/index.less
  35. 0 45
      src/views/adapay/userAuth/index.module.less
  36. 0 148
      src/views/adapay/userAuth/index.tsx

+ 34 - 32
src/router/routes-student.ts

@@ -91,10 +91,43 @@ export default [
         meta: {
           title: '申请退团'
         }
+      },
+      {
+        path: '/attendance-rule',
+        name: 'attendance-rule',
+        component: () => import('@/views/attendance-rule/index'),
+        meta: {
+          title: '考勤规则'
+        }
+      },
+      {
+        path: '/ranking-list',
+        name: 'ranking-list',
+        component: () => import('@/student/ranking-list/index'),
+        meta: {
+          title: '排行榜'
+        }
+      },
+      {
+        path: '/exercise-record',
+        name: 'exercise-record',
+        component: () => import('@/views/exercise-record'),
+        meta: {
+          title: '练习记录'
+        }
+      },
+      {
+        path: '/exercis-detail',
+        name: 'exercis-detail',
+        component: () => import('@/views/exercise-record/exercis-detail'),
+        meta: {
+          title: '练习统计'
+        }
       }
     ]
   },
   {
+    // 只针对乐团报名
     path: '/msuicGroup',
     component: MusicAuth,
     children: [
@@ -137,39 +170,8 @@ export default [
         meta: {
           title: '收货地址'
         }
-      },
-      {
-        path: '/attendance-rule',
-        name: 'attendance-rule',
-        component: () => import('@/views/attendance-rule/index'),
-        meta: {
-          title: '考勤规则'
-        }
-      },
-      {
-        path: '/ranking-list',
-        name: 'ranking-list',
-        component: () => import('@/student/ranking-list/index'),
-        meta: {
-          title: '排行榜'
-        }
-      },
-      {
-        path: '/exercise-record',
-        name: 'exercise-record',
-        component: () => import('@/views/exercise-record'),
-        meta: {
-          title: '练习记录'
-        }
-      },
-      {
-        path: '/exercis-detail',
-        name: 'exercis-detail',
-        component: () => import('@/views/exercise-record/exercis-detail'),
-        meta: {
-          title: '练习统计'
-        }
       }
+      // 非乐团报名的路由不要放在这里,放到上面去
     ]
   },
 

+ 2 - 14
src/school/approval-manage/course-adjust.tsx

@@ -202,22 +202,10 @@ export default defineComponent({
           </div>
           <OSticky position="bottom">
             <div class={['btnGroup btnMore']}>
-              <Button
-                color="#ccc"
-                size="large"
-                round
-                class={styles.unpassBtn}
-                onClick={() => reset()}
-              >
+              <Button color="#ccc" round class={styles.unpassBtn} onClick={() => reset()}>
                 取消
               </Button>
-              <Button
-                color="#FF8057"
-                size="large"
-                round
-                class={styles.unpassBtn}
-                onClick={() => submit()}
-              >
+              <Button color="#FF8057" round class={styles.unpassBtn} onClick={() => submit()}>
                 确认调整
               </Button>
             </div>

+ 8 - 3
src/school/manage-teacher/index.tsx

@@ -52,7 +52,8 @@ export default defineComponent({
         status: null,
         page: 1,
         rows: 20
-      }
+      },
+      isClick: false
     })
 
     // 获取当前用户所在的学校
@@ -75,6 +76,8 @@ export default defineComponent({
 
     const getList = async () => {
       try {
+        if (form.isClick) return
+        form.isClick = true
         const res = await request.post('/api-school/schoolStaff/page', {
           data: {
             ...form.params,
@@ -91,9 +94,11 @@ export default defineComponent({
         form.listState.finished = result.current >= result.pages
         form.params.page = result.current + 1
         form.listState.dataShow = form.list.length > 0
+        form.isClick = false
       } catch {
         form.listState.dataShow = false
         form.listState.finished = true
+        form.isClick = false
       }
     }
 
@@ -219,7 +224,7 @@ export default defineComponent({
     }
 
     onMounted(() => {
-      console.log(state.user.data.id, '1212')
+      // console.log(state.user.data.id, '1212')
       getDetail(state.user.data.id)
 
       getList()
@@ -292,7 +297,7 @@ export default defineComponent({
           v-model:show={form.showQrcode}
           position="bottom"
           style={{ background: 'transparent' }}
-          safeAreaInsetBottom={true}
+          // safeAreaInsetBottom={true}
         >
           <div class={styles.codeContainer}>
             <div class={styles.codeImg} id="preview-container">

+ 3 - 22
src/school/mass-message/create-message.tsx

@@ -410,14 +410,7 @@ export default defineComponent({
         <OSticky position="bottom">
           {forms.type === 'ADD' && (
             <div class={'btnGroup'}>
-              <Button
-                round
-                block
-                type="primary"
-                size="large"
-                onClick={onSubmit}
-                disabled={forms.sureLoading}
-              >
+              <Button round block type="primary" onClick={onSubmit} disabled={forms.sureLoading}>
                 确认发送
               </Button>
             </div>
@@ -425,22 +418,10 @@ export default defineComponent({
 
           {forms.type === 'WAIT' && (
             <div class={['btnGroup', 'btnMore']}>
-              <Button
-                round
-                type="primary"
-                size="large"
-                onClick={onSubmit}
-                disabled={forms.updateLoading}
-              >
+              <Button round type="primary" onClick={onSubmit} disabled={forms.updateLoading}>
                 修改
               </Button>
-              <Button
-                round
-                color="#64A9FF"
-                size="large"
-                onClick={onClose}
-                disabled={forms.closeLoading}
-              >
+              <Button round color="#64A9FF" onClick={onClose} disabled={forms.closeLoading}>
                 撤销
               </Button>
             </div>

+ 1 - 1
src/school/mass-message/select-sned.tsx

@@ -87,7 +87,7 @@ export default defineComponent({
 
         <OSticky position="bottom">
           <div class={'btnGroup'}>
-            <Button round block type="primary" size="large" onClick={onSubmit}>
+            <Button round block type="primary" onClick={onSubmit}>
               确认
             </Button>
           </div>

+ 17 - 11
src/school/orchestra/compontent/information.tsx

@@ -93,8 +93,14 @@ export default defineComponent({
 
     const getDetails = async () => {
       try {
-        const { data } = await request.get('/api-school/orchestra/detail/' + route.query.id)
+        const { data } = await request.get('/api-school/classGroup/statistics', {
+          params: {
+            orchestraId: route.query.id
+          }
+        })
         state.orchestraInfo = data || {}
+
+        initNumCountUp()
       } catch {
         //
       }
@@ -142,17 +148,17 @@ export default defineComponent({
     const initNumCountUp = () => {
       nextTick(() => {
         // 在读学生
-        new CountUp('currentStudentNum', Math.random() * 1000).start()
-        new CountUp('time1', Math.random() * 100).start()
-        new CountUp('time2', Math.random() * 100).start()
-        new CountUp('time3', Math.random() * 100).start()
+        const orchestraInfo = state.orchestraInfo
+        new CountUp('currentStudentNum', orchestraInfo.studentNum || 0).start()
+        new CountUp('time1', orchestraInfo.attendanceRate || 0).start()
+        new CountUp('time2', orchestraInfo.homeworkRate || 0).start()
+        new CountUp('time3', orchestraInfo.homeworkQualifiedRate || 0).start()
       })
     }
 
     onMounted(() => {
       getDetails()
       getList()
-      initNumCountUp()
     })
 
     return () => (
@@ -183,26 +189,26 @@ export default defineComponent({
         <Grid border={false} class={styles.gridContainer}>
           <GridItem>
             <p class={[styles.title, styles.red]}>
-              <span id="currentStudentNum">0</span>
+              <span id="currentStudentNum">{state.orchestraInfo.studentNum || 0}</span>
               <i>名</i>
             </p>
             <p class={styles.name}>在读学生</p>
           </GridItem>
           <GridItem>
             <p class={[styles.title, styles.red]}>
-              <span id="time1">0</span>%
+              <span id="time1">{state.orchestraInfo.attendanceRate || 0}</span>%
             </p>
             <p class={styles.name}>到课率</p>
           </GridItem>
           <GridItem>
             <p class={[styles.title, styles.red]}>
-              <span id="time2">0</span>%
+              <span id="time2">{state.orchestraInfo.homeworkRate || 0}</span>%
             </p>
             <p class={styles.name}>作业提交率</p>
           </GridItem>
           <GridItem>
             <p class={[styles.title, styles.red]}>
-              <span id="time3">0</span>%
+              <span id="time3">{state.orchestraInfo.homeworkQualifiedRate || 0}</span>%
             </p>
             <p class={styles.name}>练习合格率</p>
           </GridItem>
@@ -273,7 +279,7 @@ export default defineComponent({
           v-model:show={state.showQrcode}
           position="bottom"
           style={{ background: 'transparent' }}
-          safeAreaInsetBottom={true}
+          // safeAreaInsetBottom={true}
         >
           <div class={styles.codeContainer}>
             <div class={styles.codeImg}>

+ 19 - 12
src/school/orchestra/compontent/photo-detail.tsx

@@ -258,17 +258,24 @@ export default defineComponent({
 
     return () => (
       <div class={styles.phoneDetail}>
-        <OHeader title={(route.query.name as any) || ''}>
-          {{
-            right: () => (
-              <Icon name={iconDelete} size={22} onClick={() => (state.isEdit = !state.isEdit)} />
-            )
-          }}
-        </OHeader>
+        <OSticky position="top">
+          <OHeader title={(route.query.name as any) || ''}>
+            {{
+              right: () => (
+                <Icon name={iconDelete} size={22} onClick={() => (state.isEdit = !state.isEdit)} />
+              )
+            }}
+          </OHeader>
 
-        <Button icon="plus" block class={styles.addPhone} onClick={() => (state.showPhoto = true)}>
-          上传照片
-        </Button>
+          <Button
+            icon="plus"
+            block
+            class={styles.addPhone}
+            onClick={() => (state.showPhoto = true)}
+          >
+            上传照片
+          </Button>
+        </OSticky>
 
         {state.listState.dataShow ? (
           <List
@@ -307,7 +314,7 @@ export default defineComponent({
                       )
                     }}
                   />
-                  <Image class={styles.img} src={item.fileUrl} />
+                  <Image class={styles.img} src={item.fileUrl} fit="cover" />
                 </div>
               ))}
             </CheckboxGroup>
@@ -319,7 +326,7 @@ export default defineComponent({
         {state.isEdit && (
           <OSticky position="bottom">
             <div class={'btnGroup'}>
-              <Button size="large" block round type="primary" onClick={onRemove}>
+              <Button block round type="primary" onClick={onRemove}>
                 删除
               </Button>
             </div>

+ 2 - 1
src/school/orchestra/compontent/photo.module.less

@@ -1,7 +1,8 @@
 .phone {
-  padding: 13px;
+  padding: 0 13px 32px;
 
   .addPhone {
+    margin-top: 12px;
     color: var(--van-primary-text);
     border-color: #fff;
     border-radius: 10px;

+ 24 - 14
src/school/orchestra/compontent/photo.tsx

@@ -10,7 +10,8 @@ import {
   Popover,
   Popup,
   showConfirmDialog,
-  showToast
+  showToast,
+  Sticky
 } from 'vant'
 import { defineComponent, onMounted, reactive } from 'vue'
 import { useRoute, useRouter } from 'vue-router'
@@ -19,7 +20,13 @@ import iconPhoneDefaut from '../images/icon-photo-default.png'
 
 export default defineComponent({
   name: 'phone',
-  setup() {
+  props: {
+    height: {
+      type: [String, Number],
+      default: 'auto'
+    }
+  },
+  setup(props) {
     const route = useRoute()
     const router = useRouter()
     const state = reactive({
@@ -164,17 +171,19 @@ export default defineComponent({
     })
     return () => (
       <div class={styles.phone}>
-        <Button
-          icon="plus"
-          block
-          class={styles.addPhone}
-          onClick={() => {
-            state.status = true
-            state.selectType = 'add'
-          }}
-        >
-          新建相册
-        </Button>
+        <Sticky position="top" offsetTop={props.height}>
+          <Button
+            icon="plus"
+            block
+            class={styles.addPhone}
+            onClick={() => {
+              state.status = true
+              state.selectType = 'add'
+            }}
+          >
+            新建相册
+          </Button>
+        </Sticky>
 
         {state.listState.dataShow ? (
           <List
@@ -183,6 +192,7 @@ export default defineComponent({
             finishedText=" "
             onLoad={getList}
             immediateCheck={false}
+            class={styles.informationGroup}
           >
             <div class={styles.phoneContainer}>
               {state.list.map((item: any) => (
@@ -199,7 +209,7 @@ export default defineComponent({
                   ></i>
 
                   {item.coverUrl ? (
-                    <Image class={styles.img} src={item.coverUrl} />
+                    <Image class={styles.img} src={item.coverUrl} fit="cover" />
                   ) : (
                     <div class={[styles.img, styles.default]}>
                       <Image src={iconPhoneDefaut} class={styles.defaultImg} />

+ 1 - 1
src/school/orchestra/modal/add-information.tsx

@@ -108,7 +108,7 @@ export default defineComponent({
         <Field placeholder="请输入链接" class={styles.field} v-model={forms.linkUrl} />
 
         <div class={'btnGroup'} style={{ marginTop: '24px' }}>
-          <Button type="primary" size="large" block round onClick={onSubmit}>
+          <Button type="primary" block round onClick={onSubmit}>
             {props.selectType === 'add' ? '发布资讯' : '确认修改'}
           </Button>
         </div>

+ 7 - 2
src/school/orchestra/orchestra-detail.tsx

@@ -14,9 +14,14 @@ export default defineComponent({
     console.log(tabs, 'tabs')
     const tabValue = ref(tabs || 'information')
     sessionStorage.removeItem('orchestra-detail-tab')
+    const tabHeight = ref('auto')
+
+    const onGetHeight = (height: any) => {
+      tabHeight.value = height
+    }
     return () => (
       <div class={styles.orchestraDetail}>
-        <OSticky position="top">
+        <OSticky position="top" onGetHeight={onGetHeight}>
           <OHeader />
           <Tabs sticky lineWidth={20} lineHeight={4} v-model:active={tabValue.value}>
             <Tab title="乐团信息" name="information"></Tab>
@@ -28,7 +33,7 @@ export default defineComponent({
 
         {tabValue.value === 'information' && <Information />}
         {tabValue.value === 'plan' && <Plan />}
-        {tabValue.value === 'photo' && <Photo />}
+        {tabValue.value === 'photo' && <Photo height={tabHeight.value} />}
       </div>
     )
   }

+ 5 - 0
src/school/orchestra/orchestra-information.module.less

@@ -1,4 +1,5 @@
 .information {
+  overflow: hidden;
   .addPhone {
     color: var(--van-primary-text);
     border-color: #fff;
@@ -35,4 +36,8 @@
     color: #aaaaaa;
     line-height: 17px;
   }
+
+  .informationGroup {
+    margin-bottom: 32px;
+  }
 }

+ 17 - 11
src/school/orchestra/orchestra-information.tsx

@@ -1,5 +1,6 @@
 import OEmpty from '@/components/o-empty'
 import OPopup from '@/components/o-popup'
+import OSticky from '@/components/o-sticky'
 import request from '@/helpers/request'
 import { router } from '@/router/routes-common'
 import dayjs from 'dayjs'
@@ -124,17 +125,21 @@ export default defineComponent({
     })
     return () => (
       <div class={styles.information}>
-        <Button
-          icon="plus"
-          block
-          class={styles.addPhone}
-          onClick={() => {
-            state.selectType = 'add'
-            state.addStatus = true
-          }}
-        >
-          添加资讯
-        </Button>
+        <OSticky position="top">
+          <div style="background: #f6f8f9; overflow: hidden;">
+            <Button
+              icon="plus"
+              block
+              class={styles.addPhone}
+              onClick={() => {
+                state.selectType = 'add'
+                state.addStatus = true
+              }}
+            >
+              添加资讯
+            </Button>
+          </div>
+        </OSticky>
 
         {state.listState.dataShow ? (
           <List
@@ -143,6 +148,7 @@ export default defineComponent({
             finishedText=" "
             onLoad={getList}
             immediateCheck={false}
+            class={styles.informationGroup}
           >
             {state.list.map((item: any, index: number) => (
               <Cell center class={styles.cell} onClick={() => onDetail(item)}>

+ 1 - 8
src/school/train-planning/component/course-preview/index.tsx

@@ -341,14 +341,7 @@ export default defineComponent({
 
         <OSticky position="bottom">
           <div class={'btnGroup'}>
-            <Button
-              round
-              block
-              type="primary"
-              size="large"
-              onClick={onSubmit}
-              disabled={state.isClick}
-            >
+            <Button round block type="primary" onClick={onSubmit} disabled={state.isClick}>
               {state.type === 'change' ? '确认调整' : '确认排课'}
             </Button>
           </div>

+ 1 - 1
src/school/train-planning/component/practice/index.tsx

@@ -209,7 +209,7 @@ export default defineComponent({
 
         <OSticky position="bottom">
           <div class={'btnGroup'} style={{ marginTop: '24px' }}>
-            <Button type="primary" block round size="large" onClick={onSubmit}>
+            <Button type="primary" block round onClick={onSubmit}>
               下一步
             </Button>
           </div>

+ 1 - 1
src/school/train-planning/component/standard/index.tsx

@@ -248,7 +248,7 @@ export default defineComponent({
 
         <OSticky position="bottom">
           <div class={'btnGroup'} style={{ marginTop: '24px' }}>
-            <Button type="primary" block round size="large" onClick={onSubmit}>
+            <Button type="primary" block round onClick={onSubmit}>
               下一步
             </Button>
           </div>

+ 1 - 1
src/school/train-planning/component/train-content/index.tsx

@@ -153,7 +153,7 @@ export default defineComponent({
 
         <OSticky position="bottom">
           <div class={'btnGroup'}>
-            <Button round type="primary" size="large" block onClick={onSubmit}>
+            <Button round type="primary" block onClick={onSubmit}>
               下一步
             </Button>
           </div>

+ 1 - 8
src/school/train-planning/modal/class-list/index.tsx

@@ -108,14 +108,7 @@ export default defineComponent({
 
         <Sticky position="bottom">
           <div class={'btnGroup'}>
-            <Button
-              round
-              block
-              type="primary"
-              size="large"
-              onClick={onSubmit}
-              disabled={state.isClick}
-            >
+            <Button round block type="primary" onClick={onSubmit} disabled={state.isClick}>
               完成
             </Button>
           </div>

+ 0 - 1
src/school/train-planning/modal/timer/index.tsx

@@ -226,7 +226,6 @@ export default defineComponent({
               round
               block
               type="primary"
-              size="large"
               onClick={() => {
                 if (!state.selectTime) {
                   showToast('请选择训练开始时间')

+ 3 - 4
src/student/music-group/layout/auth.tsx

@@ -1,13 +1,12 @@
 import { defineComponent } from 'vue'
 import styles from './index.module.less'
-import { state, setLogin, setLogout, setLoginError } from '../state-music'
+import { state, setLogin, setLogout, setLoginError } from '@/state'
 import { browser } from '@/helpers/utils'
 import { setAuth } from './utils'
-import { postMessage } from '@/helpers/native-message'
 import { RouterView } from 'vue-router'
-import { Button, Icon } from 'vant'
-import request from '../request-music'
+
 import OEmpty from '@/components/o-empty'
+import request from '@/helpers/request'
 
 const browserInfo = browser()
 export default defineComponent({

+ 2 - 2
src/student/music-group/layout/login.tsx

@@ -2,10 +2,10 @@ import { defineComponent } from 'vue'
 import { CellGroup, Field, Button, CountDown, Row, Col, showToast } from 'vant'
 import ImgCode from '@/components/o-img-code'
 import { checkPhone } from '@/helpers/validate'
-import request from '../request-music'
-import { setLogin, state } from '../state-music'
+import { setLogin, state } from '@/state'
 import { removeAuth, setAuth } from './utils'
 import styles from './index.module.less'
+import request from '@/helpers/request'
 
 type loginType = 'PWD' | 'SMS'
 export default defineComponent({

+ 4 - 5
src/student/music-group/pre-apply/component/apply.tsx

@@ -1,6 +1,6 @@
+import request from '@/helpers/request'
 import {
   Button,
-  Cell,
   CellGroup,
   Dialog,
   Field,
@@ -14,7 +14,6 @@ import {
 } from 'vant'
 import { defineComponent, onMounted, reactive } from 'vue'
 import { useRoute } from 'vue-router'
-import request from '../../request-music'
 import styles from '../index.module.less'
 
 // 乐团交付,乐团停止或关闭,有新的交付团;则不允许报名
@@ -304,7 +303,7 @@ export default defineComponent({
           position="bottom"
           round
           safeAreaInsetBottom
-          duration={0}
+          // duration={0}
           lazyRender={false}
         >
           <Picker
@@ -320,7 +319,7 @@ export default defineComponent({
           />
         </Popup>
         {/* 班级 */}
-        <Popup v-model:show={state.classStatus} position="bottom" round duration={0}>
+        <Popup v-model:show={state.classStatus} position="bottom" round>
           <Picker
             showToolbar
             columns={state.classList}
@@ -334,7 +333,7 @@ export default defineComponent({
           />
         </Popup>
         {/* 声部 */}
-        <Popup v-model:show={state.subjectStatus} position="bottom" round duration={0}>
+        <Popup v-model:show={state.subjectStatus} position="bottom" round>
           <Picker
             showToolbar
             columns={state.subjectList}

+ 2 - 2
src/student/music-group/pre-apply/component/order.tsx

@@ -17,7 +17,7 @@ import {
 } from 'vant'
 import { defineComponent, onMounted, reactive, ref } from 'vue'
 import { useRoute, useRouter } from 'vue-router'
-import request from '../../request-music'
+import request from '@/helpers/request'
 import styles from '../index.module.less'
 
 export default defineComponent({
@@ -218,7 +218,7 @@ export default defineComponent({
                           </>
                         )} */}
                         {/* 订单成功 订单金额大于0 */}
-                        {item.status === 'PAID' && (
+                        {item.refundable && (
                           <Button
                             round
                             plain

+ 1 - 1
src/student/music-group/pre-apply/component/payment.tsx

@@ -16,7 +16,7 @@ import styles from '../index.module.less'
 import radioCheck from '@/common/images/icon-radio-check.png'
 import radioDefault from '@/common/images/icon-radio-default.png'
 import { useRoute, useRouter } from 'vue-router'
-import request from '../../request-music'
+import request from '@/helpers/request'
 import { moneyFormat } from '@/helpers/utils'
 import { CountUp } from 'countup.js'
 

+ 50 - 0
src/student/music-group/pre-apply/component/user-auth.module.less

@@ -0,0 +1,50 @@
+.userAuth {
+  min-height: 100vh;
+  background-color: #f6f8f9;
+  overflow: hidden;
+
+  .cellGroup {
+    margin: 12px 13px 24px;
+    border-radius: 12px;
+    overflow: hidden;
+  }
+  :global {
+    .van-cell {
+      flex-direction: column;
+      font-size: 16px;
+      padding: 18px 13px;
+    }
+
+    .van-field__label {
+      width: 100%;
+      margin-right: 0;
+      color: #333;
+      font-size: 16px;
+      font-weight: 500;
+    }
+
+    .van-cell--required::before {
+      left: 15px;
+    }
+
+    .van-field__body {
+      margin-top: 10px;
+    }
+
+    .van-form {
+      margin-top: 174px;
+      /* background: #F8F8F8; */
+      overflow: hidden;
+      /* margin: 290px 13px 14px; */
+    }
+
+    .van-tag + .van-tag {
+      margin-left: 8px;
+    }
+  }
+
+  .btnGroup {
+    padding: 0 14px;
+    padding-bottom: 15px;
+  }
+}

+ 100 - 0
src/student/music-group/pre-apply/component/user-auth.tsx

@@ -0,0 +1,100 @@
+import request from '@/helpers/request'
+import { verifyIdCard } from '@/helpers/toolsValidate'
+import { postMessage } from '@/helpers/native-message'
+import { state } from '@/state'
+import { Button, CellGroup, Field, Form, Icon, showToast } from 'vant'
+import { defineComponent } from 'vue'
+import styles from './user-auth.module.less'
+import OHeader from '@/components/o-header'
+
+export default defineComponent({
+  name: 'UserAuth',
+  props: {
+    onSuccess: {
+      // 实名成功
+      type: Function,
+      default: () => {}
+    },
+    hideHeader: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      form: {
+        realName: '',
+        idCardNo: ''
+      }
+    }
+  },
+  mounted() {
+    // 初始化数据
+    const users = state.user.data
+    this.form.realName = users?.account.realName
+    // this.form.idCardNo = users?.idCardNo
+  },
+  methods: {
+    async onSubmit() {
+      try {
+        const url = state.platformApi + '/sysAccount/realNameAuth'
+        await request.post(url, {
+          data: {
+            ...this.form,
+            contract: true,
+            save: true
+          }
+        })
+        showToast('实名成功')
+        state.user.data.account.realName = this.form.realName
+        state.user.data.account.idCardNo = this.form.idCardNo
+        setTimeout(() => {
+          this.onSuccess()
+        }, 500)
+      } catch {
+        //
+      }
+    }
+  },
+  render() {
+    return (
+      <Form class={styles.userAuth} onSubmit={this.onSubmit}>
+        {!this.hideHeader && <OHeader title="实名认证" />}
+
+        <CellGroup inset class={styles.cellGroup}>
+          <Field
+            required
+            label="真实姓名"
+            v-model={this.form.realName}
+            rules={[{ required: true, message: '请填写真实姓名' }]}
+            name="realName"
+            placeholder="请填写真实姓名"
+            maxlength="50"
+          ></Field>
+
+          <Field
+            required
+            label="身份证号"
+            v-model={this.form.idCardNo}
+            maxlength={18}
+            rules={[
+              { required: true, message: '请输入身份证号' },
+              {
+                pattern:
+                  /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/,
+                message: '请输入正确的身份证号'
+              }
+            ]}
+            placeholder="请输入身份证号"
+          ></Field>
+        </CellGroup>
+
+        <div class={['btnGroup']}>
+          <Button block round type="primary" native-type="submit">
+            确定
+          </Button>
+        </div>
+      </Form>
+    )
+  }
+})

+ 21 - 2
src/student/music-group/pre-apply/index.tsx

@@ -6,8 +6,9 @@ import Apply from './component/apply'
 import Payment from './component/payment'
 import Order from './component/order'
 import { useRoute, useRouter } from 'vue-router'
-import request from '../request-music'
-import { setLogout } from '../state-music'
+
+import { setLogout } from '@/state'
+import request from '@/helpers/request'
 
 export default defineComponent({
   name: 'pre-apply',
@@ -82,6 +83,24 @@ export default defineComponent({
           })
           return
         }
+
+        if (data.registerOrchestra >= 1) {
+          showDialog({
+            title: '提示',
+            message: '您已在其它乐团'
+          }).then(() => {
+            setLogout()
+            const query = {
+              returnUrl: route.path,
+              ...route.query
+            } as any
+            router.replace({
+              path: '/loginMusic',
+              query: query
+            })
+          })
+          return
+        }
       } catch {
         //
       }

+ 30 - 1
src/student/music-group/pre-apply/order-detail.tsx

@@ -8,8 +8,11 @@ import Payment from '@/views/adapay/payment'
 import { useRoute, useRouter } from 'vue-router'
 import OQrcode from '@/components/o-qrcode'
 import request from '@/helpers/request'
+import { state as baseState } from '@/state'
 import { browser, moneyFormat } from '@/helpers/utils'
 import OProtocol from '@/components/o-protocol'
+import OPopup from '@/components/o-popup'
+import UserAuth from './component/user-auth'
 
 export default defineComponent({
   name: 'order-detail',
@@ -29,7 +32,8 @@ export default defineComponent({
       hasFreight: route.query.hf ? false : true, // 是否显示
       freight: '', // 运费
       agreeStatus: true, //是否勾选协议
-      showHeader: false
+      showHeader: false,
+      authShow: false // 是否进行实名认证
     })
 
     const orderType = computed(() => {
@@ -138,6 +142,7 @@ export default defineComponent({
       }
     }
 
+    // 轮询查询订单状态
     const getPaymentOrderStatus = async () => {
       // 循环查询订单
       // const orderNo = state.orderNo
@@ -202,6 +207,7 @@ export default defineComponent({
 
     const onSubmit = async () => {
       clearInterval(state.orderTimer)
+
       if (orderType.value === 'VIP') {
         // onCallback()
         buyVip(onCallback)
@@ -251,6 +257,18 @@ export default defineComponent({
         return
       }
 
+      if (!state.agreeStatus) {
+        showToast('请先阅读并同意《管乐团平台服务协议》')
+        return
+      }
+      const users = baseState.user.data
+
+      // 判断是否需要实名认证, 姓名,卡号
+      if (!users?.account.realName || !users?.account.idCardNo) {
+        state.authShow = true
+        return
+      }
+
       try {
         const { data } = await request.post('/api-student/userPaymentOrder/updateReceiveAddress', {
           data: {
@@ -291,6 +309,13 @@ export default defineComponent({
       }
     }
 
+    // 实名认证成功
+    const onAuthSuccess = () => {
+      //
+      state.authShow = false
+      onSubmit() // 实名成功后自动支付
+    }
+
     onMounted(() => {
       if (browser().isApp) {
         state.showHeader = true
@@ -434,6 +459,10 @@ export default defineComponent({
             </div>
           </div>
         </Popup>
+
+        <OPopup v-model:modelValue={state.authShow}>
+          <UserAuth onSuccess={onAuthSuccess} hideHeader={!browser().isApp} />
+        </OPopup>
       </>
     )
   }

+ 43 - 18
src/student/my-orchestra/apply-withdrawal.tsx

@@ -2,9 +2,9 @@ import OHeader from '@/components/o-header'
 import { defineComponent, onMounted, reactive, ref } from 'vue'
 import iconStudent from '@common/images/icon_student.png'
 import styles from './apply-withdrawal.module.less'
-import { Button, Dialog, Field, Image } from 'vant'
+import { Button, Dialog, Field, Image, showToast } from 'vant'
 import OSticky from '@/components/o-sticky'
-import { useRoute } from 'vue-router'
+import { useRoute, useRouter } from 'vue-router'
 import request from '@/helpers/request'
 import { state } from '@/state'
 
@@ -12,6 +12,7 @@ export default defineComponent({
   name: 'apply-withdrawal',
   setup() {
     const route = useRoute()
+    const router = useRouter()
     const headColor = reactive({
       headBg: 'transparent',
       textColor: '#fff'
@@ -19,27 +20,53 @@ export default defineComponent({
     const forms = reactive({
       status: false,
       reason: null,
-      id: route.query.id
+      id: route.query.id,
+      dataInfo: {} as any,
+      isClick: false
     })
 
     const getDetails = async () => {
       try {
         const { data } = await request.post('/api-student/student/getOrchestraDate/' + forms.id)
+        forms.dataInfo = data
       } catch {
         //
       }
     }
 
     const onSubmit = async () => {
-      // forms.status = true
-      await request.post('/api-student/orchestra/leaveOrchestra', {
-        data: {
-          studentId: state.user.data.account.id,
-          orchestraId: forms.id,
-          reason: forms.reason
-        }
-      })
+      if (!forms.reason) {
+        showToast('请输入退团原因')
+        return
+      }
+      forms.status = true
+    }
+
+    //
+    const onConfirm = async () => {
+      try {
+        forms.isClick = true
+        await request.post('/api-student/orchestra/leaveOrchestra', {
+          data: {
+            studentId: forms.dataInfo.studentId,
+            orchestraId: forms.id,
+            reason: forms.reason
+          }
+        })
+
+        forms.isClick = false
+        setTimeout(() => {
+          showToast('申请成功')
+        }, 100)
+        setTimeout(() => {
+          router.replace('/my-orchestra')
+        }, 1100)
+      } catch {
+        //
+        forms.isClick = false
+      }
     }
+
     onMounted(() => {
       getDetails()
     })
@@ -54,10 +81,10 @@ export default defineComponent({
           />
 
           <div class={styles.userInfo}>
-            <Image src={iconStudent} class={styles.img} />
-            <div class={styles.userName}>宋小泽 同学</div>
+            <Image src={forms.dataInfo.studentAvatar || iconStudent} class={styles.img} />
+            <div class={styles.userName}>{forms.dataInfo.studentName} 同学</div>
             <div class={styles.timer}>
-              您已在武汉小学2022标小学2022标准团训练<span>142</span>天
+              您已在{forms.dataInfo.orchestraName}训练<span>{forms.dataInfo.joinDays}</span>天
             </div>
           </div>
         </div>
@@ -78,7 +105,7 @@ export default defineComponent({
 
         <OSticky position="bottom">
           <div class={'btnGroup'}>
-            <Button block round size="large" type="primary" onClick={onSubmit}>
+            <Button block round type="primary" onClick={onSubmit} disabled={forms.isClick}>
               确定
             </Button>
           </div>
@@ -91,9 +118,7 @@ export default defineComponent({
           confirmButtonText="确定"
           cancelButtonText="取消"
           showCancelButton
-          onConfirm={() => {
-            console.log('223')
-          }}
+          onConfirm={() => onConfirm()}
         >
           {{
             title: () => (

+ 1 - 1
src/student/my-orchestra/index.module.less

@@ -186,7 +186,7 @@
   display: flex;
   justify-content: space-between;
   flex-wrap: wrap;
-  margin: 0 13px 12px;
+  margin: 0 13px 24px;
   .item {
     position: relative;
     padding-top: 12px;

+ 32 - 19
src/student/my-orchestra/index.tsx

@@ -5,6 +5,7 @@ import { useRoute, useRouter } from 'vue-router'
 import styles from './index.module.less'
 import iconTeacher from '@common/images/icon_teacher.png'
 import iconMessage from '@common/images/icon-message.png'
+import { postMessage } from '@/helpers/native-message'
 import iconPhoneDefaut from '@/school/orchestra/images/icon-photo-default.png'
 import iconChange from './images/icon_change.png'
 import request from '@/helpers/request'
@@ -87,6 +88,8 @@ export default defineComponent({
         state.orchestraList = data || []
         if (data && data.length > 0) {
           state.selectOrchestra = data[0]
+          // 判断是否有乐团
+          await getList()
         }
       } catch {
         //
@@ -99,34 +102,43 @@ export default defineComponent({
         api: 'joinChatGroup',
         content: {
           type: 'multi', // single 单人 multi 多人
-          id: item.classGroupId
+          id: item.imGroupId
         }
       })
     }
 
     onMounted(async () => {
       await getOrchestras()
-      await getList()
     })
     return () => (
       <div class={styles.myOrchestra}>
         <OHeader
           v-slots={{
-            right: () =>
-              state.selectOrchestra.orchestraId && (
-                <span
-                  onClick={() => {
-                    router.push({
-                      path: '/apply-withdrawal',
-                      query: {
-                        id: state.selectOrchestra.orchestraId
-                      }
-                    })
-                  }}
-                >
-                  申请退团
-                </span>
-              )
+            right: () => (
+              <>
+                {state.selectOrchestra.status === 'REGISTER' &&
+                  state.selectOrchestra.status === 'LEARNING' && (
+                    <span
+                      onClick={() => {
+                        router.push({
+                          path: '/apply-withdrawal',
+                          query: {
+                            id: state.selectOrchestra.orchestraId
+                          }
+                        })
+                      }}
+                    >
+                      申请退团
+                    </span>
+                  )}
+                {state.selectOrchestra.status === 'AUTH' && (
+                  <span style={{ color: 'red' }}>申请退团中</span>
+                )}
+                {/* {state.selectOrchestra.status === 'OUTOF_ORCHESTRA' && (
+                  <span style={{ color: '#666' }}>已退团</span>
+                )} */}
+              </>
+            )
           }}
         />
         {state.orchestraList.length > 0 ? (
@@ -224,10 +236,10 @@ export default defineComponent({
                   {state.list.map((item: any) => (
                     <div class={styles.item} onClick={() => onDetail(item)}>
                       {item.coverUrl ? (
-                        <Image class={styles.img} src={item.coverUrl} />
+                        <Image class={styles.img} src={item.coverUrl} fit="cover" />
                       ) : (
                         <div class={[styles.img, styles.default]}>
-                          <Image src={iconPhoneDefaut} class={styles.defaultImg} />
+                          <Image src={iconPhoneDefaut} class={styles.defaultImg} fit="cover" />
                         </div>
                       )}
 
@@ -264,6 +276,7 @@ export default defineComponent({
               })
 
               state.orchestraStatus = false
+              onSearch()
             }}
           />
         </Popup>

+ 1 - 1
src/student/my-orchestra/photo-detail.tsx

@@ -91,7 +91,7 @@ export default defineComponent({
                     onShowImage(index)
                   }}
                 >
-                  <Image class={styles.img} src={item.fileUrl} />
+                  <Image class={styles.img} src={item.fileUrl} fit="cover" />
                 </div>
               ))}
             </div>

+ 2 - 2
src/student/payment-result/index.tsx

@@ -43,7 +43,7 @@ export default defineComponent({
 
     const onRefund = async () => {
       showConfirmDialog({
-        message: '您是否确定退款'
+        message: '您是否确定撤销退费?'
       }).then(async () => {
         try {
           await request.post('/api-student/userPaymentOrder/cancelRefund/' + route.query.orderNo)
@@ -131,7 +131,7 @@ export default defineComponent({
 
         {state.orders.status === 'REFUNDING' && browser().isApp && (
           <div class={'btnGroup'}>
-            <Button type="primary" round size="large" block onClick={onRefund}>
+            <Button type="primary" round block onClick={onRefund}>
               撤销退费
             </Button>
           </div>

+ 6 - 2
src/styles/index.less

@@ -124,7 +124,11 @@ body {
 
 .btnGroup {
   padding: 0 25px;
-  padding-bottom: 15px;
+  padding-bottom: 24px;
+  .van-button {
+    font-size: 16px !important;
+    font-weight: 500;
+  }
 }
 .btnMore {
   padding-left: 13px;
@@ -133,7 +137,7 @@ body {
   justify-content: center !important;
   // :global {
   .van-button {
-    // width: 49% !important;
+    width: 100% !important;
   }
   .van-button + .van-button {
     margin-left: 15px;

+ 0 - 45
src/views/adapay/userAuth/index.module.less

@@ -1,45 +0,0 @@
-.userAuth {
-  min-height: 100vh;
-  background-color: #f6f8f9;
-  overflow: hidden;
-
-  .btnGroup {
-    padding: 0 14px;
-    padding-bottom: 15px;
-  }
-
-  .colProtocol {
-    // display: flex;
-    // align-items: center;
-    font-size: 12px;
-    padding: 15px 14px;
-    color: #999;
-    .protocolText {
-      color: var(--van-primary);
-      line-height: 15px;
-    }
-
-    .boxStyle {
-      background: transparent !important;
-      width: 15px;
-      height: 15px;
-      border: transparent !important;
-    }
-    :global {
-      .van-checkbox {
-        display: inline-block;
-        align-items: inherit;
-        overflow: inherit;
-      }
-      .van-checkbox__icon {
-        height: 15px;
-        line-height: 15px;
-        display: inline-block;
-        vertical-align: middle;
-      }
-      .van-checkbox__label {
-        line-height: 15px;
-      }
-    }
-  }
-}

+ 0 - 148
src/views/adapay/userAuth/index.tsx

@@ -1,148 +0,0 @@
-import request from '@/helpers/request'
-import { verifyIdCard } from '@/helpers/toolsValidate'
-import { postMessage } from '@/helpers/native-message'
-import { state } from '@/state'
-import { Button, CellGroup, Checkbox, Field, Form, Icon, showToast, Toast } from 'vant'
-import { defineComponent } from 'vue'
-import activeButtonIcon from '@common/images/icon_checkbox.png'
-import inactiveButtonIcon from '@common/images/icon_checkbox_default.png'
-import styles from './index.module.less'
-import OHeader from '@/components/o-header'
-
-export default defineComponent({
-  name: 'UserAuth',
-  props: {
-    onSuccess: {
-      // 实名成功
-      type: Function,
-      default: () => {}
-    },
-    exists: {
-      type: Boolean,
-      default: false
-    },
-    hideHeader: {
-      type: Boolean,
-      default: false
-    }
-  },
-  data() {
-    return {
-      form: {
-        realName: '',
-        idCardNo: ''
-      },
-      checked: false
-    }
-  },
-  mounted() {
-    // exists
-    this.checked = this.checked || this.exists
-    // 初始化数据
-    const users = state.user.data
-    this.form.realName = users?.realName
-    // this.form.idCardNo = users?.idCardNo
-  },
-  methods: {
-    async onSubmit() {
-      try {
-        if (!this.checked) {
-          showToast('请先阅读并同意《用户注册协议》')
-          return
-        }
-        const url =
-          state.platformType === 'STUDENT'
-            ? '/api-student/student/realNameAuth'
-            : '/api-teacher/teacher/realNameAuth'
-        await request.post(url, {
-          data: {
-            ...this.form,
-            contract: true,
-            save: true
-          }
-        })
-        showToast('实名成功')
-        state.user.data.realName = this.form.realName
-        state.user.data.idCardNo = this.form.idCardNo
-        setTimeout(() => {
-          this.onSuccess()
-        }, 500)
-      } catch {
-        //
-      }
-    },
-    getContractDetail() {
-      // 查看协议
-      const client = state.platformType === 'STUDENT' ? 'student' : 'teacher'
-      postMessage({
-        api: 'openWebView',
-        content: {
-          url: `${location.origin}/${client}/#/previewProtocol`,
-          orientation: 1,
-          isHideTitle: false
-        }
-      })
-    }
-  },
-  render() {
-    return (
-      <Form class={styles.userAuth} onSubmit={this.onSubmit}>
-        {!this.hideHeader && <OHeader title="实名认证" />}
-
-        {/* <CellGroup style={{ marginTop: '15px' }}>
-          <ColField title="姓名" required>
-            <Field
-              name="lessonName"
-              maxlength={20}
-              v-model={this.form.realName}
-              placeholder="请输入真实姓名"
-              rules={[{ required: true, message: '请输入真实姓名' }]}
-            />
-          </ColField>
-          <ColField title="证件号码" required>
-            <Field
-              name="lessonSubjectName"
-              v-model={this.form.idCardNo}
-              rules={[
-                { required: true, message: '请输入身份证号' },
-                {
-                  pattern:
-                    /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/,
-                  message: '请输入正确的身份证号'
-                }
-              ]}
-              placeholder="请输入身份证号"
-            />
-          </ColField>
-        </CellGroup> */}
-        <div class={styles.colProtocol}>
-          {!this.exists && (
-            <Checkbox
-              v-model={this.checked}
-              v-slots={{
-                icon: (props: any) => (
-                  <Icon
-                    class={styles.boxStyle}
-                    name={props.checked ? activeButtonIcon : inactiveButtonIcon}
-                    size="15"
-                  />
-                )
-              }}
-            >
-              我已阅读并同意
-            </Checkbox>
-          )}
-          {this.exists && <>查看</>}
-          <span onClick={this.getContractDetail} class={styles.protocolText}>
-            《用户注册协议》
-          </span>
-        </div>
-        <div class={['btnGroup']}>
-          <Button block round type="primary" native-type="submit">
-            确定
-          </Button>
-        </div>
-      </Form>
-    )
-  }
-})