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