Bläddra i källkod

Merge branch 'develop' of SEEC-II-FrontEnd-Team/SEEC-II-FrontEnd into master

WuXinyu 7 år sedan
förälder
incheckning
8bbbbe17f1

+ 6 - 0
mock/serializers/review/CheckListResultItemSerializer.js

@@ -6,6 +6,9 @@ const makeId = require("../../util/makeId");
  * @property {number|string} id checkListItem id
  * @property {string} content 评价内容
  * @property {string} explain 老师说明
+ * @property {boolean} teacherLevel 老师作出的评价
+ * @property {string} teacherComment 老师做出的备注
+ * @property {boolean} hasTeacherReview 老师是否评审过
  * @property {ResultByGroupType[]} results 各个小组的评价
  */
 
@@ -37,6 +40,9 @@ module.exports = ({ id = makeId() }) => {
     id,
     content: "该项评价的内容, String",
     explain: "老师的说明,String",
+    teacherLevel: true,
+    teacherComment: "老师的评论论论",
+    hasTeacherReview: true,
     results: [groupResult(), groupResult(), groupResult()]
   };
 };

+ 1 - 1
mock/serializers/user/UserSerializer.js

@@ -14,7 +14,7 @@ const makeId = require("../../util/makeId");
  * @param role
  * @returns {UserSerializerType}
  */
-module.exports = (role = "STUDENT") => {
+module.exports = (role = "TEACHER") => {
   return {
     id: makeId(),
     role: role,

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 0
mock/util/makeLongMarkdown.js


+ 2 - 1
package.json

@@ -15,12 +15,13 @@
     "chart.js": "^2.7.3",
     "dayjs": "^1.7.8",
     "file-saver": "^2.0.1",
+    "highlight.js": "^9.15.6",
+    "marked": "^0.6.2",
     "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",
     "vuelidate": "^0.7.4",
     "vuex": "^3.0.1",

+ 0 - 6
src/App.vue

@@ -9,10 +9,4 @@
   background: $default-background;
   word-wrap: break-word;
 }
-
-.content .table {
-  table-layout: fixed;
-  overflow: auto;
-  width: 100%;
-}
 </style>

+ 11 - 16
src/api/codehw.js

@@ -1,18 +1,17 @@
 import request from "@/util/request";
 import { CODE_HOMEWORK_MODULE } from "./_prefix";
 
-/**
- * 获得学生的 代码作业 列表
- */
-export const getCodeHomeworkList = courseId => {
-  console.log(courseId);
-  return {
-    data: [
-      { homeworkId: "1", description: "codeHomework1" },
-      { homeworkId: "2", description: "codeHomework2" }
-    ]
-  };
-};
+// /**
+//  * 获得学生的 代码作业 列表
+//  */
+// export const getCodeHomeworkList = courseId => {
+//   return {
+//     data: [
+//       { homeworkId: "1", description: "codeHomework1" },
+//       { homeworkId: "2", description: "codeHomework2" }
+//     ]
+//   };
+// };
 
 /**
  * 获得某个 Homework 的 Project 列表(应该只有一个)
@@ -20,8 +19,6 @@ export const getCodeHomeworkList = courseId => {
  * @return {Promise<{data:{projectId:string,name:string}[]}>}
  */
 export const getProjectList = homeworkId => {
-  //TODO:delete this before deploy
-  console.log(homeworkId);
   return request(`${CODE_HOMEWORK_MODULE}/projects`, {
     method: "POST",
     body: {
@@ -36,8 +33,6 @@ export const getProjectList = homeworkId => {
  * @return {Promise<{id:string,data:ProjectSerializerType}>}
  */
 export const getProjectDetail = projectId => {
-  //TODO:delete this before deploy
-  console.log(projectId);
   return request(`${CODE_HOMEWORK_MODULE}/project/${projectId}`);
 };
 

+ 3 - 3
src/api/review.js

@@ -98,13 +98,13 @@ export const getTeacherStartArgue = (reviewId, groupId) => {
  * 老师提交对某次互评作业一个小组的评价结果
  * @param {string|number} reviewId
  * @param {string|number} groupId
- * @param {CheckListItemSerializerType[]} checkList
+ * @param {CheckListItemSerializerType[]} checkListItem
  * @return {Promise<{checkList:CheckListItemSerializerType[]}>}
  */
-export const postTeacherArgueResult = (reviewId, groupId, checkList) => {
+export const postTeacherArgueResult = (reviewId, groupId, checkListItem) => {
   return request(`${REVIEW_MODULE}/sum/${reviewId}/argue/${groupId}`, {
     method: "POST",
-    body: { checkList }
+    body: { checkList: checkListItem }
   });
 };
 

BIN
src/assets/icon/edit-dark.png


+ 24 - 2
src/assets/scss/app.scss

@@ -80,7 +80,29 @@
 }
 
 .table td, .table th{
-  border-width: 0 0 1px;
+  //border-width: 0 0 1px;
   padding: 1em 0.75em;
   border-bottom: 1px solid rgba(112, 96, 255, 0.22);
-}
+}
+
+.content pre{
+  background-color: hsl(258, 29%, 97%);
+}
+
+.content table {
+  td{
+    border-bottom: 1px solid hsla(255, 40%, 96%, 1);
+  }
+  th{
+    border-bottom: 1px solid hsla(255, 40%, 96%, 1);
+  }
+
+  display: block;
+  overflow: auto;
+  width: 100%;
+  @extend .table, .is-striped, .is-narrow, .is-fullwidth;
+}
+
+.table.is-striped tbody tr:not(.is-selected):nth-child(even), .content table tbody tr:not(.is-selected):nth-child(even) {
+  background-color: hsla(252, 33%, 98%, 1);
+}

+ 105 - 7
src/components/CheckList/ResultCheckListItem.vue

@@ -1,17 +1,30 @@
 <template>
   <card-judge-item :success="pass">
     <div class="result-section">
-      <strong>{{ checkResultItem.content }}</strong>
+      <div class="line-container">
+        <strong style="flex-grow: 1">
+          <b-tooltip :label="checkResultItem.explain" position="is-top">
+            {{ checkResultItem.content }}
+          </b-tooltip>
+        </strong>
+        <div @click="selectReviewingTarget" class="image-container">
+          <img
+            style="width: 20px;height: 20px"
+            alt=""
+            src="../../assets/icon/edit-dark.png"
+          />
+        </div>
+      </div>
       <div
-        :class="{ 'group-line--hover': !result.isArgued }"
+        :class="{ 'group-line--hover': !result.isArgued && !canBeReviewed }"
         class="group-line"
         v-for="result in checkResultItem.results"
         :key="result.rid"
         @click="argue(result)"
       >
-        <strong style="padding-right:10px;color:grey"
-          >+ id:{{ result.groupId + "\t" }}</strong
-        >
+        <strong style="padding-right:10px;color:grey">
+          + id:{{ result.groupId + "\t" }}
+        </strong>
         <span class="state state-success" v-if="result.level">PASS</span>
         <span class="state state-error" v-else>ERROR</span>
         <span class="comments">{{ result.comment }}</span>
@@ -20,9 +33,47 @@
           type="is-warning"
           class="state"
           style="margin-left: 10px;"
-          >已申请
+        >
+          已申请
         </b-tag>
       </div>
+      <div
+        v-if="checkResultItem.hasTeacherReview && !isReviewing"
+        :class="{ 'group-line--hover': canBeReviewed }"
+        @click="selectReviewingTarget"
+        class="group-line"
+      >
+        <strong style="padding-right:10px;color:grey">「老师评价」</strong>
+        <span class="state state-success" v-if="checkResultItem.teacherLevel">
+          PASS
+        </span>
+        <span class="state state-error" v-else>ERROR</span>
+        <span class="comments">{{ checkResultItem.teacherComment }}</span>
+      </div>
+      <div v-else>
+        <div class="line-container">
+          <b-checkbox
+            class="checkbox-section"
+            v-model="reviewLevel"
+            type="is-primary"
+          >
+            是否满足条件
+          </b-checkbox>
+          <a
+            class="button is-small is-primary"
+            :class="{ 'is-loading': submitLoading }"
+            @click="submitReviewResult"
+          >
+            提交
+          </a>
+        </div>
+
+        <b-input
+          placeholder="请输入评价"
+          v-model="reviewComment"
+          type="textarea"
+        ></b-input>
+      </div>
     </div>
 
     <b-modal :active.sync="showModal" :width="400">
@@ -60,6 +111,14 @@ export default {
     arguable: {
       type: Boolean,
       default: false
+    },
+    canBeReviewed: {
+      type: Boolean,
+      default: false
+    },
+    isReviewing: {
+      type: Boolean,
+      default: false
     }
   },
   data() {
@@ -67,16 +126,26 @@ export default {
       selectedResult: {},
       showModal: false,
       remark: "",
-      submitLoading: false
+      submitLoading: false,
+      reviewLevel: this.checkResultItem.teacherLevel,
+      reviewComment: this.checkResultItem.teacherComment || ""
     };
   },
   computed: {
     pass() {
       const { results = [] } = this.checkResultItem;
+      if (this.checkResultItem.hasTeacherReview) {
+        return this.checkResultItem.teacherLevel;
+      }
       return results.filter(result => result.level === false).length === 0;
     }
   },
   methods: {
+    selectReviewingTarget() {
+      if (this.canBeReviewed) {
+        this.$emit("review-item", this.checkResultItem.id);
+      }
+    },
     argue(result) {
       if (this.arguable && !result.isArgued) {
         this.selectedResult = result;
@@ -93,6 +162,15 @@ export default {
       this.submitLoading = false;
       this.showModal = false;
       this.remark = "";
+    },
+    async submitReviewResult() {
+      this.submitLoading = true;
+      await this.$emit("review-teacher", {
+        id: this.checkResultItem.id,
+        level: this.reviewLevel,
+        comment: this.reviewComment
+      });
+      this.submitLoading = false;
     }
   }
 };
@@ -100,6 +178,10 @@ export default {
 
 <style lang="scss" scoped>
 @import "../../assets/scss/app";
+.checkbox-section {
+  padding: $default-margin 0;
+}
+
 .result-section {
   padding: $default-margin;
   border-bottom: 1px solid rgba(0, 0, 0, 0.12);
@@ -110,6 +192,12 @@ export default {
   border-radius: $default-radius;
 }
 
+.line-container {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
 .state {
   padding: 2px 5px;
   font-weight: bold;
@@ -131,6 +219,16 @@ export default {
   font-size: 14px;
 }
 
+.image-container {
+  border-radius: 2px;
+  height: 20px;
+  cursor: pointer;
+}
+
+.image-container:hover {
+  background-color: #f6f5fa;
+}
+
 .group-line {
   padding: 2px 0;
   border-radius: $default-radius;

+ 2 - 1
src/components/CheckList/index.vue

@@ -67,8 +67,9 @@
           @click="submitSolution(item)"
           :class="{ 'is-loading': submitSolutionLoading }"
           class="button is-primary"
-          >提交处理好的申诉</span
         >
+          提交处理好的申诉
+        </span>
       </div>
     </card-judge-item>
   </div>

+ 22 - 0
src/components/Markdown/index.jsx

@@ -0,0 +1,22 @@
+import marked from "marked";
+import highlight from "highlight.js";
+import "highlight.js/styles/github.css";
+// import VueMarkdown from "vue-markdown";
+
+export default {
+  name: "Markdown",
+  render() {
+    const content = this.$slots.default;
+    return (
+      <div
+        domPropsInnerHTML={marked(content[0].text || "", {
+          pedantic: false,
+          breaks: true,
+          gfm: true,
+          highlight: code => highlight.highlightAuto(code).value
+        })}
+      />
+    );
+    // return <VueMarkdown>{content[0].text}</VueMarkdown>;
+  }
+};

+ 0 - 1
src/views/student/Code/ProjectDetail/TestDetail.vue

@@ -136,7 +136,6 @@ export default {
       }
     },
     sortTestList(list) {
-      console.log(list);
       if (!list) return [];
       const copyList = list.slice(0);
       copyList.sort((a, b) => b.time - a.time);

+ 8 - 4
src/views/student/Code/ProjectDetail/index.vue

@@ -32,9 +32,14 @@
       <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>
+        <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>
@@ -79,7 +84,6 @@ export default {
     const { projectId } = this.$route.params;
     this.detailLoading = true;
     const detail = await getProjectDetail(projectId);
-    console.log(detail.data);
     this.projectDetail = detail.data;
     this.detailLoading = false;
   }

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

@@ -63,7 +63,12 @@
           <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/${docResult.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">

+ 18 - 8
src/views/student/Document/docContent.vue

@@ -17,11 +17,21 @@
       <template slot="content">
         题目名称:{{ contentResult.name }} <br />
         <br />
-      对应提交: <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/>
+        对应提交:
+        <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"
@@ -47,7 +57,7 @@
         <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>
+            <markdown>{{ contentResult.content }}</markdown>
           </div>
         </div>
       </div>
@@ -59,15 +69,15 @@
 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";
+import Markdown from "@/components/Markdown";
 export default {
   mixins: [timeMixins],
   components: {
+    Markdown,
     PageBody,
     PageHeader,
-    VueMarkdown,
     PageSectionLoading
   },
   methods: {

+ 4 - 4
src/views/student/Review/ReviewDetail/ReviewSelfDetail/index.vue

@@ -5,7 +5,7 @@
         <page-section-loading :show="selfDetailLoading" />
         <div v-if="!selfDetailLoading" class="page-section">
           <div v-if="detail.docContent" class="content">
-            <vue-markdown>{{ detail.docContent }}</vue-markdown>
+            <markdown>{{ detail.docContent }}</markdown>
           </div>
         </div>
       </div>
@@ -31,7 +31,6 @@
   </div>
 </template>
 <script>
-import VueMarkdown from "vue-markdown";
 import {
   getStudentReviewSelfDetail,
   postStudentArgueReview
@@ -39,11 +38,12 @@ import {
 import timeMixins from "@/mixins/time";
 import ResultCheckListItem from "@/components/CheckList/ResultCheckListItem";
 import PageSectionLoading from "@/components/PageBody/PageSectionLoading/index";
+import Markdown from "@/components/Markdown";
 export default {
   components: {
+    Markdown,
     PageSectionLoading,
-    ResultCheckListItem,
-    VueMarkdown
+    ResultCheckListItem
   },
   data() {
     return {

+ 4 - 4
src/views/student/Review/ReviewDocDetail/index.vue

@@ -23,7 +23,7 @@
           <div v-if="fetchLoading"><page-section-loading show /></div>
           <div v-else class="page-section">
             <div v-if="detail.docContent" class="content">
-              <vue-markdown>{{ detail.docContent }}</vue-markdown>
+              <markdown>{{ detail.docContent }}</markdown>
             </div>
           </div>
         </div>
@@ -57,7 +57,6 @@
 <script>
 import PageHeader from "@/components/PageHeader";
 import PageBody from "@/components/PageBody/index";
-import VueMarkdown from "vue-markdown";
 import {
   getStudentReviewDocDetail,
   postStudentArgueAcceptation,
@@ -68,14 +67,15 @@ import timeMixins from "@/mixins/time";
 import ReviewStateTag from "@/components/ReviewStateTag/index";
 import CheckList from "@/components/CheckList/index";
 import PageSectionLoading from "@/components/PageBody/PageSectionLoading/index";
+import Markdown from "@/components/Markdown";
 export default {
   components: {
+    Markdown,
     PageSectionLoading,
     CheckList,
     ReviewStateTag,
     PageBody,
-    PageHeader,
-    VueMarkdown
+    PageHeader
   },
   data() {
     return {

+ 11 - 6
src/views/teacher/Document/docContent.vue

@@ -17,9 +17,14 @@
       <template slot="content">
         题目名称:{{ contentResult.name }} <br />
         <br />
-        对应提交: <b-tag type="is-primary">{{contentResult.gitCommit ? contentResult.gitCommit.substring(0,8) : '暂无commit记录' }}</b-tag>
-        <br/>
-        <br/>
+        对应提交:
+        <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"
@@ -45,7 +50,7 @@
         <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>
+            <markdown>{{ contentResult.content }}</markdown>
           </div>
         </div>
       </div>
@@ -57,15 +62,15 @@
 import PageHeader from "@/components/PageHeader";
 import PageBody from "@/components/PageBody/index";
 import { getDocContentByDocId } from "@/api/assignment";
-import VueMarkdown from "vue-markdown";
 import PageSectionLoading from "@/components/PageBody/PageSectionLoading/index";
 import timeMixins from "@/mixins/time";
+import Markdown from "@/components/Markdown";
 export default {
   mixins: [timeMixins],
   components: {
+    Markdown,
     PageBody,
     PageHeader,
-    VueMarkdown,
     PageSectionLoading
   },
   data() {

+ 4 - 4
src/views/teacher/Review/ReviewDetail/GroupArgueDetail/index.vue

@@ -32,7 +32,7 @@
         <div class="column is-8">
           <div class="page-section">
             <div v-if="detail.docContent" class="content">
-              <vue-markdown>{{ detail.docContent }}</vue-markdown>
+              <markdown>{{ detail.docContent }}</markdown>
             </div>
           </div>
         </div>
@@ -53,19 +53,19 @@
   </div>
 </template>
 <script>
-import VueMarkdown from "vue-markdown";
 import { getTeacherStartArgue, postTeacherArgueResult } from "@/api/review";
 import timeMixins from "@/mixins/time";
 import PageHeader from "@/components/PageHeader";
 import PageBody from "@/components/PageBody/index";
 import { getGroupDetail } from "@/api/group";
 import CheckList from "@/components/CheckList/index";
+import Markdown from "@/components/Markdown";
 export default {
   components: {
+    Markdown,
     PageBody,
     PageHeader,
-    CheckList,
-    VueMarkdown
+    CheckList
   },
   data() {
     return {

+ 44 - 17
src/views/teacher/Review/ReviewDetail/GroupDocDetail/index.vue

@@ -16,11 +16,6 @@
       <template slot="title">
         {{ groupDetail.name }}
       </template>
-      <template slot="action">
-        <router-link :to="`${$route.path}/argue`" class="button is-primary">
-          开始重评
-        </router-link>
-      </template>
     </page-header>
     <page-body>
       <div class="columns">
@@ -28,19 +23,27 @@
           <div v-if="detailLoading"><page-section-loading show /></div>
           <div v-else class="page-section">
             <div v-if="detail.docContent" class="content">
-              <vue-markdown>{{ detail.docContent }}</vue-markdown>
+              <markdown>{{ detail.docContent }}</markdown>
             </div>
           </div>
         </div>
         <div class="column is-4">
           <div class="right-part">
             <div v-if="detailLoading"><page-section-loading show /></div>
-            <result-check-list-item
-              v-else
-              v-for="item in detail.checkListResult"
-              :key="item.id"
-              :check-result-item="item"
-            />
+            <div v-else>
+              <div v-if="!!detail.level" class="notification is-success">
+                <strong>小组得分 : </strong>{{ detail.level }}
+              </div>
+              <result-check-list-item
+                v-for="item in detail.checkListResult"
+                :key="item.id"
+                :check-result-item="item"
+                :can-be-reviewed="true"
+                :is-reviewing="item.id === reviewingId"
+                @review-item="onReviewItem"
+                @review-teacher="onReviewSubmit"
+              />
+            </div>
           </div>
         </div>
       </div>
@@ -48,21 +51,24 @@
   </div>
 </template>
 <script>
-import VueMarkdown from "vue-markdown";
-import { getTeacherReviewGroupDetail } from "@/api/review";
+import {
+  getTeacherReviewGroupDetail,
+  postTeacherArgueResult
+} from "@/api/review";
 import timeMixins from "@/mixins/time";
 import ResultCheckListItem from "@/components/CheckList/ResultCheckListItem";
 import PageHeader from "@/components/PageHeader";
 import PageBody from "@/components/PageBody/index";
 import { getGroupDetail } from "@/api/group";
 import PageSectionLoading from "@/components/PageBody/PageSectionLoading/index";
+import Markdown from "@/components/Markdown";
 export default {
   components: {
+    Markdown,
     PageSectionLoading,
     PageBody,
     PageHeader,
-    ResultCheckListItem,
-    VueMarkdown
+    ResultCheckListItem
   },
   data() {
     return {
@@ -73,10 +79,31 @@ export default {
       detailLoading: false,
       groupDetail: {},
       groupDetailLoading: false,
-      submitLoading: false
+      submitLoading: false,
+      reviewingId: -1
     };
   },
   mixins: [timeMixins],
+  methods: {
+    onReviewItem(id) {
+      this.reviewingId = id;
+    },
+    onReviewSubmit(checkListItem) {
+      const { reviewId, groupId } = this.$route.params;
+      postTeacherArgueResult(reviewId, groupId, checkListItem)
+        .then(() =>
+          getTeacherReviewGroupDetail(reviewId, groupId).then(
+            resp => (this.detail = resp.data)
+          )
+        )
+        .catch(err =>
+          this.$toast.open({
+            message: err.message || "服务器未知错误",
+            type: "is-danger"
+          })
+        );
+    }
+  },
   mounted() {
     const { reviewId, groupId } = this.$route.params;
     this.detailLoading = true;

+ 2 - 2
vue.config.js

@@ -3,8 +3,8 @@ module.exports = {
     proxy: {
       "^/api": {
         // target: "http://localhost:4000/",
-        target: "http://10.1.1.198:8080/",
-        //target: "http://192.168.0.101:8080",
+        // target: "http://10.1.1.198:8080/",
+        target: "http://192.168.0.100:8080",
         // target: "http://10.1.2.3:8080/",
 
         ws: true,

+ 46 - 117
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 "https://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"
@@ -2012,10 +2021,6 @@ clone@^1.0.2:
   version "1.0.4"
   resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
 
-clone@^2.1.0:
-  version "2.1.2"
-  resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
-
 co@^4.6.0:
   version "4.6.0"
   resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -2651,6 +2656,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 "https://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 +3804,13 @@ globule@^1.0.0:
     lodash "~4.17.10"
     minimatch "~3.0.2"
 
+good-listener@^1.2.2:
+  version "1.2.2"
+  resolved "https://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"
@@ -3897,9 +3914,10 @@ hex-color-regex@^1.1.0:
   version "1.1.0"
   resolved "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
 
-highlight.js@^9.12.0:
-  version "9.13.1"
-  resolved "http://registry.npm.taobao.org/highlight.js/download/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e"
+highlight.js@^9.15.6:
+  version "9.15.6"
+  resolved "https://registry.npm.taobao.org/highlight.js/download/highlight.js-9.15.6.tgz#72d4d8d779ec066af9a17cb14360c3def0aa57c4"
+  integrity sha1-ctTY13nsBmr5oXyxQ2DD3vCqV8Q=
 
 hmac-drbg@^1.0.0:
   version "1.0.1"
@@ -4690,12 +4708,6 @@ just-extend@^4.0.2:
   version "4.0.2"
   resolved "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc"
 
-katex@^0.6.0:
-  version "0.6.0"
-  resolved "http://registry.npm.taobao.org/katex/download/katex-0.6.0.tgz#12418e09121c05c92041b6b3b9fb6bab213cb6f3"
-  dependencies:
-    match-at "^0.1.0"
-
 killable@^1.0.0:
   version "1.0.1"
   resolved "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
@@ -4762,12 +4774,6 @@ levn@^0.3.0, levn@~0.3.0:
     prelude-ls "~1.1.2"
     type-check "~0.3.2"
 
-linkify-it@~1.2.2:
-  version "1.2.4"
-  resolved "http://registry.npm.taobao.org/linkify-it/download/linkify-it-1.2.4.tgz#0773526c317c8fd13bd534ee1d180ff88abf881a"
-  dependencies:
-    uc.micro "^1.0.1"
-
 lint-staged@^7.2.2:
   version "7.3.0"
   resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-7.3.0.tgz#90ff33e5ca61ed3dbac35b6f6502dbefdc0db58d"
@@ -5044,68 +5050,10 @@ map-visit@^1.0.0:
   dependencies:
     object-visit "^1.0.0"
 
-markdown-it-abbr@^1.0.3:
-  version "1.0.4"
-  resolved "http://registry.npm.taobao.org/markdown-it-abbr/download/markdown-it-abbr-1.0.4.tgz#d66b5364521cbb3dd8aa59dadfba2fb6865c8fd8"
-
-markdown-it-deflist@^2.0.1:
-  version "2.0.3"
-  resolved "http://registry.npm.taobao.org/markdown-it-deflist/download/markdown-it-deflist-2.0.3.tgz#5727db04184d3cb2bc6ee4a9641e3a1091d5fd6f"
-
-markdown-it-emoji@^1.1.1:
-  version "1.4.0"
-  resolved "http://registry.npm.taobao.org/markdown-it-emoji/download/markdown-it-emoji-1.4.0.tgz#9bee0e9a990a963ba96df6980c4fddb05dfb4dcc"
-
-markdown-it-footnote@^2.0.0:
-  version "2.0.0"
-  resolved "http://registry.npm.taobao.org/markdown-it-footnote/download/markdown-it-footnote-2.0.0.tgz#14e9c4f68ff12cf354fa365ae378276e8104ca94"
-
-markdown-it-ins@^2.0.0:
-  version "2.0.0"
-  resolved "http://registry.npm.taobao.org/markdown-it-ins/download/markdown-it-ins-2.0.0.tgz#a5aa6a30f1e2f71e9497567cfdff40f1fde67483"
-
-markdown-it-katex@^2.0.3:
-  version "2.0.3"
-  resolved "http://registry.npm.taobao.org/markdown-it-katex/download/markdown-it-katex-2.0.3.tgz#d7b86a1aea0b9d6496fab4e7919a18fdef589c39"
-  dependencies:
-    katex "^0.6.0"
-
-markdown-it-mark@^2.0.0:
-  version "2.0.0"
-  resolved "http://registry.npm.taobao.org/markdown-it-mark/download/markdown-it-mark-2.0.0.tgz#46a1aa947105aed8188978e0a016179e404f42c7"
-
-markdown-it-sub@^1.0.0:
-  version "1.0.0"
-  resolved "http://registry.npm.taobao.org/markdown-it-sub/download/markdown-it-sub-1.0.0.tgz#375fd6026eae7ddcb012497f6411195ea1e3afe8"
-
-markdown-it-sup@^1.0.0:
-  version "1.0.0"
-  resolved "http://registry.npm.taobao.org/markdown-it-sup/download/markdown-it-sup-1.0.0.tgz#cb9c9ff91a5255ac08f3fd3d63286e15df0a1fc3"
-
-markdown-it-task-lists@^2.0.1:
-  version "2.1.1"
-  resolved "http://registry.npm.taobao.org/markdown-it-task-lists/download/markdown-it-task-lists-2.1.1.tgz#f68f4d2ac2bad5a2c373ba93081a1a6848417088"
-
-markdown-it-toc-and-anchor@^4.1.2:
-  version "4.2.0"
-  resolved "http://registry.npm.taobao.org/markdown-it-toc-and-anchor/download/markdown-it-toc-and-anchor-4.2.0.tgz#d1613327cc63c61f82cd66cbac5564f4db12c0e9"
-  dependencies:
-    clone "^2.1.0"
-    uslug "^1.0.4"
-
-markdown-it@^6.0.1:
-  version "6.1.1"
-  resolved "http://registry.npm.taobao.org/markdown-it/download/markdown-it-6.1.1.tgz#ced037f4473ee9f5153ac414f77dc83c91ba927c"
-  dependencies:
-    argparse "^1.0.7"
-    entities "~1.1.1"
-    linkify-it "~1.2.2"
-    mdurl "~1.0.1"
-    uc.micro "^1.0.1"
-
-match-at@^0.1.0:
-  version "0.1.1"
-  resolved "http://registry.npm.taobao.org/match-at/download/match-at-0.1.1.tgz#25d040d291777704d5e6556bbb79230ec2de0540"
+marked@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.npm.taobao.org/marked/download/marked-0.6.2.tgz#c574be8b545a8b48641456ca1dbe0e37b6dccc1a"
+  integrity sha1-xXS+i1Rai0hkFFbKHb4ON7bczBo=
 
 math-random@^1.0.1:
   version "1.0.1"
@@ -5123,10 +5071,6 @@ mdn-data@~1.1.0:
   version "1.1.4"
   resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01"
 
-mdurl@~1.0.1:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/mdurl/download/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
-
 media-typer@0.3.0:
   version "0.3.0"
   resolved "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@@ -6953,6 +6897,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 "https://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 +7580,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 "https://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"
@@ -7762,10 +7716,6 @@ typedarray@^0.0.6:
   version "0.0.6"
   resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
 
-uc.micro@^1.0.1:
-  version "1.0.5"
-  resolved "http://registry.npm.taobao.org/uc.micro/download/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376"
-
 uglify-js@3.4.x:
   version "3.4.9"
   resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3"
@@ -7825,10 +7775,6 @@ universalify@^0.1.0:
   version "0.1.2"
   resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
 
-"unorm@>= 1.0.0":
-  version "1.4.1"
-  resolved "http://registry.npm.taobao.org/unorm/download/unorm-1.4.1.tgz#364200d5f13646ca8bcd44490271335614792300"
-
 unpipe@1.0.0, unpipe@~1.0.0:
   version "1.0.0"
   resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
@@ -7888,12 +7834,6 @@ use@^3.1.0:
   version "3.1.1"
   resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
 
-uslug@^1.0.4:
-  version "1.0.4"
-  resolved "http://registry.npm.taobao.org/uslug/download/uslug-1.0.4.tgz#b9a22f0914e0a86140633dacc302e5f4fa450677"
-  dependencies:
-    unorm ">= 1.0.0"
-
 utf8-byte-length@^1.0.4:
   version "1.0.4"
   resolved "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"
@@ -7970,6 +7910,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 "https://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"
@@ -8012,24 +7959,6 @@ vue-loader@^15.4.2:
     vue-hot-reload-api "^2.3.0"
     vue-style-loader "^4.1.0"
 
-vue-markdown@^2.2.4:
-  version "2.2.4"
-  resolved "http://registry.npm.taobao.org/vue-markdown/download/vue-markdown-2.2.4.tgz#db0f774178f3bc91ee18c626d86a3a0d2de22746"
-  dependencies:
-    highlight.js "^9.12.0"
-    markdown-it "^6.0.1"
-    markdown-it-abbr "^1.0.3"
-    markdown-it-deflist "^2.0.1"
-    markdown-it-emoji "^1.1.1"
-    markdown-it-footnote "^2.0.0"
-    markdown-it-ins "^2.0.0"
-    markdown-it-katex "^2.0.3"
-    markdown-it-mark "^2.0.0"
-    markdown-it-sub "^1.0.0"
-    markdown-it-sup "^1.0.0"
-    markdown-it-task-lists "^2.0.1"
-    markdown-it-toc-and-anchor "^4.1.2"
-
 vue-router@^3.0.1:
   version "3.0.2"
   resolved "https://registry.npmjs.org/vue-router/-/vue-router-3.0.2.tgz#dedc67afe6c4e2bc25682c8b1c2a8c0d7c7e56be"

Vissa filer visades inte eftersom för många filer har ändrats