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