diff --git a/test_client/src/views/crm/consumer.vue b/test_client/src/views/crm/consumer.vue
index 053ce4d..3b9b216 100644
--- a/test_client/src/views/crm/consumer.vue
+++ b/test_client/src/views/crm/consumer.vue
@@ -16,7 +16,7 @@
:value="item.value"
/>
-
-
+ -->
{{ scope.row.company_name }}
-
-
- 已付费
- 未付费
+
+
+
+ {{ item.name }}
+
@@ -153,7 +157,7 @@
{
+ let consumer = this.consumer
+ consumer.company = consumer.company.id
+ updateConsumer(this.consumer.id, consumer).then(() => {
for (let index = 0; index < this.consumerList.length; index++) {
if (this.consumerList[index].id === this.consumer.id) {
this.consumerList.splice(
@@ -365,8 +367,10 @@ export default {
});
});
} else {
- this.consumer.company = this.consumer.company.pop();
- createConsumer(this.consumer).then(res => {
+ this.consumer.company.id = this.consumer.company.id.pop();
+ let consumer = this.consumer
+ consumer.company = consumer.company.id
+ createConsumer(consumer).then(res => {
// this.consumer = res.data
// this.consumerList.unshift(this.consumer)
this.getList();
diff --git a/test_mini/app.json b/test_mini/app.json
index 7e83dba..9afa48d 100644
--- a/test_mini/app.json
+++ b/test_mini/app.json
@@ -11,7 +11,11 @@
"pages/cuoti/index",
"pages/moni/index",
"pages/moni/note",
- "pages/test/test"
+ "pages/test/test",
+ "pages/test/result",
+ "pages/test/detail",
+ "pages/test/sheet",
+ "pages/test/list"
],
"window": {
"backgroundTextStyle": "light",
diff --git a/test_mini/pages/cuoti/index.js b/test_mini/pages/cuoti/index.js
index efbec89..e0e1bb7 100644
--- a/test_mini/pages/cuoti/index.js
+++ b/test_mini/pages/cuoti/index.js
@@ -8,20 +8,20 @@ Page({
*/
data: {
ctms: [],
- tmIndex: 0,
+ tm_index: 0,
isright:false,
answerP:false
},
radioChange: function (e) {
var that = this
that.data.currentTm['user_answer'] = e.detail.value
- that.data.ctms[that.data.tmIndex] = that.data.currentTm
+ that.data.ctms[that.data.tm_index] = that.data.currentTm
that.showAnswer()
},
checkboxChange: function (e) {
var that = this
that.data.currentTm['user_answer'] = e.detail.value
- that.data.ctms[that.data.tmIndex] = that.data.currentTm
+ that.data.ctms[that.data.tm_index] = that.data.currentTm
},
/**
* 生命周期函数--监听页面加载
@@ -64,7 +64,7 @@ Page({
}
})
}else{
- that.showTm(that.data.tmIndex)
+ that.showTm(that.data.tm_index)
}
},
@@ -123,7 +123,7 @@ Page({
var that = this
var currentTm = that.data.ctms[index]
that.setData({
- 'tmIndex': index,
+ 'tm_index': index,
'tmtotal':that.data.ctms.length,
'currentTm': currentTm
})
@@ -165,13 +165,13 @@ Page({
},
next: function () {
var that = this
- var tmIndex = that.data.tmIndex + 1
- that.showTm(tmIndex)
+ var tm_index = that.data.tm_index + 1
+ that.showTm(tm_index)
},
previous: function () {
var that = this
- var tmIndex = that.data.tmIndex - 1
- that.showTm(tmIndex)
+ var tm_index = that.data.tm_index - 1
+ that.showTm(tm_index)
},
showOptions: function () {
let currentTm = this.data.currentTm
@@ -195,7 +195,7 @@ Page({
},
remove: function () {
var that = this
- var index = that.data.tmIndex
+ var index = that.data.tm_index
that.data.ctms.splice(index,1)
if(that.data.ctms.length>index){
that.showTm(index)
diff --git a/test_mini/pages/cuoti/index.wxml b/test_mini/pages/cuoti/index.wxml
index 605bfff..3f5b0e2 100644
--- a/test_mini/pages/cuoti/index.wxml
+++ b/test_mini/pages/cuoti/index.wxml
@@ -1,9 +1,9 @@
- 题量: {{tmIndex+1}}/{{tmtotal}}
+ 题量: {{tm_index+1}}/{{tmtotal}}
- {{tmIndex+1}}.
+ {{tm_index+1}}.
{{currentTm.type}}
@@ -52,10 +52,10 @@
-
+
-
+
diff --git a/test_mini/pages/lianxi/main.js b/test_mini/pages/lianxi/main.js
index 5175d16..6224c35 100644
--- a/test_mini/pages/lianxi/main.js
+++ b/test_mini/pages/lianxi/main.js
@@ -11,14 +11,14 @@ Page({
tms:[],
ydtms:[],
ctms:[],
- tmIndex: 0,
+ tm_index: 0,
answerP: false,
isLoad:true,
},
radioChange: function (e) {
var that = this
that.data.tm_current['user_answer'] = e.detail.value
- that.data.tms[that.data.tmIndex] = that.data.tm_current
+ that.data.tms[that.data.tm_index] = that.data.tm_current
that.showAnswer()
if (that.data.ydtms.indexOf(that.data.tm_current.id)==-1){
that.data.ydtms.push(that.data.tm_current.id)
@@ -27,7 +27,7 @@ Page({
checkboxChange: function (e) {
var that = this
that.data.tm_current['user_answer'] = e.detail.value
- that.data.tms[that.data.tmIndex] = that.data.tm_current
+ that.data.tms[that.data.tm_index] = that.data.tm_current
if (that.data.ydtms.indexOf(that.data.tm_current.id) == -1) {
that.data.ydtms.push(that.data.tm_current.id)
}
@@ -81,7 +81,7 @@ Page({
})
}else{
that.data.tms = that.data.tms.concat(res.data.results)
- that.showTm(that.data.tmIndex) //展示题目和答案
+ that.showTm(that.data.tm_index) //展示题目和答案
if(that.data.isLoad){
that.setData({
tmtotal: res.data.total,
@@ -152,7 +152,7 @@ Page({
var that = this
var tm_current = that.data.tms[index]
that.setData({
- 'tmIndex': index,
+ 'tm_index': index,
'tm_current': tm_current
})
that.showOptions()
@@ -193,25 +193,25 @@ Page({
},
next: function () {
var that = this
- var tmIndex = that.data.tmIndex + 1
+ var tm_index = that.data.tm_index + 1
that.setData({
- tmIndex: tmIndex,
+ tm_index: tm_index,
answerP: false
})
- if (tmIndex + 1 > that.data.tms.length) {
+ if (tm_index + 1 > that.data.tms.length) {
that.getTms()
} else {
- that.showTm(tmIndex)
+ that.showTm(tm_index)
}
},
previous: function () {
var that = this
- var tmIndex = that.data.tmIndex - 1
+ var tm_index = that.data.tm_index - 1
that.setData({
answerP: false
})
- that.showTm(tmIndex)
+ that.showTm(tm_index)
},
showOptions: function () {
let tm_current = this.data.tm_current
diff --git a/test_mini/pages/lianxi/main.wxml b/test_mini/pages/lianxi/main.wxml
index e018a1b..a8b5ff5 100644
--- a/test_mini/pages/lianxi/main.wxml
+++ b/test_mini/pages/lianxi/main.wxml
@@ -1,9 +1,9 @@
- 题量: {{tmIndex+1}}/{{tmtotal}}
+ 题量: {{tm_index+1}}/{{tmtotal}}
- {{tmIndex+1}}.
+ {{tm_index+1}}.
{{tm_current.type}}
{{tm_current.name}}
@@ -48,10 +48,10 @@
-
+
-
+
diff --git a/test_mini/pages/main/main.js b/test_mini/pages/main/main.js
index b5b4f55..698e639 100644
--- a/test_mini/pages/main/main.js
+++ b/test_mini/pages/main/main.js
@@ -143,5 +143,16 @@ Page({
duration: 1500
})
}
+ },
+ goYati: function () {
+ wx.showToast({
+ title: '暂未开放',
+ icon:'none'
+ })
+ },
+ testList: function (){
+ wx.navigateTo({
+ url: '/pages/test/list',
+ })
}
})
\ No newline at end of file
diff --git a/test_mini/pages/main/main.wxml b/test_mini/pages/main/main.wxml
index ae20a47..ed7d8a4 100644
--- a/test_mini/pages/main/main.wxml
+++ b/test_mini/pages/main/main.wxml
@@ -47,14 +47,14 @@
自助模考
-
-
+
+
押题考试
-
-
+
+
考试记录
diff --git a/test_mini/pages/moni/index.js b/test_mini/pages/moni/index.js
index c42669e..4768db0 100644
--- a/test_mini/pages/moni/index.js
+++ b/test_mini/pages/moni/index.js
@@ -91,7 +91,7 @@ Page({
wx.showLoading({
title: '正在生成试卷',
})
- api.request('examtest/monitest/', 'GET', { 'rule': e.currentTarget.id }).then(res => {
+ api.request('examtest/testrule/' + e.currentTarget.id + '/monitest', 'GET').then(res => {
try {
wx.setStorageSync('monitest', res.data)
} catch (e) { }
diff --git a/test_mini/pages/test/detail.js b/test_mini/pages/test/detail.js
new file mode 100644
index 0000000..a3e22a3
--- /dev/null
+++ b/test_mini/pages/test/detail.js
@@ -0,0 +1,125 @@
+// pages/test/detail.js
+const api = require("../../utils/request.js");
+Page({
+
+ /**
+ * 页面的初始数据
+ */
+ data: {
+ tm_index:0,
+ results:[]
+ },
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function (options) {
+ var that = this
+ var query = {'examtest':options.id}
+ api.request('examtest/answerdetail/', 'GET', query).then(res => {
+ that.data.results= res.data
+ that.showTm(0)
+ that.setData({
+ tmtotal:res.data.length
+ })
+ })
+ try {
+ const res = wx.getSystemInfoSync()
+ that.setData({
+ scrollHeight: res.windowHeight - 70
+ })
+ } catch (e) {
+ }
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function () {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh: function () {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom: function () {
+
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage: function () {
+
+ },
+ showTm: function (index) {
+ var that = this
+ var tm_current = that.data.results[index]
+ that.setData({
+ 'tm_index': index,
+ 'tm_current': tm_current
+ })
+ that.showOptions()
+ },
+ next: function () {
+ var that = this
+ var tm_index = that.data.tm_index + 1
+ that.showTm(tm_index)
+
+ },
+ previous: function () {
+ var that = this
+ var tm_index = that.data.tm_index - 1
+ that.showTm(tm_index)
+ },
+ showOptions: function () {
+ var that = this
+ let question_options = that.data.tm_current.question.options
+ let options = []
+ let user_answer = that.data.tm_current.user_answer
+ for (let key in question_options) {
+ let option = {}
+ option.key = key
+ option.value = key + ':' + question_options[key]
+ if (user_answer) {
+ if (key == user_answer || user_answer.indexOf(key) != -1) {
+ option.checked = true
+ }
+ } else {
+ option.checked = false
+ }
+ options.push(option)
+ }
+ that.setData({
+ options: options
+ })
+ },
+})
\ No newline at end of file
diff --git a/test_mini/pages/test/detail.json b/test_mini/pages/test/detail.json
new file mode 100644
index 0000000..8835af0
--- /dev/null
+++ b/test_mini/pages/test/detail.json
@@ -0,0 +1,3 @@
+{
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/test_mini/pages/test/detail.wxml b/test_mini/pages/test/detail.wxml
new file mode 100644
index 0000000..36def9e
--- /dev/null
+++ b/test_mini/pages/test/detail.wxml
@@ -0,0 +1,60 @@
+
+ 题量: {{tm_index+1}}/{{tmtotal}}
+
+
+
+ {{tm_index+1}}.
+ {{tm_current.question.type}}
+
+ {{tm_current.question.name}}
+
+
+
+
+
+
+
+
+
+
+
+
+ 回答正确!
+ 回答有误!
+ 正确答案是{{tm_current.question.right}},你的答案是{{tm_current.user_answer}}
+
+ 解析:
+ {{tm_current.question.resoluation}}
+ 无
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test_mini/pages/test/detail.wxss b/test_mini/pages/test/detail.wxss
new file mode 100644
index 0000000..0ee5e6b
--- /dev/null
+++ b/test_mini/pages/test/detail.wxss
@@ -0,0 +1,20 @@
+.head{
+ width:100%;
+ height:30px;
+ color:#fff;
+ background-color: cornflowerblue;
+ text-align: center;
+}
+.btns{
+ height:40px;
+ display:flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ text-align:center;
+}
+.txlabel{
+ color:#fff;
+ background-color: rgb(216, 140, 0);
+ padding: 2px
+}
+
diff --git a/test_mini/pages/test/list.js b/test_mini/pages/test/list.js
new file mode 100644
index 0000000..ffaaecf
--- /dev/null
+++ b/test_mini/pages/test/list.js
@@ -0,0 +1,102 @@
+// pages/lianxi/index.js
+const api = require("../../utils/request.js");
+Page({
+
+ /**
+ * 页面的初始数据
+ */
+ data: {
+ results: [],
+ query:{
+ page:1,
+ limit:10
+ }
+ },
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function () {
+ var that = this
+ that.getList(that.data.query)
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow: function () {
+ },
+ getList: function () {
+ var that = this
+ api.request('examtest/myexamtest/', 'GET', that.data.query).then(res => {
+ if(res.data.length==0){
+ wx.showToast({
+ title: '没有更多了',
+ icon:''
+ })
+ }else{
+ if (that.data.query.page == 1){
+ that.data.results = res.data.results
+ }else{
+ that.data.results = that.data.results.concat(res.data.results)
+ }
+
+ that.setData({
+ results:that.data.results,
+ count:res.data.count
+ })
+ }
+ })
+ },
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function () {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh: function () {
+ var that = this
+ that.data.query.page = 1;
+ that.getList();
+ wx.stopPullDownRefresh();
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom: function () {
+ that.data.query.page = that.data.query.page + 1
+ that.getList()
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage: function () {
+
+ },
+
+ detail: function (e) {
+ wx.navigateTo({
+ url: '',
+ })
+ },
+})
\ No newline at end of file
diff --git a/test_mini/pages/test/list.json b/test_mini/pages/test/list.json
new file mode 100644
index 0000000..27a9ac8
--- /dev/null
+++ b/test_mini/pages/test/list.json
@@ -0,0 +1,6 @@
+{
+ "usingComponents": {},
+ "navigationBarTitleText": "考试记录",
+ "enablePullDownRefresh": true,
+ "onReachBottomDistance": 50
+}
\ No newline at end of file
diff --git a/test_mini/pages/test/list.wxml b/test_mini/pages/test/list.wxml
new file mode 100644
index 0000000..57e78cf
--- /dev/null
+++ b/test_mini/pages/test/list.wxml
@@ -0,0 +1,30 @@
+
+
+ 共{{count}}条考试记录
+
+
+
+
+ {{item.name}}
+
+ {{item.type}}
+ -
+ 通过
+ 未通过
+ (得分
+ {{item.score}}
+ {{item.score}}
+ -满分
+ {{item.total_score}})
+
+
+ 耗时:{{item.took}}s
+ 开始答题:{{item.start_time}}
+
+
+
+ 答卷详情
+
+
+
+
\ No newline at end of file
diff --git a/test_mini/pages/test/list.wxss b/test_mini/pages/test/list.wxss
new file mode 100644
index 0000000..a458506
--- /dev/null
+++ b/test_mini/pages/test/list.wxss
@@ -0,0 +1,5 @@
+.head{
+ color:#fff;
+ background-color: cornflowerblue;
+ text-align: center;
+}
\ No newline at end of file
diff --git a/test_mini/pages/test/result.js b/test_mini/pages/test/result.js
new file mode 100644
index 0000000..269bcc9
--- /dev/null
+++ b/test_mini/pages/test/result.js
@@ -0,0 +1,76 @@
+// pages/examtest/result.js
+Page({
+
+ /**
+ * 页面的初始数据
+ */
+ data: {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function () {
+ this.setData(getApp().globalData.testData)
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function () {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh: function () {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom: function () {
+
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage: function () {
+
+ },
+ detail: function () {
+ wx.redirectTo({
+ url: 'detail?id=' + this.data.id,
+ })
+ },
+ back: function () {
+ wx.switchTab({
+ url: '/pages/main/main'
+ })
+ },
+})
\ No newline at end of file
diff --git a/test_mini/pages/test/result.json b/test_mini/pages/test/result.json
new file mode 100644
index 0000000..8835af0
--- /dev/null
+++ b/test_mini/pages/test/result.json
@@ -0,0 +1,3 @@
+{
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/test_mini/pages/test/result.wxml b/test_mini/pages/test/result.wxml
new file mode 100644
index 0000000..4fccee8
--- /dev/null
+++ b/test_mini/pages/test/result.wxml
@@ -0,0 +1,29 @@
+
+
+
+
+
+ 恭喜您,通过考试
+ 很遗憾,下次加油
+
+ 得分
+ {{score}}
+ {{score}}
+ ——满分
+ {{total_score}}
+
+
+ 用时:
+ {{took}}
+ {{took}}
+ 秒
+
+
+
+
+ 查看答卷详情
+ 返回首页
+
+
+
+
\ No newline at end of file
diff --git a/test_mini/pages/test/result.wxss b/test_mini/pages/test/result.wxss
new file mode 100644
index 0000000..e45ef0f
--- /dev/null
+++ b/test_mini/pages/test/result.wxss
@@ -0,0 +1 @@
+/* pages/test/note.wxss */
\ No newline at end of file
diff --git a/test_mini/pages/test/sheet.js b/test_mini/pages/test/sheet.js
new file mode 100644
index 0000000..c444179
--- /dev/null
+++ b/test_mini/pages/test/sheet.js
@@ -0,0 +1,86 @@
+// pages/examtest/sheet.js
+
+Page({
+
+ /**
+ * 页面的初始数据
+ */
+ data: {
+
+ },
+
+ back: function (e) {
+ console.log(e.currentTarget.dataset.index);
+ var tm_index = e.currentTarget.dataset.index
+ var pages = getCurrentPages();
+ var prevPage = pages[pages.length - 2]; //上一个页面
+ prevPage.setData({
+ tm_index: tm_index
+ })
+ prevPage.showTm(tm_index)
+ prevPage.showOptions()
+ wx.navigateBack({
+ })
+ },
+ /**
+ * 生命周期函数--监听页面加载
+ */
+ onLoad: function (options) {
+ var pages = getCurrentPages();
+ var prevPage = pages[pages.length - 2]; //上一个页面
+ var tms = prevPage.data.tms //取上页data里的数据也可以修改
+ this.setData({
+ tms: tms
+ })
+
+ },
+
+ /**
+ * 生命周期函数--监听页面初次渲染完成
+ */
+ onReady: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面显示
+ */
+ onShow: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面隐藏
+ */
+ onHide: function () {
+
+ },
+
+ /**
+ * 生命周期函数--监听页面卸载
+ */
+ onUnload: function () {
+
+ },
+
+ /**
+ * 页面相关事件处理函数--监听用户下拉动作
+ */
+ onPullDownRefresh: function () {
+
+ },
+
+ /**
+ * 页面上拉触底事件的处理函数
+ */
+ onReachBottom: function () {
+
+ },
+
+ /**
+ * 用户点击右上角分享
+ */
+ onShareAppMessage: function () {
+
+ }
+})
\ No newline at end of file
diff --git a/test_mini/pages/test/sheet.json b/test_mini/pages/test/sheet.json
new file mode 100644
index 0000000..6cfdd8d
--- /dev/null
+++ b/test_mini/pages/test/sheet.json
@@ -0,0 +1,4 @@
+{
+ "usingComponents": {},
+ "navigationBarTitleText": "答题卡"
+}
\ No newline at end of file
diff --git a/test_mini/pages/test/sheet.wxml b/test_mini/pages/test/sheet.wxml
new file mode 100644
index 0000000..f79108e
--- /dev/null
+++ b/test_mini/pages/test/sheet.wxml
@@ -0,0 +1,13 @@
+
+
+
+
+
+{{index+1}}
+
+
+{{index+1}}
+
+
+
+
diff --git a/test_mini/pages/test/sheet.wxss b/test_mini/pages/test/sheet.wxss
new file mode 100644
index 0000000..913bdd4
--- /dev/null
+++ b/test_mini/pages/test/sheet.wxss
@@ -0,0 +1,21 @@
+/* pages/examtest/sheet.wxss */
+.ok{
+ display: flex;
+ color:#fff;
+ background-color: green;
+ border:4rpx solid green;
+ height:100rpx;
+ width:100rpx;
+ margin:20rpx;
+ justify-content: center;
+ align-items: center;
+}
+.no{
+ display: flex;
+ border:4rpx solid red;
+ height:100rpx;
+ width:100rpx;
+ margin:20rpx;
+ justify-content: center;
+ align-items: center;
+}
\ No newline at end of file
diff --git a/test_mini/pages/test/test.js b/test_mini/pages/test/test.js
index b5daeb4..f963fff 100644
--- a/test_mini/pages/test/test.js
+++ b/test_mini/pages/test/test.js
@@ -43,6 +43,12 @@ Page({
})
} catch (e) {
}
+ try {
+ var value = wx.getStorageSync('ctms')
+ if (value) {
+ that.data.ctms = value
+ }
+ } catch (e) { }
let mil = that.data.monitest.limit * 60 * 1000
let starttimes = (new Date()).getTime() //时间戳
let endtimes = starttimes + mil
@@ -78,6 +84,9 @@ Page({
*/
onUnload: function () {
clearInterval(getApp().globalData.timer)
+ try {
+ wx.setStorageSync('ctms', this.data.ctms)
+ } catch (e) { }
},
/**
@@ -178,6 +187,11 @@ Page({
options: options
})
},
+ sheet: function () {
+ wx.navigateTo({
+ url: 'sheet',
+ })
+ },
hand: function () {
var that = this
for (var i = 0, len = that.data.tms.length; i < len; i++) {
@@ -219,19 +233,35 @@ Page({
for (var i = 0, len = that.data.tms.length; i < len; i++) {
let tm_result = that.panTi(that.data.tms[i])
that.data.tms[i].is_right = tm_result.is_right
+ if (tm_result.is_right == false){
+ that.data.ctms.unshift(that.data.tms[i])
+ if (that.data.ctms.length > 40) {
+ that.data.ctms.length = 40
+ }
+ }
that.data.tms[i].score = tm_result.score
score = score + tm_result.score
}
that.data.monitest.score = score
+ if (score >= that.data.monitest.pass_score){
+ that.data.monitest.is_pass = true
+ }else{
+ that.data.monitest.is_pass = false
+ }
+ console.log(that.data.tms)
that.data.monitest.questions = that.data.tms
that.data.monitest.start_time = util.formatTime(new Date(that.data.starttimes))
that.data.monitest.end_time = util.formatTime(new Date())
that.data.monitest.took = Math.floor(((new Date()).getTime() - this.data.starttimes) / 1000)
- console.log(that.data.monitest)
- // api.request('examtest/monitest/', 'POST', that.data.monitest).then(res => {
- // wx.redirectTo({
- // url: 'note',
- // })
- // })
+ api.request('examtest/monitest/', 'POST', that.data.monitest).then(res => {
+ getApp().globalData.testData = res.data
+ try {
+ wx.removeStorageSync('monitest')
+ } catch (e) {
+ }
+ wx.redirectTo({
+ url: 'result',
+ })
+ })
}
})
\ No newline at end of file
diff --git a/test_mini/pages/test/test.json b/test_mini/pages/test/test.json
index 9c848e5..33273aa 100644
--- a/test_mini/pages/test/test.json
+++ b/test_mini/pages/test/test.json
@@ -1,4 +1,4 @@
{
"usingComponents": {},
- "navigationBarTitleText": "考试中"
+ "navigationBarTitleText": "答题中"
}
\ No newline at end of file
diff --git a/test_mini/pages/test/test.wxml b/test_mini/pages/test/test.wxml
index f8f918f..d7b91c0 100644
--- a/test_mini/pages/test/test.wxml
+++ b/test_mini/pages/test/test.wxml
@@ -53,7 +53,7 @@
-
+ 答题卡
交卷
diff --git a/test_mini/utils/util.js b/test_mini/utils/util.js
index 3cc2ba3..2cbf163 100644
--- a/test_mini/utils/util.js
+++ b/test_mini/utils/util.js
@@ -6,7 +6,7 @@ const formatTime = date => {
const minute = date.getMinutes()
const second = date.getSeconds()
- return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
+ return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}
const formatNumber = n => {
diff --git a/test_server/crm/migrations/0007_auto_20200320_1726.py b/test_server/crm/migrations/0007_auto_20200320_1726.py
new file mode 100644
index 0000000..73d5dd1
--- /dev/null
+++ b/test_server/crm/migrations/0007_auto_20200320_1726.py
@@ -0,0 +1,39 @@
+# Generated by Django 3.0.4 on 2020-03-20 09:26
+
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('question', '0007_auto_20200319_0846'),
+ ('crm', '0006_auto_20200310_1531'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='consumer',
+ name='is_paid',
+ ),
+ migrations.CreateModel(
+ name='PaySubject',
+ 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='删除标记')),
+ ('consumer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='crm.Consumer')),
+ ('subject', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='question.Questioncat')),
+ ],
+ options={
+ 'abstract': False,
+ },
+ ),
+ migrations.AddField(
+ model_name='consumer',
+ name='subjects',
+ field=models.ManyToManyField(through='crm.PaySubject', to='question.Questioncat', verbose_name='付费学科'),
+ ),
+ ]
diff --git a/test_server/crm/models.py b/test_server/crm/models.py
index a0edfc0..1fa0aa2 100644
--- a/test_server/crm/models.py
+++ b/test_server/crm/models.py
@@ -1,9 +1,10 @@
from django.db import models
import django.utils.timezone as timezone
-from rbac.models import CommonModel
+from rbac.models import SoftCommonModel, CommonModel
+from question.models import Questioncat
# Create your models here.
-class Company(CommonModel):
+class Company(SoftCommonModel):
"""
客户企业
"""
@@ -17,7 +18,7 @@ class Company(CommonModel):
def __str__(self):
return self.name
-class Consumer(CommonModel):
+class Consumer(SoftCommonModel):
"""
学员
"""
@@ -27,7 +28,7 @@ class Consumer(CommonModel):
openid = models.CharField(max_length=200, verbose_name="openid", null=True, blank=True, unique=True)
avatar = models.CharField(default="/media/default/avatar.png",max_length=1000, null=True, blank=True, verbose_name="头像")
nickname = models.CharField(max_length=200, verbose_name="昵称", null=True, blank=True)
- is_paid = models.BooleanField(default=False,verbose_name="是否付费")
+ subjects = models.ManyToManyField(Questioncat, verbose_name="付费学科", through="PaySubject")
class Meta:
@@ -35,4 +36,11 @@ class Consumer(CommonModel):
verbose_name_plural = verbose_name
def __str__(self):
- return self.name
\ No newline at end of file
+ return self.name
+
+class PaySubject(CommonModel):
+ '''
+ 付费学科关联表
+ '''
+ consumer = models.ForeignKey(Consumer, on_delete=models.CASCADE)
+ subject = models.ForeignKey(Questioncat, on_delete=models.CASCADE)
\ No newline at end of file
diff --git a/test_server/crm/serializers.py b/test_server/crm/serializers.py
index 3f95d52..d439e61 100644
--- a/test_server/crm/serializers.py
+++ b/test_server/crm/serializers.py
@@ -24,3 +24,15 @@ class ConsumerSerializer(serializers.ModelSerializer):
class Meta:
model = Consumer
fields = '__all__'
+ depth = 1
+
+class ConsumerCUSerializer(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)
+
+ class Meta:
+ model = Consumer
+ fields = '__all__'
\ No newline at end of file
diff --git a/test_server/crm/views.py b/test_server/crm/views.py
index 4f4c288..8ebf927 100644
--- a/test_server/crm/views.py
+++ b/test_server/crm/views.py
@@ -14,9 +14,10 @@ import json
from utils.custom import CommonPagination
from rbac.permission import RbacPermission
-from .models import Company, Consumer
-from .serializers import CompanySerializer, ConsumerSerializer
+from .models import Company, Consumer, PaySubject
+from .serializers import CompanySerializer, ConsumerSerializer, ConsumerCUSerializer
from server import settings
+from question.models import Questioncat
appid = 'wx5c39b569f01c27db'
secret = '68762892f8df2b4a0b1940c5250a8dc0'
@@ -70,9 +71,14 @@ class ConsumerViewSet(ModelViewSet):
ordering_fields = ('id',)
ordering = ['id']
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
- filterset_fields = ('is_paid','company')
+ filterset_fields = ('company',)
search_fields = ('^name',)
+ def get_serializer_class(self):
+ if self.action == 'list':
+ return ConsumerSerializer
+ else:
+ return ConsumerCUSerializer
def destroy(self, request, *args, **kwargs): #逻辑删除
instance = self.get_object()
@@ -125,8 +131,10 @@ class ConsumerViewSet(ModelViewSet):
obj.name = name
obj.username = username
obj.company = companyobj
- obj.is_paid = True
obj.save()
+ subjects = Questioncat.objects.filter(is_subject=True,is_delete=False)
+ if subjects.exists():
+ PaySubject.objects.create(subject=subjects.first(), consumer=obj)
i = i + 1
if consumerdict:
return {"code":206,"data":consumerdict,"msg":"导入部分成功"}
diff --git a/test_server/examtest/migrations/0008_auto_20200319_1827.py b/test_server/examtest/migrations/0008_auto_20200319_1827.py
index 89ec25f..8bb176e 100644
--- a/test_server/examtest/migrations/0008_auto_20200319_1827.py
+++ b/test_server/examtest/migrations/0008_auto_20200319_1827.py
@@ -50,7 +50,7 @@ class Migration(migrations.Migration):
field=models.FloatField(default=0, verbose_name='判断分数'),
),
migrations.CreateModel(
- name='MoniTest',
+ name='ExamTest',
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='创建时间')),
@@ -73,8 +73,8 @@ class Migration(migrations.Migration):
),
migrations.AddField(
model_name='answerdetail',
- name='monitest',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='examtest.MoniTest'),
+ name='examtest',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='examtest.ExamTest'),
),
migrations.AddField(
model_name='answerdetail',
diff --git a/test_server/examtest/migrations/0009_auto_20200319_1850.py b/test_server/examtest/migrations/0009_auto_20200319_1850.py
index 50d129f..ba19d56 100644
--- a/test_server/examtest/migrations/0009_auto_20200319_1850.py
+++ b/test_server/examtest/migrations/0009_auto_20200319_1850.py
@@ -29,7 +29,7 @@ class Migration(migrations.Migration):
options={'verbose_name': '答题记录', 'verbose_name_plural': '答题记录'},
),
migrations.AlterModelOptions(
- name='monitest',
+ name='examtest',
options={'verbose_name': '自助模考', 'verbose_name_plural': '自助模考'},
),
]
diff --git a/test_server/examtest/migrations/0010_testrule_is_pass.py b/test_server/examtest/migrations/0010_testrule_is_pass.py
new file mode 100644
index 0000000..b830ded
--- /dev/null
+++ b/test_server/examtest/migrations/0010_testrule_is_pass.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.4 on 2020-03-20 03:12
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('examtest', '0009_auto_20200319_1850'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='testrule',
+ name='is_pass',
+ field=models.BooleanField(default=True, verbose_name='是否通过'),
+ ),
+ ]
diff --git a/test_server/examtest/migrations/0011_auto_20200320_1115.py b/test_server/examtest/migrations/0011_auto_20200320_1115.py
new file mode 100644
index 0000000..b27fe64
--- /dev/null
+++ b/test_server/examtest/migrations/0011_auto_20200320_1115.py
@@ -0,0 +1,42 @@
+# Generated by Django 3.0.4 on 2020-03-20 03:15
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('examtest', '0010_testrule_is_pass'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='testrule',
+ name='is_pass',
+ ),
+ migrations.AddField(
+ model_name='examtest',
+ name='is_pass',
+ field=models.BooleanField(default=True, verbose_name='是否通过'),
+ ),
+ migrations.AddField(
+ model_name='examtest',
+ name='total_score',
+ field=models.FloatField(default=0, verbose_name='总分'),
+ ),
+ migrations.AlterField(
+ model_name='examtest',
+ name='score',
+ field=models.FloatField(default=0, verbose_name='得分'),
+ ),
+ migrations.AlterField(
+ model_name='testrule',
+ name='pass_score',
+ field=models.FloatField(default=0, verbose_name='及格分数'),
+ ),
+ migrations.AlterField(
+ model_name='testrule',
+ name='total_score',
+ field=models.FloatField(default=0, verbose_name='满分'),
+ ),
+ ]
diff --git a/test_server/examtest/migrations/0012_auto_20200320_1439.py b/test_server/examtest/migrations/0012_auto_20200320_1439.py
new file mode 100644
index 0000000..032e6ed
--- /dev/null
+++ b/test_server/examtest/migrations/0012_auto_20200320_1439.py
@@ -0,0 +1,50 @@
+# Generated by Django 3.0.4 on 2020-03-20 06:39
+
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('examtest', '0011_auto_20200320_1115'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Paper',
+ 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='删除标记')),
+ ('name', models.CharField(max_length=200, verbose_name='名称')),
+ ],
+ options={
+ 'abstract': False,
+ },
+ ),
+ migrations.DeleteModel(
+ name='PaperTest',
+ ),
+ migrations.AlterModelOptions(
+ name='examtest',
+ options={'verbose_name': '考试表', 'verbose_name_plural': '考试表'},
+ ),
+ migrations.AlterField(
+ model_name='examtest',
+ name='rule',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='examtest.TestRule', verbose_name='所用规则'),
+ ),
+ migrations.AlterField(
+ model_name='examtest',
+ name='type',
+ field=models.CharField(choices=[('自助模考', '自助模考'), ('押卷模考', '押卷模考')], default='自助模考', max_length=50, verbose_name='考试类型'),
+ ),
+ migrations.AddField(
+ model_name='examtest',
+ name='paper',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='examtest.Paper', verbose_name='所用试卷'),
+ ),
+ ]
diff --git a/test_server/examtest/models.py b/test_server/examtest/models.py
index 53df816..9283be5 100644
--- a/test_server/examtest/models.py
+++ b/test_server/examtest/models.py
@@ -1,11 +1,11 @@
from django.db import models
-from rbac.models import CommonModel
+from rbac.models import SoftCommonModel, CommonModel
from django.contrib.postgres.fields import JSONField, ArrayField
from question.models import Questioncat, Question
from crm.models import Consumer
# Create your models here.
-class TestRule(CommonModel):
+class TestRule(SoftCommonModel):
name = models.CharField(max_length=200, unique=True, verbose_name='名称')
desc = models.TextField(verbose_name='描述', default='')
subject = models.ForeignKey(Questioncat, blank=True, null=True, on_delete=models.CASCADE, verbose_name='所属学科', related_name='subject')
@@ -17,8 +17,9 @@ class TestRule(CommonModel):
panduan_count = models.IntegerField(default=0, verbose_name='判断数量')
panduan_score = models.FloatField(default=0, verbose_name='判断分数')
limit = models.IntegerField(default=0, verbose_name='限时(分钟)')
- total_score = models.IntegerField(default=0, verbose_name='满分')
- pass_score = models.IntegerField(default=0, verbose_name='及格分数')
+ total_score = models.FloatField(default=0, verbose_name='满分')
+ pass_score = models.FloatField(default=0, verbose_name='及格分数')
+
class Meta:
verbose_name = '出题规则'
@@ -27,31 +28,38 @@ class TestRule(CommonModel):
def __str__(self):
return self.name
-class PaperTest(CommonModel):
- pass
- class Meta:
- verbose_name = '押题模考'
- verbose_name_plural = verbose_name
-
-class MoniTest(CommonModel):
+class Paper(SoftCommonModel):
name = models.CharField(max_length=200, verbose_name='名称')
- type = models.CharField(max_length=50, default='自助模考',verbose_name='考试类型')
+
+class ExamTest(CommonModel):
+ '''
+ 硬删除
+ '''
+ type_choices = (
+ ('自助模考', '自助模考'),
+ ('押卷模考', '押卷模考'),
+ )
+ name = models.CharField(max_length=200, verbose_name='名称')
+ type = models.CharField(max_length=50, default='自助模考',choices = type_choices, verbose_name='考试类型')
limit = models.IntegerField(default=0, verbose_name='限时(分钟)')
- rule = models.ForeignKey(TestRule, on_delete=models.CASCADE, verbose_name='出题规则')
+ rule = models.ForeignKey(TestRule, on_delete=models.CASCADE, verbose_name='所用规则', null=True, blank=True)
+ paper = models.ForeignKey(Paper, on_delete=models.CASCADE, verbose_name='所用试卷', null=True, blank=True)
consumer = models.ForeignKey(Consumer, on_delete=models.CASCADE, verbose_name='模考人')
- score = models.IntegerField(default=0, verbose_name='得分')
+ total_score = models.FloatField(default=0, verbose_name='总分')
+ score = models.FloatField(default=0, verbose_name='得分')
took = models.IntegerField(default=0, verbose_name='耗时(秒)')
start_time = models.DateTimeField(verbose_name='开始答题时间')
end_time = models.DateTimeField(verbose_name='结束答题时间')
detail = models.ManyToManyField(Question, related_name='答题记录', through='AnswerDetail')
+ is_pass = models.BooleanField(default=True, verbose_name='是否通过')
class Meta:
- verbose_name = '自助模考'
+ verbose_name = '考试表'
verbose_name_plural = verbose_name
-class AnswerDetail(CommonModel):
- monitest = models.ForeignKey(MoniTest, on_delete=models.CASCADE)
+class AnswerDetail(SoftCommonModel):
+ examtest = models.ForeignKey(ExamTest, on_delete=models.CASCADE)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
user_answer = JSONField()
score = models.FloatField(default=0, verbose_name='本题得分')
diff --git a/test_server/examtest/serializers.py b/test_server/examtest/serializers.py
index 4f6ca3b..f39f879 100644
--- a/test_server/examtest/serializers.py
+++ b/test_server/examtest/serializers.py
@@ -1,6 +1,7 @@
from rest_framework import serializers
from question.models import Questioncat
-from .models import TestRule, MoniTest
+from crm.models import Consumer
+from .models import TestRule, ExamTest, AnswerDetail
@@ -41,12 +42,36 @@ class MoniTestSerializer(serializers.ModelSerializer):
"""
自助模考序列化
"""
- start_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
- end_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
+ start_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
+ end_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
+ consumer = serializers.PrimaryKeyRelatedField(queryset=Consumer.objects.all(), required=False)
+ rule = serializers.PrimaryKeyRelatedField(queryset=TestRule.objects.all(), required=True)
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)
class Meta:
- model = MoniTest
+ model = ExamTest
fields = '__all__'
-
+
+class ExamTestListSerializer(serializers.ModelSerializer):
+ """
+ 考试列表序列化
+ """
+ start_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
+ end_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
+ 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)
+ class Meta:
+ model = ExamTest
+ fields = '__all__'
+
+class AnswerDetailSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = AnswerDetail
+ fields = '__all__'
+ depth = 1
+
+class AnswerDetailCreateSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = AnswerDetail
+ fields = '__all__'
diff --git a/test_server/examtest/urls.py b/test_server/examtest/urls.py
index 2f8505e..de3e18c 100644
--- a/test_server/examtest/urls.py
+++ b/test_server/examtest/urls.py
@@ -1,5 +1,5 @@
from django.urls import path,include
-from .views import TestRuleViewSet, MoniTestView
+from .views import TestRuleViewSet, MoniTestView, MyExamTestView, AnswerDetailView
from rest_framework import routers
@@ -8,5 +8,7 @@ router.register('testrule', TestRuleViewSet, basename="testrule")
urlpatterns = [
path('monitest/',MoniTestView.as_view()),
+ path('myexamtest/',MyExamTestView.as_view()),
+ path('answerdetail/', AnswerDetailView.as_view()),
path('', include(router.urls)),
]
diff --git a/test_server/examtest/views.py b/test_server/examtest/views.py
index 631d0d9..bc4d864 100644
--- a/test_server/examtest/views.py
+++ b/test_server/examtest/views.py
@@ -15,60 +15,65 @@ from utils.custom import CommonPagination
from rbac.permission import RbacPermission
from question.models import Question
from question.serializers import QuestionSerializer
-from .models import TestRule
-from .serializers import TestRuleSerializer, TestRuleListSerializer, TestRuleCreateSerializer, MoniTestSerializer
+from .models import TestRule, ExamTest, AnswerDetail
+from .serializers import TestRuleSerializer, TestRuleListSerializer, TestRuleCreateSerializer, MoniTestSerializer, AnswerDetailSerializer, ExamTestListSerializer, AnswerDetailCreateSerializer
from server import settings
from crm.authentication import ConsumerTokenAuthentication
+from utils.custom import CommonPagination
# Create your views here.
class MoniTestView(APIView):
authentication_classes = [ConsumerTokenAuthentication]
permission_classes = []
-
def post(self, request, *args, **kwargs):
- data = request.data
- pass
- def get(self, request, *args, **kwargs):
- '''
- 生成模拟考试
- '''
- if request.query_params.get('rule', None):
- ret = {}
- testrule = TestRule.objects.get(id = request.query_params.get('rule'))
- ret['name'] = '自助模考' + datetime.now().strftime('%Y%m%d%H%M')
- ret['type'] = '自助模考' # 自助模拟考试
- ret['rule'] = testrule.id
- ret['limit'] = testrule.limit
- ret['total_score'] = testrule.total_score
- ret['pass_score'] = testrule.pass_score
- ret['danxuan_count'] = testrule.danxuan_count
- ret['danxuan_score'] = testrule.danxuan_score
- ret['duoxuan_count'] = testrule.duoxuan_count
- ret['duoxuan_score'] = testrule.duoxuan_score
- ret['panduan_count'] = testrule.panduan_count
- ret['panduan_score'] = testrule.panduan_score
- question_queryset = Question.objects.none()
- queryset = Question.objects.filter(is_delete=0,questioncat__in = testrule.questioncat.all())
- if ret['danxuan_count']:
- danxuan = queryset.filter(type='单选').order_by('?')[:ret['danxuan_count']]
- question_queryset = question_queryset | danxuan
- if ret['duoxuan_count']:
- duoxuan = queryset.filter(type='多选').order_by('?')[:ret['duoxuan_count']]
- question_queryset = question_queryset | duoxuan
- if ret['panduan_count']:
- panduan = queryset.filter(type='判断').order_by('?')[:ret['panduan_count']]
- question_queryset = question_queryset | panduan
- questions = QuestionSerializer(instance=question_queryset.order_by('type'),many=True).data
- for i in questions:
- if i['type'] == 1:
- i['total_score'] = ret['danxuan_score']
- elif i['type'] == 2:
- i['total_score'] = ret['duoxuan_score']
+ serializer = MoniTestSerializer(data = request.data)
+ if serializer.is_valid():
+ instance = serializer.save(consumer = request.user)
+ if 'questions' in request.data:
+ questions = []
+ for i in request.data['questions']:
+ question = {}
+ question['question'] = i['id']
+ question['examtest'] = instance.id
+ question['score'] = i['score']
+ if 'user_answer' in i:
+ question['user_answer'] = i['user_answer']
+ question['is_right'] = i['is_right']
+ questions.append(question)
+ serializer_detail = AnswerDetailCreateSerializer(data=questions, many=True)
+ if serializer_detail.is_valid():
+ serializer_detail.save()
+ return Response(MoniTestSerializer(instance).data,status=status.HTTP_200_OK)
else:
- i['total_score'] = ret['panduan_score']
- ret['questions'] = questions
- return Response(ret)
+ return Response(serializer_detail.errors)
+
+ else:
+ return Response({'error':'答题记录不存在'})
+ else:
+ return Response(serializer.errors)
+
+
+class MyExamTestView(APIView):
+ authentication_classes = [ConsumerTokenAuthentication]
+ permission_classes = []
+ def get(self, request, *args, **kwargs):
+ queryset = ExamTest.objects.filter(consumer=request.user)
+ pg = CommonPagination()
+ p = pg.paginate_queryset(queryset=queryset,request=request,view=self)
+ serializer = ExamTestListSerializer(instance=p,many=True)
+ return pg.get_paginated_response(serializer.data)
+
+
+class AnswerDetailView(APIView):
+ authentication_classes = []
+ permission_classes = []
+ def get(self, request, *args, **kwargs):
+ queryset = AnswerDetail.objects.all()
+ if request.query_params.get('examtest', None):
+ queryset = queryset.filter(examtest=request.query_params.get('examtest'))
+ serializer = AnswerDetailSerializer(instance=queryset,many=True)
+ return Response(serializer.data)
@@ -114,4 +119,46 @@ class TestRuleViewSet(ModelViewSet):
"""
if self.request.method == 'GET':
self.permission_classes = []
- return [permission() for permission in self.permission_classes]
\ No newline at end of file
+ return [permission() for permission in self.permission_classes]
+
+ @action(methods=['get'], detail=True, permission_classes=[IsAuthenticated],
+ url_path='monitest', url_name='gen_monitest')
+ def monitest(self, request, pk=None):
+ '''
+ 生成自助模拟考试
+ '''
+ ret = {}
+ testrule = self.get_object()
+ ret['name'] = '自助模考' + datetime.now().strftime('%Y%m%d%H%M')
+ ret['type'] = '自助模考' # 自助模拟考试
+ ret['rule'] = testrule.id
+ ret['limit'] = testrule.limit
+ ret['total_score'] = testrule.total_score
+ ret['pass_score'] = testrule.pass_score
+ ret['danxuan_count'] = testrule.danxuan_count
+ ret['danxuan_score'] = testrule.danxuan_score
+ ret['duoxuan_count'] = testrule.duoxuan_count
+ ret['duoxuan_score'] = testrule.duoxuan_score
+ ret['panduan_count'] = testrule.panduan_count
+ ret['panduan_score'] = testrule.panduan_score
+ question_queryset = Question.objects.none()
+ queryset = Question.objects.filter(is_delete=0,questioncat__in = testrule.questioncat.all())
+ if ret['danxuan_count']:
+ danxuan = queryset.filter(type='单选').order_by('?')[:ret['danxuan_count']]
+ question_queryset = question_queryset | danxuan
+ if ret['duoxuan_count']:
+ duoxuan = queryset.filter(type='多选').order_by('?')[:ret['duoxuan_count']]
+ question_queryset = question_queryset | duoxuan
+ if ret['panduan_count']:
+ panduan = queryset.filter(type='判断').order_by('?')[:ret['panduan_count']]
+ question_queryset = question_queryset | panduan
+ questions = QuestionSerializer(instance=question_queryset.order_by('type'),many=True).data
+ for i in questions:
+ if i['type'] == 1:
+ i['total_score'] = ret['danxuan_score']
+ elif i['type'] == 2:
+ i['total_score'] = ret['duoxuan_score']
+ else:
+ i['total_score'] = ret['panduan_score']
+ ret['questions'] = questions
+ return Response(ret)
\ No newline at end of file
diff --git a/test_server/media/20200320/7e69b28c-6a90-11ea-8b16-90cdb685c056.xlsx b/test_server/media/20200320/7e69b28c-6a90-11ea-8b16-90cdb685c056.xlsx
new file mode 100644
index 0000000..a3867d1
Binary files /dev/null and b/test_server/media/20200320/7e69b28c-6a90-11ea-8b16-90cdb685c056.xlsx differ
diff --git a/test_server/media/20200320/a045ee7e-6a90-11ea-9c68-90cdb685c056.xlsx b/test_server/media/20200320/a045ee7e-6a90-11ea-9c68-90cdb685c056.xlsx
new file mode 100644
index 0000000..917c10f
Binary files /dev/null and b/test_server/media/20200320/a045ee7e-6a90-11ea-9c68-90cdb685c056.xlsx differ
diff --git a/test_server/question/models.py b/test_server/question/models.py
index 8952115..15c00ce 100644
--- a/test_server/question/models.py
+++ b/test_server/question/models.py
@@ -1,10 +1,10 @@
from django.db import models
-from rbac.models import CommonModel
+from rbac.models import SoftCommonModel
from django.contrib.postgres.fields import JSONField, ArrayField
# Create your models here.
-class Questioncat(CommonModel):
+class Questioncat(SoftCommonModel):
name = models.CharField(max_length=200, unique=True, verbose_name='名称')
pid = models.ForeignKey('self', verbose_name='父', null=True, blank=True, on_delete=models.CASCADE, related_name='questioncatpid')
is_subject = models.BooleanField(default=False, verbose_name='是否是学科')
@@ -20,7 +20,7 @@ class Questioncat(CommonModel):
return self.questioncat.count()
-class Question(CommonModel):
+class Question(SoftCommonModel):
type_choices = (
('单选', '单选'),
('多选', '多选'),
diff --git a/test_server/rbac/models.py b/test_server/rbac/models.py
index 06c57d7..5acf02a 100644
--- a/test_server/rbac/models.py
+++ b/test_server/rbac/models.py
@@ -13,7 +13,7 @@ class SoftDeletManager(models.Manager):
'''
def get_queryset(self):
"""
- 在这里处理一下QuerySet, 然后返回没被标记位is_deleted的QuerySet
+ 在这里处理一下QuerySet, 然后返回没被标记位is_delete的QuerySet
"""
kwargs = {'model': self.model, 'using': self._db}
if hasattr(self, '_hints'):
@@ -21,7 +21,7 @@ class SoftDeletManager(models.Manager):
return self._queryset_class(**kwargs).filter(is_delete=False)
-class CommonModel(models.Model):
+class SoftCommonModel(models.Model):
create_time = models.DateTimeField(default=timezone.now, verbose_name='创建时间', help_text='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间', help_text='修改时间')
is_delete = models.BooleanField(default=False, verbose_name='删除标记', help_text='删除标记')
@@ -39,10 +39,18 @@ class CommonModel(models.Model):
self.is_delete = True
self.save(using=using)
else:
- return super(CommonModel, self).delete(using=using, *args, **kwargs)
+ return super(SoftCommonModel, self).delete(using=using, *args, **kwargs)
+
+class CommonModel(models.Model):
+ create_time = models.DateTimeField(default=timezone.now, verbose_name='创建时间', help_text='创建时间')
+ update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间', help_text='修改时间')
+ is_delete = models.BooleanField(default=False, verbose_name='删除标记', help_text='删除标记')
+
+ class Meta:
+ abstract = True
-class Menu(CommonModel):
+class Menu(SoftCommonModel):
"""
功能权限:目录,菜单,权限
"""
@@ -68,7 +76,7 @@ class Menu(CommonModel):
ordering = ['id']
-class Role(CommonModel):
+class Role(SoftCommonModel):
"""
角色
"""
@@ -83,7 +91,7 @@ class Role(CommonModel):
def __str__(self):
return self.name
-class Organization(CommonModel):
+class Organization(SoftCommonModel):
"""
组织架构
"""