Quellcode durchsuchen

Merge remote-tracking branch 'origin/addSubject' into iteration-class

lex vor 1 Jahr
Ursprung
Commit
09ce978175

+ 18 - 1
src/views/classList/api.ts

@@ -160,7 +160,6 @@ export const getTrainingClassDetail = (params: any) => {
   });
 };
 
-
 /**
  * 学生练习记录
  */
@@ -169,3 +168,21 @@ export const getTrainingStatList = (params: any) => {
     data: params
   });
 };
+
+/**
+ * 获取班级列表
+ */
+export const getSubject = (params: any) => {
+  return request.post(`/edu-app/subject/page`, {
+    data: params
+  });
+};
+
+/**
+ * 修改班级
+ */
+export const resetClass = (params: any) => {
+  return request.post('/edu-app/classGroup/update', {
+    data: params
+  });
+};

+ 67 - 12
src/views/classList/index.tsx

@@ -15,7 +15,7 @@ import {
 import SearchInput from '@/components/searchInput';
 import CSelect from '@/components/CSelect';
 import Pagination from '@/components/pagination';
-import { classGroupList, deleteClass } from './api';
+import { classGroupList, deleteClass,getSubject } from './api';
 
 import CreateClass from './modals/createClass';
 import RestStudentBox from './modals/restStudentBox';
@@ -30,6 +30,7 @@ import TheTooltip from '/src/components/TheTooltip';
 import PreviewWindow from '../preview-window';
 import { state as globalState } from '/src/state';
 import {courseSchedulePage} from '../home/api'
+import ResetSubject from './modals/resetSubject'
 import { fscreen } from '/src/utils';
 export default defineComponent({
   name: 'class-classList',
@@ -38,7 +39,8 @@ export default defineComponent({
       searchForm: {
         keyword: null as any,
         currentClass: null,
-        currentGradeNum: null
+        currentGradeNum: null,
+        subjectId:null
       },
       orchestraType: null,
       courseTypeCode: null,
@@ -58,7 +60,9 @@ export default defineComponent({
       removeRow: {} as any,
       previewModal: false,
       previewParams: {} as any,
-      lastCourse:null as any
+      lastCourse:null as any,
+      subjectList:[] as any,
+      showResetClass:false
     });
     const formRef = ref();
     const dialog = useDialog();
@@ -75,7 +79,8 @@ export default defineComponent({
       state.searchForm = {
         keyword: null as any,
         currentClass: null,
-        currentGradeNum: null
+        currentGradeNum: null,
+        subjectId:null
       };
       getList();
     };
@@ -113,23 +118,37 @@ export default defineComponent({
       }
       console.log('getList');
     };
-
+    const getSubjectList = async()=>{
+      const res = await getSubject({page:1,rows:9999})
+      state.subjectList = res.data.rows.map((item:any)=>{
+        return {
+          value:item.id,
+          label:item.name
+        }
+      })
+      state.subjectList.unshift( { value: null, label: '选择声部' },)
+    }
     const columns = () => {
       return [
         {
           title: '班级名称',
           key: 'name',
-          width: '25%'
+          width: '20%'
+        },
+        {
+          title: '班级声部',
+          key: 'subjectName',
+          width: '20%'
         },
         {
           title: '学生人数',
           key: 'preStudentNum',
-          width: '25%'
+          width: '20%'
         },
         {
           title: '上次学习',
           key: 'lastStudy',
-          width: '25%',
+          width: '20%',
           render(row: any) {
             return row.lastStudy ? (
               <TheTooltip
@@ -177,7 +196,12 @@ export default defineComponent({
                       详情
                     </NButton>
                   )}
-
+                     <NButton
+                      type="primary"
+                      text
+                      onClick={() => resetClassSubject(row)}>
+                      修改声部
+                    </NButton>
                   {index == 0 ? (
                     <NButton
                       type="primary"
@@ -257,8 +281,14 @@ export default defineComponent({
       state.activeRow = row;
       state.goCourseVisiable = true;
     };
+
+    const resetClassSubject = (row:any)=>{
+      state.activeRow = row;
+      state.showResetClass = true
+    }
     onMounted(() => {
       getList();
+      getSubjectList()
     });
     return () => (
       <div class={styles.listWrap}>
@@ -294,7 +324,16 @@ export default defineComponent({
                 } as any)}
                 v-model:value={state.searchForm.currentClass}></CSelect>
             </NFormItem>
-
+            <NFormItem>
+              <CSelect
+                {...({
+                  options: state.subjectList,
+                  placeholder: '选择声部',
+                  clearable: true,
+                  inline: true
+                } as any)}
+                v-model:value={state.searchForm.subjectId}></CSelect>
+            </NFormItem>
             <NFormItem>
               <NSpace justify="end">
                 <NButton type="primary" class="searchBtn" onClick={search}>
@@ -360,12 +399,28 @@ export default defineComponent({
           preset="card"
           class={['modalTitle background']}
           title={'创建班级'}>
-          <CreateClass
+            {state.showaddClass?    <CreateClass
             gradeNumList={state.gradeNumList}
             classArray={classArray}
+            subjectList = {state.subjectList}
             onGetList={() => getList()}
             onClose={() => (state.showaddClass = false)}
-          />
+          />:null}
+
+        </NModal>
+        <NModal
+          v-model:show={state.showResetClass}
+          style={{ width: '500px' }}
+          preset="card"
+          class={['modalTitle background']}
+          title={'修改声部'}>
+            {state.showResetClass?    <ResetSubject
+            activeRow={state.activeRow}
+            subjectList = {state.subjectList}
+            onGetList={() => getList()}
+            onClose={() => (state.showResetClass = false)}
+          />:null}
+
         </NModal>
 
         <NModal

+ 23 - 3
src/views/classList/modals/createClass.tsx

@@ -23,6 +23,10 @@ export default defineComponent({
     classArray: {
       type: Array,
       default: () => []
+    },
+    subjectList:{
+      type: Array,
+      default: () => []
     }
   },
   name: 'resetStudent',
@@ -35,13 +39,12 @@ export default defineComponent({
     const foemsRef = ref();
     const createClassForm = reactive({
       currentGradeNum: null,
-      currentClass: null
+      currentClass: null,
+      subjectId:null
     });
     const submitForms = () => {
       data.uploading = true
       foemsRef.value.validate(async (error: any) => {
-        console.log(createClassForm);
-        console.log(error);
         if (error) {
           return;
         }
@@ -94,6 +97,23 @@ export default defineComponent({
               } as any)}
               v-model:value={createClassForm.currentClass}></CSelect>
           </NFormItem>
+          <NFormItem
+            path="subjectId"
+            rule={[
+              {
+                required: true,
+                message: '请选择声部'
+              }
+            ]}>
+            <CSelect
+              {...({
+                style: { width: '400px' },
+                options: props.subjectList,
+                placeholder: '选择声部',
+                clearable: true
+              } as any)}
+              v-model:value={createClassForm.subjectId}></CSelect>
+          </NFormItem>
         </NForm>
         <NSpace class={styles.btnGroup} justify="center">
           <NButton round onClick={() => emit('close')}>

+ 106 - 0
src/views/classList/modals/resetSubject.tsx

@@ -0,0 +1,106 @@
+import {
+  NButton,
+  NSpace,
+  useMessage,
+  NForm,
+  NFormItem,
+  NSelect
+} from 'naive-ui';
+import { defineComponent, onMounted, reactive, ref } from 'vue';
+import styles from '../index.module.less';
+import CSelect from '/src/components/CSelect';
+import { resetClass } from '../api';
+export default defineComponent({
+  props: {
+    activeRow: {
+      type: Object,
+      default: () => ({ id: '' })
+    },
+    gradeNumList: {
+      type: Array,
+      default: () => []
+    },
+    classArray: {
+      type: Array,
+      default: () => []
+    },
+    subjectList:{
+      type: Array,
+      default: () => []
+    },
+  },
+  name: 'resetStudent',
+  emits: ['close', 'getList'],
+  setup(props, { emit }) {
+    const data = reactive({
+      uploading: false
+    });
+    const message = useMessage();
+    const foemsRef = ref();
+    const createClassForm = reactive({
+      currentGradeNum: null,
+      currentClass: null,
+      subjectId:null,
+      id:null
+    });
+    onMounted(()=>{
+      createClassForm.currentGradeNum = props.activeRow.currentGradeNum
+      createClassForm.currentClass = props.activeRow.currentClass
+      createClassForm.subjectId = props.activeRow.subjectId
+      createClassForm.id = props.activeRow.id
+    })
+    const submitForms = () => {
+      data.uploading = true
+      foemsRef.value.validate(async (error: any) => {
+        if (error) {
+          return;
+        }
+        try {
+          const res = await resetClass({ ...createClassForm });
+          message.success('修改成功');
+          emit('close');
+          emit('getList');
+          data.uploading = false
+        } catch (e) {
+          data.uploading = false
+          console.log(e);
+        }
+      });
+    };
+    return () => (
+      <div class={[styles.addClass]}>
+        <NForm label-placement="left" model={createClassForm} ref={foemsRef}>
+          <NFormItem
+            path="subjectId"
+            rule={[
+              {
+                required: true,
+                message: '请选择声部'
+              }
+            ]}>
+            <CSelect
+              {...({
+                style: { width: '400px' },
+                options: props.subjectList,
+                placeholder: '选择声部',
+                clearable: true
+              } as any)}
+              v-model:value={createClassForm.subjectId}></CSelect>
+          </NFormItem>
+        </NForm>
+        <NSpace class={styles.btnGroup} justify="center">
+          <NButton round onClick={() => emit('close')}>
+            取消
+          </NButton>
+          <NButton
+            round
+            loading={data.uploading}
+            onClick={() => submitForms()}
+            type="primary">
+            保存
+          </NButton>
+        </NSpace>
+      </div>
+    );
+  }
+});

+ 1 - 1
src/views/login/index.module.less

@@ -368,4 +368,4 @@
     cursor: pointer;
   }
 
-}
+}

+ 110 - 83
src/views/login/index.tsx

@@ -1,17 +1,32 @@
-import { defineComponent, onBeforeUnmount, reactive, ref, onMounted } from 'vue';
+import {
+  defineComponent,
+  onBeforeUnmount,
+  reactive,
+  ref,
+  onMounted
+} from 'vue';
 import loginStyles from './images/login_styles.png';
 import loginLeft from './images/login-left.png';
 import loginRight from './images/loginright.png';
 import colLogo from './images/colLogo.png';
 import CodeLogin from './components/codeLogin';
 import PwdLogin from './components/pwdLogin';
-import { NTabs, NTabPane, useDialog, NModal, NButton, NSpace,NAlert, NImage } from 'naive-ui';
+import {
+  NTabs,
+  NTabPane,
+  useDialog,
+  NModal,
+  NButton,
+  NSpace,
+  NAlert,
+  NImage
+} from 'naive-ui';
 import styles from './index.module.less';
 import ForgotPassword from './components/forgotPassword';
-import moveTop from './images/moveTopBg.png'
-import dingPng from './images/ding.png'
-import closeAble from './images/closeAble.png'
-import infoIcon from './images/infoIcon.png'
+import moveTop from './images/moveTopBg.png';
+import dingPng from './images/ding.png';
+import closeAble from './images/closeAble.png';
+import infoIcon from './images/infoIcon.png';
 import { state } from '/src/state';
 export default defineComponent({
   name: 'login-page',
@@ -20,14 +35,14 @@ export default defineComponent({
     const NavsValue = ref('pwdLogin');
     const pwdLoginRef = ref();
     const forgotPasswordRef = ref();
-    const popEvent = ref()
+    const popEvent = ref();
     const dialog = useDialog();
-    const showModalMask = ref(false)
+    const showModalMask = ref(false);
     const checkInstall = async (event: any) => {
       event.preventDefault();
-      console.log('checkInstall', event)
-      popEvent.value = event
-      console.log('beforeoutcome')
+      console.log('checkInstall', event);
+      popEvent.value = event;
+      console.log('beforeoutcome');
       // const { outcome } = await event.userChoice;
       // console.log(outcome, 'outcome')
       // setTimeout(async function () {
@@ -40,68 +55,74 @@ export default defineComponent({
 
       // }, 2000)
 
-
       if (window.matchMedia('(display-mode: standalone)').matches) {
-        state.application = window.matchMedia('(display-mode: standalone)').matches
-        console.log('应用内打开')
-      }else{
-        console.log(popEvent.value,'popEvent.value')
-        if(popEvent.value){
-        showModalMask.value = true;
-        setTimeout(()=>{
-          const btn = document.querySelector('#submitBtn')
-          console.log(btn)
-          if(btn){
-            btn.addEventListener('click', () => {
-              showModalMask.value = false;
-              if( !popEvent.value ) {
-                return;
-              }
-              popEvent.value.prompt();
-              popEvent.value.userChoice.then( (choiceResult:any) => {
-                if (choiceResult.outcome === 'accepted') {
-                  console.log('用户已同意添加到桌面')
-                  showModalMask.value = false;
-                } else {
-                  console.log('用户已取消添加到桌面')
-                  showModalMask.value = false;
+        state.application = window.matchMedia(
+          '(display-mode: standalone)'
+        ).matches;
+        console.log('应用内打开');
+      } else {
+        console.log(popEvent.value, 'popEvent.value');
+        if (popEvent.value) {
+          showModalMask.value = true;
+          setTimeout(() => {
+            const btn = document.querySelector('#submitBtn');
+            console.log(btn);
+            if (btn) {
+              btn.addEventListener('click', () => {
+                showModalMask.value = false;
+                if (!popEvent.value) {
+                  return;
                 }
-              })
-            })
-          }
-
-        },500)
-
+                popEvent.value.prompt();
+                popEvent.value.userChoice.then((choiceResult: any) => {
+                  if (choiceResult.outcome === 'accepted') {
+                    console.log('用户已同意添加到桌面');
+                    showModalMask.value = false;
+                  } else {
+                    console.log('用户已取消添加到桌面');
+                    showModalMask.value = false;
+                  }
+                });
+              });
+            }
+          }, 500);
+        }
       }
-      }
-
-    }
+    };
 
-
-    window.addEventListener('beforeinstallprompt', checkInstall, { once: true })
+    window.addEventListener('beforeinstallprompt', checkInstall, {
+      once: true
+    });
 
     onBeforeUnmount(() => {
-      window.removeEventListener('beforeinstallprompt', checkInstall)
-    })
+      window.removeEventListener('beforeinstallprompt', checkInstall);
+    });
 
     onMounted(async () => {
       // const relatedApps = await navigator?.getInstalledRelatedApps();
       //
-
-    })
-    const downChrome = ()=>{
+    });
+    const downChrome = () => {
       const agent = navigator.userAgent.toLowerCase();
-      const isMac = function () { return /macintosh|mac os x/i.test(navigator.userAgent); }();
-      if (agent.indexOf("win32") >= 0 || agent.indexOf("wow32") >= 0) {
-        window.open('https://appstore.ks3-cn-beijing.ksyuncs.com/ChromeStandaloneSetup32.exe');
+      const isMac = (function () {
+        return /macintosh|mac os x/i.test(navigator.userAgent);
+      })();
+      if (agent.indexOf('win32') >= 0 || agent.indexOf('wow32') >= 0) {
+        window.open(
+          'https://appstore.ks3-cn-beijing.ksyuncs.com/ChromeStandaloneSetup32.exe'
+        );
       }
-      if (agent.indexOf("win64") >= 0 || agent.indexOf("wow64") >= 0) {
-        window.open('https://appstore.ks3-cn-beijing.ksyuncs.com/ChromeStandaloneSetup64.exe');
+      if (agent.indexOf('win64') >= 0 || agent.indexOf('wow64') >= 0) {
+        window.open(
+          'https://appstore.ks3-cn-beijing.ksyuncs.com/ChromeStandaloneSetup64.exe'
+        );
       }
       if (isMac) {
-        window.open('https://appstore.ks3-cn-beijing.ksyuncs.com/googlechrome-mac.dmg');
+        window.open(
+          'https://appstore.ks3-cn-beijing.ksyuncs.com/googlechrome-mac.dmg'
+        );
       }
-    }
+    };
 
     return () => (
       <div class={styles['view-account']}>
@@ -151,18 +172,20 @@ export default defineComponent({
             </NTabs>
           )}
 
-
-<div class={styles.alertWrap}>
-          <div class={styles.alertInfo}>
-            <NImage src={infoIcon} class={styles.infoIcon} previewDisabled></NImage>
-            为了您更好的上课体验,推荐使用Chrome浏览器
+          <div class={styles.alertWrap}>
+            <div class={styles.alertInfo}>
+              <NImage
+                src={infoIcon}
+                class={styles.infoIcon}
+                previewDisabled></NImage>
+              为了您更好的上课体验,推荐使用Chrome浏览器
+            </div>
+            <div class={styles.down} onClick={downChrome}>
+              立即下载
+            </div>
           </div>
-          <div class={styles.down} onClick={downChrome}>立即下载</div>
-         </div>
         </div>
-        <NModal
-          v-model:show={showModalMask.value}
-          >
+        <NModal v-model:show={showModalMask.value}>
           {/* <div
             onClick={() => {
               showModalTone.value = false;
@@ -175,24 +198,28 @@ export default defineComponent({
           <div class={styles.downMove}>
             <img src={dingPng} class={styles.dingPng} alt="" />
             <img src={moveTop} class={styles.downMoveBg} alt="" />
-            <img src={closeAble} class={styles.closeAble} onClick={()=>{
-              showModalMask.value = false
-            }} alt="" />
+            <img
+              src={closeAble}
+              class={styles.closeAble}
+              onClick={() => {
+                showModalMask.value = false;
+              }}
+              alt=""
+            />
             <h2>温馨提示</h2>
-            <p>检测到您尚未安装“音乐数字课堂”应用程序,为了更好的使用体验,是否立即下载?</p>
+            <p>
+              检测到您尚未安装“音乐数字课堂”应用程序,为了更好的使用体验,是否立即下载?
+            </p>
             {/* <NButton>确定</NButton> */}
             <NSpace style={{ padding: '25px 0 0 0' }} justify="center">
-          <NButton
-          {...{id
-          :'submitBtn'}}
-            class={styles.submitAppBtn}
-            round
-            type="primary"
-
-            >
-            立即下载
-          </NButton>
-        </NSpace>
+              <NButton
+                {...{ id: 'submitBtn' }}
+                class={styles.submitAppBtn}
+                round
+                type="primary">
+                立即下载
+              </NButton>
+            </NSpace>
           </div>
         </NModal>
       </div>

+ 2 - 2
vite.config.ts

@@ -23,8 +23,8 @@ function resolve(dir: string) {
 }
 // https://vitejs.dev/config/
 // https://github.com/vitejs/vite/issues/1930 .env
-// const proxyUrl = 'https://dev.kt.colexiu.com/';
-const proxyUrl = 'https://test.lexiaoya.cn';
+const proxyUrl = 'https://dev.kt.colexiu.com/';
+// const proxyUrl = 'https://test.lexiaoya.cn';
 export default defineConfig({
   base: './',
   plugins: [