Просмотр исходного кода

[修改]fix界面问题,新增gitcommit信息和复制

soleil 7 лет назад
Родитель
Сommit
5a4f42d49b

+ 41 - 0
package-lock.json

@@ -3602,6 +3602,16 @@
       "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
       "dev": true
     },
+    "clipboard": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz",
+      "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==",
+      "requires": {
+        "good-listener": "1.2.2",
+        "select": "1.1.2",
+        "tiny-emitter": "2.1.0"
+      }
+    },
     "clipboardy": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz",
@@ -4815,6 +4825,11 @@
       "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
       "dev": true
     },
+    "delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+    },
     "delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@@ -7296,6 +7311,14 @@
         "minimatch": "3.0.4"
       }
     },
+    "good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
+      "requires": {
+        "delegate": "3.2.0"
+      }
+    },
     "graceful-fs": {
       "version": "4.1.15",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
@@ -13912,6 +13935,11 @@
         }
       }
     },
+    "select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
+      "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0="
+    },
     "select-hose": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
@@ -15254,6 +15282,11 @@
       "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
       "dev": true
     },
+    "tiny-emitter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+    },
     "tmp": {
       "version": "0.0.33",
       "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -15879,6 +15912,14 @@
       "integrity": "sha512-ZYwNuMcT9a1MvD0/YwJOLoM+mWd8+sLIw9eJgrDLZ8dcwW51nOxPPkJRZIul7FUibjsZX0JGJ+1f8MSGUdbxaA==",
       "dev": true
     },
+    "vue-clipboard2": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/vue-clipboard2/-/vue-clipboard2-0.3.0.tgz",
+      "integrity": "sha512-6/Y9NJErWb4LNBLMgsJSdKb7KpF6/jqXagvKlYut6VQzQsNj6515FpwH0r5hhmeJMqaPzf1kxAw8L8Qvw/QBJQ==",
+      "requires": {
+        "clipboard": "2.0.4"
+      }
+    },
     "vue-eslint-parser": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz",

+ 1 - 0
package.json

@@ -18,6 +18,7 @@
     "register-service-worker": "^1.5.2",
     "vue": "^2.5.17",
     "vue-chartjs": "^3.4.0",
+    "vue-clipboard2": "^0.3.0",
     "vue-flatpickr-component": "^8.1.1",
     "vue-markdown": "^2.2.4",
     "vue-router": "^3.0.1",

+ 11 - 0
src/api/assignment.js

@@ -219,6 +219,17 @@ export const getDocAssignmentListByCrs = courseId => {
   return request(`${ASSIGNMENT_MODULE}/student/course/${courseId}/document`);
 };
 
+/**
+ * 学生查看文档作业详细信息
+ * @param documentId
+ * @returns {Promise<{data:DocumentSerializerType}>}
+ */
+export const getDocAssignmentContentByDocId = documentId => {
+  return request(
+    `${ASSIGNMENT_MODULE}/student/document/result/${documentId}/content`
+  );
+};
+
 /**
  * 学生查看单个文档作业信息
  * @param documentId

+ 3 - 0
src/main.js

@@ -10,6 +10,8 @@ import VueFlatPickr from "vue-flatpickr-component";
 import "flatpickr/dist/flatpickr.css";
 import flatpickr from "../node_modules/flatpickr";
 import { Mandarin } from "../node_modules/flatpickr/dist/l10n/zh.js";
+import VueClipboard from "vue-clipboard2";
+
 // date picker
 flatpickr.setDefaults({
   enableTime: true,
@@ -24,6 +26,7 @@ Vue.config.productionTip = false;
 Vue.use(Vuelidate);
 Vue.use(Buefy);
 Vue.use(VueFlatPickr);
+Vue.use(VueClipboard);
 
 new Vue({
   router,

+ 1 - 1
src/router/routes.js

@@ -219,7 +219,7 @@ export default [
       },
       {
         path: "document/:documentId/content/:groupWorkId",
-        component: () => import("@/views/teacher/Document/docContent")
+        component: () => import("@/views/student/Document/docContent")
       },
       {
         path: "review",

+ 7 - 3
src/views/student/Code/ProjectDetail/TestDetail.vue

@@ -15,7 +15,7 @@
           tag="div"
         >
           <div><strong>UNIT TEST : #</strong> {{ item.id }}</div>
-          <pass-tag :pass="item.passAll" />
+          <pass-tag v-if="item.status == 1" :pass="item.passAll" />
           <span style="padding-left: 10px">{{
             displayUnixTime(item.time)
           }}</span>
@@ -52,7 +52,7 @@
           tag="div"
         >
           <div><strong>FUNCTIONAL TEST : #</strong> {{ item.id }}</div>
-          <pass-tag :pass="item.passAll" />
+          <pass-tag v-if="item.status == 1" :pass="item.passAll" />
           <span style="padding-left: 10px">{{
             displayUnixTime(item.time)
           }}</span>
@@ -67,8 +67,12 @@ import PassTag from "@/views/student/Code/ProjectDetail/components/PassTag";
 import timeMixins from "@/mixins/time";
 import { makeFunctionalTest } from "@/api/codehw";
 import PageSectionLoading from "@/components/PageBody/PageSectionLoading/index";
+
 export default {
-  components: { PageSectionLoading, PassTag },
+  components: {
+    PageSectionLoading,
+    PassTag
+  },
   props: {
     projectDetail: {
       type: Object,

+ 17 - 0
src/views/student/Code/ProjectDetail/index.vue

@@ -32,6 +32,9 @@
       <template slot="content">
         <strong>git 地址 : </strong>
         <a :href="projectDetail.url" target="_blank">{{ projectDetail.url }}</a>
+        <a style="margin-left:10px;" class="button is-small" v-clipboard:copy="projectDetail.url"
+           v-clipboard:success="onCopy"
+           v-clipboard:error="onError">复制地址</a>
       </template>
     </page-header>
     <page-body>
@@ -58,6 +61,20 @@ export default {
       detailLoading: false
     };
   },
+  methods: {
+    onCopy() {
+      this.$toast.open({
+        message: "复制成功",
+        type: "is-success"
+      });
+    },
+    onError() {
+      this.$toast.open({
+        message: "复制失败",
+        type: "is-danger"
+      });
+    }
+  },
   async mounted() {
     const { projectId } = this.$route.params;
     this.detailLoading = true;

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

@@ -63,7 +63,7 @@
           <div class="columns is-desktop" v-show="isAvailable">
             <div class="column">
               <h5 class="title is-5">查看文档内容</h5>
-              <!--<div class="subtitle is-6"><router-link :to="{path: `${$route.path}/content/${detail.id}`}">查看文档内容</router-link></div>-->
+              <div class="subtitle is-6"><router-link :to="{path: `${$route.path}/content/${docResult.id}`}">查看文档内容</router-link></div>
             </div>
           </div>
           <div class="columns is-desktop" v-show="isAvailable">

+ 130 - 0
src/views/student/Document/docContent.vue

@@ -0,0 +1,130 @@
+<template>
+  <div>
+    <page-header
+      :loading="loadingDocContent"
+      :routes="[
+        { name: '文档作业', path: 'document' },
+        {
+          name: `作业详情`,
+          path: `document/${$route.params.documentId}`
+        },
+        { name: `文档内容`, path: `${$route.path}` }
+      ]"
+    >
+      <template slot="title">
+        文档内容
+      </template>
+      <template slot="content">
+        题目名称:{{ contentResult.name }} <br />
+        <br />
+      commit: <b-tag type="is-primary">{{contentResult.gitCommit ? contentResult.gitCommit.substring(0,8) : '暂无commit记录' }}</b-tag>
+          <a class="button is-small" v-clipboard:copy="message"
+                  v-clipboard:success="onCopy"
+                  v-clipboard:error="onError" style="margin-left:10px;">复制</a>
+      <br/><br/>
+        小组成员:<span
+          v-for="member in contentResult.group.members"
+          :key="member.id"
+          >{{ member.username }}&emsp;</span
+        >
+      </template>
+      <template slot="extraContent">
+        <b-tag type="is-light" style="margin-right: 5px"
+          >上次修改时间:{{
+            displayUnixTime(contentResult.lastUpdateAt)
+          }}</b-tag
+        >
+        <br />
+        <b-tag type="is-info" style="margin-right: 5px" size="is-medium"
+          >成绩:{{
+            contentResult.result === null ? "暂无" : contentResult.result
+          }}</b-tag
+        >
+      </template>
+    </page-header>
+    <page-body>
+      <div class="data-table">
+        <page-section-loading :show="loadingDocContent" />
+        <div v-if="!loadingDocContent" class="page-section">
+          <div v-if="contentResult.content" class="content">
+            <vue-markdown>{{ contentResult.content }}</vue-markdown>
+          </div>
+        </div>
+      </div>
+    </page-body>
+  </div>
+</template>
+
+<script>
+import PageHeader from "@/components/PageHeader";
+import PageBody from "@/components/PageBody/index";
+import { getDocAssignmentContentByDocId } from "@/api/assignment";
+import VueMarkdown from "vue-markdown";
+import PageSectionLoading from "@/components/PageBody/PageSectionLoading/index";
+import timeMixins from "@/mixins/time";
+export default {
+  mixins: [timeMixins],
+  components: {
+    PageBody,
+    PageHeader,
+    VueMarkdown,
+    PageSectionLoading
+  },
+  methods: {
+    onCopy() {
+      this.$toast.open({
+        message: "复制成功",
+        type: "is-success"
+      });
+    },
+    onError() {
+      this.$toast.open({
+        message: "复制失败",
+        type: "is-danger"
+      });
+    }
+  },
+  data() {
+    return {
+      contentResult: {
+        content: "",
+        group: "",
+        result: null,
+        lastUpdateAt: "",
+        name: "",
+        message: ""
+      },
+      loadingDocContent: false
+    };
+  },
+
+  mounted() {
+    this.loadingDocContent = true;
+    const { groupWorkId } = this.$route.params;
+    getDocAssignmentContentByDocId(groupWorkId).then(res => {
+      this.contentResult = res.data;
+      this.message = res.data.gitCommit;
+      this.loadingDocContent = false;
+    });
+  }
+};
+</script>
+<style lang="scss" scoped>
+@import "../../../assets/scss/app";
+.right-part {
+  margin-bottom: -1.5rem;
+  margin-right: -1.5rem;
+  background: white;
+  border-top: 1px solid #eff2f7;
+  /*position: sticky;*/
+  top: 0;
+  /*max-height: 100vh;*/
+  /*overflow-y: auto;*/
+  box-shadow: $default-shadow;
+}
+
+.action-button {
+  width: 100%;
+  border-radius: 0;
+}
+</style>

+ 3 - 1
src/views/teacher/Document/docContent.vue

@@ -17,6 +17,9 @@
       <template slot="content">
         题目名称:{{ contentResult.name }} <br />
         <br />
+        commit: <b-tag type="is-primary">{{contentResult.gitCommit ? contentResult.gitCommit.substring(0,8) : '暂无commit记录' }}</b-tag>
+        <br/>
+        <br/>
         小组成员:<span
           v-for="member in contentResult.group.members"
           :key="member.id"
@@ -77,7 +80,6 @@ export default {
       loadingDocContent: false
     };
   },
-
   mounted() {
     this.loadingDocContent = true;
     const { groupWorkId } = this.$route.params;