From 0af507deb2a8b08a606b795d73c660d02ecb7f49 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期四, 06 六月 2024 17:11:23 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/Manage/TestPaper/QuestionBank.vue     |  191 ++++++--
 src/api/request.js                              |   82 +-
 src/components/PopUp/gap-filling.vue            |   27 
 src/views/Manage/ClassManagement/Class.vue      |  117 ++++-
 src/components/PopUp/single-choice.vue          |   22 
 src/api/classesNotify.js                        |   61 ++
 src/api/user.js                                 |    6 
 src/components/PopUp/question/Show.vue          |    5 
 src/api/question.js                             |    1 
 src/api/subject.js                              |    6 
 src/api/classes.js                              |   22 
 src/router.js                                   |    7 
 src/components/PopUp/short-answer.vue           |   22 
 src/components/PopUp/multiple-choice.vue        |   23 
 src/views/Manage/Manage.vue                     |   40 +
 src/components/PopUp/true-false.vue             |   22 
 src/api/classesUser.js                          |   55 ++
 src/views/Manage/ClassManagement/ClassStaff.vue |  297 +++++++++----
 src/views/Manage/TestPaper/subject.vue          |  219 ++++++++++
 19 files changed, 944 insertions(+), 281 deletions(-)

diff --git a/src/api/classes.js b/src/api/classes.js
index 04cf616..164459d 100644
--- a/src/api/classes.js
+++ b/src/api/classes.js
@@ -3,7 +3,7 @@
 // 鑾峰彇鐝骇鍒嗛〉
 export const getClassess = (params) => {
     return axios({
-        url: "/api/classes/page",
+        url: "/api/admin/classes/page",
         method: "GET",
         params: params
     })
@@ -12,7 +12,7 @@
 // 鑾峰彇鐝骇鍒楄〃
 export const getClassesList = () => {
     return axios({
-        url: "/api/classes/list",
+        url: "/api/admin/classes/list",
         method: "GET"
     })
 }
@@ -20,7 +20,7 @@
 // 閫氳繃id鑾峰彇鐝骇
 export const getClassesById = (params) => {
     return axios({
-        url: "/api/classes/" + params,
+        url: "/api/admin/classes/" + params,
         method: "GET"
     })
 }
@@ -28,15 +28,23 @@
 // 閫氳繃id鍒犻櫎鐝骇
 export const deleteClassesById = (params) => {
     return axios({
-        url: "/api/classes/" + params,
+        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/classes/batch",
+        url: "/api/admin/classes/batch",
         method: "DELETE",
         data: params
     })
@@ -45,7 +53,7 @@
 // 淇敼鐝骇
 export const editClasses = (params) => {
     return axios({
-        url: "/api/classes/",
+        url: "/api/admin/classes/",
         method: "PUT",
         data: params
     })
@@ -54,7 +62,7 @@
 // 娣诲姞鐝骇
 export const addClasses = (params) => {
     return axios({
-        url: "/api/classes/",
+        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/question.js b/src/api/question.js
index f28d6ce..780e7a5 100644
--- a/src/api/question.js
+++ b/src/api/question.js
@@ -3,6 +3,7 @@
 export default {
   pageList: query => post('/api/admin/question/page', query),
   edit: query => post('/api/admin/question/edit', query),
+  updateStatus: query => post('/api/admin/question/status', query),
   select: id => post('/api/admin/question/select/' + id),
   deleteQuestion: id => post('/api/admin/question/delete/' + id)
 }
diff --git a/src/api/request.js b/src/api/request.js
index 449cac1..947c2e5 100644
--- a/src/api/request.js
+++ b/src/api/request.js
@@ -1,54 +1,54 @@
 import axios from "axios";
 import router from "../router";
-import { Message } from 'element-ui';
+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"
-    }
-  });
+  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);
-  });
+  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);
-    }
+  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.status === 401) {
-      error.message = "鐧诲綍宸茶繃鏈燂紝璇烽噸鏂扮櫥褰�";
-      // 鍒犳帀sessionStorage涓繃鏈焧oken
-      sessionStorage.clear();
-      router.push("/login");
-    }
-    if(error.response.status === 403) {
-      error.message = "鏉冮檺涓嶈冻";
-    }
-    Message.error(error.message);
-    return Promise.reject(error);
-  });
+}, 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 99d3491..e006ae2 100644
--- a/src/api/subject.js
+++ b/src/api/subject.js
@@ -1,9 +1,11 @@
-import { post } from '@/utils/request'
+import { get, post } from '@/utils/request'
 
 export default {
   list: query => post('/api/admin/subject/list'),
   pageList: query => post('/api/admin/subject/page', query),
   edit: query => post('/api/admin/subject/edit', query),
+  updateStatus: query => post('/api/admin/subject/status', query),
   select: id => post('/api/admin/subject/select/' + id),
-  deleteSubject: id => post('/api/admin/subject/delete/' + id)
+  deleteSubject: id => post('/api/admin/subject/delete/' + id),
+  getItemOrder: id => get('/api/admin/subject/getItemOrder')
 }
diff --git a/src/api/user.js b/src/api/user.js
index bd97bde..34afe94 100644
--- a/src/api/user.js
+++ b/src/api/user.js
@@ -1,4 +1,4 @@
-import { post } from '@/utils/request'
+import { post,get } from '@/utils/request'
 
 export default {
   getUserPageList: query => post('/api/admin/user/page/list', query),
@@ -9,5 +9,7 @@
   updateUser: query => post('/api/admin/user/update', query),
   changeStatus: id => post('/api/admin/user/changeStatus/' + id),
   deleteUser: id => post('/api/admin/user/delete/' + id),
-  selectByUserName: query => post('/api/admin/user/selectByUserName', query)
+  selectByUserName: query => post('/api/admin/user/selectByUserName', query),
+  studentList: () => get('/api/admin/user/student/list'),
+  getClassesCurrentUserList: (param) => get('/api/admin/user/classes/students', param),
 }
diff --git a/src/components/PopUp/gap-filling.vue b/src/components/PopUp/gap-filling.vue
index 4deb149..24d349d 100644
--- a/src/components/PopUp/gap-filling.vue
+++ b/src/components/PopUp/gap-filling.vue
@@ -12,18 +12,17 @@
       <el-form-item label="濉┖绛旀锛�" required>
         <el-form-item :label="item.prefix" :key="item.prefix" v-for="item in form.items" label-width="50px"
           class="question-item-label">
-          <el-input v-model="item.content" @focus="inputClick(item, 'content')" class="question-item-content-input"
-            style="width: 50%" />
-          <span class="question-item-span">鍒嗘暟锛�</span><el-input-number v-model="item.score" :precision="1" :step="1"
-            :max="100"></el-input-number>
+          <el-input v-model="item.content" @focus="inputClick(item, 'content')" class="question-item-content-input" />
+          <!-- <span v-if="false" class="question-item-span">鍒嗘暟锛�</span><el-input-number v-model="item.score" :precision="1" :step="1"
+            :max="100"></el-input-number> -->
         </el-form-item>
       </el-form-item>
       <el-form-item label="瑙f瀽锛�" prop="analyze" required>
         <el-input v-model="form.analyze" @focus="inputClick(form, 'analyze')" />
       </el-form-item>
-      <el-form-item label="鍒嗘暟锛�" prop="score" required>
+      <!-- <el-form-item label="鍒嗘暟锛�" prop="score" required>
         <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="闅惧害锛�" required>
         <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
       </el-form-item>
@@ -105,17 +104,23 @@
       },
     }
   },
+  props: {
+    id: {
+      type: Number,
+      default: 0
+    }
+  },
   created() {
-    let id = this.$route.query.id
+    this.getSubjects();
+    let id = this.id
     let _this = this
     if (id && parseInt(id) !== 0) {
       _this.formLoading = true
       questionApi.select(id).then(re => {
-        _this.form = re.response
+        _this.form = re.data
         _this.formLoading = false
       })
     }
-    this.getSubjects();
   },
   methods: {
     // 鑾峰彇绉戠洰
@@ -186,9 +191,7 @@
           questionApi.edit(this.form).then(re => {
             if (re.code === 1) {
               _this.$message.success(re.message)
-              _this.delCurrentView(_this).then(() => {
-                _this.$router.push('/exam/question/list')
-              })
+              this.$emit('callback')
             } else {
               _this.$message.error(re.message)
               this.formLoading = false
diff --git a/src/components/PopUp/multiple-choice.vue b/src/components/PopUp/multiple-choice.vue
index cd1effc..007389c 100644
--- a/src/components/PopUp/multiple-choice.vue
+++ b/src/components/PopUp/multiple-choice.vue
@@ -19,9 +19,9 @@
       <el-form-item label="瑙f瀽锛�" prop="analyze" required>
         <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
       </el-form-item>
-      <el-form-item label="鍒嗘暟锛�" prop="score" required>
+      <!-- <el-form-item label="鍒嗘暟锛�" prop="score" required>
         <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="闅惧害锛�" required>
         <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
       </el-form-item>
@@ -53,7 +53,7 @@
 <script>
 import QuestionShow from '@/components/PopUp/question/Show'
 import Ueditor from '@/components/Ueditor'
-import { mapGetters, mapState, mapActions } from 'vuex'
+import { mapActions } from 'vuex'
 import questionApi from '@/api/question'
 import subjectApi from '@/api/subject'
 
@@ -117,13 +117,20 @@
       }
     }
   },
-  created () {
-    let id = this.$route.query.id
+  props: {
+    id: {
+      type: Number,
+      default: 0
+    }
+  },
+  created() {
+    this.getSubjects();
+    let id = this.id
     let _this = this
     if (id && parseInt(id) !== 0) {
       _this.formLoading = true
       questionApi.select(id).then(re => {
-        _this.form = re.response
+        _this.form = re.data
         _this.formLoading = false
       })
     }
@@ -175,9 +182,7 @@
           questionApi.edit(this.form).then(re => {
             if (re.code === 1) {
               _this.$message.success(re.message)
-              _this.delCurrentView(_this).then(() => {
-                _this.$router.push('/exam/question/list')
-              })
+              this.$emit('callback')
             } else {
               _this.$message.error(re.message)
               this.formLoading = false
diff --git a/src/components/PopUp/question/Show.vue b/src/components/PopUp/question/Show.vue
index 2b7e9c9..b1f3757 100644
--- a/src/components/PopUp/question/Show.vue
+++ b/src/components/PopUp/question/Show.vue
@@ -60,3 +60,8 @@
   methods: {}
 }
 </script>
+<style scoped>
+  /deep/ td {
+    background-color: #f0f0f0;
+  }
+</style>
\ No newline at end of file
diff --git a/src/components/PopUp/short-answer.vue b/src/components/PopUp/short-answer.vue
index 4f2994f..dcf5feb 100644
--- a/src/components/PopUp/short-answer.vue
+++ b/src/components/PopUp/short-answer.vue
@@ -15,9 +15,9 @@
       <el-form-item label="瑙f瀽锛�" prop="analyze" required>
         <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
       </el-form-item>
-      <el-form-item label="鍒嗘暟锛�" prop="score" required>
+      <!-- <el-form-item label="鍒嗘暟锛�" prop="score" required>
         <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="闅惧害锛�" required>
         <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
       </el-form-item>
@@ -43,7 +43,6 @@
 <script>
 import QuestionShow from '@/components/PopUp/question/Show'
 import Ueditor from '@/components/Ueditor'
-import { mapGetters, mapState, mapActions } from 'vuex'
 import questionApi from '@/api/question'
 import subjectApi from '@/api/subject'
 
@@ -102,13 +101,20 @@
       }
     }
   },
-  created () {
-    let id = this.$route.query.id
+  props: {
+    id: {
+      type: Number,
+      default: 0
+    }
+  },
+  created() {
+    this.getSubjects();
+    let id = this.id
     let _this = this
     if (id && parseInt(id) !== 0) {
       _this.formLoading = true
       questionApi.select(id).then(re => {
-        _this.form = re.response
+        _this.form = re.data
         _this.formLoading = false
       })
     }
@@ -146,9 +152,7 @@
           questionApi.edit(this.form).then(re => {
             if (re.code === 1) {
               _this.$message.success(re.message)
-              _this.delCurrentView(_this).then(() => {
-                _this.$router.push('/exam/question/list')
-              })
+              this.$emit('callback')
             } else {
               _this.$message.error(re.message)
               this.formLoading = false
diff --git a/src/components/PopUp/single-choice.vue b/src/components/PopUp/single-choice.vue
index ad7e191..7c35dd5 100644
--- a/src/components/PopUp/single-choice.vue
+++ b/src/components/PopUp/single-choice.vue
@@ -19,9 +19,9 @@
       <el-form-item label="瑙f瀽锛�" prop="analyze" required>
         <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
       </el-form-item>
-      <el-form-item label="鍒嗘暟锛�" prop="score" required>
+      <!-- <el-form-item label="鍒嗘暟锛�" prop="score" required>
         <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="闅惧害锛�" required>
         <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
       </el-form-item>
@@ -53,7 +53,6 @@
 <script>
 import QuestionShow from '@/components/PopUp/question/Show'
 import Ueditor from '@/components/Ueditor'
-import { mapGetters, mapState, mapActions } from 'vuex'
 import questionApi from '@/api/question'
 import subjectApi from '@/api/subject'
 
@@ -117,13 +116,20 @@
       }
     }
   },
-  created () {
-    let id = this.$route.query.id
+  props: {
+    id: {
+      type: Number,
+      default: 0
+    }
+  },
+  created() {
+    this.getSubjects();
+    let id = this.id
     let _this = this
     if (id && parseInt(id) !== 0) {
       _this.formLoading = true
       questionApi.select(id).then(re => {
-        _this.form = re.response
+        _this.form = re.data
         _this.formLoading = false
       })
     }
@@ -175,9 +181,7 @@
           questionApi.edit(this.form).then(re => {
             if (re.code === 1) {
               _this.$message.success(re.message)
-              _this.delCurrentView(_this).then(() => {
-                _this.$router.push('/exam/question/list')
-              })
+              this.$emit('callback')
             } else {
               _this.$message.error(re.message)
               this.formLoading = false
diff --git a/src/components/PopUp/true-false.vue b/src/components/PopUp/true-false.vue
index 1b49929..90f0efa 100644
--- a/src/components/PopUp/true-false.vue
+++ b/src/components/PopUp/true-false.vue
@@ -18,9 +18,9 @@
       <el-form-item label="瑙f瀽锛�" prop="analyze" required>
         <el-input v-model="form.analyze"  @focus="inputClick(form,'analyze')" />
       </el-form-item>
-      <el-form-item label="鍒嗘暟锛�" prop="score" required>
+      <!-- <el-form-item label="鍒嗘暟锛�" prop="score" required>
         <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="闅惧害锛�" required>
         <el-rate v-model="form.difficult" class="question-item-rate"></el-rate>
       </el-form-item>
@@ -51,7 +51,6 @@
 <script>
 import QuestionShow from '@/components/PopUp/question/Show'
 import Ueditor from '@/components/Ueditor'
-import { mapGetters, mapState, mapActions } from 'vuex'
 import questionApi from '@/api/question'
 import subjectApi from '@/api/subject'
 
@@ -113,13 +112,20 @@
       }
     }
   },
-  created () {
-    let id = this.$route.query.id
+  props: {
+    id: {
+      type: Number,
+      default: 0
+    }
+  },
+  created() {
+    this.getSubjects();
+    let id = this.id
     let _this = this
     if (id && parseInt(id) !== 0) {
       _this.formLoading = true
       questionApi.select(id).then(re => {
-        _this.form = re.response
+        _this.form = re.data
         _this.formLoading = false
       })
     }
@@ -157,9 +163,7 @@
           questionApi.edit(this.form).then(re => {
             if (re.code === 1) {
               _this.$message.success(re.message)
-              _this.delCurrentView(_this).then(() => {
-                _this.$router.push('/exam/question/list')
-              })
+              this.$emit('callback')
             } else {
               _this.$message.error(re.message)
               this.formLoading = false
diff --git a/src/router.js b/src/router.js
index 7b19ea1..e9e8a24 100644
--- a/src/router.js
+++ b/src/router.js
@@ -129,6 +129,13 @@
         component: () => import('@/views/Manage/TestPaper/QuestionBank.vue'),
         meta: { title: '棰樺簱绠$悊' }
       },
+      // 绉戠洰绠$悊
+      {
+        path: 'subject',
+        name: 'subject',
+        component: () => import('@/views/Manage/TestPaper/subject.vue'),
+        meta: { title: '绉戠洰绠$悊' }
+      },
       // 璇曞嵎鐢熸垚
       {
         path: 'test-paper-generation',
diff --git a/src/views/Manage/ClassManagement/Class.vue b/src/views/Manage/ClassManagement/Class.vue
index 6bfa2e3..db5b41d 100644
--- a/src/views/Manage/ClassManagement/Class.vue
+++ b/src/views/Manage/ClassManagement/Class.vue
@@ -15,19 +15,25 @@
                 @click="handlerAdd"
               >鏂板鐝骇</el-button>
             </div>
-            <div
-              class="flex"
-              style="align-items:center"
-            >
-              <p style="margin-left:20px;margin-right: 10px;">鎵�鍦ㄥ崟浣�</p>
-<!--              <el-select v-model="searchData.deptId">-->
-<!--                <el-option></el-option>-->
-<!--              </el-select>-->
-            </div>
+            <el-form :inline="true" :model="searchForm" class="demo-form-inline">
+              <el-form-item label="鐝骇鍚嶇О">
+                <el-input v-model="searchForm.className" clearable @clear="page" placeholder="鐝骇鍚嶇О"></el-input>
+              </el-form-item>
+              <el-form-item label="鐝骇鐘舵��">
+                <el-select v-model="searchForm.status" 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'}"
@@ -40,11 +46,16 @@
                   width="180px"
                 ></el-table-column>
                 <el-table-column
-                  label="骞寸骇"
+                  label="鐘舵��"
                   align="center"
                   width="80px"
-                  prop="grade"
-                ></el-table-column>
+                  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"
@@ -83,9 +94,9 @@
                   <template slot-scope="scope">
                     <el-button size="small" @click="handlerEdit(scope.row)" type="primary">淇敼</el-button>
                     <el-button size="small" type="warning">鐝骇楠岃瘉</el-button>
-                    <el-button size="small" type="info">閫氱煡</el-button>
-                    <el-button @click="routersTo()" size="small" type="success">鎴愬憳绠$悊</el-button>
-                    <el-button @click="remove(scope.row.id)" type="danger" size="small">鍒犻櫎</el-button>
+                    <el-button size="small" @click="handlerOpenNotify(scope.row)" type="info">閫氱煡</el-button>
+                    <el-button @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>
@@ -103,6 +114,24 @@
 
     </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"
@@ -151,17 +180,27 @@
 </template>
 
 <script>
-import { addClasses, editClasses, getClassess, deleteClassesById } from "@/api/classes";
+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
@@ -174,6 +213,12 @@
         startTime: null,
         endTime: null,
         remark: ""
+      },
+      notifyRules: {
+        notifyContent: [
+          { required: true, message: '璇疯緭鍏ラ�氱煡鍐呭', trigger: 'blur' },
+          { min: 1, max: 500, message: '闀垮害鍦� 1 鍒� 500 涓瓧绗�', trigger: 'blur' }
+        ],
       },
       rules: {
         className: [
@@ -193,10 +238,38 @@
     };
   },
   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() {
@@ -231,9 +304,9 @@
         }
       });
     },
-    remove(id) {
-      deleteClassesById(id).then(res => {
-        this.$message.success("鍒犻櫎鎴愬姛")
+    dissolution(id) {
+      dissolution(id).then(res => {
+        this.$message.success(res.data.message)
         this.page()
       })
     },
@@ -250,10 +323,8 @@
       this.title = "鏂板鐝骇"
     },
     // 璺宠浆(鏌ョ湅鐝骇浜哄憳鎯呭喌)
-    routersTo() {
-      this.$router.push({
-        name: "ClassStaff",
-      });
+    studentManager(classesId) {
+      this.$router.push({ path: "class-management/Class-staff", query: { classesId: classesId } });
     },
     // 杩斿洖涓婁竴涓〉闈�
     goBack() {
diff --git a/src/views/Manage/ClassManagement/ClassStaff.vue b/src/views/Manage/ClassManagement/ClassStaff.vue
index b6849c8..468e550 100644
--- a/src/views/Manage/ClassManagement/ClassStaff.vue
+++ b/src/views/Manage/ClassManagement/ClassStaff.vue
@@ -3,11 +3,12 @@
   <div class="c">
     <div class="bg">
       <div class="main">
-        <TitleIndex title="鐝骇浜哄憳绠$悊" />
         <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
@@ -26,13 +27,14 @@
             </el-table-column>
             <el-table-column
               align="center"
-              prop="name"
+              prop="realName"
               label="濮撳悕"
             >
             </el-table-column>
             <el-table-column
               align="center"
               prop="sex"
+              :formatter="sexFormatter"
               label="鎬у埆"
             >
             </el-table-column>
@@ -43,33 +45,23 @@
             >
             </el-table-column>
             <el-table-column
-              align="center"
-              prop="condition"
-              label="涓婄嚎鎯呭喌"
-            >
-            </el-table-column>
-            <el-table-column
               label="鎿嶄綔"
               align="center"
               width="300px"
             >
-              <el-button type="warning">缂栬緫</el-button>
-              <el-button type="danger">鍒犻櫎</el-button>
-              <el-button type="primary">鍒嗛厤瑙掕壊</el-button>
+              <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;"
           >
-            <el-pagination
-              style="margin:auto"
-              background
-              :page-size="10"
-              layout="prev, pager, next, jumper"
-              :total="100"
-            >
-            </el-pagination>
+            <pagination v-show="total>0" :total="total" :page.sync="searchForm.pageNum" :limit.sync="searchForm.pageSize"
+                        @pagination="page"/>
           </div>
         </div>
       </div>
@@ -79,11 +71,69 @@
       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: {
@@ -91,6 +141,43 @@
   },
   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: {
+        realName: "",
+        pageSize: 10,
+        pageNum: 1,
+        classesId: null
+      },
+      classes: {
+        id: null,
+        studentList: []
+      },
+      open: false,
       // 鐝骇鍚嶇О
       title: "19绾ц蒋浠跺洓鐝�",
       formLabelAlign: {
@@ -99,90 +186,102 @@
         region: "",
       },
       tableData: [
-        {
-          id: 1,
-          name: "寮犱笁",
-          sex: "鐢�",
-          phone: "12345678977",
-          // 鏄惁涓婄嚎
-          condition: "宸蹭笂绾�",
-        },
-        {
-          id: 1,
-          name: "鏉庡洓",
-          sex: "濂�",
-          phone: "12345678977",
-          // 鏄惁涓婄嚎
-          condition: "宸蹭笂绾�",
-        },
-        {
-          id: 1,
-          name: "鐜嬩簲",
-          sex: "鐢�",
-          phone: "12345678977",
-          // 鏄惁涓婄嚎
-          condition: "鏈笂绾�",
-        },
-        {
-          id: 1,
-          name: "寮犱笁",
-          sex: "鐢�",
-          phone: "12345678977",
-          // 鏄惁涓婄嚎
-          condition: "宸蹭笂绾�",
-        },
-        {
-          id: 1,
-          name: "鏉庡洓",
-          sex: "濂�",
-          phone: "12345678977",
-          // 鏄惁涓婄嚎
-          condition: "宸蹭笂绾�",
-        },
-        {
-          id: 1,
-          name: "鐜嬩簲",
-          sex: "鐢�",
-          phone: "12345678977",
-          // 鏄惁涓婄嚎
-          condition: "鏈笂绾�",
-        },
-        {
-          id: 1,
-          name: "寮犱笁",
-          sex: "鐢�",
-          phone: "12345678977",
-          // 鏄惁涓婄嚎
-          condition: "宸蹭笂绾�",
-        },
-        {
-          id: 1,
-          name: "鏉庡洓",
-          sex: "濂�",
-          phone: "12345678977",
-          // 鏄惁涓婄嚎
-          condition: "宸蹭笂绾�",
-        },
-        {
-          id: 1,
-          name: "鐜嬩簲",
-          sex: "鐢�",
-          phone: "12345678977",
-          // 鏄惁涓婄嚎
-          condition: "鏈笂绾�",
-        },
-        {
-          id: 1,
-          name: "鐜嬩簲",
-          sex: "鐢�",
-          phone: "12345678977",
-          // 鏄惁涓婄嚎
-          condition: "鏈笂绾�",
-        },
       ],
     };
   },
+  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
+      })
+    },
+    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) {
+      return item.realName.indexOf(query) > -1;
+    },
     // 杩斿洖涓婁竴涓〉闈�
     goBack() {
       this.$router.back();
diff --git a/src/views/Manage/Manage.vue b/src/views/Manage/Manage.vue
index ba4d18f..eb813a0 100644
--- a/src/views/Manage/Manage.vue
+++ b/src/views/Manage/Manage.vue
@@ -503,6 +503,46 @@
               </div>
               <p>鏁欏笀绠$悊</p>
             </div>
+            <!-- 绉戠洰绠$悊 -->
+            <div
+              class="main-1-con"
+              @click="routersTo('/manage/subject')"
+            >
+              <div class="icon-bg1">
+                <svg
+                  t="1651737345718"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4056"
+                  width="32"
+                  height="32"
+                >
+                  <path
+                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
+                    fill="#515151"
+                    p-id="4057"
+                  ></path>
+                  <path
+                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
+                    fill="#515151"
+                    p-id="4058"
+                  ></path>
+                  <path
+                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
+                    fill="#515151"
+                    p-id="4059"
+                  ></path>
+                  <path
+                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
+                    fill="#515151"
+                    p-id="4060"
+                  ></path>
+                </svg>
+              </div>
+              <p>绉戠洰绠$悊</p>
+            </div>
             <!-- 棰樺簱绠$悊 -->
             <div
               class="main-1-con"
diff --git a/src/views/Manage/TestPaper/QuestionBank.vue b/src/views/Manage/TestPaper/QuestionBank.vue
index e7b4c3e..a8d238d 100644
--- a/src/views/Manage/TestPaper/QuestionBank.vue
+++ b/src/views/Manage/TestPaper/QuestionBank.vue
@@ -12,78 +12,97 @@
               <el-button type="warning" size="mini" v-for="item in editUrlEnum" :key="item.key"
                 @click="getDialogFormVisible(item.name)">{{ item.name }}
               </el-button>
-              <el-button slot="reference" type="primary" class="link-left">褰曞叆棰樼洰</el-button>
+              <el-button slot="reference" type="primary" class="link-left">鏂板</el-button>
             </el-popover>
           </div>
           <!-- 鎼滅储 -->
           <div>
-            <el-form :inline="true" :model="formLabelAlign" class="demo-form-inline" label-width="80px">
+            <el-form :inline="true" :model="queryParam" class="demo-form-inline" label-width="80px">
               <el-form-item>
-                <el-input v-model="formLabelAlign.type" placeholder="棰樼洰鍚�"></el-input>
+                <el-input v-model="queryParam.content" placeholder="璇疯緭鍏ラ鐩�" clearable></el-input>
               </el-form-item>
               <el-form-item>
-                <el-select v-model="formLabelAlign.region" placeholder="鍏ㄩ儴绉戠洰">
-                  <el-option label="鍏ㄩ儴绉戠洰" value="shanghai"></el-option>
-                  <el-option label="璇枃" value="beijing"></el-option>
-                  <el-option label="鏁板" value="beijing"></el-option>
-                  <el-option label="鑻辫" value="beijing"></el-option>
+                <el-select v-model="queryParam.subjectId" placeholder="璇烽�夋嫨绉戠洰" clearable multiple @change="search">
+                  <el-option v-for="item in subjects" :key="item.id" :value="item.id" :label="item.name"></el-option>
                 </el-select>
               </el-form-item>
               <el-form-item>
-                <el-select v-model="formLabelAlign.region" placeholder="閫夋嫨棰�">
-                  <el-option label="閫夋嫨棰�" value="shanghai"></el-option>
-                  <el-option label="闂瓟棰�" value="beijing"></el-option>
-                  <el-option label="鍒ゆ柇棰�" value="beijing"></el-option>
+                <el-select v-model="queryParam.questionType" placeholder="璇烽�夋嫨棰樺瀷" clearable multiple @change="search">
+                  <el-option v-for="item in questionTypeEnum" :key="item.key" :value="item.key"
+                    :label="item.value"></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item>
+                <el-select v-model="queryParam.status" placeholder="璇烽�夋嫨鐘舵��" clearable @change="search">
+                  <el-option value="1" label="鍚敤"></el-option>
+                  <el-option value="2" label="绂佺敤"></el-option>
                 </el-select>
               </el-form-item>
 
-              <el-form-item label="">
+              <el-form-item>
                 <el-button style="width:100px;" type="primary" size="small" @click="search()">鏌ヨ</el-button>
               </el-form-item>
             </el-form>
           </div>
           <!-- 琛ㄦ牸 -->
-          <el-table v-loading="listLoading" :header-cell-style="getRowClass" :data="tableData" border style="width: 100%;">
-            <el-table-column align="center" prop="title" label="棰樼洰鍚�">
+          <el-table v-loading="listLoading" :header-cell-style="getRowClass" :data="tableData" border
+            style="width: 100%;">
+            <el-table-column align="center" prop="shortTitle" label="棰樼洰" show-overflow-tooltip>
             </el-table-column>
-            <el-table-column align="center" prop="subject" label="绉戠洰">
+            <el-table-column align="center" prop="subjectName" label="绉戠洰" width="150px">
             </el-table-column>
-            <el-table-column align="center" prop="type" label="棰樼洰绫诲瀷">
+            <el-table-column align="center" prop="questionTypeName" label="棰樺瀷" width="100px">
             </el-table-column>
-            <el-table-column align="center" prop="score" label="鍙傝�冪瓟妗�">
+            <el-table-column align="center" prop="difficult" label="闅惧害" width="60px" />
+            <el-table-column align="center" prop="createTime" label="鍒涘缓鏃堕棿" width="160px" />
+            <el-table-column label="鐘舵��" prop="status" width="70px">
+              <template slot-scope="{row}">
+                <el-tag :type="row.status === '绂佺敤' ? 'danger' : 'success'">
+                  {{ row.status ? row.status : '鍚敤' }}
+                </el-tag>
+              </template>
             </el-table-column>
-            <el-table-column label="鎿嶄綔" align="center">
-              <el-button type="text">缂栬緫</el-button>
-              <el-button type="text">鍒犻櫎</el-button>
+            <el-table-column label="鎿嶄綔" align="center" width="300px">
+              <template slot-scope="{row}">
+                <el-button size="mini" @click="showQuestion(row)">棰勮</el-button>
+                <el-button size="mini" @click="editQuestion(row)">缂栬緫</el-button>
+                <el-button size="mini" type="primary" @click="statusQuestion(row)">{{ row.status === "绂佺敤" ? "鍚敤" : "绂佺敤"
+                  }}</el-button>
+                <el-popconfirm title="纭鍒犻櫎鍚�" @confirm="deleteQuestion(row)">
+                  <el-button slot="reference" size="mini" type="danger" class="link-left">鍒犻櫎</el-button>
+                </el-popconfirm>
+              </template>
             </el-table-column>
           </el-table>
-          <div class="block" style="display: flex; margin-top: 40px;">
-            <pagination v-show="total > 0" :total="total" :page.sync="queryParam.pageIndex"
-              :limit.sync="queryParam.pageSize" @pagination="search" />
-          </div>
+          <pagination v-show="total > 0" :total="total" :page.sync="queryParam.pageIndex"
+            :limit.sync="queryParam.pageSize" @pagination="search" />
         </div>
       </div>
-
     </div>
+
     <!-- 濉┖ -->
-    <el-dialog :visible.sync="gapVisible" :close-on-click-modal="false">
-      <gap ref="gap" @children="parentGoods" />
+    <el-dialog :visible.sync="gapVisible" :close-on-click-modal="false" v-if="gapVisible">
+      <gap ref="gap" @children="parentGoods" @callback="callback" :id="updateId" />
     </el-dialog>
     <!-- 澶氶�� -->
-    <el-dialog :visible.sync="multipleVisible" :close-on-click-modal="false">
-      <multiple ref="multiple" @children="parentGoods" />
+    <el-dialog :visible.sync="multipleVisible" :close-on-click-modal="false" v-if="multipleVisible">
+      <multiple ref="multiple" @children="parentGoods" @callback="callback" :id="updateId" />
     </el-dialog>
     <!-- 绠�绛� -->
-    <el-dialog :visible.sync="shortVisible" :close-on-click-modal="false">
-      <short ref="short" @children="parentGoods" />
+    <el-dialog :visible.sync="shortVisible" :close-on-click-modal="false" v-if="shortVisible">
+      <short ref="short" @children="parentGoods" @callback="callback" :id="updateId" />
     </el-dialog>
     <!-- 鍗曢�� -->
-    <el-dialog :visible.sync="singleVisible" :close-on-click-modal="false">
-      <single ref="single" @children="parentGoods" />
+    <el-dialog :visible.sync="singleVisible" :close-on-click-modal="false" v-if="singleVisible">
+      <single ref="single" @children="parentGoods" @callback="callback" :id="updateId" />
     </el-dialog>
     <!-- 鍒ゆ柇 -->
-    <el-dialog :visible.sync="truesVisible" :close-on-click-modal="false">
-      <trues ref="trues" @children="parentGoods" />
+    <el-dialog :visible.sync="truesVisible" :close-on-click-modal="false" v-if="truesVisible">
+      <trues ref="trues" @children="parentGoods" @callback="callback" :id="updateId" />
+    </el-dialog>
+
+    <el-dialog :visible.sync="questionShow.dialog" style="width: 100%;height: 100%">
+      <QuestionShow :qType="questionShow.qType" :question="questionShow.question" :qLoading="questionShow.loading" />
     </el-dialog>
   </div>
 </template>
@@ -96,6 +115,9 @@
 import trues from "@/components/PopUp/true-false.vue";
 import { mapGetters, mapState } from 'vuex'
 import questionApi from '@/api/question'
+import QuestionShow from '@/components/PopUp/question/Show'
+import subjectApi from '@/api/subject'
+import Pagination from '@/components/Pagination'
 
 export default {
   // 娉ㄥ唽
@@ -105,13 +127,24 @@
     short,
     single,
     trues,
+    QuestionShow,
+    Pagination
   },
   data() {
     return {
+      updateId: '',
+      questionShow: {
+        qType: 0,
+        dialog: false,
+        question: null,
+        loading: false
+      },
       listLoading: true,
       queryParam: {
-        questionType: null,
-        subjectId: null,
+        questionType: [],
+        subjectId: [],
+        content: '',
+        status: '',
         pageIndex: 1,
         pageSize: 10
       },
@@ -121,43 +154,43 @@
       shortVisible: false,
       singleVisible: false,
       truesVisible: false,
-      formLabelAlign: {
-        type: "",
-        user: "",
-        region: "",
-      },
       tableData: [],
+      subjects: []
     };
   },
   created() {
     this.search()
+    this.getSubjects();
   },
   methods: {
+    // 鑾峰彇绉戠洰
+    getSubjects() {
+      subjectApi.list().then(re => {
+        this.subjects = re.data
+      })
+    },
+    callback() {
+      this.gapVisible = false;
+      this.multipleVisible = false;
+      this.shortVisible = false;
+      this.singleVisible = false;
+      this.truesVisible = false;
+      this.search()
+    },
     // 鑾峰彇鍒楄〃
     search() {
       this.listLoading = true
       questionApi.pageList(this.queryParam).then(re => {
-        this.tableData = re.data
-        this.total = re.total
-        this.queryParam.pageIndex = re.pageNum
+        this.tableData = re.data.list
+        this.total = re.data.total
+        this.queryParam.pageSize = re.data.pageSize
+        this.queryParam.pageIndex = re.data.pageNum
         this.listLoading = false
       })
-    },
-    // 杩斿洖涓婁竴涓〉闈�
-    goBack() {
-      this.$router.back();
     },
     // 淇敼琛ㄥ崟澶撮儴鐨勯鑹�
     getRowClass() {
       return "background:#d2d3d6";
-    },
-    // 鐢熸垚璇曞嵎
-    getCreate() {
-      // 璺宠浆鍒扮敓鎴愰〉闈�
-      //璺宠浆鍒板搴旂殑绠$悊椤甸潰
-      this.$router.push({
-        path: "/manage/test-paper-generation",
-      });
     },
     // 鐐瑰嚮鍚庤皟鐢ㄥ脊绐楃粍浠剁殑鏂规硶,寮�鍚脊绐�
     getDialogFormVisible(value) {
@@ -178,11 +211,51 @@
           this.truesVisible = true;
           break;
       }
+      this.updateId = '';
     },
     // 寮圭獥
     // 鎺ユ敹寮圭獥缁勪欢杩斿洖鐨勮〃鍗曞��
     parentGoods(obj) {
       console.log(obj, "寮圭獥缁勪欢鐨勮〃鍗曞��");
+    },
+    showQuestion(row) {
+      let _this = this
+      this.questionShow.dialog = true
+      this.questionShow.loading = true
+      questionApi.select(row.id).then(re => {
+        _this.questionShow.qType = re.data.questionType
+        _this.questionShow.question = re.data
+        _this.questionShow.loading = false
+      })
+    },
+    editQuestion(row) {
+      this.getDialogFormVisible(row.questionTypeName);
+      this.updateId = row.id;
+    },
+    statusQuestion(row) {
+      let question = {
+        id: row.id,
+        status: row.status === '绂佺敤' ? '鍚敤' : '绂佺敤'
+      }
+      questionApi.updateStatus(question).then(re => {
+        if (re.code === 1) {
+          this.$message.success(re.message)
+          this.search()
+        } else {
+          this.$message.error(re.message)
+        }
+      })
+    },
+    deleteQuestion(row) {
+      let _this = this
+      questionApi.deleteQuestion(row.id).then(re => {
+        if (re.code === 1) {
+          _this.search()
+          _this.$message.success(re.message)
+        } else {
+          _this.$message.error(re.message)
+        }
+      })
     },
   },
   computed: {
@@ -191,7 +264,7 @@
       questionTypeEnum: state => state.exam.question.typeEnum,
       editUrlEnum: state => state.exam.question.editUrlEnum
     }),
-    ...mapState('exam', { subjects: state => state.subjects })
+    ...mapGetters('exam', ['subjectEnumFormat']),
   }
 };
 </script>
diff --git a/src/views/Manage/TestPaper/subject.vue b/src/views/Manage/TestPaper/subject.vue
new file mode 100644
index 0000000..a1091f0
--- /dev/null
+++ b/src/views/Manage/TestPaper/subject.vue
@@ -0,0 +1,219 @@
+<!-- 绉戠洰绠$悊 -->
+<template>
+  <div class="c">
+    <div class="bg">
+      <div class="main">
+        <!-- 寰呰繑鍥炵殑鏍囬 -->
+        <TitleIndex title="绉戠洰绠$悊" />
+        <div class="content">
+          <!-- 鏂板鎸夐挳 -->
+          <div style="padding-bottom:20px; border-bottom: 3px solid #409EFF;margin-bottom: 20px;">
+            <el-button type="primary" class="link-left" @click="edit()">鏂板</el-button>
+          </div>
+          <!-- 鎼滅储 -->
+          <div>
+            <el-form :inline="true" :model="queryParam" class="demo-form-inline" label-width="80px">
+              <el-form-item>
+                <el-input v-model="queryParam.name" placeholder="璇疯緭鍏ュ悕绉�" clearable></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-select v-model="queryParam.status" placeholder="璇烽�夋嫨鐘舵��" clearable @change="search">
+                  <el-option value="1" label="鍚敤"></el-option>
+                  <el-option value="2" label="绂佺敤"></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item>
+                <el-button style="width:100px;" type="primary" size="small" @click="search()">鏌ヨ</el-button>
+              </el-form-item>
+            </el-form>
+          </div>
+          <!-- 琛ㄦ牸 -->
+          <el-table v-loading="listLoading" :header-cell-style="getRowClass" :data="tableData" border
+            style="width: 100%;">
+            <el-table-column align="center" prop="name" label="鍚嶇О" show-overflow-tooltip />
+            <el-table-column align="center" prop="itemOrder" label="鎺掑簭" width="150px" />
+            <el-table-column align="center" prop="createTime" label="鍒涘缓鏃堕棿" width="160px" />
+            <el-table-column label="鐘舵��" prop="status" width="70px">
+              <template slot-scope="{row}">
+                <el-tag :type="row.status === '绂佺敤' ? 'danger' : 'success'">
+                  {{ row.status ? row.status : '鍚敤' }}
+                </el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="鎿嶄綔" align="center" width="300px">
+              <template slot-scope="{row}">
+                <el-button size="mini" @click="edit(row)">缂栬緫</el-button>
+                <el-button size="mini" type="primary" @click="status(row)">{{ row.status === "绂佺敤" ? "鍚敤" : "绂佺敤"
+                  }}</el-button>
+                <el-popconfirm title="纭鍒犻櫎鍚�" @confirm="deleteSubject(row)">
+                  <el-button slot="reference" size="mini" type="danger" class="link-left">鍒犻櫎</el-button>
+                </el-popconfirm>
+              </template>
+            </el-table-column>
+          </el-table>
+          <pagination v-show="total > 0" :total="total" :page.sync="queryParam.pageIndex"
+            :limit.sync="queryParam.pageSize" @pagination="search" />
+        </div>
+      </div>
+    </div>
+
+    <el-dialog :visible.sync="visible" width="400px">
+      <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules">
+        <el-form-item label="鍚嶇О锛�" prop="name" required>
+          <el-input v-model="form.name" maxlength="10" show-word-limit />
+        </el-form-item>
+        <el-form-item label="鎺掑簭锛�" prop="itemOrder" required>
+          <el-input-number v-model="form.itemOrder" type="number" :min="1" :max="100" />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="submitForm">鎻愪氦</el-button>
+          <el-button @click="resetForm">閲嶇疆</el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+<script>
+// 寮曞叆褰堝嚭绐楀彛绲勪欢
+import subjectApi from '@/api/subject'
+import Pagination from '@/components/Pagination'
+
+export default {
+  // 娉ㄥ唽
+  components: {
+    Pagination
+  },
+  data() {
+    return {
+      listLoading: true,
+      queryParam: {
+        name: '',
+        pageIndex: 1,
+        pageSize: 10
+      },
+      formLoading: false,
+      total: 0,
+      tableData: [],
+      form: {
+        id: '',
+        name: '',
+        itemOrder: ''
+      },
+      visible: false,
+      rules: {
+        name: [
+          { required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur' }
+        ],
+        itemOrder: [
+          { required: true, message: '璇疯緭鍏ユ帓搴�', trigger: 'blur', type: 'number' }
+        ]
+      },
+    };
+  },
+  created() {
+    this.search()
+  },
+  methods: {
+    // 鑾峰彇鎺掑簭
+    getItemOrder() {
+      subjectApi.getItemOrder().then(re => {
+        this.form.itemOrder = re.data
+      })
+    },
+    // 鑾峰彇鍒楄〃
+    search() {
+      this.listLoading = true
+      subjectApi.pageList(this.queryParam).then(re => {
+        this.tableData = re.data.list
+        this.total = re.data.total
+        this.queryParam.pageSize = re.data.pageSize
+        this.queryParam.pageIndex = re.data.pageNum
+        this.listLoading = false
+      })
+    },
+    // 淇敼琛ㄥ崟澶撮儴鐨勯鑹�
+    getRowClass() {
+      return "background:#d2d3d6";
+    },
+    edit(row) {
+      if (row) {
+        subjectApi.select(row.id).then(re => {
+          if (re.code === 1) {
+            this.form = re.data;
+            this.visible = true;
+          } else {
+            this.$message.error(re.message)
+          }
+        })
+      } else {
+        this.getItemOrder();
+        this.visible = true;
+      }
+    },
+    status(row) {
+      let question = {
+        id: row.id,
+        status: row.status === '绂佺敤' ? '鍚敤' : '绂佺敤'
+      }
+      subjectApi.updateStatus(question).then(re => {
+        if (re.code === 1) {
+          this.$message.success(re.message)
+          this.search()
+        } else {
+          this.$message.error(re.message)
+        }
+      })
+    },
+    deleteSubject(row) {
+      let _this = this
+      subjectApi.deleteSubject(row.id).then(re => {
+        if (re.code === 1) {
+          _this.search()
+          _this.$message.success(re.message)
+        } else {
+          _this.$message.error(re.message)
+        }
+      })
+    },
+    submitForm() {
+      let _this = this
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.formLoading = true
+          subjectApi.edit(this.form).then(re => {
+            if (re.code === 1) {
+              _this.$message.success(re.message)
+              _this.search()
+              _this.formLoading = false
+              _this.visible = false
+            } else {
+              _this.$message.error(re.message)
+              _this.formLoading = false
+              _this.visible = false
+            }
+          })
+        }
+      })
+    },
+    resetForm() {
+      let lastId = this.form.id
+      this.$refs['form'].resetFields()
+      this.form.id = lastId
+    },
+  }
+};
+</script>
+<style scoped lang="scss">
+.flex {
+  display: flex;
+}
+
+// 鍐呭
+.content {
+  width: 1262px;
+  margin-bottom: 80px;
+  background-color: #fff;
+  padding: 20px 40px;
+  border-radius: 10px;
+}
+</style>

--
Gitblit v1.8.0