Browse Source

社团选课

bzkf30 1 year ago
parent
commit
cd3ac69570

+ 87 - 0
src/pages/clubCourse/attendance.vue

@@ -0,0 +1,87 @@
+<template>
+  <div class="index">
+    <div class="text-center leading-80px">上课点名</div>
+    <van-form @submit="onSubmit">
+      <van-cell-group inset>
+        <van-field v-model="ruleForm.xss_mc" name="名称" label="名称" placeholder="名称" :rules="[{ required: true, message: '请填写名称' }]" />
+        <dateTimePicker ref="dmsjRef" label="点名时间" />
+        <van-field v-model="ruleForm.xss_qkrs_json" is-link readonly name="picker" label="缺课人数" placeholder="点击选择缺课人数" @click="showPicker = true" :rules="[{ required: true, message: '请选择缺课人数' }]" />
+        <van-popup v-model:show="showPicker" position="bottom">
+          <van-checkbox-group v-model="qkrsData" shape="square" @change="handleChange">
+            <van-cell-group>
+              <van-cell v-for="(item, index) in stuData" clickable :key="index" :title="item.xsxx_xsxm">
+                <template #right-icon>
+                  <van-checkbox :name="item.xsxx_xsxh"></van-checkbox>
+                </template>
+              </van-cell>
+            </van-cell-group>
+          </van-checkbox-group>
+        </van-popup>
+      </van-cell-group>
+      <div style="margin: 16px;">
+        <van-button round block type="primary" native-type="submit">
+          提交
+        </van-button>
+      </div>
+    </van-form>
+  </div>
+</template>
+
+<script setup>
+import { closeToast, showConfirmDialog, showFailToast, showSuccessToast } from 'vant'
+import dateTimePicker from './dateTImePicker.vue'
+const router = useRouter();
+const route = router.currentRoute.value
+const xsxk_id = route.query.xsxk_id
+
+const ruleForm = $ref({
+  xsxk_id: "",
+  xss_mc: "",
+  xss_dmsj: "",
+  xss_qkrs: "",
+  xss_qkrs_json: ""
+})
+const qkrsData = $ref([]);
+
+const dmsjRef = $ref()
+const onSubmit = async () => {
+  ruleForm.xss_dmsj = dmsjRef.getResult();
+  ruleForm.xsxk_id = xsxk_id;
+  let obj = {
+    xdjx_stxkgl_skdm: ruleForm,
+  }
+  let { code } = await request({ url: '/xdjx/stxkgl_skdm/add', data: obj });
+  if (code == 1) {
+    router.back();
+    showSuccessToast('保存成功!');
+  }
+};
+
+let stuData = $ref([]);
+initSelectData();
+async function initSelectData() {
+  let res = await request({ url: '/xdjx/stxkgl_xktj_xkqk/index', data: { limit: '999', xsxk_id } });
+  if (res.code == 1) {
+    stuData = res.data.page_data;
+  }
+}
+
+let showPicker = $ref(false);
+
+function handleChange(values) {
+  ruleForm.xss_qkrs = values.join(",");
+
+  let arr = [];
+  values.map(item => {
+    stuData.map(val => {
+      if (item == val.xsxx_xsxh) {
+        arr.push(val.xsxx_xsxm);
+      }
+    })
+  })
+  ruleForm.xss_qkrs_json = arr.join(",");
+}
+</script>
+
+<style>
+</style>

+ 55 - 0
src/pages/clubCourse/dateTImePicker.vue

@@ -0,0 +1,55 @@
+<script setup>
+const props = defineProps({
+  label: {
+    type: String,
+    default: '',
+  },
+})
+
+defineExpose({
+  getResult
+})
+function getResult() {
+  return result
+}
+let result = $ref('')
+let showDatePicker = $ref(false)
+let showTimePicker = $ref(false)
+
+const onDateConfirm = ({ selectedValues }) => {
+  result = selectedValues.join('-');
+  showDatePicker = false;
+  showTimePicker = true
+};
+const onTimeConfirm = ({ selectedValues }) => {
+  result = result + ' ' + selectedValues.join(':');
+  showTimePicker = false;
+};
+
+let oldResult = ''
+const clickPop = () => {
+  oldResult = result
+  showDatePicker = true
+}
+const clickCancel = () => {
+  result = oldResult
+  showDatePicker = false
+  showTimePicker = false
+
+}
+const currentTime = ref(['12', '00', '00']);
+const columnsType = ['hour', 'minute', 'second'];
+
+const minDate = new Date(2010, 0, 1)
+</script>
+<template>
+  <van-field v-model="result" is-link readonly name="datePicker" :label='props.label' placeholder="点击选择时间"
+    @click="clickPop" :rules="[{ required: true, message: '请选择时间' }]" />
+  <van-popup v-model:show="showDatePicker" position="bottom">
+    <van-date-picker :min-date="minDate" @confirm="onDateConfirm" @cancel="clickCancel" />
+  </van-popup>
+  <van-popup v-model:show="showTimePicker" position="bottom">
+    <van-time-picker @confirm="onTimeConfirm" @cancel="clickCancel" v-model="currentTime" title="选择时间"
+      :columns-type="columnsType" />
+  </van-popup>
+</template>

+ 54 - 0
src/pages/clubCourse/detail.vue

@@ -0,0 +1,54 @@
+<script setup>
+const router = useRouter();
+const route = router.currentRoute.value;
+const xsxk_id = route.query.xsxk_id;
+
+let active = $ref(0);
+const tabData = $ref([
+  {
+    title: "课程选课详情",
+    name: "CourseDetail"
+  },
+  {
+    title: "选课情况",
+    name: "CourseCondition"
+  },
+  {
+    title: "上课点名",
+    name: "CheckAttendance"
+  }
+])
+
+watch(
+  () => router.currentRoute.value.name,
+  (val) => {
+    tabData.map((item, index) => {
+      if (val.indexOf(item.name) != -1) {
+        active = index;
+      }
+    })
+  },
+  { immediate: true }
+)
+
+linkTo({ name: active });
+function linkTo({ name }) {
+  router.replace({
+    path: `/clubCourse/detail/${tabData[name].name}`,
+    query: { xsxk_id },
+  });
+}
+</script>
+
+<template>
+  <div class="index">
+    <van-tabs v-model:active="active" @click-tab="linkTo">
+      <van-tab v-for="(item, index) in tabData" :key="index" :title="item.title"></van-tab>
+    </van-tabs>
+
+    <router-view></router-view>
+  </div>
+</template>
+
+<style>
+</style>

+ 14 - 7
src/pages/clubCourse/detail/components/CheckAttendance.vue

@@ -1,7 +1,7 @@
 <script setup>
-const { currentRoute } = useRouter()
-const route = currentRoute.value
-const xsxk_id = route.query.xsxk_id
+const router = useRouter();
+const route = router.currentRoute.value;
+const xsxk_id = route.query.xsxk_id;
 
 const list = ref([])
 const loading = ref(false)
@@ -37,16 +37,23 @@ function reGetList() {
   finished.value = false
   onLoad()
 }
+
+function linkTo(name) {
+  router.push({
+    path: `/clubCourse/${name}`,
+    query: { xsxk_id },
+  });
+}
 </script>
 
 <template>
   <div class="index">
-    <!-- <van-cell>
+    <van-cell>
       <div class="flex space-x-15px">
-        <van-button class="flex-1" size="small" type="primary">新增</van-button>
-        <van-button class="flex-1" size="small" type="primary">统计</van-button>
+        <van-button class="flex-1" size="small" type="primary" @click="linkTo('attendance')">新增</van-button>
+        <van-button class="flex-1" size="small" type="primary" @click="linkTo('statistic')">统计</van-button>
       </div>
-    </van-cell> -->
+    </van-cell>
     <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
       <van-cell v-for="item in list" :key="item">
         <template #title>

+ 9 - 34
src/pages/clubCourse/detail/components/CourseCondition.vue

@@ -1,7 +1,7 @@
 <script setup>
 import { closeToast, showConfirmDialog, showFailToast, showSuccessToast } from 'vant'
-const { currentRoute } = useRouter()
-const route = currentRoute.value
+const router = useRouter();
+const route = router.currentRoute.value
 const xsxk_id = route.query.xsxk_id
 
 const list = ref([])
@@ -87,32 +87,11 @@ async function initClass() {
   }
 }
 
-const dialogVisible = ref(false)
-
-function beforeCloseDialog(action) {
-  if (action == 'confirm') {
-    showFailToast('请输入必填项!')
-    return
-    // if (dialogType.value != 1) {
-    //   if (currentData.value.lc_bt == 1 && currentData.value.xmlc_bt_value == '') {
-    //     showFailToast('请输入必填项!')
-    //     return false
-    //   }
-    //   handleClose()
-    // } else {
-    //   handleUpload()
-    // }
-  } else {
-    handleClose()
-  }
-}
-
-function handleClose() {
-  dialogVisible.value = false;
-  // currentData.value = {}
-  // dialogType.value = ''
-  // dialogTitle.value = ''
-  // fileData.value = []
+function handleAdd() {
+  router.push({
+    path: '/clubCourse/register',
+    query: { xsxk_id },
+  });
 }
 </script>
 
@@ -130,7 +109,7 @@ function handleClose() {
       <van-dropdown-item v-model="param.class_id" :options="classOption" @change="dropItemChange" />
     </van-dropdown-menu>
     <van-cell style="padding-top: 0 !important;">
-      <van-button class="w-full" size="small" type="primary" @click="dialogVisible=true">新增</van-button>
+      <van-button class="w-full" type="primary" size="small" @click="handleAdd">新增</van-button>
     </van-cell>
     <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
       <van-cell v-for="item in list" :key="item">
@@ -146,12 +125,8 @@ function handleClose() {
         </template>
       </van-cell>
     </van-list>
-
-    <van-dialog v-model:show="dialogVisible" title="课程报名" show-cancel-button :before-close="beforeCloseDialog">
-      888
-    </van-dialog>
   </div>
 </template>
 
 <style lang="scss" scoped>
-</style>
+</style>

src/pages/clubCourse/detail/components/CourseDetail.vue → src/pages/clubCourse/detail/CourseDetail.vue


+ 0 - 25
src/pages/clubCourse/detail/index.vue

@@ -1,25 +0,0 @@
-<script setup>
-import CourseDetail from "./components/CourseDetail.vue";
-import CourseCondition from "./components/CourseCondition.vue";
-import CheckAttendance from "./components/CheckAttendance.vue";
-const active = ref(0);
-</script>
-
-<template>
-  <div class="index">
-    <van-tabs v-model:active="active">
-      <van-tab title="课程选课详情">
-        <CourseDetail />
-      </van-tab>
-      <van-tab title="选课情况">
-        <CourseCondition />
-      </van-tab>
-      <van-tab title="上课点名">
-        <CheckAttendance />
-      </van-tab>
-    </van-tabs>
-  </div>
-</template>
-
-<style>
-</style>

+ 108 - 0
src/pages/clubCourse/register.vue

@@ -0,0 +1,108 @@
+<template>
+  <div class="index">
+    <div class="text-center leading-80px">课程报名</div>
+    <van-form @submit="onSubmit">
+      <van-cell-group inset>
+        <van-field v-model="ruleForm.xsxx_xsxm" name="学生姓名" label="学生姓名" placeholder="学生姓名" :rules="[{ required: true, message: '请填写学生姓名' }]" />
+        <van-field v-model="ruleForm.xsxx_xsxh" name="学籍号" label="学籍号" placeholder="学籍号" :rules="[{ required: true, message: '请填写学籍号' }]" />
+        <van-field v-model="ruleForm.grade_name" is-link readonly name="picker" label="年级" placeholder="点击选择年级" @click="showGradePicker = true" :rules="[{ required: true, message: '请选择年级' }]" />
+        <van-popup v-model:show="showGradePicker" position="bottom">
+          <van-picker :columns="gradeData" :columns-field-names="customGradeFieldName" @confirm="onGradeConfirm" @cancel="showGradePicker = false" />
+        </van-popup>
+        <van-field v-model="ruleForm.class_name" is-link readonly name="picker" label="班级" placeholder="点击选择班级" @click="showClassPicker = true" :rules="[{ required: true, message: '请选择班级' }]" />
+        <van-popup v-model:show="showClassPicker" position="bottom">
+          <van-picker :columns="classData" :columns-field-names="customClassFieldName" @confirm="onClassConfirm" @cancel="showClassPicker = false" />
+        </van-popup>
+      </van-cell-group>
+      <div style="margin: 16px;">
+        <van-button round block type="primary" native-type="submit">
+          提交
+        </van-button>
+      </div>
+    </van-form>
+  </div>
+</template>
+
+<script setup>
+import { closeToast, showConfirmDialog, showFailToast, showSuccessToast } from 'vant'
+const router = useRouter();
+const route = router.currentRoute.value
+const xsxk_id = route.query.xsxk_id
+
+const ruleForm = $ref({
+  xsxk_id: "",
+  xsxx_xsxm: "",
+  xsxx_xsxh: "",
+  grade_id: "",
+  grade_name: "",
+  class_id: "",
+  class_name: ""
+})
+
+const onSubmit = async () => {
+  ruleForm.xsxk_id = xsxk_id;
+  let obj = {
+    xdjx_stxkgl_xktj_xkqk: ruleForm,
+  }
+  let { code } = await request({ url: '/xdjx/stxkgl_xktj_xkqk/add', data: obj });
+  if (code == 1) {
+    router.back();
+    showSuccessToast('保存成功');
+  }
+};
+
+let gradeData = $ref([]);
+initSelectData();
+async function initSelectData() {
+  let res = await request({ url: '/jcxx/grade/index', data: { limit: '999' } });
+  if (res.code == 1) {
+    gradeData = res.data.page_data;
+  }
+}
+
+let showGradePicker = $ref(false);
+const customGradeFieldName = {
+  text: 'grade_name',
+  value: 'grade_id'
+};
+function onGradeConfirm({ selectedOptions }) {
+  ruleForm.grade_id = selectedOptions[0]?.grade_id;
+  ruleForm.grade_name = selectedOptions[0]?.grade_name;
+  showGradePicker = false;
+
+  if (ruleForm.grade_id) {
+    initClass();
+  }
+}
+
+
+let classData = $ref([]);
+async function initClass() {
+  ruleForm.class_id = "";
+  ruleForm.class_name = "";
+  classData = [];
+
+  if (!ruleForm.grade_id)
+    return
+
+  let res = await request({ url: '/jcxx/class/index', data: { limit: '999', grade_id: ruleForm.grade_id } });
+  if (res.code == 1) {
+    classData = res.data.page_data;
+  }
+}
+
+
+let showClassPicker = $ref(false);
+const customClassFieldName = {
+  text: 'class_name',
+  value: 'class_num'
+};
+function onClassConfirm({ selectedOptions }) {
+  ruleForm.class_id = selectedOptions[0]?.class_num;
+  ruleForm.class_name = selectedOptions[0]?.class_name;
+  showClassPicker = false;
+}
+</script>
+
+<style>
+</style>

+ 43 - 0
src/pages/clubCourse/statistic.vue

@@ -0,0 +1,43 @@
+<script setup>
+const router = useRouter();
+const route = router.currentRoute.value;
+const xsxk_id = route.query.xsxk_id;
+
+const list = ref([])
+const loading = ref(false)
+const finished = ref(false)
+let page = 1
+function onLoad() {
+  loading.value = true
+  request({
+    url: '/xdjx/stxkgl_skdm_dmjl/dmjl_alyz',
+    data: {
+      page,
+      limit: 20,
+      xsxk_id,
+    },
+  }).then((res) => {
+    const data = res.data
+    list.value = [...list.value, ...data.students]
+    finished.value = true;
+    // finished.value = data.total_page === page
+    // page++
+    loading.value = false
+  })
+}
+</script>
+
+<template>
+  <div class="index">
+    <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
+      <van-cell v-for="item in list" :key="item">
+        <template #title>
+          <span>{{ `${item.xsxm}` }}(缺课次数:{{ item.num }})</span>
+        </template>
+      </van-cell>
+    </van-list>
+  </div>
+</template>
+
+<style lang="scss" scoped>
+</style>

+ 13 - 0
src/pages/equipmentPurchase/index.vue

@@ -0,0 +1,13 @@
+<template>
+  <div>设备申购</div>
+</template>
+
+<script>
+export default {
+
+}
+</script>
+
+<style>
+
+</style>

+ 15 - 1
src/pages/menuData.js

@@ -100,11 +100,25 @@ export const menuList = [
       { icon: getAssetsImages('index/xmlcgl.png'), menuName: '体检登记', path: '/morningInspectionSystem/medicalExaminationRegistration' },
     ],
   },
-    {
+  {
     tag: 'sbbx',
     title: '设备保修',
     list: [
       { icon: getAssetsImages('index/xmlcgl.png'), menuName: '设备保修', path: '/equipmentWarranty/equipmentWarranty' },
     ],
   },
+  {
+    tag: 'stxk',
+    title: '社团选课',
+    list: [
+      { icon: getAssetsImages('index/xmlcgl.png'), menuName: '课程选课管理', path: '/clubCourse' },
+    ],
+  },
+  {
+    tag: 'xnsg',
+    title: '校内申购',
+    list: [
+      { icon: getAssetsImages('index/xmlcgl.png'), menuName: '校内申购', path: '/equipmentPurchase' },
+    ],
+  },
 ]