瀏覽代碼

[修改]代码作业状态标记

Johnson 7 年之前
父節點
當前提交
81e0e30c87

+ 19 - 15
mock/modules/assignment/index.js

@@ -11,6 +11,7 @@ const groupSerializer = require("../../serializers/course/GroupSerializer");
 //新建代码作业
 router.route("/course/:courseId/code").post((req, res) => {
   res.send({
+    err: 0,
     data: CodeSerializer()
   });
 });
@@ -20,12 +21,14 @@ router
   //更新代码作业信息
   .put((req, res) => {
     res.send({
+      err: 0,
       data: CodeSerializer()
     });
   })
   //删除代码作业
   .delete((req, res) => {
     res.send({
+      err: 0,
       data: {}
     });
   });
@@ -33,6 +36,7 @@ router
 //老师查看代码作业列表
 router.route("/teacher/course/:courseId/code").get((req, res) => {
   res.send({
+    err: 0,
     data: [CodeSerializer(), CodeSerializer()]
   });
 });
@@ -40,6 +44,7 @@ router.route("/teacher/course/:courseId/code").get((req, res) => {
 //学生查看代码作业列表
 router.route("/student/course/:courseId/code").get((req, res) => {
   res.send({
+    err: 0,
     data: [CodeSerializer(), CodeSerializer()]
   });
 });
@@ -47,6 +52,7 @@ router.route("/student/course/:courseId/code").get((req, res) => {
 //学生查看单个代码作业
 router.route("/student/code/:codeId").get((req, res) => {
   res.send({
+    err: 0,
     data: CodeSerializer()
   });
 });
@@ -54,6 +60,7 @@ router.route("/student/code/:codeId").get((req, res) => {
 //学生查看单个代码作业下的项目信息列表
 router.route("/student/code/:codeId/project").get((req, res) => {
   res.send({
+    err: 0,
     data: [ProjectSerializer(), ProjectSerializer()]
   });
 });
@@ -61,6 +68,7 @@ router.route("/student/code/:codeId/project").get((req, res) => {
 //老师查看单个代码作业下所有已提交组的过程统计信息
 router.route("/teacher/code/:codeId/submitted/procedure").get((req, res) => {
   res.send({
+    err: 0,
     data: [codeProcedureSerializer(), codeProcedureSerializer()]
   });
 });
@@ -68,6 +76,7 @@ router.route("/teacher/code/:codeId/submitted/procedure").get((req, res) => {
 //老师查看单个代码作业下所有未提交组的信息
 router.route("/teacher/code/:codeId/unsubmitted/groups").get((req, res) => {
   res.send({
+    err: 0,
     data: [groupSerializer(), groupSerializer()]
   });
 });
@@ -75,6 +84,7 @@ router.route("/teacher/code/:codeId/unsubmitted/groups").get((req, res) => {
 //老师查看单个代码作业的成绩列表(所有组的)
 router.route("/teacher/code/:codeId/result").get((req, res) => {
   res.send({
+    err: 0,
     data: [CodeResultSerializer, CodeResultSerializer]
   });
 });
@@ -82,18 +92,12 @@ router.route("/teacher/code/:codeId/result").get((req, res) => {
 //学生查看单个代码作业的成绩
 router.route("/student/code/:codeId/result").get((req, res) => {
   res.send({
+    err: 0,
     data: CodeResultSerializer
   });
 });
 
 // Document
-//新建文档作业
-router.route("/course/:courseId/document").post((req, res) => {
-  res.send({
-    data: DocumentSerializer()
-  });
-});
-
 //新建文档作业
 router.route("/course/:courseId/document").post((req, res) => {
   res.send({
@@ -102,25 +106,19 @@ router.route("/course/:courseId/document").post((req, res) => {
   });
 });
 
-//新建文档作业
-router.route("/course/:courseId/document").post((req, res) => {
-  res.send({
-    err: 404,
-    data: "errmsg"
-  });
-});
-
 router
   .route("/document/:documentId")
   //更新文档作业信息
   .put((req, res) => {
     res.send({
+      err: 0,
       data: DocumentSerializer()
     });
   })
   //删除文档作业
   .delete((req, res) => {
     res.send({
+      err: 0,
       data: {}
     });
   });
@@ -128,6 +126,7 @@ router
 //老师查看文档作业列表
 router.route("/teacher/course/:courseId/document").get((req, res) => {
   res.send({
+    err: 0,
     data: [DocumentSerializer(), DocumentSerializer()]
   });
 });
@@ -135,6 +134,7 @@ router.route("/teacher/course/:courseId/document").get((req, res) => {
 //学生查看文档作业列表
 router.route("/student/course/:courseId/document").get((req, res) => {
   res.send({
+    err: 0,
     data: [DocumentSerializer(), DocumentSerializer()]
   });
 });
@@ -142,6 +142,7 @@ router.route("/student/course/:courseId/document").get((req, res) => {
 //学生查看单个文档作业信息
 router.route("/student/document/:documentId").get((req, res) => {
   res.send({
+    err: 0,
     data: DocumentSerializer()
   });
 });
@@ -151,6 +152,7 @@ router
   .route("/teacher/document/:documentId/submitted/result")
   .get((req, res) => {
     res.send({
+      err: 0,
       status: "正在互评",
       data: [DocumentResultSerializer(), DocumentResultSerializer()]
     });
@@ -161,6 +163,7 @@ router
   .route("/teacher/document/:documentId/unsubmitted/groups")
   .get((req, res) => {
     res.send({
+      err: 0,
       data: [groupSerializer(), groupSerializer()]
     });
   });
@@ -168,6 +171,7 @@ router
 //学生查看文档作业的成绩
 router.route("/student/document/:documentId/result").get((req, res) => {
   res.send({
+    err: 0,
     data: DocumentResultSerializer()
   });
 });

+ 53 - 20
src/api/assignment.js

@@ -10,6 +10,7 @@ import { ASSIGNMENT_MODULE } from "./_prefix";
  * @param startAt
  * @param endAt
  * @param problem
+ * @param courseId
  * @returns {Promise<{data:CodeSerializerType}>}
  */
 export const postCodeAssignment = ({
@@ -18,9 +19,10 @@ export const postCodeAssignment = ({
   description,
   startAt,
   endAt,
-  problem
+  problem,
+  courseId
 }) => {
-  return request(`${ASSIGNMENT_MODULE}/course/:courseId/code`, {
+  return request(`${ASSIGNMENT_MODULE}/course/${courseId}/code`, {
     method: "POST",
     body: {
       type: type || null,
@@ -38,10 +40,17 @@ export const postCodeAssignment = ({
  * @param description
  * @param startAt
  * @param endAt
+ * @param codeId
  * @returns {Promise<{data:CodeSerializerType}>}
  */
-export const putCodeAssignment = ({ name, description, startAt, endAt }) => {
-  return request(`${ASSIGNMENT_MODULE}/code/:codeId`, {
+export const putCodeAssignment = ({
+  name,
+  description,
+  startAt,
+  endAt,
+  codeId
+}) => {
+  return request(`${ASSIGNMENT_MODULE}/code/${codeId}`, {
     method: "PUT",
     body: {
       name: name || null,
@@ -54,14 +63,16 @@ export const putCodeAssignment = ({ name, description, startAt, endAt }) => {
 
 /**
  * 老师删除代码作业
+ * @param codeId
  * @returns {Promise<{}>}
  */
 export const delCodeAssignment = codeId => {
-  return request(`${ASSIGNMENT_MODULE}/code/${codeId}`);
+  return request(`${ASSIGNMENT_MODULE}/code/${codeId}`, { method: "DELETE" });
 };
 
 /**
  * 老师查看代码作业列表
+ * @param courseId
  * @returns {Promise<{data:CodeSerializerType[]}>}
  */
 export const getCodeAssignmentListByTeacher = (courseId = 123) => {
@@ -70,34 +81,38 @@ export const getCodeAssignmentListByTeacher = (courseId = 123) => {
 
 /**
  * 学生查看代码作业列表
+ * @param courseId
  * @returns {Promise<{data:CodeSerializerType[]}>}
  */
-export const getCodeAssignmentListByStu = () => {
-  return request(`${ASSIGNMENT_MODULE}/student/course/:courseId/code`);
+export const getCodeAssignmentListByStu = courseId => {
+  return request(`${ASSIGNMENT_MODULE}/student/course/${courseId}}/code`);
 };
 
 /**
  * 学生查看单个代码作业
+ * @param codeId
  * @returns {Promise<{data:CodeSerializerType}>}
  */
-export const getCodeAssignmentByStu = () => {
-  return request(`${ASSIGNMENT_MODULE}/student/code/:codeId`);
+export const getCodeAssignmentByStu = codeId => {
+  return request(`${ASSIGNMENT_MODULE}/student/code/${codeId}`);
 };
 
 /**
  * 学生查看单个代码作业下的项目信息列表
+ * @param codeId
  * @returns {Promise<{data:ProjectSerializerType}>}
  */
-export const getProjectListByCode = () => {
-  return request(`${ASSIGNMENT_MODULE}/student/code/:codeId/project`);
+export const getProjectListByCode = codeId => {
+  return request(`${ASSIGNMENT_MODULE}/student/code/${codeId}/project`);
 };
 
 /**
  * 学生查看单个代码作业下的成绩
+ * @param codeId
  * @returns {Promise<{data:CodeResultSerializerType}>}
  */
-export const getCodeResultByCode = () => {
-  return request(`${ASSIGNMENT_MODULE}/student/code/:codeId/result`);
+export const getCodeResultByCode = codeId => {
+  return request(`${ASSIGNMENT_MODULE}/student/code/${codeId}/result`);
 };
 
 /**
@@ -124,10 +139,11 @@ export const getUnsubmittedCodeGroupsList = (codeId = 123) => {
 
 /**
  * 老师查看单个代码作业的成绩列表(所有组的)
+ * @param codeId
  * @returns {Promise<{data:CodeResultSerializerType}>}
  */
-export const getCodeResultListByCode = () => {
-  return request(`${ASSIGNMENT_MODULE}/teacher/code/:codeId/result`);
+export const getCodeResultListByCode = codeId => {
+  return request(`${ASSIGNMENT_MODULE}/teacher/code/${codeId}/result`);
 };
 
 /* 文档作业*/
@@ -139,6 +155,7 @@ export const getCodeResultListByCode = () => {
  * @param startAt
  * @param endAt
  * @param problem
+ * @param courseId
  * @returns {Promise<{data:DocumentSerializerType}>}
  */
 export const postDocAssignment = ({
@@ -147,9 +164,10 @@ export const postDocAssignment = ({
   description,
   startAt,
   endAt,
-  problem
+  problem,
+  courseId
 }) => {
-  return request(`${ASSIGNMENT_MODULE}/course/:courseId/document`, {
+  return request(`${ASSIGNMENT_MODULE}/course/${courseId}/document`, {
     method: "POST",
     body: {
       type: type || null,
@@ -167,10 +185,17 @@ export const postDocAssignment = ({
  * @param description
  * @param startAt
  * @param endAt
+ * @param documentId
  * @returns {Promise<{data:DocumentSerializerType}>}
  */
-export const putDocAssignment = ({ name, description, startAt, endAt }) => {
-  return request(`${ASSIGNMENT_MODULE}/document/:documentId`, {
+export const putDocAssignment = ({
+  name,
+  description,
+  startAt,
+  endAt,
+  documentId
+}) => {
+  return request(`${ASSIGNMENT_MODULE}/document/${documentId}`, {
     method: "PUT",
     body: {
       name: name || null,
@@ -183,14 +208,18 @@ export const putDocAssignment = ({ name, description, startAt, endAt }) => {
 
 /**
  * 老师删除文档作业
+ * @param documentId
  * @returns {Promise<{}>}
  */
 export const delDocAssignment = (documentId = 123) => {
-  return request(`${ASSIGNMENT_MODULE}/document/${documentId}`);
+  return request(`${ASSIGNMENT_MODULE}/document/${documentId}`, {
+    method: "DELETE"
+  });
 };
 
 /**
  * 老师查看文档作业列表
+ * @param courseId
  * @returns {Promise<{data:DocumentSerializerType[]}>}
  */
 export const getDocAssignmentListTeacherByCrs = (courseId = 123) => {
@@ -199,6 +228,7 @@ export const getDocAssignmentListTeacherByCrs = (courseId = 123) => {
 
 /**
  * 学生查看文档作业列表
+ * @param courseId
  * @returns {Promise<{data:DocumentSerializerType[]}>}
  */
 export const getDocAssignmentListByCrs = (courseId = 123) => {
@@ -207,6 +237,7 @@ export const getDocAssignmentListByCrs = (courseId = 123) => {
 
 /**
  * 学生查看单个文档作业信息
+ * @param documentId
  * @returns {Promise<{data:DocumentSerializerType}>}
  */
 export const getDocAssignmentDetailByDocuId = (documentId = 123) => {
@@ -215,6 +246,7 @@ export const getDocAssignmentDetailByDocuId = (documentId = 123) => {
 
 /**
  * 学生查看单个文档作业下的成绩
+ * @param documentId
  * @returns {Promise<{data:DocumentResultSerializerType}>}
  */
 export const getDocResultById = (documentId = 123) => {
@@ -223,6 +255,7 @@ export const getDocResultById = (documentId = 123) => {
 
 /**
  * 老师查看文档作业的成绩列表(已提交小组)
+ * @param documentId
  * @returns {Promise<{data:DocumentResultSerializerType}>}
  */
 export const getSubmittedDocResultListByDocId = (documentId = 123) => {

+ 3 - 11
src/router/routes.js

@@ -81,11 +81,11 @@ export default [
         component: () => import("@/views/teacher/Code/index")
       },
       {
-        path: "code/detail",
+        path: "code/:codeId",
         component: () => import("@/views/teacher/Code/detail")
       },
       {
-        path: "code/detail/test",
+        path: "code/:codeId/test",
         component: () => import("@/views/teacher/Code/test")
       },
 
@@ -94,7 +94,7 @@ export default [
         component: () => import("@/views/teacher/Document/index")
       },
       {
-        path: "document/detail",
+        path: "document/:documentId",
         component: () => import("@/views/teacher/Document/detail")
       },
       {
@@ -139,14 +139,6 @@ export default [
         path: "dashboard",
         component: () => import("@/views/student/Dashboard")
       },
-      {
-        path: "code",
-        component: () => import("@/views/student/Code/index")
-      },
-      {
-        path: "code/detail",
-        component: () => import("@/views/student/Code/detail")
-      },
       {
         path: "document",
         component: () => import("@/views/student/Document/index")

+ 1 - 1
src/util/request.js

@@ -80,7 +80,7 @@ export default async function request(url, options) {
     }
   }
 
-  if (newOptions.method === "DELETE" || response.status === 204) {
+  if (response.status === 204) {
     return response.text();
   }
   const Authorization = await response.headers.get("Authorization");

+ 0 - 49
src/views/student/Code/detail.vue

@@ -1,49 +0,0 @@
-<template>
-  <div>
-    <page-header
-      :routes="[
-        { name: '代码作业', path: 'code' },
-        { name: '购物车web项目', path: 'code/detail' }
-      ]"
-    >
-      <template slot="title">
-        Here might be a page title
-      </template>
-      <template slot="content">
-        Here might be a page title
-      </template>
-    </page-header>
-    <page-body> </page-body>
-  </div>
-</template>
-
-<script>
-import PageHeader from "@/components/PageHeader";
-import PageBody from "@/components/PageBody/index";
-const codeAssignmentDetail = {
-  id: 1,
-  name: "软件需求规格说明书",
-  description: "这里是描述这里是描述这里是描述这里是描述这里是描述",
-  state: "未开始",
-  startAt: "2019-1-1",
-  endAt: "2019-6-1"
-};
-const codeAssignmentProjects = {
-  codeId: 1,
-  url: "https://www.github.com/adsf/adsfa",
-  name: "电影票web项目",
-  buildList: []
-};
-export default {
-  components: {
-    PageBody,
-    PageHeader
-  },
-  data() {
-    return {
-      codeAssignmentDetail,
-      codeAssignmentProjects
-    };
-  }
-};
-</script>

+ 0 - 126
src/views/student/Code/index.vue

@@ -1,126 +0,0 @@
-<template>
-  <div>
-    <page-header :routes="[{ name: '代码作业', path: 'code' }]">
-      <template slot="title">
-        代码作业列表
-      </template>
-      <template slot="content">
-        Here might be a page title
-      </template>
-    </page-header>
-    <page-body>
-      <div>
-        <b-table
-          :data="codeData"
-          paginated
-          per-page="5"
-          detailed
-          detail-key="id"
-        >
-          <template slot-scope="props">
-            <b-table-column field="id" label="题目ID" numeric sortable centered>
-              {{ props.row.id }}
-            </b-table-column>
-
-            <b-table-column label="题目名称" centered>
-              <router-link :to="`/course-student/:courseId/code/detail`">
-                {{ props.row.name }}</router-link
-              >
-            </b-table-column>
-            <b-table-column label="状态" centered>
-              {{ props.row.state }}
-            </b-table-column>
-
-            <b-table-column label="开始时间" centered>
-              {{ props.row.startAt }}
-            </b-table-column>
-
-            <b-table-column label="结束时间" centered>
-              {{ props.row.endAt }}
-            </b-table-column>
-          </template>
-
-          <template slot="detail">
-            <article class="media">
-              <div class="media-content">
-                <div class="content">
-                  <p>
-                    <strong>成绩详情</strong>
-                    <small>这里可以放具体的作业成绩,前面可以放总评啥的</small>
-                    <br />
-                  </p>
-                </div>
-              </div>
-            </article>
-          </template>
-        </b-table>
-      </div>
-    </page-body>
-  </div>
-</template>
-
-<script>
-import PageHeader from "@/components/PageHeader";
-import PageBody from "@/components/PageBody/index";
-const codeData = [
-  {
-    id: 1,
-    name: "购物车web项目",
-    state: "未开始",
-    startAt: "2019-1-1",
-    endAt: "2019-6-1"
-  },
-  {
-    id: 2,
-    name: "购物车web项目",
-    state: "已结束",
-    startAt: "2019-1-1",
-    endAt: "2019-6-1"
-  },
-  {
-    id: 3,
-    name: "购物车web项目",
-    state: "正在进行",
-    startAt: "2019-1-1",
-    endAt: "2019-6-1"
-  }
-];
-export default {
-  components: {
-    PageBody,
-    PageHeader
-  },
-  data() {
-    return {
-      codeData,
-      docAssignment: {
-        name: "",
-        description: "",
-        startAt: new Date(),
-        endAt: new Date()
-      },
-      isCardModalActive: false
-    };
-  },
-  methods: {}
-};
-</script>
-
-<style lang="scss" scoped>
-.card {
-  padding: 30px;
-  .title {
-    font-size: 1.25rem;
-    small {
-      color: gray;
-      font-size: 1rem;
-    }
-  }
-  .content {
-    a {
-      margin-top: 30px;
-      width: 100%;
-    }
-  }
-}
-</style>

+ 1 - 1
src/views/student/Document/detail.vue

@@ -10,7 +10,7 @@
         {{ assignmentInfo.name }}
       </template>
       <template slot="content">
-        Here might be a page title
+        {{ assignmentInfo.description }}
       </template>
     </page-header>
     <page-body>

+ 6 - 9
src/views/student/Document/index.vue

@@ -5,7 +5,7 @@
         文档作业列表
       </template>
       <template slot="content">
-        共有{n}份作业
+        共有{{ docList.length }}份作业
       </template>
     </page-header>
     <page-body>
@@ -25,7 +25,7 @@
             <b-table-column label="作业名称" centered>
               <router-link
                 :to="{
-                  path: `/course-student/:courseId/document/detail`,
+                  path: `document/${props.row.id}`,
                   query: { assignmentInfo: props.row }
                 }"
               >
@@ -37,15 +37,11 @@
             </b-table-column>
 
             <b-table-column label="开始时间" centered>
-              {{ new Date(props.row.startAt * 1000).getFullYear() }}-{{
-                new Date(props.row.startAt * 1000).getMonth() + 1
-              }}-{{ new Date(props.row.startAt * 1000).getDate() }}
+              {{ displayUnixTime(props.row.startAt) }}
             </b-table-column>
 
             <b-table-column label="结束时间" centered>
-              {{ new Date(props.row.endAt * 1000).getFullYear() }}-{{
-                new Date(props.row.endAt * 1000).getMonth() + 1
-              }}-{{ new Date(props.row.endAt * 1000).getDate() }}
+              {{ displayUnixTime(props.row.endAt) }}
             </b-table-column>
           </template>
 
@@ -71,14 +67,15 @@
 import PageHeader from "@/components/PageHeader";
 import PageBody from "@/components/PageBody/index";
 import { getDocAssignmentListByCrs } from "@/api/assignment";
+import timeMixins from "@/mixins/time";
 export default {
   components: {
     PageBody,
     PageHeader
   },
+  mixins: [timeMixins],
   mounted() {
     getDocAssignmentListByCrs(123).then(res => {
-      console.log(typeof res.data);
       this.docList = res.data;
     });
   },

+ 3 - 3
src/views/teacher/Code/detail.vue

@@ -3,7 +3,7 @@
     <page-header
       :routes="[
         { name: '代码作业', path: 'code' },
-        { name: `${assignmentInfo.name}`, path: 'code/detail' }
+        { name: `${assignmentInfo.name}`, path: 'code/${assignmentInfo.id}' }
       ]"
     >
       <template slot="title">
@@ -167,7 +167,7 @@ export default {
     PageBody,
     PageHeader
   },
-  async mounted() {
+  mounted() {
     this.assignmentInfo = this.$route.query.assignmentInfo;
     getCodeProcedureListByCodeId(123).then(res => {
       this.codeProcedureList = res.data;
@@ -198,7 +198,7 @@ export default {
         title: "",
         tag: ""
       };
-      if (state === 2) {
+      if (state === -1) {
         data.title = status.failed;
         data.tag = tag.failed;
       } else if (state === 0) {

+ 250 - 77
src/views/teacher/Code/index.vue

@@ -5,7 +5,7 @@
         代码作业列表
       </template>
       <template slot="content">
-        共有{{ codeData.length }}份代码作业
+        共有{{ codeData.length }}份作业
       </template>
       <template slot="action">
         <b-field>
@@ -13,40 +13,39 @@
         </b-field>
       </template>
     </page-header>
+
     <page-body>
       <div class="data-table">
         <b-table :data="codeData" detailed detail-key="id">
           <template slot-scope="props">
-            <b-table-column field="id" label="作业ID" numeric sortable centered>
+            <b-table-column field="id" label="ID" numeric sortable centered>
               {{ props.row.id }}
             </b-table-column>
 
             <b-table-column label="作业名称" centered>
               <router-link
                 :to="{
-                  path: `/course-teacher/:courseId/code/detail`,
-                  query: { assignmentInfo: props.row }
+                  path: `code/${props.row.id}`,
+                  query: {
+                    assignmentInfo: props.row.problem,
+                    title: props.row.name
+                  }
                 }"
               >
                 {{ props.row.name }}
               </router-link>
             </b-table-column>
-            <b-table-column label="作业状态" centered>
+            <b-table-column label="状态" centered>
               {{ props.row.status }}
             </b-table-column>
 
             <b-table-column label="开始时间" centered>
-              {{ new Date(props.row.startAt * 1000).getFullYear() }}-{{
-                new Date(props.row.startAt * 1000).getMonth() + 1
-              }}-{{ new Date(props.row.startAt * 1000).getDate() }}
+              {{ displayUnixTime(props.row.startAt) }}
             </b-table-column>
 
             <b-table-column label="结束时间" centered>
-              {{ new Date(props.row.endAt * 1000).getFullYear() }}-{{
-                new Date(props.row.endAt * 1000).getMonth() + 1
-              }}-{{ new Date(props.row.endAt * 1000).getDate() }}
+              {{ displayUnixTime(props.row.endAt) }}
             </b-table-column>
-
             <b-table-column label="修改" centered>
               <a @click="updateInfo(props.row.id)">修改</a>
             </b-table-column>
@@ -73,34 +72,77 @@
       </div>
     </page-body>
 
-    <!--新建文档作业模态框-->
+    <!--新建代码作业模态框-->
     <b-modal :active.sync="isCardModalActive" :width="640" scroll="keep">
       <div class="card">
         <div class="title">{{ modal.title }}</div>
         <div class="content">
-          <b-field label="作业名称">
-            <b-input v-model="codeAssignment.name"></b-input>
+          <div v-if="display">
+            <b-field label="查找题目"></b-field>
+            <b-field :type="$v.params.problem.$error ? 'is-danger' : ''">
+              <b-input
+                placeholder="输入ID查找题目"
+                type="search"
+                icon="magnify"
+                :value="searchContent"
+                v-model="$v.params.problem.$model"
+                expanded
+              >
+              </b-input>
+              <p class="control">
+                <button class="button is-link" @click="search(searchContent)">
+                  查找
+                </button>
+              </p>
+            </b-field>
+          </div>
+          <b-field
+            label="作业名称"
+            :type="$v.params.name.$error ? 'is-danger' : ''"
+            :message="$v.params.name.$error ? '请填写作业名称' : ''"
+          >
+            <b-input
+              placeholder="请填写作业名称"
+              v-model="$v.params.name.$model"
+            ></b-input>
           </b-field>
-          <b-field label="作业描述">
-            <b-input v-model="codeAssignment.description"></b-input>
+          <b-field
+            label="作业描述"
+            :type="$v.params.description.$error ? 'is-danger' : ''"
+            :message="$v.params.description.$error ? '请填写作业描述' : ''"
+          >
+            <b-input
+              type="textarea"
+              placeholder="请填写作业描述"
+              v-model="$v.params.description.$model"
+            ></b-input>
           </b-field>
-          <b-field label="开始时间">
-            <b-datepicker
-              v-model="codeAssignment.startAt"
+          <b-field
+            label="开始时间"
+            :type="$v.params.startAt.$error ? 'is-danger' : ''"
+            :message="$v.params.startAt.$error ? '请填写作业开始时间' : ''"
+          >
+            <flat-pickr
               placeholder="Click to select..."
-              icon="calendar-today"
-            >
-            </b-datepicker>
+              class="input"
+              v-model="$v.params.startAt.$model"
+              :config="startAtConfig"
+            ></flat-pickr>
           </b-field>
-          <b-field label="结束时间">
-            <b-datepicker
-              v-model="codeAssignment.endAt"
+          <b-field
+            label="结束时间"
+            :type="$v.params.endAt.$error ? 'is-danger' : ''"
+            :message="$v.params.endAt.$error ? '请填写作业结束时间' : ''"
+          >
+            <flat-pickr
               placeholder="Click to select..."
-              icon="calendar-today"
-            >
-            </b-datepicker>
+              class="input"
+              v-model="$v.params.endAt.$model"
+              :config="endAtConfig"
+            ></flat-pickr>
           </b-field>
-          <a class="button is-link" @click="createCodeAssignment">{{
+
+          <a class="button is-link" @click="createDocAssignment()">{{
             modal.submit
           }}</a>
         </div>
@@ -113,11 +155,20 @@
 import PageHeader from "@/components/PageHeader";
 import PageBody from "@/components/PageBody/index";
 import { getCodeAssignmentListByTeacher } from "@/api/assignment";
+import { getQuestionDetail } from "@/api/question";
+import { postCodeAssignment } from "@/api/assignment";
+import { putCodeAssignment } from "@/api/assignment";
+import { delCodeAssignment } from "@/api/assignment";
+import timeMixins from "@/mixins/time";
+import { required } from "vuelidate/lib/validators";
+import pathMixins from "@/mixins/path";
+
 export default {
   components: {
     PageBody,
     PageHeader
   },
+  mixins: [timeMixins, pathMixins],
   mounted() {
     getCodeAssignmentListByTeacher(123).then(res => {
       this.codeData = res.data;
@@ -125,82 +176,204 @@ export default {
   },
   data() {
     return {
+      searchContent: null,
+      question: {},
       codeData: [],
-      codeAssignment: {
-        id: -1,
-        name: "",
-        description: "",
-        startAt: new Date(),
-        endAt: new Date()
+      params: {
+        name: null,
+        description: null,
+        startAt: null,
+        endAt: null,
+        problem: null //选择题目编号
       },
+      // 返回的代码作业信息
       isCardModalActive: false,
       modal: {
-        title: "新建文档作业",
+        title: "新建代码作业",
         submit: "确认创建"
+      },
+      flag: -1, //区分创建还是修改
+      display: true,
+      startAtConfig: {
+        ...this.getDefaultConfig(),
+        minDate: "today",
+        maxDate: null
+      },
+      endAtConfig: {
+        ...this.getDefaultConfig(),
+        minDate: "today",
+        maxDate: null
       }
     };
   },
+  validations: {
+    params: {
+      name: {
+        required
+      },
+      description: {
+        required
+      },
+      startAt: {
+        required
+      },
+      endAt: {
+        required
+      },
+      problem: {
+        required
+      }
+    }
+  },
+  watch: {
+    isCardModalActive(newValue) {
+      if (newValue === false) {
+        this.$v.$reset();
+      }
+    }
+  },
   methods: {
+    /**
+     * 搜索题目
+     * @param content
+     * @return {Promise<void>}
+     */
+    async searchAssis(content) {
+      console.log(content);
+      await getQuestionDetail().then(res => {
+        this.question = res.data;
+      });
+    },
+    search(content) {
+      this.searchAssis(content).then(() => {
+        console.log(this.question);
+        this.params.problem = this.question.id;
+        this.searchContent = this.question.name;
+        this.$dialog.alert({
+          title: "题目信息",
+          message: this.searchContent,
+          confirmText: "OK"
+        });
+      });
+    },
+
+    /**
+     * 确定删除
+     * @param id
+     */
     confirmDelete(id) {
       this.$dialog.confirm({
         message: "确认删除?",
         confirmText: "删除",
         type: "is-danger",
         onConfirm: () => {
-          for (var item of this.codeData) {
-            if (item.id === id) {
-              this.codeData.pop(item);
+          delCodeAssignment(id).then(res => {
+            console.log(res);
+            if (res.err === 0) {
+              //删除成功
+              for (let item of this.codeData) {
+                if (item.id === id) {
+                  this.codeData.pop(item);
+                }
+              }
+              this.$toast.open("删除成功");
+            } else {
+              this.$dialog.alert({
+                title: "删除失败",
+                message: res.msg,
+                type: "is-danger",
+                hasIcon: true,
+                icon: "times-circle",
+                iconPack: "fa"
+              });
             }
-          }
-          this.$toast.open("删除成功");
+          });
         }
       });
     },
+    /**
+     * 准备新建或者修改
+     * @param id
+     */
     updateInfo(id) {
       this.isCardModalActive = true;
-      if (id !== -1) {
+      if (id === -1) {
+        // 准备新建
+        this.display = true;
+        this.modal.title = "新建代码作业";
+        this.modal.submit = "确认创建";
+        this.flag = -1;
+      } else {
+        this.display = false;
+        // 准备修改
+        this.modal.title = "修改代码作业";
         this.modal.submit = "确认修改";
-        this.modal.title = "修改文档作业";
         for (let item of this.codeData) {
           if (item.id === id) {
-            this.codeAssignment.id = id;
-            this.codeAssignment.name = item.name;
-            this.codeAssignment.description = item.description;
-            this.codeAssignment.startAt = new Date(item.startAt);
-            this.codeAssignment.endAt = new Date(item.endAt);
+            this.params.name = item.name;
+            this.params.description = item.description;
+            // 以下两项无效
+            this.params.startAt = item.startAt;
+            this.params.endAt = item.endAt;
             break;
           }
         }
-      } else {
-        this.modal.title = "新建文档作业";
-        this.modal.submit = "确认创建";
-        this.codeAssignment.id = -1;
-        this.codeAssignment.name = "";
-        this.codeAssignment.description = "";
-        this.codeAssignment.startAt = new Date();
-        this.codeAssignment.endAt = new Date();
+        this.flag = 0;
       }
     },
-    createCodeAssignment() {
-      this.isCardModalActive = false;
-      if (this.codeAssignment.id === -1) {
-        var itemsCount = this.codeData.length;
-        this.codeData.push({
-          id: itemsCount + 1,
-          name: this.codeAssignment.name,
-          description: this.codeAssignment.description,
-          startAt: this.codeAssignment.startAt.getTime(),
-          endAt: this.codeAssignment.endAt.getTime()
-        });
-      } else {
-        for (var item of this.codeData) {
-          if (item.id === this.codeAssignment.id) {
-            item.name = this.codeAssignment.name;
-            item.description = this.codeAssignment.description;
-            item.startAt = this.codeAssignment.startAt.getTime();
-            item.endAt = this.codeAssignment.endAt.getTime();
-            break;
-          }
+    /**
+     * 确认新建或者修改
+     */
+    createDocAssignment() {
+      this.$v.$touch();
+      if (!this.$v.$invalid) {
+        this.isCardModalActive = false;
+        if (this.flag === -1) {
+          // 确认新建作业
+          this.params["type"] = "DOCUMENT";
+          postCodeAssignment(this.params).then(res => {
+            console.log(res);
+            if (res.err === 0) {
+              //创建成功
+              this.codeData.push(res.data);
+              this.$router.push({
+                path: `${this.prefix}/review?documentHwId=${res.data.id}`
+              });
+            } else {
+              //创建失败
+              this.$dialog.alert({
+                title: "创建失败",
+                message: res.msg,
+                type: "is-danger",
+                hasIcon: true,
+                icon: "times-circle",
+                iconPack: "fa"
+              });
+            }
+          });
+        } else {
+          // 确认修改作业
+          putCodeAssignment(this.params).then(res => {
+            if (res.err === 0) {
+              let id = res.data.id;
+              for (let item of this.codeData) {
+                if (item.id === id) {
+                  item = res.data;
+                  console.log("修改成功");
+                  break;
+                }
+              }
+            } else {
+              this.$dialog.alert({
+                title: "修改失败",
+                message: res.msg,
+                type: "is-danger",
+                hasIcon: true,
+                icon: "times-circle",
+                iconPack: "fa"
+              });
+            }
+          });
         }
       }
     }

+ 2 - 1
src/views/teacher/Code/test.vue

@@ -3,7 +3,7 @@
     <page-header
       :routes="[
         { name: '代码作业', path: 'code' },
-        { name: '购物车web项目', path: 'code/detail' },
+        { name: '购物车web项目', path: `code/${assignmentInfo.id}` },
         { name: '测试信息', path: 'code/detail/test' }
       ]"
     >
@@ -94,6 +94,7 @@ export default {
   },
   mounted() {
     this.assignmentInfo = this.$route.query.assignmentInfo;
+    console.log(this.assignmentInfo);
   },
   data() {
     return {

+ 2 - 4
src/views/teacher/Document/detail.vue

@@ -3,7 +3,7 @@
     <page-header
       :routes="[
         { name: '文档作业', path: 'document' },
-        { name: `${title}`, path: 'document/detail' }
+        { name: `${title}`, path: 'document/:documentId' }
       ]"
     >
       <template slot="title">
@@ -58,9 +58,7 @@
                   {{ props.row.result }}
                 </b-table-column>
                 <b-table-column field="difficulty" label="详情" centered
-                  ><a :href="props.row.url" target="_blank"
-                    >查看详情-加提示框</a
-                  >
+                  ><a :href="props.row.url" target="_blank">查看详情</a>
                 </b-table-column>
               </template>
 

+ 11 - 0
src/views/teacher/Document/docList.vue

@@ -0,0 +1,11 @@
+<template>
+  <div>显示该组的文档列表</div>
+</template>
+
+<script>
+export default {
+  name: "docList"
+};
+</script>
+
+<style scoped></style>

+ 177 - 63
src/views/teacher/Document/index.vue

@@ -25,7 +25,7 @@
             <b-table-column label="作业名称" centered>
               <router-link
                 :to="{
-                  path: `/course-teacher/:courseId/document/detail`,
+                  path: `document/${props.row.id}`,
                   query: {
                     assignmentInfo: props.row.problem,
                     title: props.row.name
@@ -40,15 +40,11 @@
             </b-table-column>
 
             <b-table-column label="开始时间" centered>
-              {{ new Date(props.row.startAt).getFullYear() }}-{{
-                new Date(props.row.startAt).getMonth() + 1
-              }}-{{ new Date(props.row.startAt).getDate() }}
+              {{ displayUnixTime(props.row.startAt) }}
             </b-table-column>
 
             <b-table-column label="结束时间" centered>
-              {{ new Date(props.row.endAt).getFullYear() }}-{{
-                new Date(props.row.endAt).getMonth() + 1
-              }}-{{ new Date(props.row.endAt).getDate() }}
+              {{ displayUnixTime(props.row.endAt) }}
             </b-table-column>
             <b-table-column label="修改" centered>
               <a @click="updateInfo(props.row.id)">修改</a>
@@ -65,7 +61,7 @@
               <div class="media-content">
                 <div class="content">
                   <p>
-                    <strong>作业描述:</strong><br />
+                    <strong>作业描述:</strong>
                     <small>{{ props.row.description }}</small> <br />
                   </p>
                 </div>
@@ -83,12 +79,11 @@
         <div class="content">
           <div v-if="display">
             <b-field label="查找题目"></b-field>
-            <b-field>
+            <b-field :type="$v.searchContent.$error ? 'is-danger' : ''">
               <b-input
-                placeholder="输入ID查找题目"
+                placeholder="输入关键字模糊查找"
                 type="search"
-                icon="magnify"
-                :value="searchContent"
+                v-model="$v.searchContent.$model"
                 expanded
               >
               </b-input>
@@ -99,28 +94,52 @@
               </p>
             </b-field>
           </div>
-          <b-field label="作业名称">
-            <b-input v-model="params.name"></b-input>
+          <b-field
+            label="作业名称"
+            :type="$v.params.name.$error ? 'is-danger' : ''"
+            :message="$v.params.name.$error ? '请填写作业名称' : ''"
+          >
+            <b-input
+              placeholder="请填写作业名称"
+              v-model="$v.params.name.$model"
+            ></b-input>
           </b-field>
-          <b-field label="作业描述">
-            <b-input v-model="params.description"></b-input>
+          <b-field
+            label="作业描述"
+            :type="$v.params.description.$error ? 'is-danger' : ''"
+            :message="$v.params.description.$error ? '请填写作业描述' : ''"
+          >
+            <b-input
+              type="textarea"
+              placeholder="请填写作业描述"
+              v-model="$v.params.description.$model"
+            ></b-input>
           </b-field>
-          <b-field label="开始时间">
-            <b-datepicker
-              v-model="params.startAt"
+          <b-field
+            label="开始时间"
+            :type="$v.params.startAt.$error ? 'is-danger' : ''"
+            :message="$v.params.startAt.$error ? '请填写作业开始时间' : ''"
+          >
+            <flat-pickr
               placeholder="Click to select..."
-              icon="calendar-today"
-            >
-            </b-datepicker>
+              class="input"
+              v-model="$v.params.startAt.$model"
+              :config="startAtConfig"
+            ></flat-pickr>
           </b-field>
-          <b-field label="结束时间">
-            <b-datepicker
-              v-model="params.endAt"
+          <b-field
+            label="结束时间"
+            :type="$v.params.endAt.$error ? 'is-danger' : ''"
+            :message="$v.params.endAt.$error ? '请填写作业结束时间' : ''"
+          >
+            <flat-pickr
               placeholder="Click to select..."
-              icon="calendar-today"
-            >
-            </b-datepicker>
+              class="input"
+              v-model="$v.params.endAt.$model"
+              :config="endAtConfig"
+            ></flat-pickr>
           </b-field>
+
           <a class="button is-link" @click="createDocAssignment()">{{
             modal.submit
           }}</a>
@@ -133,20 +152,21 @@
 <script>
 import PageHeader from "@/components/PageHeader";
 import PageBody from "@/components/PageBody/index";
-// import { required } from "vuelidate/lib/validators";
 import { getDocAssignmentListTeacherByCrs } from "@/api/assignment";
-import timeMixins from "@/mixins/time";
 import { getQuestionDetail } from "@/api/question";
 import { postDocAssignment } from "@/api/assignment";
 import { putDocAssignment } from "@/api/assignment";
 import { delDocAssignment } from "@/api/assignment";
+import timeMixins from "@/mixins/time";
+import { required } from "vuelidate/lib/validators";
+import pathMixins from "@/mixins/path";
 
 export default {
   components: {
     PageBody,
     PageHeader
   },
-  mixins: [timeMixins],
+  mixins: [timeMixins, pathMixins],
   mounted() {
     getDocAssignmentListTeacherByCrs(123).then(res => {
       this.docData = res.data;
@@ -158,11 +178,11 @@ export default {
       question: {},
       docData: [],
       params: {
-        name: "",
-        description: "",
-        startAt: new Date(),
-        endAt: new Date(),
-        problem: -1 //选择题目编号
+        name: null,
+        description: null,
+        startAt: null,
+        endAt: null,
+        problem: null //题目编号
       },
       // 返回的文档作业信息
       isCardModalActive: false,
@@ -171,9 +191,48 @@ export default {
         submit: "确认创建"
       },
       flag: -1, //区分创建还是修改
-      display: true
+      display: true,
+      startAtConfig: {
+        ...this.getDefaultConfig(),
+        minDate: "today",
+        maxDate: null
+      },
+      endAtConfig: {
+        ...this.getDefaultConfig(),
+        minDate: "today",
+        maxDate: null
+      }
     };
   },
+  validations: {
+    params: {
+      name: {
+        required
+      },
+      description: {
+        required
+      },
+      startAt: {
+        required
+      },
+      endAt: {
+        required
+      }
+      // problem: {
+      //   required
+      // }
+    },
+    searchContent: {
+      required
+    }
+  },
+  watch: {
+    isCardModalActive(newValue) {
+      if (newValue === false) {
+        this.$v.$reset();
+      }
+    }
+  },
   methods: {
     /**
      * 搜索题目
@@ -182,17 +241,25 @@ export default {
      */
     async searchAssis(content) {
       console.log(content);
-      getQuestionDetail().then(res => {
+      await getQuestionDetail().then(res => {
         this.question = res.data;
       });
     },
     search(content) {
-      this.params.problem = this.question.id;
-      this.searchContent = this.question.name;
       this.searchAssis(content).then(() => {
+        this.params.problem = this.question.id;
+        this.searchContent = this.question.name;
         this.$dialog.alert({
           title: "题目信息",
-          message: this.searchContent,
+          message: `<strong>题目名称</strong><br/>
+            ${this.question.name}<br/>
+            <strong>题目描述</strong><br/>
+            ${this.question.description}<br/>
+            <strong>期望时间</strong><br/>
+            ${this.question.expectTime}<br/>
+            <strong>题目难度</strong><br/>
+            ${this.question.difficulty}<br/>
+            `,
           confirmText: "OK"
         });
       });
@@ -208,15 +275,24 @@ export default {
         confirmText: "删除",
         type: "is-danger",
         onConfirm: () => {
-          // 加判断
-          delDocAssignment(id).then(req => {
-            if (req.data === 0) {
+          delDocAssignment(id).then(res => {
+            if (res.err === 0) {
+              //删除成功
               for (let item of this.docData) {
                 if (item.id === id) {
                   this.docData.pop(item);
                 }
               }
               this.$toast.open("删除成功");
+            } else {
+              this.$dialog.alert({
+                title: "删除失败",
+                message: res.msg,
+                type: "is-danger",
+                hasIcon: true,
+                icon: "times-circle",
+                iconPack: "fa"
+              });
             }
           });
         }
@@ -239,6 +315,16 @@ export default {
         // 准备修改
         this.modal.title = "修改文档作业";
         this.modal.submit = "确认修改";
+        for (let item of this.docData) {
+          if (item.id === id) {
+            this.params.name = item.name;
+            this.params.description = item.description;
+            // 以下两项无效
+            this.params.startAt = item.startAt;
+            this.params.endAt = item.endAt;
+            break;
+          }
+        }
         this.flag = 0;
       }
     },
@@ -246,26 +332,54 @@ export default {
      * 确认新建或者修改
      */
     createDocAssignment() {
-      this.isCardModalActive = false;
-      if (this.flag === -1) {
-        // 确认新建作业
-        this.params["type"] = "DOCUMENT";
-        postDocAssignment(this.params).then(res => {
-          this.docData.push(res.data);
-        });
-        //如果创建成功
-      } else {
-        // 确认修改作业
-        putDocAssignment(this.params).then(res => {
-          let id = res.data.id;
-          for (let item of this.docData) {
-            if (item.id === id) {
-              item = res.data;
-              console.log("修改成功");
-              break;
+      this.$v.$touch();
+      if (!this.$v.$invalid) {
+        this.isCardModalActive = false;
+        if (this.flag === -1) {
+          // 确认新建作业
+          this.params["type"] = "DOCUMENT";
+          postDocAssignment(this.params).then(res => {
+            if (res.err === 0) {
+              //创建成功
+              this.docData.push(res.data);
+              this.$router.push({
+                path: `${this.prefix}/review?documentHwId=${res.data.id}`
+              });
+            } else {
+              //创建失败
+              this.$dialog.alert({
+                title: "创建失败",
+                message: res.msg,
+                type: "is-danger",
+                hasIcon: true,
+                icon: "times-circle",
+                iconPack: "fa"
+              });
             }
-          }
-        });
+          });
+        } else {
+          // 确认修改作业
+          putDocAssignment(this.params).then(res => {
+            if (res.err === 0) {
+              let id = res.data.id;
+              for (let item of this.docData) {
+                if (item.id === id) {
+                  item = res.data;
+                  break;
+                }
+              }
+            } else {
+              this.$dialog.alert({
+                title: "修改失败",
+                message: res.msg,
+                type: "is-danger",
+                hasIcon: true,
+                icon: "times-circle",
+                iconPack: "fa"
+              });
+            }
+          });
+        }
       }
     }
   }