From b67903481b37599fa65dbe2ede230f720db6cce7 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 31 Mar 2020 18:00:18 +0800 Subject: [PATCH] testpaper --- test_client/debug.log | 1 + test_client/src/api/examtest.js | 21 ++ test_client/src/router/index.js | 7 + test_client/src/views/examtest/paper.vue | 107 ++++----- .../src/views/examtest/papercreate.vue | 198 +++++++++++++++ test_client/src/views/question/question.vue | 63 +---- .../src/views/question/questionchoose.vue | 225 ++++++++++++++++++ test_client/src/views/system/banner.vue | 2 + test_mini/app.json | 3 +- test_mini/pages/main/main.js | 15 +- test_mini/pages/yati/index.js | 116 +++++++++ test_mini/pages/yati/index.json | 4 + test_mini/pages/yati/index.wxml | 26 ++ test_mini/pages/yati/index.wxss | 1 + .../migrations/0018_auto_20200331_0901.py | 56 +++++ .../migrations/0019_auto_20200331_1616.py | 43 ++++ test_server/examtest/models_paper.py | 7 + test_server/examtest/serializers.py | 8 +- test_server/examtest/views.py | 35 ++- 19 files changed, 809 insertions(+), 129 deletions(-) create mode 100644 test_client/src/views/examtest/papercreate.vue create mode 100644 test_client/src/views/question/questionchoose.vue create mode 100644 test_mini/pages/yati/index.js create mode 100644 test_mini/pages/yati/index.json create mode 100644 test_mini/pages/yati/index.wxml create mode 100644 test_mini/pages/yati/index.wxss create mode 100644 test_server/examtest/migrations/0018_auto_20200331_0901.py create mode 100644 test_server/examtest/migrations/0019_auto_20200331_1616.py diff --git a/test_client/debug.log b/test_client/debug.log index 9217f12..e6c4d90 100644 --- a/test_client/debug.log +++ b/test_client/debug.log @@ -1,2 +1,3 @@ [0309/185402.553:WARNING:minidump_to_upload_parameters.cc(36)] duplicate key guid, discarding value e9fabbb7-863e-4ba9-aa01-bd9e2a892f87 [0309/185709.823:WARNING:minidump_to_upload_parameters.cc(36)] duplicate key guid, discarding value e9fabbb7-863e-4ba9-aa01-bd9e2a892f87 +[0330/140108.513:WARNING:minidump_to_upload_parameters.cc(36)] duplicate key guid, discarding value 8c211a77-fb10-434c-a128-67f93c6c5458 diff --git a/test_client/src/api/examtest.js b/test_client/src/api/examtest.js index 318b7a8..1e0b1cc 100644 --- a/test_client/src/api/examtest.js +++ b/test_client/src/api/examtest.js @@ -83,4 +83,25 @@ export function getExamTestDetail(id){ url: `/examtest/examtest/${id}/`, method: 'get', }) +} +export function getPaperList(query) { + return request({ + url: '/examtest/paper/', + method: 'get', + params: query + }) +} + +export function getPaperDetail(id){ + return request({ + url: `/examtest/paper/${id}/`, + method: 'get', + }) +} +export function createPaper(data) { + return request({ + url: '/examtest/paper/', + method: 'post', + data + }) } \ No newline at end of file diff --git a/test_client/src/router/index.js b/test_client/src/router/index.js index beff052..768aa95 100644 --- a/test_client/src/router/index.js +++ b/test_client/src/router/index.js @@ -164,6 +164,13 @@ export const asyncRoutes = [ meta: { title: '编辑工作类别', noCache: true, icon: '', perms: ['workscope_update']}, hidden: true }, + { + path: 'paper/create', + name: 'CreatePaper', + component: () => import('@/views/examtest/papercreate.vue'), + meta: { title: '新建押题试卷', noCache: true, icon: '', perms: ['paper_add']}, + hidden: true + }, ] }, { diff --git a/test_client/src/views/examtest/paper.vue b/test_client/src/views/examtest/paper.vue index 44582aa..74240de 100644 --- a/test_client/src/views/examtest/paper.vue +++ b/test_client/src/views/examtest/paper.vue @@ -1,44 +1,23 @@ \ No newline at end of file diff --git a/test_client/src/views/question/question.vue b/test_client/src/views/question/question.vue index 7945d9d..5f2f01d 100644 --- a/test_client/src/views/question/question.vue +++ b/test_client/src/views/question/question.vue @@ -2,7 +2,7 @@
{ - // this.$refs["commonForm"].clearValidate(); - // }); - // }, - // handleEdit(scope) { - // this.questioncat = Object.assign({}, scope.row); // copy obj - // this.dialogType = "edit"; - // this.dialogVisible = true; - // this.$nextTick(() => { - // this.$refs["commonForm"].clearValidate(); - // }); - // }, handleDelete(scope) { this.$confirm("确认删除该题目吗?将丢失数据!", "警告", { confirmButtonText: "确认", @@ -291,42 +278,6 @@ export default { // console.error(err); }); }, - // async confirm(form) { - // this.$refs[form].validate(valid => { - // if (valid) { - // const isEdit = this.dialogType === "edit"; - // if (isEdit) { - // updateQuestioncat(this.questioncat.id, this.questioncat).then( - // () => { - // this.getList(); - // this.dialogVisible = false; - // this.$notify({ - // title: "成功", - // message: "编辑成功", - // type: "success", - // duration: 2000 - // }); - // } - // ); - // } else { - // createQuestioncat(this.questioncat).then(res => { - // // this.questioncat = res.data - // // this.tableData.unshift(this.questioncat) - // this.getList(); - // this.dialogVisible = false; - // this.$notify({ - // title: "成功", - // message: "新增成功", - // type: "success", - // duration: 2000 - // }); - // }); - // } - // } else { - // return false; - // } - // }); - // } } }; diff --git a/test_client/src/views/question/questionchoose.vue b/test_client/src/views/question/questionchoose.vue new file mode 100644 index 0000000..d45bb5c --- /dev/null +++ b/test_client/src/views/question/questionchoose.vue @@ -0,0 +1,225 @@ + + + diff --git a/test_client/src/views/system/banner.vue b/test_client/src/views/system/banner.vue index 72fb1f3..27ed6ec 100644 --- a/test_client/src/views/system/banner.vue +++ b/test_client/src/views/system/banner.vue @@ -147,7 +147,9 @@ export default { getList() { this.listLoading = true getBannerAll().then(response => { + if(response.data.length){ this.tableData = response.data; + } this.listLoading = false }); }, diff --git a/test_mini/app.json b/test_mini/app.json index 4e5087c..cdca009 100644 --- a/test_mini/app.json +++ b/test_mini/app.json @@ -18,7 +18,8 @@ "pages/test/list", "pages/my/index", "pages/collect/main", - "pages/workscope/index" + "pages/workscope/index", + "pages/yati/index" ], "window": { "backgroundTextStyle": "light", diff --git a/test_mini/pages/main/main.js b/test_mini/pages/main/main.js index 0f63e9e..932df0b 100644 --- a/test_mini/pages/main/main.js +++ b/test_mini/pages/main/main.js @@ -126,10 +126,17 @@ Page({ } }, goYati: function () { - wx.showToast({ - title: '暂未开放', - icon:'none' - }) + if (getApp().globalData.userinfo.workscope) { + wx.navigateTo({ + url: '/pages/yati/index', + }) + } else { + wx.showToast({ + title: '未开通权限\r\n请联系课程顾问', + icon: 'none', + duration: 2000 + }) + } }, testList: function (){ wx.navigateTo({ diff --git a/test_mini/pages/yati/index.js b/test_mini/pages/yati/index.js new file mode 100644 index 0000000..8d70880 --- /dev/null +++ b/test_mini/pages/yati/index.js @@ -0,0 +1,116 @@ +// pages/lianxi/index.js +const api = require("../../utils/request.js"); +Page({ + + /** + * 页面的初始数据 + */ + data: { + paperData: [], + query:{ + page:1, + limit:10 + } + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function () { + + if (getApp().globalData.userinfo.workscope) { + this.setData({ + workscopeId: getApp().globalData.userinfo.workscope + }) + } else { + wx.switchTab({ + url: '/pages/main/main', + }) + } + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + this.getList() + }, + getList: function () { + var that = this + if (that.data.workscopeId) { + that.data.query.workscope = that.data.workscopeId + api.request('/examtest/paper/', 'GET', that.data.query).then(res => { + if (that.data.query.page == 1) { + that.data.paperData = res.data.results + } else { + that.data.paperData = that.data.paperData.concat(res.data.results) + } + that.setData({ + paperData: that.data.paperData, + count: res.data.count + }) + }) + } + + }, + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + var that = this + that.data.query.page = 1; + that.getList(); + wx.stopPullDownRefresh(); + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + var that = this + if (that.data.count <= that.data.query.page * that.data.query.limit) { + wx.showToast({ + title: '没有更多了', + icon: 'none' + }) + } else { + that.data.query.page = that.data.query.page + 1 + that.getList() + } + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + }, + + startLianxi: function (e) { + wx.navigateTo({ + url: 'main?questioncat=' + e.currentTarget.id, + }) + }, +}) \ No newline at end of file diff --git a/test_mini/pages/yati/index.json b/test_mini/pages/yati/index.json new file mode 100644 index 0000000..16a27d9 --- /dev/null +++ b/test_mini/pages/yati/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "押题试卷" +} \ No newline at end of file diff --git a/test_mini/pages/yati/index.wxml b/test_mini/pages/yati/index.wxml new file mode 100644 index 0000000..4a5b438 --- /dev/null +++ b/test_mini/pages/yati/index.wxml @@ -0,0 +1,26 @@ + + + +当前工作类别押题卷 + + + + +

{{item.name}}

+ + {{item.workscope_name}} + + + + 开始考试 + +
+
+
+
+
+
diff --git a/test_mini/pages/yati/index.wxss b/test_mini/pages/yati/index.wxss new file mode 100644 index 0000000..8596982 --- /dev/null +++ b/test_mini/pages/yati/index.wxss @@ -0,0 +1 @@ +/* pages/yati/index.wxss */ \ No newline at end of file diff --git a/test_server/examtest/migrations/0018_auto_20200331_0901.py b/test_server/examtest/migrations/0018_auto_20200331_0901.py new file mode 100644 index 0000000..4cff1b4 --- /dev/null +++ b/test_server/examtest/migrations/0018_auto_20200331_0901.py @@ -0,0 +1,56 @@ +# Generated by Django 3.0.4 on 2020-03-31 01:01 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('question', '0008_auto_20200325_0959'), + ('examtest', '0017_banner'), + ] + + operations = [ + migrations.AddField( + model_name='paper', + name='limit', + field=models.IntegerField(default=0, verbose_name='限时(分钟)'), + ), + migrations.AddField( + model_name='paper', + name='pass_score', + field=models.FloatField(default=0, verbose_name='及格分数'), + ), + migrations.AddField( + model_name='paper', + name='total_score', + field=models.FloatField(default=0, verbose_name='满分'), + ), + migrations.AddField( + model_name='paper', + name='workscope', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='examtest.WorkScope', verbose_name='名称'), + ), + migrations.CreateModel( + name='PaperQuestions', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_delete', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('score', models.FloatField(default=0, verbose_name='满分')), + ('paper', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='examtest.Paper', verbose_name='试卷')), + ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='question.Question', verbose_name='试题')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='paper', + name='questions', + field=models.ManyToManyField(through='examtest.PaperQuestions', to='question.Question'), + ), + ] diff --git a/test_server/examtest/migrations/0019_auto_20200331_1616.py b/test_server/examtest/migrations/0019_auto_20200331_1616.py new file mode 100644 index 0000000..cc98267 --- /dev/null +++ b/test_server/examtest/migrations/0019_auto_20200331_1616.py @@ -0,0 +1,43 @@ +# Generated by Django 3.0.4 on 2020-03-31 08:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('examtest', '0018_auto_20200331_0901'), + ] + + operations = [ + migrations.AddField( + model_name='paper', + name='danxuan_count', + field=models.IntegerField(default=0, verbose_name='单选数量'), + ), + migrations.AddField( + model_name='paper', + name='danxuan_score', + field=models.FloatField(default=0, verbose_name='单选分数'), + ), + migrations.AddField( + model_name='paper', + name='duoxuan_count', + field=models.IntegerField(default=0, verbose_name='多选数量'), + ), + migrations.AddField( + model_name='paper', + name='duoxuan_score', + field=models.FloatField(default=0, verbose_name='多选分数'), + ), + migrations.AddField( + model_name='paper', + name='panduan_count', + field=models.IntegerField(default=0, verbose_name='判断数量'), + ), + migrations.AddField( + model_name='paper', + name='panduan_score', + field=models.FloatField(default=0, verbose_name='判断分数'), + ), + ] diff --git a/test_server/examtest/models_paper.py b/test_server/examtest/models_paper.py index 8074f94..bf57e2b 100644 --- a/test_server/examtest/models_paper.py +++ b/test_server/examtest/models_paper.py @@ -41,10 +41,17 @@ class WorkScope(SoftCommonModel): class Paper(SoftCommonModel): name = models.CharField(max_length=200, verbose_name='名称') + workscope = models.ForeignKey(WorkScope, on_delete=models.CASCADE, null=True, blank=True, verbose_name='名称') questions = models.ManyToManyField(Question, through='PaperQuestions') limit = models.IntegerField(default=0, verbose_name='限时(分钟)') total_score = models.FloatField(default=0, verbose_name='满分') pass_score = models.FloatField(default=0, verbose_name='及格分数') + danxuan_count = models.IntegerField(default=0, verbose_name='单选数量') + danxuan_score = models.FloatField(default=2, verbose_name='单选分数') + duoxuan_count = models.IntegerField(default=0, verbose_name='多选数量') + duoxuan_score = models.FloatField(default=4, verbose_name='多选分数') + panduan_count = models.IntegerField(default=0, verbose_name='判断数量') + panduan_score = models.FloatField(default=2, verbose_name='判断分数') class PaperQuestions(CommonModel): paper = models.ForeignKey(Paper, on_delete=models.CASCADE, verbose_name='试卷') diff --git a/test_server/examtest/serializers.py b/test_server/examtest/serializers.py index f7df2bd..db08182 100644 --- a/test_server/examtest/serializers.py +++ b/test_server/examtest/serializers.py @@ -77,6 +77,12 @@ class AnswerDetailCreateSerializer(serializers.ModelSerializer): class PaperSerializer(serializers.ModelSerializer): create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) + workscope_name = serializers.StringRelatedField(source='workscope', read_only=True) class Meta: model = Paper - exclude = ('questions',) \ No newline at end of file + exclude = ('questions',) + +class PaperQuestionsCreateSerializer(serializers.ModelSerializer): + class Meta: + model = PaperQuestions + fields = '__all__' \ No newline at end of file diff --git a/test_server/examtest/views.py b/test_server/examtest/views.py index 3c554dd..a25e2d8 100644 --- a/test_server/examtest/views.py +++ b/test_server/examtest/views.py @@ -20,7 +20,7 @@ from .models import ExamTest, AnswerDetail, Banner from .models_paper import TestRule, WorkScope, Paper from .serializers import (TestRuleSerializer, MoniTestSerializer, AnswerDetailSerializer, ExamTestListSerializer, AnswerDetailCreateSerializer, WorkScopeSerializer, - BannerSerializer, PaperSerializer) + BannerSerializer, PaperSerializer, PaperQuestionsCreateSerializer) from server import settings from crm.authentication import ConsumerTokenAuthentication from utils.custom import CommonPagination @@ -248,7 +248,38 @@ class PaperViewSet(ModelViewSet): {'*': 'admin'}, {'*': 'Paper_all'}, {'get': 'Paper_list'}, {'post': 'Paper_create'}, {'put': 'Paper_update'}, {'delete': 'Paper_delete'}) queryset = Paper.objects.filter(is_delete=0).all().order_by("id") + pagination_class = CommonPagination serializer_class = PaperSerializer ordering_fields = ('id',) ordering = ['id'] - search_fields = ('^name',) \ No newline at end of file + filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] + filterset_fields = ['workscope'] + search_fields = ('^name',) + + def create(self, request, *args, **kwargs): + data = request.data + serializer = self.get_serializer(data=data) + serializer.is_valid(raise_exception=True) + instance = serializer.save() + if 'questions' in data: + questions = [] + for i in data['questions']: + question = {} + question['question'] = i['id'] + question['paper'] = instance.id + if i['type'] == '单选': + question['score'] = instance.danxuan_score + elif i['type'] == '多选': + question['score'] = instance.duoxuan_score + elif i['type'] == '判断': + question['score'] = instance.panduan_score + questions.append(question) + serializer_detail = PaperQuestionsCreateSerializer(data=questions, many=True) + if serializer_detail.is_valid(): + serializer_detail.save() + return Response(status=status.HTTP_200_OK) + else: + return Response(serializer_detail.errors) + + else: + return Response({'error':'不存在题库'}) \ No newline at end of file