Jelajahi Sumber

DLWork详情页面跳转

ChenYizong 7 tahun lalu
induk
melakukan
fe694e7629

+ 16 - 0
src/router/routes.js

@@ -84,6 +84,22 @@ export default [
         path: "dlwork/:dlworkId",
         component: () => import("@/views/teacher/DlWork/detail")
       },
+      {
+        path: "dlwork/:dlworkId/:userId",
+        component: () => import("@/views/teacher/DlWork/test"),
+        children: [
+          {
+            path: "",
+            component: () =>
+              import("@/views/teacher/DlWork/DLWorkDetail/DLBuildDetail")
+          },
+          {
+            path: "test",
+            component: () =>
+              import("@/views/teacher/DlWork/DLWorkDetail/DLTestDetail")
+          }
+        ]
+      },
       {
         path: "code",
         component: () => import("@/views/teacher/Code/index")

+ 25 - 0
src/views/student/DlWork/components/BuildTag.vue

@@ -0,0 +1,25 @@
+<template>
+  <div style="display: inline-block">
+    <div v-if="buildState === 1" class="tag is-success" style="width: 55px;">
+      <strong style="color: white;">构建成功</strong>
+    </div>
+    <div v-if="buildState === -1" class="tag is-danger" style="width: 55px;">
+      <strong style="color: white;">构建失败</strong>
+    </div>
+    <div v-if="buildState === 0" class="tag" style="width: 55px;">
+      <strong>正在构建</strong>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "BuildTag",
+  props: {
+    buildState: {
+      type: Number,
+      default: 0
+    }
+  }
+};
+</script>

+ 118 - 0
src/views/teacher/DlWork/DLWorkDetail/DLBuildDetail.vue

@@ -0,0 +1,118 @@
+<template>
+  <div>
+    <div v-if="detailLoading"><page-section-loading show /></div>
+    <div v-else>
+      <!--空数据处理-->
+      <div
+        class="page-section"
+        v-if="!(dlDetail.buildList && dlDetail.buildList.length > 0)"
+        style="height: 60vh;"
+      >
+        <no-data-svg></no-data-svg>
+      </div>
+      <div
+        v-for="(item, index) in dlDetail.buildList"
+        :key="item.id"
+        class="gap-section"
+      >
+        <div class="page-section">
+          <div class="level">
+            <div class="level-left">
+              <build-tag :build-state="item.buildState" />
+              <strong style="padding-left: 10px">
+                {{ item.commitMessage }} · #构建ID:{{ item.id }}
+              </strong>
+            </div>
+            <div class="level-right">
+              <strong>完成时间:{{ item.buildTime }}</strong>
+            </div>
+          </div>
+          <div class="level">
+            <div class="level-left">
+              <strong style="padding-left: 10px">
+                #branchID:{{ item.branchId }}
+              </strong>
+            </div>
+            <div v-if="item.buildState === 1" class="level-right">
+              <strong>mirror : {{ item.mirrorId }}</strong>
+            </div>
+          </div>
+          <a
+            class="button is-info is-small"
+            @click="changeBuildMessageStatus(index)"
+            aria-controls="contentIdForA11y2"
+            >查看详细编译信息</a
+          >
+          <div class="code-section" v-show="buildMessageIsOpen[index]">
+            <p v-html="item.buildMessage"></p>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import PageSectionLoading from "@/components/PageBody/PageSectionLoading/index";
+import BuildTag from "@/views/student/DlWork/components/BuildTag";
+import NoDataSvg from "@/components/NoDataSvg";
+export default {
+  name: "BuildDetail",
+  components: { BuildTag, PageSectionLoading, NoDataSvg },
+  props: {
+    dlDetail: {
+      type: Object,
+      default: () => {}
+    },
+    detailLoading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  computed: {},
+  watch: {
+    dlDetail: function(newVal) {
+      let buildMessageIsOpen = [];
+      for (let i = 0; i < newVal.buildList.length; i++) {
+        let buildInfo = newVal.buildList[i];
+        buildInfo.buildTime = buildInfo.buildTime.replace("T", " ") + "ms";
+        buildMessageIsOpen.push(false);
+        this.dlDetail.buildList[i] = buildInfo;
+      }
+      this.buildMessageIsOpen = buildMessageIsOpen;
+    }
+  },
+  data() {
+    return {
+      buildMessageIsOpen: [],
+      testBuildMessage: "测试换行<br>第一行<br>第二行<br>"
+    };
+  },
+  mounted() {},
+  methods: {
+    changeBuildMessageStatus(index) {
+      let status = !this.buildMessageIsOpen[index];
+      this.buildMessageIsOpen.splice(index, 1, status);
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../../../assets/scss/app";
+.gap-section {
+  padding-bottom: $default-margin-between;
+}
+
+.gap-section:last-child {
+  padding-bottom: 0;
+}
+
+.code-section {
+  margin: $default-margin-between -#{$default-margin-between} -#{$default-margin-between};
+  padding: $default-margin-between;
+  background-color: #2d3044;
+  color: #cacff1;
+  white-space: pre-line;
+}
+</style>

+ 101 - 0
src/views/teacher/DlWork/DLWorkDetail/DLTestDetail.vue

@@ -0,0 +1,101 @@
+<template>
+  <div class="columns is-desktop">
+    <div class="column">
+      <div v-if="detailLoading"><page-section-loading show /></div>
+      <div v-else class="page-section">
+        <h5 class="title is-5">机器学习测试:</h5>
+        <router-link
+          class="test-item"
+          :key="item.id"
+          :to="`${$route.path}/unit/${item.id}`"
+          v-for="item in dlTestList"
+          tag="div"
+        >
+          <div><strong>准确率测试 : #</strong> {{ item.id }}</div>
+          <span>准确率 : </span>
+          <div class="tag is-success" style="width: 40px;height:1.5em">
+            <strong style="color: white;">{{
+              item.accuracy ? item.accuracy : "100%"
+            }}</strong>
+          </div>
+          <br />
+          <span>得分 : </span>
+          <strong>{{ item.score ? item.score : "100" }}</strong
+          ><br />
+          <span>{{ displayUnixTime(item.time) }}</span>
+        </router-link>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import timeMixins from "@/mixins/time";
+// import { makeFunctionalTest } from "@/api/codehw";
+import PageSectionLoading from "@/components/PageBody/PageSectionLoading/index";
+
+export default {
+  components: { PageSectionLoading },
+  props: {
+    dlDetail: {
+      type: Object,
+      default: () => ({
+        dlTestList: []
+      })
+    },
+    detailLoading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  computed: {
+    dlTestList() {
+      return this.sortTestList(this.dlDetail.dlTestList);
+    }
+  },
+  data() {
+    return {
+      testing: false
+    };
+  },
+  mixins: [timeMixins],
+  methods: {
+    sortTestList(list) {
+      console.log(list);
+      if (!list) return [];
+      const copyList = list.slice(0);
+      copyList.sort((a, b) => b.time - a.time);
+      return copyList;
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../../../assets/scss/app";
+
+.test-item {
+  padding: $default-margin $default-margin-between;
+  margin: 0 -#{$default-margin-between};
+  cursor: pointer;
+}
+
+.test-title {
+  position: relative;
+
+  &__action {
+    position: absolute;
+    right: 0;
+    transform: translateY(-20%);
+  }
+}
+
+.test-item:hover,
+.test-item:nth-child(even):hover {
+  background-color: #dde3ef;
+}
+
+.test-item:nth-child(even) {
+  background-color: rgba(244, 247, 252, 0.6);
+}
+</style>

+ 1 - 1
src/views/teacher/DlWork/detail.vue

@@ -56,7 +56,7 @@
                 <b-table-column label="详情" centered>
                   <router-link
                     :to="{
-                      path: `${$route.path}/${props.row.id}`
+                      path: `${$route.path}/${props.row.userId}`
                     }"
                     >查看详情
                   </router-link>

+ 64 - 0
src/views/teacher/DlWork/test.vue

@@ -0,0 +1,64 @@
+<template>
+  <div>
+    <page-header
+      :routes="[
+        { name: '机器学习作业', path: 'dlwork' },
+        { name: '作业详情', path: `dlwork/${$route.params.dlworkId}` },
+        { name: '测试信息', path: `${$route.path}` }
+      ]"
+      :tab-list="[
+        {
+          name: '构建',
+          path: `dlwork/${$route.params.dlworkId}/${$route.params.userId}`
+        },
+        {
+          name: '测试',
+          path: `dlwork/${$route.params.dlworkId}/${$route.params.userId}/test`
+        }
+      ]"
+    >
+      <template slot="title">
+        测试信息: {{ dlDetail.name }}
+      </template>
+      <template slot="content">
+        <strong>git 地址 : </strong>
+        <a :href="dlDetail.url">{{ dlDetail.url }}</a>
+      </template>
+    </page-header>
+    <page-body>
+      <router-view :project-detail="dlDetail" :detail-loading="detailLoading" />
+    </page-body>
+  </div>
+</template>
+
+<script>
+import { getDLProjectDetail } from "@/api/dlwork";
+import PageHeader from "@/components/PageHeader";
+import PageBody from "@/components/PageBody/index";
+
+export default {
+  components: {
+    PageBody,
+    PageHeader
+  },
+  data() {
+    return {
+      dlDetail: {},
+      detailLoading: false
+    };
+  },
+  async mounted() {
+    const { dlworkId } = this.$route.params;
+    this.detailLoading = true;
+    const detail = await getDLProjectDetail(dlworkId);
+    this.dlDetail = detail.data;
+    this.detailLoading = false;
+  }
+};
+</script>
+
+<style scoped>
+.top-nav-section {
+  padding: 0 40px;
+}
+</style>

+ 2 - 2
vue.config.js

@@ -2,8 +2,8 @@ module.exports = {
   devServer: {
     proxy: {
       "^/api": {
-        // target: "http://localhost:4000/",
-        target: "http://10.1.1.198:8080/",
+        target: "http://localhost:18080/",
+        //target: "http://10.1.1.198:8080/",
         //target: "http://192.168.0.101:8080",
         // target: "http://10.1.2.3:8080/",
 

+ 38 - 0
yarn.lock

@@ -1976,6 +1976,15 @@ cli-width@^2.0.0:
   version "2.2.0"
   resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
 
+clipboard@^2.0.0:
+  version "2.0.4"
+  resolved "http://registry.npm.taobao.org/clipboard/download/clipboard-2.0.4.tgz#836dafd66cf0fea5d71ce5d5b0bf6e958009112d"
+  integrity sha1-g22v1mzw/qXXHOXVsL9ulYAJES0=
+  dependencies:
+    good-listener "^1.2.2"
+    select "^1.1.2"
+    tiny-emitter "^2.0.0"
+
 clipboardy@^1.2.3:
   version "1.2.3"
   resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz#0526361bf78724c1f20be248d428e365433c07ef"
@@ -2651,6 +2660,11 @@ delayed-stream@~1.0.0:
   version "1.0.0"
   resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
 
+delegate@^3.1.2:
+  version "3.2.0"
+  resolved "http://registry.npm.taobao.org/delegate/download/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166"
+  integrity sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=
+
 delegates@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
@@ -3794,6 +3808,13 @@ globule@^1.0.0:
     lodash "~4.17.10"
     minimatch "~3.0.2"
 
+good-listener@^1.2.2:
+  version "1.2.2"
+  resolved "http://registry.npm.taobao.org/good-listener/download/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50"
+  integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=
+  dependencies:
+    delegate "^3.1.2"
+
 graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
   version "4.1.15"
   resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
@@ -6953,6 +6974,11 @@ select-hose@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
 
+select@^1.1.2:
+  version "1.1.2"
+  resolved "http://registry.npm.taobao.org/select/download/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
+  integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=
+
 selfsigned@^1.9.1:
   version "1.10.4"
   resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd"
@@ -7631,6 +7657,11 @@ timsort@^0.3.0:
   version "0.3.0"
   resolved "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
 
+tiny-emitter@^2.0.0:
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/tiny-emitter/download/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
+  integrity sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM=
+
 tmp@^0.0.33:
   version "0.0.33"
   resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
@@ -7970,6 +8001,13 @@ vue-cli-plugin-buefy@^0.3.3:
   version "0.3.3"
   resolved "https://registry.npmjs.org/vue-cli-plugin-buefy/-/vue-cli-plugin-buefy-0.3.3.tgz#497942f854d1a578d8f8021f57323865b4c53d38"
 
+vue-clipboard2@^0.3.0:
+  version "0.3.0"
+  resolved "http://registry.npm.taobao.org/vue-clipboard2/download/vue-clipboard2-0.3.0.tgz#b04d3f9a2d46f12ca85178445930b38463640b22"
+  integrity sha1-sE0/mi1G8SyoUXhEWTCzhGNkCyI=
+  dependencies:
+    clipboard "^2.0.0"
+
 vue-eslint-parser@^2.0.3:
   version "2.0.3"
   resolved "http://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1"