From 1aa0483fabd258d1c1b1f9b21cc585ce75ddf5b9 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期三, 12 六月 2024 16:17:30 +0800
Subject: [PATCH] 代码迁移、路由

---
 src/api/request.js                        |   54 ++
 src/api/classesNotify.js                  |   61 ++
 src/views/login/index.vue                 |    2 
 src/views/exam/exam/Index.vue             |   18 
 src/views/class-management/index.vue      |   12 
 src/api/subject.js                        |    2 
 src/api/classes.js                        |   77 +++
 src/router.js                             |    2 
 src/views/exam/exam/ExamManage.vue        |  377 +++++++++++++++
 src/views/class-management/ClassStaff.vue |  332 +++++++++++++
 src/views/class-management/Class.vue      |  387 ++++++++++++++++
 src/api/classesUser.js                    |   55 ++
 src/views/exam/exam/MarkPaper.vue         |   42 +
 13 files changed, 1,418 insertions(+), 3 deletions(-)

diff --git a/src/api/classes.js b/src/api/classes.js
new file mode 100644
index 0000000..c3e8bee
--- /dev/null
+++ b/src/api/classes.js
@@ -0,0 +1,77 @@
+import axios from "./request";
+
+// 鑾峰彇鐝骇鍒嗛〉
+export const getClassess = (params) => {
+    return axios({
+        url: "/api/admin/classes/page",
+        method: "GET",
+        params: params
+    })
+}
+
+// 鎴戠殑鐝骇
+export const myClasses = () => {
+  return axios({
+    url: "/api/admin/classes/my",
+    method: "GET"
+  })
+}
+
+// 鑾峰彇鐝骇鍒楄〃
+export const getClassesList = () => {
+    return axios({
+        url: "/api/admin/classes/list",
+        method: "GET"
+    })
+}
+
+// 閫氳繃id鑾峰彇鐝骇
+export const getClassesById = (params) => {
+    return axios({
+        url: "/api/admin/classes/" + params,
+        method: "GET"
+    })
+}
+
+// 閫氳繃id鍒犻櫎鐝骇
+export const deleteClassesById = (params) => {
+    return axios({
+        url: "/api/admin/classes/" + params,
+        method: "DELETE"
+    })
+}
+
+// 瑙f暎鐝骇
+export const dissolution = (params) => {
+  return axios({
+    url: "/api/admin/classes/dissolution/" + params,
+    method: "PUT"
+  })
+}
+
+// 鎵归噺鍒犻櫎鐝骇
+export const deleteClassesByIds = (params) => {
+    return axios({
+        url: "/api/admin/classes/batch",
+        method: "DELETE",
+        data: params
+    })
+}
+
+// 淇敼鐝骇
+export const editClasses = (params) => {
+    return axios({
+        url: "/api/admin/classes/",
+        method: "PUT",
+        data: params
+    })
+}
+
+// 娣诲姞鐝骇
+export const addClasses = (params) => {
+    return axios({
+        url: "/api/admin/classes/",
+        method: "POST",
+        data: params
+    })
+}
diff --git a/src/api/classesNotify.js b/src/api/classesNotify.js
new file mode 100644
index 0000000..222fe3a
--- /dev/null
+++ b/src/api/classesNotify.js
@@ -0,0 +1,61 @@
+import axios from "./request";
+
+// 鑾峰彇鐝骇閫氱煡鍒嗛〉
+export const getClassesNotifys = (params) => {
+    return axios({
+        url: "/api/admin/classes-notify/page",
+        method: "GET",
+        params: params
+    })
+}
+
+// 鑾峰彇鐝骇閫氱煡鍒楄〃
+export const getClassesNotifyList = () => {
+    return axios({
+        url: "/api/admin/classes-notify/list",
+        method: "GET"
+    })
+}
+
+// 閫氳繃id鑾峰彇鐝骇閫氱煡
+export const getClassesNotifyById = (params) => {
+    return axios({
+        url: "/api/admin/classes-notify/" + params,
+        method: "GET"
+    })
+}
+
+// 閫氳繃id鍒犻櫎鐝骇閫氱煡
+export const deleteClassesNotifyById = (params) => {
+    return axios({
+        url: "/api/admin/classes-notify/" + params,
+        method: "DELETE"
+    })
+}
+
+// 鎵归噺鍒犻櫎鐝骇閫氱煡
+export const deleteClassesNotifyByIds = (params) => {
+    return axios({
+        url: "/api/admin/classes-notify/batch",
+        method: "DELETE",
+        data: params
+    })
+}
+
+// 淇敼鐝骇閫氱煡
+export const editClassesNotify = (params) => {
+    return axios({
+        url: "/api/admin/classes-notify/",
+        method: "PUT",
+        data: params
+    })
+}
+
+// 娣诲姞鐝骇閫氱煡
+export const addClassesNotify = (params) => {
+    return axios({
+        url: "/api/admin/classes-notify/",
+        method: "POST",
+        data: params
+    })
+}
diff --git a/src/api/classesUser.js b/src/api/classesUser.js
new file mode 100644
index 0000000..338a4e4
--- /dev/null
+++ b/src/api/classesUser.js
@@ -0,0 +1,55 @@
+import axios from "./request";
+
+// 鑾峰彇鐝骇涓庣敤鎴峰叧鑱旇〃鍒嗛〉
+export const getClassesUsers = (params) => {
+    return axios({
+        url: "/api/admin/classesUser/page",
+        method: "GET",
+        params: params
+    })
+}
+
+// 淇濆瓨鐝骇瀛﹀憳鏁版嵁(鍒犻櫎/鏂板)
+export const updateClassesUser = (data) => {
+  return axios({
+    url: "/api/admin/classesUser/edit",
+    method: "POST",
+    data: data
+  })
+}
+
+// 缂栬緫瀛﹀憳淇℃伅
+export const editClassesUser = (data) => {
+  return axios({
+    url: "/api/admin/classesUser",
+    method: "PUT",
+    data: data
+  })
+}
+
+
+// 閫氳繃id鍒犻櫎
+export const deleteClassesUserById = (params) => {
+  return axios({
+    url: "/api/admin/classesUser/" + params,
+    method: "DELETE"
+  })
+}
+
+// 鎵归噺鍒犻櫎
+export const deleteClassesUserByIds = (params) => {
+  return axios({
+    url: "/api/admin/classesUser/batch",
+    method: "DELETE",
+    data: params
+  })
+}
+
+// 娣诲姞鐝骇涓庣敤鎴峰叧鑱旇〃
+export const addClassesUser = (params) => {
+  return axios({
+    url: "/api/admin/classesUser/",
+    method: "POST",
+    data: params
+  })
+}
diff --git a/src/api/request.js b/src/api/request.js
new file mode 100644
index 0000000..3a41c94
--- /dev/null
+++ b/src/api/request.js
@@ -0,0 +1,54 @@
+import axios from "axios";
+import router from "../router";
+import {Message} from 'element-ui';
+import vue from "vue";
+
+const instance = axios.create({
+  baseURL: process.env.VUE_APP_URL,
+  timeout: 50000,
+  // 涓嶆惡甯ookie
+  withCredentials: true,
+  headers: {
+    "Content-Type": "application/json"
+  }
+});
+
+// 娣诲姞璇锋眰鎷︽埅鍣�
+instance.interceptors.request.use(function (config) {
+  return config;
+}, function (error) {
+  Message.error("璇锋眰瀛樺湪闂锛岃妫�鏌�")
+  return Promise.reject(error);
+});
+
+// 娣诲姞鍝嶅簲鎷︽埅鍣�
+instance.interceptors.response.use(function (response) {
+  if (response.data.code === 1) {
+    return response;
+    // 楠岃瘉鐮侀敊璇斁琛岋紝浠ヤ究鍒锋柊楠岃瘉鐮�
+  }
+  // 澶勭悊鑷畾涔夌姸鎬佺爜
+  else if (response.data.code === 1998) {
+    return response;
+  } else {
+    Message.error(response.data.msg);
+    return Promise.reject(response.data.msg);
+  }
+
+}, function (error) {
+  // 澶勭悊http鐘舵�佺爜
+  if (error.response.data) {
+    error.message = error.response.data.msg;
+  }
+  if (error.response.code === 401) {
+    error.message = "鐧诲綍宸茶繃鏈燂紝璇烽噸鏂扮櫥褰�";
+    vue.prototype.$$router.push({ path: '/login' })
+  }
+  if (error.response.code === 403) {
+    error.message = "鏉冮檺涓嶈冻";
+  }
+  Message.error(error.message);
+  return Promise.reject(error);
+});
+
+export default instance;
diff --git a/src/api/subject.js b/src/api/subject.js
index 124c6a3..d2bed4f 100644
--- a/src/api/subject.js
+++ b/src/api/subject.js
@@ -1,7 +1,7 @@
 import { post } from '@/utils/request'
 
 export default {
-  list: query => post('/api/admin/education/subject/list'),
+  list: query => post('/api/admin/subject/list'),
   pageList: query => post('/api/admin/education/subject/page', query),
   edit: query => post('/api/admin/education/subject/edit', query),
   select: id => post('/api/admin/education/subject/select/' + id),
diff --git a/src/router.js b/src/router.js
index b567245..1632554 100644
--- a/src/router.js
+++ b/src/router.js
@@ -26,7 +26,7 @@
   {
     path: '/',
     component: Layout,
-    redirect: '/dashboard',
+    redirect: '/login',
     children: [
       {
         path: 'dashboard',
diff --git a/src/views/class-management/Class.vue b/src/views/class-management/Class.vue
new file mode 100644
index 0000000..9cdd5a9
--- /dev/null
+++ b/src/views/class-management/Class.vue
@@ -0,0 +1,387 @@
+<!-- 鐝骇绠$悊 -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <div class="main-1">
+          <div
+            class="main-btn flex"
+            style="justify-content:space-between"
+          >
+            <div>
+              <el-button
+                type="primary"
+                size="small"
+                style="margin-right:20px;"
+                @click="handlerAdd"
+              >鏂板鐝骇</el-button>
+            </div>
+            <el-form :inline="true" :model="searchForm" class="demo-form-inline">
+              <el-form-item label="鐝骇鍚嶇О">
+                <el-input v-model="searchForm.className" size="small" clearable @clear="page" placeholder="鐝骇鍚嶇О"></el-input>
+              </el-form-item>
+              <el-form-item label="鐝骇鐘舵��">
+                <el-select v-model="searchForm.status" size="small" clearable @change="page" placeholder="鐝骇鐘舵��">
+                  <el-option label="姝e父" value="normal"></el-option>
+                  <el-option label="瑙f暎" value="dissolution"></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item>
+                <el-button type="primary" @click="page">鏌ヨ</el-button>
+              </el-form-item>
+            </el-form>
+          </div>
+          <div>
+            <div>
+              <el-table
+                v-loading="loading"
+                :data="tableData"
+                border
+                :row-style="{height:'42px'}"
+                :cell-style="{padding: '0'}"
+              >
+                <el-table-column
+                  align="center"
+                  label="鐝骇"
+                  prop="className"
+                  width="180px"
+                ></el-table-column>
+                <el-table-column
+                  label="鐘舵��"
+                  align="center"
+                  width="80px"
+                  prop="status"
+                >
+                  <template slot-scope="scope">
+                    <el-tag v-if="scope.row.status === '姝e父'" type="success">{{scope.row.status}}</el-tag>
+                    <el-tag v-if="scope.row.status === '瑙f暎'" type="danger">{{scope.row.status}}</el-tag>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  width="100px"
+                  align="center"
+                  label="鍗曚綅"
+                  prop="unit"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  width="100px"
+                  label="鏁欏笀"
+                  prop="createUserName"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  width="120px"
+                  label="鑱旂郴鐢佃瘽"
+                  prop="teacherPhone"
+                ></el-table-column>
+                <el-table-column
+                  width="140px"
+                  label="寮�鐝椂闂�"
+                  align="center"
+                  prop="startTime"
+                ></el-table-column>
+                <el-table-column
+                  width="140px"
+                  label="缁撴潫鏃堕棿"
+                  align="center"
+                  prop="endTime"
+                ></el-table-column>
+                <el-table-column
+                  label="鎿嶄綔"
+                  align="center"
+                  fixed="right"
+                >
+                  <template slot-scope="scope">
+                    <el-button v-if="scope.row.status !== '瑙f暎'" size="small" @click="handlerEdit(scope.row)" type="primary">淇敼</el-button>
+                    <el-button v-if="scope.row.status !== '瑙f暎'" size="small" type="warning">鐝骇楠岃瘉</el-button>
+                    <el-button v-if="scope.row.status !== '瑙f暎'" size="small" @click="handlerOpenNotify(scope.row)" type="info">閫氱煡</el-button>
+                    <el-button v-if="scope.row.status !== '瑙f暎'" @click="studentManager(scope.row.id)" size="small" type="success">鎴愬憳绠$悊</el-button>
+                    <el-button v-if="scope.row.status !== '瑙f暎'" @click="dissolution(scope.row.id)" type="danger" size="small">瑙f暎</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div
+              class="flex"
+              style="justify-content:center;margin-top:20px;"
+            >
+              <pagination v-show="total>0" :total="total" :page.sync="searchForm.pageIndex" :limit.sync="searchForm.pageSize"
+                          @pagination="page"/>
+            </div>
+          </div>
+        </div>
+      </div>
+
+    </div>
+
+    <el-dialog
+      title="鐝骇閫氱煡"
+      :visible.sync="notifyOpen"
+      width="600px"
+      :before-close="handleClose">
+      <el-form :model="notifyForm" :rules="notifyRules" ref="notifyForm" label-width="100px" class="demo-ruleForm">
+        <el-form-item label="閫氱煡鐝骇锛�" prop="className">
+          <span>{{notifyForm.className}}</span>
+        </el-form-item>
+        <el-form-item label="閫氱煡鍐呭锛�" prop="notifyContent">
+          <el-input type="textarea" v-model="notifyForm.notifyContent" size="small"></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleNotifyClose">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitNotifyForm">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      width="700px"
+      :before-close="handleClose">
+      <el-form :model="form" :rules="rules" ref="form" label-width="100px" class="demo-ruleForm">
+        <el-form-item label="鐝骇鍚嶇О" prop="className">
+          <el-input v-model="form.className" size="small"></el-input>
+        </el-form-item>
+        <el-form-item label="鐝骇鏃堕棿" required>
+          <el-col :span="11">
+            <el-form-item prop="startTime">
+              <el-date-picker
+                v-model="form.startTime"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="寮�濮嬫棩鏈�">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col class="line" :span="2">-</el-col>
+          <el-col :span="11">
+            <el-form-item prop="endTime">
+              <el-date-picker
+                v-model="form.endTime"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="缁撴潫鏃ユ湡">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-form-item>
+
+        <el-form-item label="澶囨敞淇℃伅" prop="remark">
+          <el-input type="textarea" v-model="form.remark" size="small"></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import { addClasses, editClasses, getClassess, dissolution } from "@/api/classes";
+import { addClassesNotify } from "@/api/classesNotify";
+import Pagination from "@/components/Pagination"
+export default {
+  components: {Pagination},
+  data() {
+    return {
+      notifyOpen: false,
+      notifyForm: {
+        className: '',
+        notifyContent: '',
+        classesId: null
+      },
+      loading: true,
+      total: 0,
+      open: false,
+      title: "",
+      value: "",
+      searchForm: {
+        className:'',
+        status: '',
+        subject: null,
+        pageSize: 10,
+        pageNum: 1
+      },
+      form: {
+        id: null,
+        className: "",
+        status: "",
+        verifyStatus: "",
+        startTime: null,
+        endTime: null,
+        remark: ""
+      },
+      notifyRules: {
+        notifyContent: [
+          { required: true, message: '璇疯緭鍏ラ�氱煡鍐呭', trigger: 'blur' },
+          { min: 1, max: 500, message: '闀垮害鍦� 1 鍒� 500 涓瓧绗�', trigger: 'blur' }
+        ],
+      },
+      rules: {
+        className: [
+          { required: true, message: '璇疯緭鍏ョ彮绾у悕绉�', trigger: 'blur' },
+          { min: 1, max: 30, message: '闀垮害鍦� 1 鍒� 30 涓瓧绗�', trigger: 'blur' }
+        ],
+        startTime: [
+          { required: true, message: '璇烽�夋嫨鐝骇寮�濮嬫椂闂�', trigger: 'change' },
+        ],
+        endTime: [
+          { required: true, message: '璇烽�夋嫨鐝骇缁撴潫鏃堕棿', trigger: 'change' },
+        ],
+      },
+      tableData: [
+
+      ],
+    };
+  },
+  methods: {
+    handlerOpenNotify(row) {
+      this.notifyOpen = true
+      this.notifyForm.className = row.className
+      this.notifyForm.classesId = row.id
+    },
+    submitNotifyForm() {
+      this.$refs['notifyForm'].validate((valid) => {
+        if (valid) {
+          let _this = this
+          addClassesNotify(_this.notifyForm).then(res => {
+            this.$message.success(res.data.message)
+            this.notifyOpen = false
+            this.clearNotifyForm()
+          })
+        }
+      })
+    },
+    clearNotifyForm() {
+      this.notifyForm = {
+        className: '',
+        notifyContent: ''
+      }
+    },
+    handleNotifyClose() {
+      this.notifyOpen = false
+      this.clearNotifyForm()
+    },
+    page() {
+      getClassess(this.searchForm).then(res => {
+        this.tableData = res.data.data
+        this.total = res.data.total
+        this.loading = false
+      })
+    },
+    resetForm() {
+      this.form = {
+        id: null,
+        className: "",
+        status: "",
+        verifyStatus: "",
+        startTime: null,
+        endTime: null,
+        remark: ""
+      }
+    },
+    submitForm() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          if (this.form.id) {
+            editClasses(this.form).then(res => {
+              this.$message.success("淇敼鎴愬姛")
+              this.resetForm()
+              this.open = false
+              this.page()
+            })
+          } else {
+            addClasses(this.form).then(res => {
+              this.$message.success("娣诲姞鐝骇鎴愬姛")
+              this.resetForm()
+              this.open = false
+              this.page()
+            })
+          }
+        } else {
+          return false;
+        }
+      });
+    },
+    dissolution(id) {
+      dissolution(id).then(res => {
+        this.$message.success(res.data.message)
+        this.page()
+      })
+    },
+    handlerEdit(row) {
+      this.form = row;
+      this.open = true
+    },
+    handleClose() {
+      this.open = false
+      this.resetForm()
+    },
+    handlerAdd() {
+      this.open = true
+      this.title = "鏂板鐝骇"
+    },
+    // 璺宠浆(鏌ョ湅鐝骇浜哄憳鎯呭喌)
+    studentManager(classesId) {
+      this.$router.push({ path: "class-management/Class-staff", query: { classesId: classesId } });
+    },
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+  },
+  created() {
+    this.page()
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+.mian-1-top {
+  margin: 10px 0;
+  align-items: center;
+  & input {
+    height: 30px;
+    width: 200px;
+    margin-right: 20px;
+  }
+}
+
+.main {
+  &-title {
+    border-left: 5px solid rgb(16, 71, 247);
+    padding-left: 10px;
+    margin: 30px 0;
+    & p {
+      font-weight: 700;
+    }
+  }
+  &-1 {
+    width: 1227px;
+    // height: 784px;
+    background: white;
+    box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.1);
+    border-radius: 10px;
+    padding: 32px 40px;
+  }
+  &-btn {
+    padding-bottom: 10px;
+    border-bottom: 3px solid rgb(16, 71, 247);
+  }
+}
+.deepBlue {
+  background: rgb(16, 71, 247);
+  color: white;
+  border: none;
+  &:hover {
+    background-color: rgb(45, 92, 248);
+  }
+}
+</style>
diff --git a/src/views/class-management/ClassStaff.vue b/src/views/class-management/ClassStaff.vue
new file mode 100644
index 0000000..2811374
--- /dev/null
+++ b/src/views/class-management/ClassStaff.vue
@@ -0,0 +1,332 @@
+<!-- 鐝骇浜哄憳绠$悊 -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <div class="content">
+          <!-- 鐝骇鍚嶇О -->
+          <div style="padding-bottom:20px; border-bottom: 3px solid #409EFF;margin-bottom: 20px;">
+            <span>{{title}}</span>
+            <el-button @click="handlerAddStudent" type="primary" size="small">鏂板瀛﹀憳</el-button>
+            <el-button @click="open = true" type="primary" size="small">瀛﹀憳璋冩暣</el-button>
+          </div>
+          <!-- 琛ㄦ牸 -->
+          <el-table
+            :header-cell-style="getRowClass"
+            :row-style="{height:'38px'}"
+            :cell-style="{padding: '0'}"
+            :data="tableData"
+            border
+            style="width: 100%;"
+          >
+            <el-table-column
+              align="center"
+              prop="id"
+              label="瀛﹀彿"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="realName"
+              label="濮撳悕"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="sex"
+              :formatter="sexFormatter"
+              label="鎬у埆"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="phone"
+              label="鐢佃瘽"
+            >
+            </el-table-column>
+            <el-table-column
+              label="鎿嶄綔"
+              align="center"
+              width="300px"
+            >
+              <template slot-scope="scope">
+                <el-button @click="handlerEditStudent(scope.row)" type="warning">缂栬緫</el-button>
+                <el-button @click="remove(scope.row.id)" type="danger">鍒犻櫎</el-button>
+                <el-button type="primary">鍒嗛厤瑙掕壊</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div
+            class="block"
+            style="display: flex; margin-top: 40px;"
+          >
+            <pagination v-show="total>0" :total="total" :page.sync="searchForm.pageNum" :limit.sync="searchForm.pageSize"
+                        @pagination="page"/>
+          </div>
+        </div>
+      </div>
+
+    </div>
+    <PopUp
+      ref="popUp"
+      @children="parentGoods"
+    />
+
+    <el-dialog
+      :title="studentTitle"
+      :visible.sync="addOpen"
+      width="700px"
+      :before-close="handleAddClose">
+      <el-form :model="studentForm" :rules="studentRules" ref="studentForm" label-width="100px" class="demo-ruleForm">
+        <el-form-item label="濮撳悕" prop="realName">
+          <el-input v-model="studentForm.realName"></el-input>
+        </el-form-item>
+        <el-form-item label="鎬у埆" prop="sex">
+          <el-select v-model="studentForm.sex">
+            <el-option label="鐢�" value="N"></el-option>
+            <el-option label="濂�" value="V"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鐢佃瘽" prop="phone">
+          <el-input v-model="studentForm.phone"></el-input>
+        </el-form-item>
+        <el-form-item label="鐧诲綍璐﹀彿" prop="account">
+          <el-input v-model="studentForm.account"></el-input>
+        </el-form-item>
+        <el-form-item label="鐧诲綍瀵嗙爜" prop="password">
+          <el-input v-model="studentForm.password" show-password placeholder="涓嶅~鍐欎細浣跨敤榛樿202406"></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleAddClose">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitStudentForm">娣� 鍔�</el-button>
+      </span>
+    </el-dialog>
+
+    <el-dialog
+      title="瀛﹀憳璋冩暣"
+      :visible.sync="open"
+      width="900px"
+      :before-close="handleClose">
+      <el-transfer
+        filterable
+        :filter-method="filterMethod"
+        filter-placeholder="瀛﹀憳濮撳悕"
+        :titles="['瀛︾敓鍒楄〃', '褰撳墠瀛︾敓']"
+        :button-texts="['閫�鍑虹彮绾�', '鍔犲叆鐝骇']"
+        :props="{
+          key: 'id',
+          label: 'realName'
+        }"
+        v-model="classes.studentList"
+        :data="studentList">
+      </el-transfer>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitForm">淇� 瀛�</el-button>
+      </span>
+    </el-dialog>
+
+  </div>
+</template>
+<script>
+// 寮曞叆褰堝嚭绐楀彛绲勪欢
+import PopUp from "../../../components/PopUp/Question.vue";
+import UserApi from "@/api/user";
+import { updateClassesUser, getClassesUsers, deleteClassesUserById, addClassesUser, edit } from "@/api/classesUser";
+export default {
+  // 娉ㄥ唽
+  components: {
+    PopUp,
+  },
+  data() {
+    return {
+      studentForm: {
+        realName: "",
+        sex: "",
+        phone: "",
+        age: null,
+        account: "",
+        password: ""
+      },
+      studentRules: {
+        realName: [
+          { required: true, message: '璇峰~鍐欏鍛樺鍚�', trigger: 'blur' },
+        ],
+        sex: [
+          { required: true, message: '璇烽�夋嫨瀛﹀憳鎬у埆', trigger: 'change' },
+        ],
+        phone: [
+          { required: true, message: '璇峰~鍐欏鍛樼數璇�', trigger: 'blur' },
+        ],
+        account: [
+          { required: true, message: '璇峰~鍐欏鍛樼櫥褰曡处鍙�', trigger: 'blur' },
+        ]
+      },
+      studentTitle: "鏂板瀛﹀憳",
+      addOpen: false,
+      total: 0,
+      studentList: [],
+      searchForm: {
+        examName: "",
+        pageSize: 10,
+        pageNum: 1,
+        classesId: null
+      },
+      classes: {
+        id: null,
+        studentList: []
+      },
+      open: false,
+      // 鐝骇鍚嶇О
+      title: "19绾ц蒋浠跺洓鐝�",
+      formLabelAlign: {
+        type: "",
+        user: "",
+        region: "",
+      },
+      tableData: [
+      ],
+    };
+  },
+  mounted() {
+    this.classes.id = this.$route.query.classesId;
+    this.page()
+    this.getClassesCurrentUserList(this.classes.id)
+    this.getStudentList()
+  },
+  methods: {
+    handlerEditStudent(row) {
+      this.studentForm = row
+      this.studentTitle = "缂栬緫瀛﹀憳"
+      this.addOpen = true
+    },
+    handlerAddStudent() {
+      this.studentTitle = "娣诲姞瀛﹀憳"
+      this.addOpen = true
+    },
+    submitStudentForm() {
+      this.$refs['studentForm'].validate((valid) => {
+        if (valid) {
+          this.studentForm.classes = this.classes.id
+          if (this.studentForm.id) {
+            edit(this.studentForm).then(res => {
+              this.addOpen = false
+              this.$message.success(res.data.message)
+              this.page()
+            })
+          }
+          addClassesUser(this.studentForm).then(res => {
+            this.addOpen = false
+            this.$message.success(res.data.message)
+            this.page()
+          })
+        }
+      })
+    },
+    resetStudentForm() {
+      this.studentForm = {
+        realName: "",
+        sex: "",
+        phone: "",
+        age: null
+      }
+    },
+    handleAddClose() {
+      this.addOpen = false
+      this.resetStudentForm()
+    },
+    remove(id) {
+      deleteClassesUserById(id).then(res => {
+        this.$message.success(res.data.message)
+        this.page()
+      })
+    },
+    sexFormatter(row) {
+      if (row.sex === 1) {
+        return "鐢�"
+      }
+      if (row.sex === 2) {
+        return "濂�"
+      }
+    },
+    getClassesCurrentUserList(classesId) {
+      let param = {
+        classesId: classesId
+      }
+      UserApi.getClassesCurrentUserList(param).then(res => {
+        this.classes.studentList = res.data.map(item => item.id)
+      })
+    },
+    getStudentList() {
+      UserApi.studentList().then(res => {
+        this.studentList = res.data;
+      })
+    },
+    // 鑾峰彇褰撳墠鐝骇瀛﹀憳鍒嗛〉
+    page() {
+      this.searchForm.classesId = this.classes.id
+      getClassesUsers(this.searchForm).then(res => {
+        this.tableData = res.data.data
+      })
+    },
+    submitForm() {
+      updateClassesUser(this.classes).then(res => {
+        this.$message.success(res.data.message)
+        this.page();
+      })
+    },
+    handleClose() {
+      this.open = false
+    },
+    filterMethod(query, item) {
+      if (! item.realName) {
+        return null
+      }
+      return item.realName.indexOf(query) > -1;
+    },
+    // 杩斿洖涓婁竴涓〉闈�
+    goBack() {
+      this.$router.back();
+    },
+    // 淇敼琛ㄥ崟澶撮儴鐨勯鑹�
+    getRowClass() {
+      return "background:#d2d3d6";
+    },
+
+    // 鐢熸垚璇曞嵎
+    getCreate() {
+      // 璺宠浆鍒扮敓鎴愰〉闈�
+      //璺宠浆鍒板搴旂殑绠$悊椤甸潰
+      this.$router.push({
+        path: "/manage/test-paper-generation",
+      });
+    },
+
+    // 鐐瑰嚮鍚庤皟鐢ㄥ脊绐楃粍浠剁殑鏂规硶,寮�鍚脊绐�
+    getDialogFormVisible() {
+      this.$refs.popUp.showDialog();
+    },
+    // 寮圭獥
+    // 鎺ユ敹寮圭獥缁勪欢杩斿洖鐨勮〃鍗曞��
+    parentGoods(obj) {
+      console.log(obj, "寮圭獥缁勪欢鐨勮〃鍗曞��");
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+// 鍐呭
+.content {
+  width: 1262px;
+  margin-bottom: 80px;
+  background-color: #fff;
+  padding: 20px 40px;
+  border-radius: 10px;
+}
+</style>
+
+
diff --git a/src/views/class-management/index.vue b/src/views/class-management/index.vue
new file mode 100644
index 0000000..6b8da30
--- /dev/null
+++ b/src/views/class-management/index.vue
@@ -0,0 +1,12 @@
+<template>
+  <div>
+    <router-view></router-view>
+  </div>
+</template>
+
+<script>
+export default {};
+</script>
+
+<style>
+</style>
diff --git a/src/views/exam/exam/ExamManage.vue b/src/views/exam/exam/ExamManage.vue
new file mode 100644
index 0000000..f609511
--- /dev/null
+++ b/src/views/exam/exam/ExamManage.vue
@@ -0,0 +1,377 @@
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <div class="main-1">
+          <div class="main-btn">
+            <el-button
+              type="primary"
+              @click="openAdd"
+            >瀹夋帓鑰冭瘯
+            </el-button>
+          </div>
+          <div>
+            <el-form :inline="true" :model="searchForm" class="demo-form-inline">
+              <el-form-item label="鑰冭瘯鍚嶇О">
+                <el-input v-model="searchForm.examName" @input="page" clearable size="small" clearable @clear="page" placeholder="鐝骇鍚嶇О"></el-input>
+              </el-form-item>
+              <el-form-item label="鍙傝�冪彮绾�">
+                <el-select v-model="searchForm.classesId" @change="page" clearable @clear="page">
+                  <el-option v-for="classes in classesList" :key="classes.id" :value="classes.id" :label="classes.className"/>
+                </el-select>
+              </el-form-item>
+              <el-form-item>
+                <el-button type="primary" @click="page" size="small">鏌ヨ</el-button>
+              </el-form-item>
+            </el-form>
+            <div>
+              <el-table :data="tableData">
+                <el-table-column
+                  label="鑰冭瘯鍚嶇О"
+                  prop="examName"
+                ></el-table-column>
+                <el-table-column
+                  label="鑰冭瘯璇曞嵎"
+                  prop="examPaperName"
+                ></el-table-column>
+                <el-table-column
+                  label="鍙傝�冪彮绾�"
+                  prop="className"
+                ></el-table-column>
+                <el-table-column
+                  label="鐝骇浜烘暟"
+                  prop="studentNum"
+                ></el-table-column>
+                <el-table-column
+                  label="鑰冭瘯鍦扮偣"
+                  prop="examPlace"
+                ></el-table-column>
+                <el-table-column
+                  label="鑰冭瘯鐘舵��"
+                  prop="status"
+                  :formatter="statusFormatter"
+                ></el-table-column>
+                <el-table-column
+                  label="鍒涘缓鏃堕棿"
+                  width="150px"
+                  prop="createTime"
+                ></el-table-column>
+                <el-table-column
+                  label="鑰冭瘯鏃堕棿"
+                  width="200px"
+                  algin="center"
+                >
+                  <template slot-scope="scope">
+                    <div>{{scope.row.startTime}}</div>
+                    <div>鑷�</div>
+                    <div>{{scope.row.endTime}}</div>
+                  </template>
+                </el-table-column>
+                <el-table-column label="鎿嶄綔" fiexd="right" width="150px">
+                  <template slot-scope="scope">
+                    <el-button
+                      type="primary"
+                      size="small"
+                      @click="handlerEdit(scope.row)"
+                    >淇敼
+                    </el-button>
+                    <el-button type="danger" size="small" @click="deleteExam(scope.row.id)">鍒犻櫎</el-button>
+                    <el-button type="success" size="small" @click="markPaper(scope.row)">闃呭嵎</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div
+              class="flex"
+              style="justify-content:center;margin-top:20px;"
+            >
+              <pagination v-show="total>0" :total="total" :page.sync="searchForm.pageIndex" :limit.sync="searchForm.pageSize"
+                          @pagination="page"/>
+            </div>
+          </div>
+        </div>
+      </div>
+
+    </div>
+
+
+    <el-dialog width="500px" :title="title" @close="closeHandler" :visible.sync="open" :destroy-on-close="true"
+               :append-to-body="true" :close-on-click-modal="false">
+      <el-form :model="examForm" :rules="examRules" ref="examForm">
+        <el-form-item label="鑰冭瘯鍚嶇О" :label-width="formLabelWidth" prop="examName">
+          <el-input v-model="examForm.examName" autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="鍙傝�冪彮绾�" :label-width="formLabelWidth" prop="classesId">
+          <el-select v-model="examForm.classesId">
+            <el-option v-for="classes in classesList" :key="classes.id" :value="classes.id" :label="classes.className"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="璇曞嵎绫诲瀷" :label-width="formLabelWidth" prop="examPaperType">
+          <el-select v-model="examForm.examPaperType" @change="getMyExamPaperList">
+            <el-option label="鍥哄畾璇曞嵎" :value="1"></el-option>
+            <el-option label="闅忔満璇曞嵎" :value="2"></el-option>
+            <el-option label="闅忓簭璇曞嵎" :value="3"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鑰冭瘯璇曞嵎" :label-width="formLabelWidth" prop="examPaperId">
+          <el-select v-model="examForm.examPaperId" :disabled="!examForm.examPaperType" placeholder="璇峰厛閫夋嫨璇曞嵎绫诲瀷">
+            <el-option v-for="examPaper in examPaperList" :key="examPaper.id" :value="examPaper.id" :label="examPaper.name"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="寮�濮嬫椂闂�" :label-width="formLabelWidth" prop="time">
+          <el-date-picker
+            v-model="examForm.time"
+            type="daterange"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="鑰冭瘯鍦扮偣" :label-width="formLabelWidth" prop="examPlace">
+          <el-input v-model="examForm.examPlace" autocomplete="off"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="closeHandler">鍙� 娑�</el-button>
+        <el-button type="primary" @click="addOrEditExam">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import Pagination from "@/components/Pagination"
+import { getExams, addExam, editExam, deleteExamById } from "@/api/exam"
+import { myClasses } from "@/api/classes"
+import examPaperAPI from "@/api/examPaper"
+export default {
+  components: { Pagination },
+  data() {
+    return {
+      formLabelWidth: "80px",
+      classesList: [],
+      examPaperList: [],
+      examForm: {
+        id: null,
+        examName: "",
+        examPaperId: "",
+        classesId: "",
+        examPaperType: null,
+        examPlace: "",
+        status: "",
+        startTime: "",
+        endTime: "",
+        time: [],
+      },
+      examRules: {
+        examName: [
+          { required: true, message: '璇疯緭鍏ヨ�冭瘯鍚嶇О', trigger: 'blur' }
+        ],
+        examPaperId: [
+          { required: true, message: '璇烽�夋嫨鑰冭瘯璇曞嵎', trigger: 'change' }
+        ],
+        classesId: [
+          { required: true, message: '璇烽�夋嫨鍙傝�冪彮绾�', trigger: 'change' }
+        ],
+        examPaperType: [
+          { required: true, message: '璇烽�夋嫨璇曞嵎绫诲瀷', trigger: 'change' }
+        ],
+        examPlace: [
+          { required: true, message: '璇疯緭鍏ヨ�冭瘯鍦扮偣', trigger: 'blur' }
+        ],
+        time: [
+          { required: true, message: '璇烽�夋嫨鑰冭瘯鏃堕棿', trigger: 'change' }
+        ],
+      },
+      total: 0,
+      title: "瀹夋帓鑰冭瘯",
+      open: false,
+      searchForm: {
+        examName: "",
+        subject: null,
+        pageIndex: 1,
+        pageSize: 10
+      },
+      tableData: [
+      ],
+    };
+  },
+  mounted() {
+    this.page();
+    this.getMyClasses()
+    this.MyExamPaperList()
+  },
+  methods: {
+    markPaper(row) {
+      // 璺宠浆闃呭嵎椤甸潰
+      this.$router.push({path: "/exam/mark/paper", query: {examName: row.examName, examId: row.id}})
+    },
+    timeFormatter(row) {
+      return row.startTime + "鑷�" + row.endTime
+    },
+    statusFormatter(row) {
+      if (row.status === "ing") {
+        return "杩涜涓�"
+      } else if (row.status === "not_start") {
+        return "鏈紑濮�"
+      } else if (row.status === "finished") {
+        return "宸茬粨鏉�"
+      }
+    },
+    MyExamPaperList() {
+      let param = {
+        "paperType": this.examForm.examPaperType
+      }
+      examPaperAPI.myExamPaperList(param).then(res => {
+        this.examForm.examPaperId = null
+        this.examPaperList = res.data
+      })
+    },
+    getMyExamPaperList() {
+      if (! this.examForm.examPaperType) {
+        return
+      }
+      this.MyExamPaperList()
+    },
+    getMyClasses() {
+      myClasses().then(res => {
+        this.classesList = res.data.data
+      })
+    },
+    deleteExam(id) {
+      deleteExamById(id).then(res => {
+        this.$message.success("鍒犻櫎鎴愬姛")
+        this.page()
+      })
+    },
+    handlerEdit(row) {
+      this.examForm = row
+      this.examForm.time = [row.startTime, row.endTime]
+      this.title = "淇敼鑰冭瘯"
+      this.open = true
+    },
+    addOrEditExam() {
+      this.$refs['examForm'].validate((valid) => {
+        if (valid) {
+          this.examForm.startTime = this.examForm.time[0]
+          this.examForm.endTime = this.examForm.time[1]
+          if (this.examForm.id) {
+            editExam(this.examForm).then(res => {
+              this.open = false
+              this.clearForm()
+              this.$message.success("鎿嶄綔鎴愬姛")
+              this.page()
+            })
+          } else {
+            addExam(this.examForm).then(res => {
+              this.open = false
+              this.clearForm()
+              this.$message.success("鎿嶄綔鎴愬姛")
+              this.page()
+            })
+          }
+        }
+      })
+    },
+    clearForm() {
+      this.examForm = {
+        id: null,
+        examName: "",
+        examPaperId: "",
+        classesId: "",
+        examPaperType: "",
+        examPlace: "",
+        status: "",
+        startTime: "",
+        endTime: "",
+      }
+    },
+    closeHandler() {
+      this.open = false
+      this.clearForm()
+    },
+    openAdd() {
+      this.title = this.examForm.id ? "淇敼鑰冭瘯" : "瀹夋帓鑰冭瘯"
+      this.open = true
+    },
+    formatterType(row) {
+    },
+    page() {
+      getExams(this.searchForm).then(res => {
+        this.tableData = res.data.data
+        this.total = res.data.total
+      })
+    },
+    routerTo(url) {
+      this.$router.push(url);
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+
+.mian-1-top {
+  margin: 10px 0;
+  align-items: center;
+
+  & input {
+    height: 30px;
+    width: 200px;
+    margin-right: 20px;
+  }
+}
+
+// .c{
+//     background-image:url('../../assets/img/loginBackground.jpg');
+//     width:100vw;
+//     height:calc(100vh - 75px);
+//     background-size: cover;
+// }
+// .bg{
+//     width:100%;
+//     height:100%;
+//     background: rgba(255,255,255,0.2);
+//     display: flex;
+//     justify-content: center;
+
+// }
+.main {
+  &-title {
+    border-left: 5px solid rgb(16, 71, 247);
+    padding-left: 10px;
+    margin: 50px 0;
+
+    & p {
+      font-weight: 700;
+    }
+  }
+
+  &-1 {
+    width: 1227px;
+    height: 784px;
+    background: white;
+    box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.1);
+    border-radius: 10px;
+    padding: 32px 40px;
+  }
+
+  &-btn {
+    padding-bottom: 32px;
+    border-bottom: 3px solid rgb(16, 71, 247);
+  }
+}
+
+.deepBlue {
+  background: rgb(16, 71, 247);
+  color: white;
+  border: none;
+
+  &:hover {
+    background-color: rgb(45, 92, 248);
+  }
+}
+</style>
diff --git a/src/views/exam/exam/Index.vue b/src/views/exam/exam/Index.vue
new file mode 100644
index 0000000..35175ca
--- /dev/null
+++ b/src/views/exam/exam/Index.vue
@@ -0,0 +1,18 @@
+<template>
+  <div>
+    <router-view>
+
+    </router-view>
+  </div>
+</template>
+
+<script>
+export default {
+  created() {
+    this.$store.commit("SET_HEADER_NUM", 2);
+  },
+};
+</script>
+
+<style>
+</style>
diff --git a/src/views/exam/exam/MarkPaper.vue b/src/views/exam/exam/MarkPaper.vue
new file mode 100644
index 0000000..5322b1d
--- /dev/null
+++ b/src/views/exam/exam/MarkPaper.vue
@@ -0,0 +1,42 @@
+<template>
+  <div>
+    <div>
+      <div></div>
+      <div></div>
+    </div>
+    <div></div>
+  </div>
+</template>
+
+<script>
+import { getExamInfo } from "@/api/exam"
+export default {
+  name: "MarkPaper",
+  mounted() {
+    this.examInfo.examName = this.$route.query.examName
+    this.examInfo.id = this.$route.query.examId
+    this.getExamInfo()
+  },
+  data() {
+    return {
+      examInfo: {
+        examName: "",
+        id: null,
+        paperList: []
+      }
+
+    }
+  },
+  methods: {
+    getExamInfo() {
+      getExamInfo(this.examInfo.id).then(res => {
+        this.examInfo = res.data.data
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/src/views/login/index.vue b/src/views/login/index.vue
index 4e59a46..d3d36d8 100644
--- a/src/views/login/index.vue
+++ b/src/views/login/index.vue
@@ -139,7 +139,7 @@
           loginApi.login(this.loginForm).then(function (result) {
             if (result && result.code === 1) {
               _this.setUserName(_this.loginForm.userName)
-              _this.$router.push({ path: '/' })
+              _this.$router.push({ path: '/dashboard' })
             } else {
               _this.loading = false
               _this.$message({

--
Gitblit v1.8.0