|
@@ -7,6 +7,11 @@
|
|
|
<template slot="content">
|
|
<template slot="content">
|
|
|
共有 {{ review.length }} 份互评作业
|
|
共有 {{ review.length }} 份互评作业
|
|
|
</template>
|
|
</template>
|
|
|
|
|
+ <template slot="action">
|
|
|
|
|
+ <a @click="() => (this.showModal = true)" class="button is-link">
|
|
|
|
|
+ 新建互评作业
|
|
|
|
|
+ </a>
|
|
|
|
|
+ </template>
|
|
|
</page-header>
|
|
</page-header>
|
|
|
<page-body>
|
|
<page-body>
|
|
|
<div class="columns is-multiline is-desktop">
|
|
<div class="columns is-multiline is-desktop">
|
|
@@ -20,16 +25,108 @@
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</page-body>
|
|
</page-body>
|
|
|
|
|
+ <b-modal :active.sync="showModal">
|
|
|
|
|
+ <div class="card">
|
|
|
|
|
+ <div class="title">创建互评作业</div>
|
|
|
|
|
+ <b-notification type="is-danger" :active.sync="isServerError">
|
|
|
|
|
+ {{ errorMassage }}
|
|
|
|
|
+ </b-notification>
|
|
|
|
|
+ <div class="content">
|
|
|
|
|
+ <b-field
|
|
|
|
|
+ label="目标文档作业"
|
|
|
|
|
+ :type="$v.documentHwId.$error ? 'is-danger' : ''"
|
|
|
|
|
+ :message="$v.documentHwId.$error ? '请选择文档' : ''"
|
|
|
|
|
+ >
|
|
|
|
|
+ <b-select
|
|
|
|
|
+ :loading="docHomeworkLoading"
|
|
|
|
|
+ v-model="$v.documentHwId.$model"
|
|
|
|
|
+ placeholder="选择一个文档作业"
|
|
|
|
|
+ expanded
|
|
|
|
|
+ >
|
|
|
|
|
+ <option
|
|
|
|
|
+ v-for="option in docHomework"
|
|
|
|
|
+ :value="option.id"
|
|
|
|
|
+ :key="option.id"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ option.name }}
|
|
|
|
|
+ </option>
|
|
|
|
|
+ </b-select>
|
|
|
|
|
+ </b-field>
|
|
|
|
|
+ <b-field
|
|
|
|
|
+ label="互评任务数"
|
|
|
|
|
+ :type="$v.taskNumber.$error ? 'is-danger' : ''"
|
|
|
|
|
+ :message="$v.taskNumber.$error ? '请输入互评任务数' : ''"
|
|
|
|
|
+ >
|
|
|
|
|
+ <b-input type="number" v-model="$v.taskNumber.$model"></b-input>
|
|
|
|
|
+ </b-field>
|
|
|
|
|
+ <b-field
|
|
|
|
|
+ label="互评开始时间"
|
|
|
|
|
+ :type="$v.startAt.$error ? 'is-danger' : ''"
|
|
|
|
|
+ :message="$v.startAt.$error ? '请选择时间' : ''"
|
|
|
|
|
+ >
|
|
|
|
|
+ <flat-pickr
|
|
|
|
|
+ class="input"
|
|
|
|
|
+ v-model="$v.startAt.$model"
|
|
|
|
|
+ :config="startAtConfig"
|
|
|
|
|
+ ></flat-pickr>
|
|
|
|
|
+ </b-field>
|
|
|
|
|
+ <b-field
|
|
|
|
|
+ label="互评结束时间"
|
|
|
|
|
+ :type="$v.reviewDdl.$error ? 'is-danger' : ''"
|
|
|
|
|
+ :message="$v.reviewDdl.$error ? '请选择时间' : ''"
|
|
|
|
|
+ >
|
|
|
|
|
+ <flat-pickr
|
|
|
|
|
+ class="input"
|
|
|
|
|
+ v-model="$v.reviewDdl.$model"
|
|
|
|
|
+ :config="reviewDdlConfig"
|
|
|
|
|
+ ></flat-pickr>
|
|
|
|
|
+ </b-field>
|
|
|
|
|
+ <b-field
|
|
|
|
|
+ label="申请重审结束时间"
|
|
|
|
|
+ :type="$v.argueDdl.$error ? 'is-danger' : ''"
|
|
|
|
|
+ :message="$v.argueDdl.$error ? '请选择时间' : ''"
|
|
|
|
|
+ >
|
|
|
|
|
+ <flat-pickr
|
|
|
|
|
+ class="input"
|
|
|
|
|
+ v-model="$v.argueDdl.$model"
|
|
|
|
|
+ :config="argueDdlConfig"
|
|
|
|
|
+ ></flat-pickr>
|
|
|
|
|
+ </b-field>
|
|
|
|
|
+ <b-field
|
|
|
|
|
+ label="重审结束时间"
|
|
|
|
|
+ :type="$v.endDdl.$error ? 'is-danger' : ''"
|
|
|
|
|
+ :message="$v.endDdl.$error ? '请选择时间' : ''"
|
|
|
|
|
+ >
|
|
|
|
|
+ <flat-pickr
|
|
|
|
|
+ class="input"
|
|
|
|
|
+ v-model="$v.endDdl.$model"
|
|
|
|
|
+ :config="endDdlConfig"
|
|
|
|
|
+ ></flat-pickr>
|
|
|
|
|
+ </b-field>
|
|
|
|
|
+
|
|
|
|
|
+ <a
|
|
|
|
|
+ class="button is-link"
|
|
|
|
|
+ :class="{ 'is-loading': submitting }"
|
|
|
|
|
+ @click="submit()"
|
|
|
|
|
+ >
|
|
|
|
|
+ 创建互评作业
|
|
|
|
|
+ </a>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </b-modal>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
<script>
|
|
|
import { mapState } from "vuex";
|
|
import { mapState } from "vuex";
|
|
|
-import { getTeacherCourseReviewList } from "@/api/review";
|
|
|
|
|
|
|
+import { createReview, getTeacherCourseReviewList } from "@/api/review";
|
|
|
import Card from "@/components/Card";
|
|
import Card from "@/components/Card";
|
|
|
import PageHeader from "@/components/PageHeader";
|
|
import PageHeader from "@/components/PageHeader";
|
|
|
import PageBody from "@/components/PageBody/index";
|
|
import PageBody from "@/components/PageBody/index";
|
|
|
import ReviewStateTag from "@/components/ReviewStateTag/index";
|
|
import ReviewStateTag from "@/components/ReviewStateTag/index";
|
|
|
|
|
+import { getDocAssignmentListByCrs } from "@/api/assignment";
|
|
|
|
|
+import timeMixins from "@/mixins/time";
|
|
|
|
|
+import { required } from "vuelidate/lib/validators";
|
|
|
export default {
|
|
export default {
|
|
|
components: {
|
|
components: {
|
|
|
ReviewStateTag,
|
|
ReviewStateTag,
|
|
@@ -42,21 +139,185 @@ export default {
|
|
|
course: state => state.course.currentCourse
|
|
course: state => state.course.currentCourse
|
|
|
})
|
|
})
|
|
|
},
|
|
},
|
|
|
|
|
+ mixins: [timeMixins],
|
|
|
data() {
|
|
data() {
|
|
|
return {
|
|
return {
|
|
|
courses: [],
|
|
courses: [],
|
|
|
- review: []
|
|
|
|
|
|
|
+ review: [],
|
|
|
|
|
+ showModal: false,
|
|
|
|
|
+ submitting: false,
|
|
|
|
|
+ docHomework: [],
|
|
|
|
|
+ docHomeworkLoading: false,
|
|
|
|
|
+ errorMassage: false,
|
|
|
|
|
+ isServerError: false,
|
|
|
|
|
+ documentHwId: null,
|
|
|
|
|
+ taskNumber: null,
|
|
|
|
|
+ startAt: null,
|
|
|
|
|
+ reviewDdl: null,
|
|
|
|
|
+ argueDdl: null,
|
|
|
|
|
+ endDdl: null,
|
|
|
|
|
+ startAtConfig: {
|
|
|
|
|
+ ...this.getDefaultConfig(),
|
|
|
|
|
+ minDate: "today",
|
|
|
|
|
+ maxDate: null
|
|
|
|
|
+ },
|
|
|
|
|
+ reviewDdlConfig: {
|
|
|
|
|
+ ...this.getDefaultConfig(),
|
|
|
|
|
+ minDate: "today",
|
|
|
|
|
+ maxDate: null
|
|
|
|
|
+ },
|
|
|
|
|
+ argueDdlConfig: {
|
|
|
|
|
+ ...this.getDefaultConfig(),
|
|
|
|
|
+ minDate: "today",
|
|
|
|
|
+ maxDate: null
|
|
|
|
|
+ },
|
|
|
|
|
+ endDdlConfig: {
|
|
|
|
|
+ ...this.getDefaultConfig(),
|
|
|
|
|
+ minDate: "today",
|
|
|
|
|
+ maxDate: null
|
|
|
|
|
+ }
|
|
|
};
|
|
};
|
|
|
},
|
|
},
|
|
|
mounted() {
|
|
mounted() {
|
|
|
- getTeacherCourseReviewList(this.courses.id).then(
|
|
|
|
|
- value => (this.review = value.data)
|
|
|
|
|
- );
|
|
|
|
|
|
|
+ const { documentHwId } = this.$route.query;
|
|
|
|
|
+ if (documentHwId) {
|
|
|
|
|
+ this.documentHwId = documentHwId;
|
|
|
|
|
+ this.showModal = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ this.getReviewList();
|
|
|
|
|
+ },
|
|
|
|
|
+ validations: {
|
|
|
|
|
+ documentHwId: {
|
|
|
|
|
+ required
|
|
|
|
|
+ },
|
|
|
|
|
+ taskNumber: {
|
|
|
|
|
+ required
|
|
|
|
|
+ },
|
|
|
|
|
+ startAt: {
|
|
|
|
|
+ required
|
|
|
|
|
+ },
|
|
|
|
|
+ reviewDdl: {
|
|
|
|
|
+ required
|
|
|
|
|
+ },
|
|
|
|
|
+ argueDdl: {
|
|
|
|
|
+ required
|
|
|
|
|
+ },
|
|
|
|
|
+ endDdl: {
|
|
|
|
|
+ required
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ watch: {
|
|
|
|
|
+ showModal(newValue) {
|
|
|
|
|
+ if (newValue) {
|
|
|
|
|
+ this.getDocHomework();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.isServerError = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ startAt(newValue) {
|
|
|
|
|
+ if (newValue !== "") {
|
|
|
|
|
+ this.adjustMinDate("reviewDdlConfig", newValue);
|
|
|
|
|
+ this.adjustMinDate("argueDdlConfig", newValue);
|
|
|
|
|
+ this.adjustMinDate("endDdlConfig", newValue);
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ reviewDdl(newValue) {
|
|
|
|
|
+ if (newValue !== "") {
|
|
|
|
|
+ this.adjustMaxDate("startAtConfig", newValue);
|
|
|
|
|
+ this.adjustMinDate("argueDdlConfig", newValue);
|
|
|
|
|
+ this.adjustMinDate("endDdlConfig", newValue);
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ argueDdl(newValue) {
|
|
|
|
|
+ if (newValue !== "") {
|
|
|
|
|
+ this.adjustMaxDate("startAtConfig", newValue);
|
|
|
|
|
+ this.adjustMaxDate("reviewDdlConfig", newValue);
|
|
|
|
|
+ this.adjustMinDate("endDdlConfig", newValue);
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ endDdl(newValue) {
|
|
|
|
|
+ if (newValue !== "") {
|
|
|
|
|
+ this.adjustMaxDate("startAtConfig", newValue);
|
|
|
|
|
+ this.adjustMaxDate("reviewDdlConfig", newValue);
|
|
|
|
|
+ this.adjustMaxDate("argueDdlConfig", newValue);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ methods: {
|
|
|
|
|
+ async getReviewList() {
|
|
|
|
|
+ const { data } = await getTeacherCourseReviewList(this.courses.id);
|
|
|
|
|
+ this.review = data;
|
|
|
|
|
+ },
|
|
|
|
|
+ async getDocHomework() {
|
|
|
|
|
+ this.docHomeworkLoading = true;
|
|
|
|
|
+ const { courseId } = this.$route.params;
|
|
|
|
|
+ const { data } = await getDocAssignmentListByCrs(courseId);
|
|
|
|
|
+ this.docHomework = data;
|
|
|
|
|
+ this.docHomeworkLoading = false;
|
|
|
|
|
+ },
|
|
|
|
|
+ adjustMinDate(config, newValue) {
|
|
|
|
|
+ const configMinDate = Number(this[config].minDate);
|
|
|
|
|
+ if (!configMinDate || configMinDate < Number(newValue)) {
|
|
|
|
|
+ this[config].minDate = newValue;
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ adjustMaxDate(config, newValue) {
|
|
|
|
|
+ const configMinDate = Number(this[config].maxDate);
|
|
|
|
|
+ if (!configMinDate || configMinDate > Number(newValue)) {
|
|
|
|
|
+ this[config].maxDate = newValue;
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ async submit() {
|
|
|
|
|
+ this.isServerError = false;
|
|
|
|
|
+ this.$v.$touch();
|
|
|
|
|
+ if (!this.$v.$invalid) {
|
|
|
|
|
+ this.submitting = true;
|
|
|
|
|
+ const { courseId } = this.$route.params;
|
|
|
|
|
+ const {
|
|
|
|
|
+ documentHwId = 0,
|
|
|
|
|
+ startAt = 0,
|
|
|
|
|
+ argueDdl = 0,
|
|
|
|
|
+ reviewDdl = 0,
|
|
|
|
|
+ taskNumber = 0,
|
|
|
|
|
+ endDdl = 0
|
|
|
|
|
+ } = this;
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ await createReview({
|
|
|
|
|
+ courseId,
|
|
|
|
|
+ documentHwId,
|
|
|
|
|
+ startAt: Number(startAt),
|
|
|
|
|
+ argueDdl: Number(argueDdl),
|
|
|
|
|
+ reviewDdl: Number(reviewDdl),
|
|
|
|
|
+ taskNumber,
|
|
|
|
|
+ endDdl: Number(endDdl)
|
|
|
|
|
+ });
|
|
|
|
|
+ this.$toast.open({
|
|
|
|
|
+ message: `互评作业创建成功`,
|
|
|
|
|
+ type: "is-success"
|
|
|
|
|
+ });
|
|
|
|
|
+ this.showModal = false;
|
|
|
|
|
+ this.getReviewList();
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ this.errorMassage = e.message;
|
|
|
|
|
+ this.isServerError = true;
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ this.submitting = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
<style lang="scss" scoped>
|
|
|
|
|
+@import "../../../assets/scss/app";
|
|
|
|
|
+.card {
|
|
|
|
|
+ padding: $default-margin-between;
|
|
|
|
|
+ border-radius: $default-radius;
|
|
|
|
|
+ margin: 0 auto;
|
|
|
|
|
+ max-width: 600px;
|
|
|
|
|
+}
|
|
|
.top-nav-section {
|
|
.top-nav-section {
|
|
|
padding: 0 40px;
|
|
padding: 0 40px;
|
|
|
}
|
|
}
|