bzkf30 1 year ago
parent
commit
ba396c72a5

+ 1 - 0
index.html

@@ -4,6 +4,7 @@
 <head>
   <meta charset="UTF-8" />
   <link rel="icon" href="/favicon.ico" />
+  <meta name="viewport" />
   <!--    <meta name="viewport" content="width=device-width, initial-scale=1.0" />-->
   <title></title>
 </head>

+ 1 - 0
package.json

@@ -27,6 +27,7 @@
     "lodash-es": "^4.17.21",
     "plop": "^3.1.1",
     "print-js": "^1.6.0",
+    "qrcode.vue": "^3.4.1",
     "tinymce": "^6.3.0",
     "tinymce-vue": "^1.0.0",
     "vue": "^3.2.45",

+ 17 - 3
src/App.vue

@@ -1,11 +1,25 @@
 <script setup lang="ts">
-import zhCn from 'element-plus/lib/locale/lang/zh-cn'
-import AppView from '~/layout/app/index.vue';
+import { watch, ref } from "vue";
+import zhCn from "element-plus/lib/locale/lang/zh-cn";
+import AppView from "~/layout/app/index.vue";
+
+import { useRouter } from "vue-router";
+const router = useRouter();
+
+const hideAside = ref(false);
+watch(
+  () => router.currentRoute.value,
+  (newValue, oldValue) => {
+    hideAside.value = newValue.path == "/" ? true : newValue.meta.hideAside;
+  },
+  { immediate: true }
+);
 </script>
 
 <template>
 
   <el-config-provider :locale="zhCn" :zIndex="50" size="large" :button="{ autoInsertSpace: true }">
-    <app-view />
+    <router-view v-if="hideAside" />
+    <app-view v-else />
   </el-config-provider>
 </template>

+ 58 - 46
src/components/RemoteSelect/index.vue

@@ -1,79 +1,91 @@
 <script setup lang="ts">
-import { ref, watch } from 'vue';
-import request from '~/utils/request';
-import App from '~/layout/app/index.vue';
-
+import { ref, watch } from "vue";
+import request from "~/utils/request";
+import App from "~/layout/app/index.vue";
 
 const props = defineProps<{
-  url?: string,
-  to?: 'team' | 'grade' | 'class' | 'subject',
-  modelValue?: string,
-  modelName?: string,
-  change?: (item: object | undefined) => void,
-  fields?: [string, string],
-  label?: (arg: any) => string,
-  d?: {}
-}>()
-const emits = defineEmits(["update:modelValue", "update:modelName"])
-
-const loading = ref(false)
-
-const value = ref(props.modelValue)
-const options = ref<{ name: string, value: string, origin?: {} }[]>((props.modelValue && props.modelName) ? [{
-  name: props.modelName,
-  value: props.modelValue
-}] : [])
+  url?: string;
+  to?: "team" | "grade" | "class" | "subject";
+  modelValue?: string;
+  modelName?: string;
+  change?: (item: object | undefined) => void;
+  fields?: [string, string];
+  label?: (arg: any) => string;
+  d?: {};
+}>();
+const emits = defineEmits(["update:modelValue", "update:modelName"]);
+
+const loading = ref(false);
+
+const value = ref(props.modelValue);
+const options = ref<{ name: string; value: string; origin?: {} }[]>(
+  props.modelValue && props.modelName
+    ? [
+        {
+          name: props.modelName,
+          value: props.modelValue,
+        },
+      ]
+    : []
+);
 
 remoteMethod().then(() => {
   //
 
   // console.log('true :>> ', props.modelValue, props.modelName, options.value.find(({ value: val }) => val === props.modelValue));
-  if (props.modelValue && props.modelName && !options.value.find(({ value: val }) => val === props.modelValue)) {
+  if (
+    props.modelValue &&
+    props.modelName &&
+    !options.value.find(({ value: val }) => val === props.modelValue)
+  ) {
     // console.log('true :>> ', true);
     options.value.unshift({
       name: props.modelName,
-      value: props.modelValue
-    })
+      value: props.modelValue,
+    });
   }
-})
+});
 
 function remoteMethod(keyword?: string) {
-  loading.value = true
+  loading.value = true;
   return request({
     url: props.to ? `/jcxx/${props.to}/index` : props.url,
     data: {
       ...props.d,
       keyword,
       limit: 100,
-    }
+    },
   }).then(({ data }) => {
     options.value = data.page_data.map((item: { [index: string]: string }) => ({
-      value: item[props.fields ? props.fields[0] : props.to + '_id'],
-      name: props.label ? props.label(item) : (item[props.fields ? props.fields[1] : props.to + '_name']),
-      origin: item
-    }))
-
-    loading.value = false
-  })
+      value: item[props.fields ? props.fields[0] : props.to + "_id"],
+      name: props.label
+        ? props.label(item)
+        : item[props.fields ? props.fields[1] : props.to + "_name"],
+      origin: item,
+    }));
+
+    loading.value = false;
+  });
 }
 
-
-
 watch(
   () => value.value,
   (val) => {
-    const item = options.value.find(({ value }) => value === val)
-    emits("update:modelValue", val)
-    emits("update:modelName", item?.name)
-    props.change?.(item?.origin)
+    const item = options.value.find(({ value }) => value === val);
+    emits("update:modelValue", val);
+    emits("update:modelName", item?.name);
+    props.change?.(item?.origin);
   }
-)
+);
 
-watch(() => props.modelValue, (val) => {
-  if (val === undefined) {
-    value.value = undefined
+watch(
+  () => props.modelValue,
+  (val) => {
+    if (val === undefined || val === "") {
+      value.value = undefined;
+    }
   }
-})
+);
 </script>
 
 

+ 127 - 0
src/pages/xdjx/stxkgl/kcxkgl/detail/register.vue

@@ -0,0 +1,127 @@
+<template>
+  <div class="registerDiv">
+    <div class="text-center registerTitle">课程报名</div>
+    <el-form :model="ruleForm" ref="addForm" :rules="rules" label-width="100px" label-position="right">
+      <el-form-item label="学生姓名:" prop="xsxx_xsxm">
+        <el-input v-model="ruleForm.xsxx_xsxm"></el-input>
+      </el-form-item>
+      <el-form-item label="学籍号:" prop="xsxx_xsxh">
+        <el-input v-model="ruleForm.xsxx_xsxh"></el-input>
+      </el-form-item>
+      <el-form-item label="年级:" prop="grade_id">
+        <remote-select to="grade" v-model="ruleForm.grade_id" v-model:modelName="ruleForm.grade_name"></remote-select>
+      </el-form-item>
+      <el-form-item label="班级:" prop="class_id">
+        <el-select v-model="ruleForm.class_id" placeholder="请选择" @change="initClassName" style="width: 100%;">
+          <el-option v-for="item in classData" :key="item.class_id" :label="item.class_name" :value="item.class_num" />
+        </el-select>
+        <!-- <remote-select to="class" v-model="ruleForm.class_id" v-model:modelName="ruleForm.class_name" :d="{grade_id: ruleForm.grade_id}"></remote-select> -->
+      </el-form-item>
+      <div class="text-center">
+        <el-button type="primary" @click="handleSubmit('addForm')">提交</el-button>
+      </div>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import request from '~/utils/request';
+export default {
+  data() {
+    return {
+      token: "",
+      ruleForm: {
+        xsxk_id: "",
+        xsxx_xsxm: "",
+        xsxx_xsxh: "",
+        grade_id: "",
+        grade_name: "",
+        class_id: "",
+        class_name: ""
+      },
+      classData: [],
+      rules: {
+        xsxx_xsxm: { required: true, message: "学生姓名不能为空", trigger: "blur" },
+        xsxx_xsxh: { required: true, message: "学籍号不能为空", trigger: "blur" },
+        grade_id: { required: true, message: "年级不能为空", trigger: "change" },
+        class_id: { required: true, message: "班级不能为空", trigger: "change" },
+      }
+    }
+  },
+  watch: {
+    'ruleForm.grade_id': {
+      immediate: true,
+      handler(val) {
+        this.classData = [];
+        this.ruleForm.class_id = "";
+        this.ruleForm.class_name = "";
+        if (val) {
+          this.initClass();
+        }
+      }
+    },
+  },
+  methods: {
+    async initClass() {
+      let { code, data } = await request({ url: '/jcxx/class/index', data: { grade_id: this.ruleForm.grade_id, limit: '100' } });
+      if (code == 1) {
+        this.classData = data.page_data;
+      }
+    },
+    initClassName(val) {
+      this.classData.map(item => {
+        if (item.class_num == val) {
+          this.ruleForm.class_name = item.class_name;
+        }
+      })
+    },
+    handleSubmit(formName) {
+      this.$refs[formName].validate(async (valid) => {
+        if (valid) {
+          let obj = {
+            xdjx_stxkgl_xktj_xkqk: this.ruleForm,
+            token: this.token
+          }
+          let { code } = await request({ url: '/xdjx/stxkgl_xktj_xkqk/add', data: obj });
+          if (code == 1) {
+            this.init();
+            ElMessage.success(`报名成功!`);
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    init() {
+      for (let key in this.ruleForm) {
+        this.ruleForm[key] = "";
+      }
+      this.ruleForm.xsxk_id = this.$route.query.aid;
+      this.token = this.$route.query.token;
+    }
+  },
+  created() {
+    this.init();
+
+    document.querySelector('meta[name="viewport"]').setAttribute('content', 'width=device-width, initial-scale=1');
+  },
+  beforeRouteLeave(to, from, next) {
+    // 离开页面取消双指缩放
+    document.querySelector('meta[name="viewport"]').setAttribute('content', 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no');
+    next();
+  }
+}
+</script>
+
+<style lang="scss">
+.registerDiv {
+  padding: 100px 30px;
+  // width: 300px;
+  // margin: auto;
+  .registerTitle {
+    font-size: 30px;
+    margin-bottom: 30px;
+  }
+}
+</style>

+ 20 - 4
src/pages/xdjx/stxkgl/kcxkgl/detail/xkqk.vue

@@ -1,4 +1,5 @@
 <script setup lang="ts">
+import QrcodeVue from "qrcode.vue";
 import { ref, getCurrentInstance, reactive } from "vue";
 import { useRouter } from "vue-router";
 import request, { download } from "~/utils/request";
@@ -6,6 +7,9 @@ import { pick } from "lodash-es";
 import { ElMessage } from "element-plus";
 import type { FormInstance, FormRules } from "element-plus";
 import type { AxiosRequestConfig } from "axios";
+import { user } from "~/store/user";
+
+const webUrl = window.globalVariables.web;
 
 // #region (constant)
 const TABLE_KEY = "xsxx_id";
@@ -81,9 +85,11 @@ const handleTableRowBtn_export = () => {
   });
 };
 const handleTableRowBtn_add = () => {
-  whichDialogSubmit = "add";
-  dialogForm_Data.value = {};
-  dialogVisible_addOrEdit.value = true;
+  // whichDialogSubmit = "add";
+  // dialogForm_Data.value = {};
+  // dialogVisible_addOrEdit.value = true;
+
+  window.open(`/#/stxkgl/kcxkgl/register?aid=${props.aid}&token=${user.token}`);
 };
 const handleTableRowBtn_delete = async () => {
   if (multipleSelection.value.length === 0)
@@ -498,7 +504,16 @@ const handleMoveChange = (
     <div>
       <import-button @success="queryApi" :url="URL_CUT_REF" :importKey="('xsxk_id='+aid)"></import-button>
       <el-button @click="handleTableRowBtn_export" type="primary">导出打印</el-button>
-      <!-- <el-button @click="handleTableRowBtn_add" type="primary">dev:新增</el-button> -->
+      <el-popover placement="bottom" :width="160" trigger="hover">
+        <!-- {{ `${webUrl}/#/stxkgl/kcxkgl/register?aid=${props.aid}&token=${user.token}` }} -->
+        <div class="text-center" style="width: 100px;margin: auto;">
+          <qrcode-vue :value="`${webUrl}/#/stxkgl/kcxkgl/register?aid=${props.aid}&token=${user.token}`" size="100" level="H" />
+        </div>
+        <template #reference>
+          <el-button type="primary">新增</el-button>
+        </template>
+      </el-popover>
+      <!-- <el-button @click="handleTableRowBtn_add" type="primary">新增</el-button> -->
       <!-- <el-button @click="handleTableRowBtn_delete" type="danger">删除</el-button> -->
     </div>
 
@@ -508,6 +523,7 @@ const handleMoveChange = (
         <el-table-column type="selection"></el-table-column>
         <el-table-column type="index" label="序号" width="60" :index="(i: number) => (currentPage - 1) * limit + i + 1" />
         <el-table-column prop="xsxx_xsxm" label="学生姓名" width="auto" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="xsxx_xsxh" label="学籍号" width="auto" show-overflow-tooltip></el-table-column>
         <!-- <el-table-column prop="grade_id" label="年级编号" width="auto" show-overflow-tooltip></el-table-column> -->
         <el-table-column prop="grade_name" label="年级名称" width="auto" show-overflow-tooltip></el-table-column>
         <!-- <el-table-column prop="class_id" label="班级编号" width="auto" show-overflow-tooltip></el-table-column> -->

+ 2 - 2
src/pages/xdjx/stxkgl/xktj/xkqk.vue

@@ -509,8 +509,8 @@ const handleMoveChange = (
         <!-- <el-table-column prop="class_id" label="班级编号" width="auto" show-overflow-tooltip></el-table-column> -->
         <el-table-column prop="class_name" label="班级名称" width="auto" show-overflow-tooltip></el-table-column>
         <el-table-column prop="xsxx_xzkc" label="选择课程" width="auto" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="xsxx_rkjs" label="任课教师" width="auto" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="xsxx_sksj" label="上课时间" width="auto" show-overflow-tooltip></el-table-column>
+        <!-- <el-table-column prop="xsxx_rkjs" label="任课教师" width="auto" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="xsxx_sksj" label="上课时间" width="auto" show-overflow-tooltip></el-table-column> -->
         <!-- <el-table-column prop="xsxk_id" label="所属课程编号" width="auto" show-overflow-tooltip></el-table-column> -->
         <el-table-column label="操作" fixed="right">
           <template #default="scope">

+ 15 - 1
src/router/routes/xdjx.ts

@@ -715,7 +715,21 @@ export default <RouteRecordDetailRaw[]>[
             "redirect": {
               "name": "-STXKGL-KCXKGL-DETAIL-INDEX"
             }
-          }
+          },
+          {
+            "path": "register",
+            "name": "-STXKGL-KCXKGL-DETAIL-REGISTER",
+            "props": true,
+            "meta": {
+              "hideAside": true,
+              "hidden": true,
+              "breadcrumb": false,
+              "sort": 1,
+              "title": "报名"
+            },
+            "component": () => import('~/pages/xdjx/stxkgl/kcxkgl/detail/register.vue'),
+            "redirect": null
+          },
         ],
         "redirect": {
           "name": "-STXKGL-KCXKGL-INDEX"

+ 5 - 0
yarn.lock

@@ -1837,6 +1837,11 @@ promise-polyfill@^7.1.0:
   resolved "https://registry.npmmirror.com/promise-polyfill/-/promise-polyfill-7.1.2.tgz#ab05301d8c28536301622d69227632269a70ca3b"
   integrity sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==
 
+qrcode.vue@^3.4.1:
+  version "3.4.1"
+  resolved "https://registry.npmmirror.com/qrcode.vue/-/qrcode.vue-3.4.1.tgz#dd8141da9c4ea07ee56b111cd13eadf123af822a"
+  integrity sha512-wq/zHsifH4FJ1GXQi8/wNxD1KfQkckIpjK1KPTc/qwYU5/Bkd4me0w4xZSg6EXk6xLBkVDE0zxVagewv5EMAVA==
+
 queue-microtask@^1.2.2:
   version "1.2.3"
   resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"