From 582590b6dbc9f0bd5efa4d2b6eb11311f5c71dcc Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 3 Jun 2019 17:18:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=89=E5=85=A8=E9=A2=84=E8=AD=A6=E6=A8=A1?= =?UTF-8?q?=E6=8B=9F=E7=BB=83=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.js | 19 +- app.json | 20 +- components/footer/footer.wxml | 3 +- components/footer/footer.wxss | 2 +- pages/bind/binduser.js | 2 +- pages/examtest/detail.js | 144 +++++++++++ pages/examtest/detail.json | 4 + pages/examtest/detail.wxml | 52 ++++ pages/examtest/detail.wxss | 18 ++ pages/examtest/index.js | 172 +++++++++++++ pages/examtest/index.json | 5 + pages/examtest/index.wxml | 53 ++++ pages/examtest/index.wxss | 13 + pages/examtest/main.js | 323 ++++++++++++++++++++++++ pages/examtest/main.json | 4 + pages/examtest/main.wxml | 50 ++++ pages/examtest/main.wxss | 18 ++ pages/examtest/note.js | 86 +++++++ pages/examtest/note.json | 4 + pages/examtest/note.wxml | 22 ++ pages/examtest/note.wxss | 4 + pages/examtest/result.js | 83 +++++++ pages/examtest/result.json | 4 + pages/examtest/result.wxml | 26 ++ pages/examtest/result.wxss | 8 + pages/examtest/sheet.js | 87 +++++++ pages/examtest/sheet.json | 4 + pages/examtest/sheet.wxml | 13 + pages/examtest/sheet.wxss | 21 ++ pages/exercise/index.js | 147 +++++++++++ pages/exercise/index.json | 3 + pages/exercise/index.wxml | 17 ++ pages/exercise/index.wxss | 8 + pages/exercise/main.js | 247 +++++++++++++++++++ pages/exercise/main.json | 4 + pages/exercise/main.wxml | 57 +++++ pages/exercise/main.wxss | 18 ++ pages/images/examtest.png | Bin 0 -> 1295 bytes pages/images/exercise.png | Bin 0 -> 582 bytes pages/images/file.png | Bin 0 -> 638 bytes pages/images/operation.png | Bin 1419 -> 2731 bytes pages/images/safecert.png | Bin 0 -> 9186 bytes pages/index/index.wxml | 11 + pages/main/main.js | 56 ++++- pages/main/main.wxml | 101 ++++---- pages/notice/detail.js | 8 +- pages/notice/detail.wxml | 2 +- pages/observe/observe.wxml | 10 +- pages/operation/list.js | 83 +++++++ pages/operation/list.json | 3 + pages/operation/list.wxml | 14 ++ pages/operation/list.wxss | 5 + pages/operation/operation.js | 57 +---- pages/operation/operation.wxml | 153 ++++++------ pages/operation/operationadd.js | 4 +- pages/operation/operationdetail.json | 3 +- pages/public/detail.js | 7 +- pages/public/detail.wxml | 4 +- pages/questioncat/ArrayUtils.js | 22 ++ pages/questioncat/index.js | 351 +++++++++++++++++++++++++++ pages/questioncat/index.json | 5 + pages/questioncat/index.wxml | 22 ++ pages/questioncat/index.wxss | 82 +++++++ pages/safecert/detail.js | 87 +++++++ pages/safecert/detail.json | 3 + pages/safecert/detail.wxml | 72 ++++++ pages/safecert/detail.wxss | 1 + pages/safecert/index.js | 170 +++++++++++++ pages/safecert/index.json | 5 + pages/safecert/index.wxml | 15 ++ pages/safecert/index.wxss | 0 pages/suggest/add.js | 8 +- pages/train/add.js | 4 + pages/train/check.js | 152 ++++++++++++ pages/train/check.json | 4 + pages/train/check.wxml | 47 ++++ pages/train/check.wxss | 5 + pages/train/detail.js | 148 +++++++++++ pages/train/detail.json | 4 + pages/train/detail.wxml | 161 ++++++++++++ pages/train/detail.wxss | 13 + pages/train/qrcode.js | 112 +++++++++ pages/train/qrcode.json | 4 + pages/train/qrcode.wxml | 51 ++++ pages/train/qrcode.wxss | 4 + pages/train/train.js | 17 +- pages/train/train.wxml | 173 +++++++------ pages/trouble/trouble.js | 59 +++-- pages/trouble/trouble.wxml | 187 +++++++------- pages/trouble/trouble.wxss | 1 + pages/userSelect/userSelect.wxml | 3 +- pages/userSelect/userSelect.wxss | 2 +- project.config.json | 2 + sitemap.json | 7 + utils/util.js | 25 +- utils/weapp.qrcode.esm.js | 5 + weui.wxss | 2 +- 97 files changed, 3909 insertions(+), 412 deletions(-) create mode 100644 pages/examtest/detail.js create mode 100644 pages/examtest/detail.json create mode 100644 pages/examtest/detail.wxml create mode 100644 pages/examtest/detail.wxss create mode 100644 pages/examtest/index.js create mode 100644 pages/examtest/index.json create mode 100644 pages/examtest/index.wxml create mode 100644 pages/examtest/index.wxss create mode 100644 pages/examtest/main.js create mode 100644 pages/examtest/main.json create mode 100644 pages/examtest/main.wxml create mode 100644 pages/examtest/main.wxss create mode 100644 pages/examtest/note.js create mode 100644 pages/examtest/note.json create mode 100644 pages/examtest/note.wxml create mode 100644 pages/examtest/note.wxss create mode 100644 pages/examtest/result.js create mode 100644 pages/examtest/result.json create mode 100644 pages/examtest/result.wxml create mode 100644 pages/examtest/result.wxss create mode 100644 pages/examtest/sheet.js create mode 100644 pages/examtest/sheet.json create mode 100644 pages/examtest/sheet.wxml create mode 100644 pages/examtest/sheet.wxss create mode 100644 pages/exercise/index.js create mode 100644 pages/exercise/index.json create mode 100644 pages/exercise/index.wxml create mode 100644 pages/exercise/index.wxss create mode 100644 pages/exercise/main.js create mode 100644 pages/exercise/main.json create mode 100644 pages/exercise/main.wxml create mode 100644 pages/exercise/main.wxss create mode 100644 pages/images/examtest.png create mode 100644 pages/images/exercise.png create mode 100644 pages/images/file.png create mode 100644 pages/images/safecert.png create mode 100644 pages/operation/list.js create mode 100644 pages/operation/list.json create mode 100644 pages/operation/list.wxml create mode 100644 pages/operation/list.wxss create mode 100644 pages/questioncat/ArrayUtils.js create mode 100644 pages/questioncat/index.js create mode 100644 pages/questioncat/index.json create mode 100644 pages/questioncat/index.wxml create mode 100644 pages/questioncat/index.wxss create mode 100644 pages/safecert/detail.js create mode 100644 pages/safecert/detail.json create mode 100644 pages/safecert/detail.wxml create mode 100644 pages/safecert/detail.wxss create mode 100644 pages/safecert/index.js create mode 100644 pages/safecert/index.json create mode 100644 pages/safecert/index.wxml create mode 100644 pages/safecert/index.wxss create mode 100644 pages/train/check.js create mode 100644 pages/train/check.json create mode 100644 pages/train/check.wxml create mode 100644 pages/train/check.wxss create mode 100644 pages/train/detail.js create mode 100644 pages/train/detail.json create mode 100644 pages/train/detail.wxml create mode 100644 pages/train/detail.wxss create mode 100644 pages/train/qrcode.js create mode 100644 pages/train/qrcode.json create mode 100644 pages/train/qrcode.wxml create mode 100644 pages/train/qrcode.wxss create mode 100644 sitemap.json create mode 100644 utils/weapp.qrcode.esm.js diff --git a/app.js b/app.js index c08a124..71dd99a 100644 --- a/app.js +++ b/app.js @@ -1,21 +1,8 @@ //app.js App({ onLaunch: function () { - // 展示本地存储能力 - //var logs = wx.getStorageSync('logs') || [] - //logs.unshift(Date.now()) - //wx.setStorageSync('logs', logs) - // wx.checkSession({ - // success() { - // //session_key 未过期,并且在本生命周期一直有效 - // console.log(wx.getStorageSync("sessionid")) - // }, - // fail() { - // // session_key 已经失效,需要重新执行登录流程 - // // 登录 - // } - // }) - this.mplogin(); + var that = this + that.mplogin() }, mplogin: function () { var that = this; @@ -93,7 +80,7 @@ App({ globalData: { userInfo: null, //serverUrl: 'https://safeyun.ctcshe.com/', - serverUrl:'http://127.0.0.1:8000/', + serverUrl: 'http://127.0.0.1:8000/', //serverUrl: 'http://192.168.0.102:8000/', //serverUrl:'http://10.7.100.250:8000/', isaqy: 0 diff --git a/app.json b/app.json index 1d6df9f..c9a2d90 100644 --- a/app.json +++ b/app.json @@ -38,7 +38,22 @@ "pages/userSelect/userSelect", "components/footer/footer", "pages/operation/operationadd", - "pages/train/add" + "pages/train/add", + "pages/train/detail", + "pages/train/check", + "pages/train/qrcode", + "pages/operation/list", + "pages/examtest/index", + "pages/examtest/note", + "pages/examtest/main", + "pages/examtest/sheet", + "pages/examtest/result", + "pages/examtest/detail", + "pages/safecert/index", + "pages/safecert/detail", + "pages/exercise/index", + "pages/questioncat/index", + "pages/exercise/main" ], "window": { "backgroundTextStyle": "light", @@ -65,5 +80,6 @@ "selectedIconPath": "image/mec.png" } ] - } + }, + "sitemapLocation": "sitemap.json" } \ No newline at end of file diff --git a/components/footer/footer.wxml b/components/footer/footer.wxml index 2d21345..924314c 100644 --- a/components/footer/footer.wxml +++ b/components/footer/footer.wxml @@ -3,4 +3,5 @@ {{item.name}} - 确定 \ No newline at end of file + 确定 + \ No newline at end of file diff --git a/components/footer/footer.wxss b/components/footer/footer.wxss index 95a6ba4..080da44 100644 --- a/components/footer/footer.wxss +++ b/components/footer/footer.wxss @@ -25,7 +25,7 @@ .text { font-size: 32rpx; color: #333; - padding: 40rpx 20rpx; + padding: 20rpx 20rpx; margin-right: 10rpx; background-color: #f5f5f5; } diff --git a/pages/bind/binduser.js b/pages/bind/binduser.js index bcd75a2..298fee5 100644 --- a/pages/bind/binduser.js +++ b/pages/bind/binduser.js @@ -26,7 +26,7 @@ Page({ if (res.statusCode === 200) { if (res.data.code == 1) { wx.showToast({}) - getApp().onLaunch() + getApp().mplogin() wx.switchTab({ url: '/pages/main/main', }) diff --git a/pages/examtest/detail.js b/pages/examtest/detail.js new file mode 100644 index 0000000..dc1c0c0 --- /dev/null +++ b/pages/examtest/detail.js @@ -0,0 +1,144 @@ +// pages/examtest/detail.js +var util = require('../../utils/util.js') +Page({ + + /** + * 页面的初始数据 + */ + data: { + }, + detaildata:{ + + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + var detailid = options.detailid + this.data.detailid = detailid + wx.showLoading({ + title: '加载中..', + }) + wx.request({ + url: getApp().globalData.serverUrl + 'api/examtestdetail?a=detail&id='+detailid, + header: { + 'content-type': 'application/json', // 默认值 + 'Cookie': wx.getStorageSync("sessionid"), + }, + success: res => { + if (res.statusCode === 200) { + wx.hideLoading() + var data = res.data + data.starttime = util.formatTime2(new Date(data.starttime)) + this.detaildata = data + this.setData({ + starttime:data.starttime, + took:data.took, + tmIndex:0, + tmtotal: data['testdetail'].length, + currentTm:data['testdetail'][0] + } + ) + this.showanswer() + } + } + }); + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + }, + next:function(){ + var that=this + var tmIndex = that.data.tmIndex +1 + that.setData({ + tmIndex:tmIndex, + currentTm:that.detaildata.testdetail[tmIndex] + }) + that.showanswer() + }, + previous: function () { + var that = this + var tmIndex = that.data.tmIndex - 1 + that.setData({ + tmIndex: tmIndex, + currentTm: that.detaildata.testdetail[tmIndex] + }) + that.showanswer() + }, + showanswer: function () { + var that = this + var currentTm = that.data.currentTm + console.log(currentTm) + var answer = currentTm.question__answer + var sorder = Object.keys(answer).sort(); + var answerChecked=[] + for (var x = 0; x < sorder.length; x++) { + if (answer[sorder[x]] != '') { + if(currentTm.userchecked!=undefined){ + var ii = currentTm.userchecked.indexOf(sorder[x]) + }else{ + ii=1 + } + if ( ii!= -1 && currentTm.question__right.indexOf(sorder[x]) != -1){ + answerChecked.push({ 'name': sorder[x] + ':' + answer[sorder[x]], 'right': true, 'checked': true }) + } else if (ii != -1){ + answerChecked.push({ 'name': sorder[x] + ':' + answer[sorder[x]], 'right': false, 'checked': true }) + } else if (currentTm.question__right.indexOf(sorder[x]) != -1){ + answerChecked.push({ 'name': sorder[x] + ':' + answer[sorder[x]], 'right': true, 'checked': false }) + }else{ + answerChecked.push({ 'name': sorder[x] + ':' + answer[sorder[x]], 'right': false, 'checked': false }) + } + + } + + } + that.setData({ 'answerChecked': answerChecked }) + }, +}) \ No newline at end of file diff --git a/pages/examtest/detail.json b/pages/examtest/detail.json new file mode 100644 index 0000000..0b34069 --- /dev/null +++ b/pages/examtest/detail.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "试卷详情" +} \ No newline at end of file diff --git a/pages/examtest/detail.wxml b/pages/examtest/detail.wxml new file mode 100644 index 0000000..a11c950 --- /dev/null +++ b/pages/examtest/detail.wxml @@ -0,0 +1,52 @@ + + + +答题耗时{{took}}分钟 + + + + + {{tmIndex+1}}. + 单选题 + 多选题 + 判断题 + ({{currentTm.score}}分) + + {{currentTm.question__title}} + + + + + + + + + 正确答案是{{currentTm.question__right}},你的答案是{{currentTm.userchecked}} + 回答正确 + 回答有误 + 解析: {{currentTm.question__resoluation}} + 解析: + + + + + + + + + + \ No newline at end of file diff --git a/pages/examtest/detail.wxss b/pages/examtest/detail.wxss new file mode 100644 index 0000000..e51debe --- /dev/null +++ b/pages/examtest/detail.wxss @@ -0,0 +1,18 @@ +.head{ + color:#fff; + background-color: cornflowerblue; +} +.txlabel{ + color:#fff; + background-color: rgb(216, 140, 0); + padding: 2px +} +.weui-btn{ + width:auto; + margin: 5px; +} +.sheet{ + color:#fff; + background-color: red; + float:right +} \ No newline at end of file diff --git a/pages/examtest/index.js b/pages/examtest/index.js new file mode 100644 index 0000000..6e9d245 --- /dev/null +++ b/pages/examtest/index.js @@ -0,0 +1,172 @@ +//var base64 = require("../images/base64"); +var sliderWidth = 96; +Page({ + data: { + page: 1, + serverUrl: getApp().globalData.serverUrl, + allyhlist: [], + tabs: ["待考", "已考"], + activeIndex: 0, + sliderOffset: 0, + sliderLeft: 0 + }, + tabClick: function (e) { + var that = this + that.setData({ + sliderOffset: e.currentTarget.offsetLeft, + activeIndex: e.currentTarget.id + }); + if (that.data.activeIndex == 0) { + that.gettodokslist(1) + that.data.todopage = 1 + } + else if (that.data.activeIndex == 1) { + that.getyklist(1) + that.data.page = 1 + } + }, + getyklist: function (page) { + var that = this; + if (page != 1) { page = that.data.page } + wx.showLoading({ + title: '加载中', + }), + wx.request({ + url: this.data.serverUrl + 'api/examtestdetail?a=listyk&rows=10&page=' + page, + header: { + 'content-type': 'application/json', // 默认值 + 'Cookie': wx.getStorageSync("sessionid"), + }, + success: res => { + if (res.statusCode === 200) { + if (res.data.rows.length == 0) { + if (page == 1) { + this.setData({ + yktotal: 0, + yklist: [] + }) + } + else { + wx.showModal({ + content: "已经到底啦!", + showCancel: false, + confirmText: "确定", + }) + } + } else { + let list + if (page == 1) { + list = res.data.rows + } else { + list = this.data.yklist.concat(res.data.rows) + } + this.setData({ + yktotal: res.data.total, + yklist: list + }) + } + } + wx.hideLoading(); + } + }); + }, + gettodokslist: function (page) { + var that = this; + if (page != 1) { page = that.data.todopage } + wx.showLoading({ + title: '加载中', + }), + wx.request({ + url: this.data.serverUrl + 'api/examtestdetail?a=listdk&rows=10&page=' + page, + header: { + 'content-type': 'application/json', // 默认值 + 'Cookie': wx.getStorageSync("sessionid"), + }, + success: res => { + if (res.statusCode === 200) { + if (res.data.rows.length == 0) { + if (page == 1) { + this.setData({ + todototal: 0, + todokslist: [] + }) + } + else { + wx.showModal({ + content: "已经到底啦!", + showCancel: false, + confirmText: "确定", + }) + } + + + } else { + let list + if (page == 1) { + list = res.data.rows + } else { + list = this.data.todokslist.concat(res.data.rows) + } + this.setData({ + todototal: res.data.total, + todokslist: list + }) + } + } + wx.hideLoading(); + } + }); + }, + onLoad: function () { + // this.setData({ + // icon: base64.icon20 + // }); + var that = this; + wx.getSystemInfo({ + success: function (res) { + that.setData({ + sliderLeft: (res.windowWidth / that.data.tabs.length - sliderWidth) / 2, + sliderOffset: res.windowWidth / that.data.tabs.length * that.data.activeIndex + }); + } + }); + }, + onShow: function () { + var that = this; + console.log(that.data.activeIndex) + if (that.data.activeIndex == 0) { + that.gettodokslist(1) + that.data.todopage = 1 + } + else if (that.data.activeIndex == 1) { + that.getyklist(1) + that.data.page = 1 + } + }, + onPullDownRefresh: function () { + var that = this; + if (that.data.activeIndex == 0) { + that.gettodokslist(1) + wx.stopPullDownRefresh(); + that.data.todopage = 1 + } + else if (that.data.activeIndex == 1) { + that.getyklist(1) + wx.stopPullDownRefresh(); + that.data.page = 1 + } + }, + onReachBottom: function () { + //上拉分页,将页码加1,然后调用分页函数 + + var that = this; + if (that.data.activeIndex == 0) { + this.data.todopage = this.data.todopage + 1; + this.gettodokslist(); + } + else if (that.data.activeIndex == 1) { + this.data.page = this.data.page + 1; + this.getyklist(); + } + }, +}); \ No newline at end of file diff --git a/pages/examtest/index.json b/pages/examtest/index.json new file mode 100644 index 0000000..2ac22d3 --- /dev/null +++ b/pages/examtest/index.json @@ -0,0 +1,5 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "在线考试", + "enablePullDownRefresh": true +} \ No newline at end of file diff --git a/pages/examtest/index.wxml b/pages/examtest/index.wxml new file mode 100644 index 0000000..e833dac --- /dev/null +++ b/pages/examtest/index.wxml @@ -0,0 +1,53 @@ + + + + + {{item}} + + + + + + + + + + \ No newline at end of file diff --git a/pages/examtest/index.wxss b/pages/examtest/index.wxss new file mode 100644 index 0000000..6d7ae6e --- /dev/null +++ b/pages/examtest/index.wxss @@ -0,0 +1,13 @@ +.weui-btn{ + width:auto; + margin: 5px; +} +.container { + background-color: #fff; + color: #939393; +} +.head{ + color:#fff; + background-color: cornflowerblue; + text-align: center; +} \ No newline at end of file diff --git a/pages/examtest/main.js b/pages/examtest/main.js new file mode 100644 index 0000000..fc0de02 --- /dev/null +++ b/pages/examtest/main.js @@ -0,0 +1,323 @@ +// pages/examtest/main.js +var util = require('../../utils/util.js') +Page({ + + /** + * 页面的初始数据 + */ + data: { + tmIndex: 0, + answerChoices:[], + ydtm:0 + }, + tmdata: { + + }, + calydtm:function(e){ + var tms = this.tmdata.tms + var ydtm = 0 + for (var i = 0, len = tms.length; i < len; ++i) { + if(tms[i].userchecked && tms[i].userchecked.length !=0){ + ydtm +=1 + } + } + this.setData({ + ydtm:ydtm + }) + }, + radioChange: function (e) { + console.log('radio发生change事件,携带value值为:', e.detail.value); + var answerChoices = this.data.answerChoices; + for (var i = 0, len = answerChoices.length; i < len; ++i) { + answerChoices[i].checked = answerChoices[i].value == e.detail.value; + } + + this.setData({ + answerChoices: answerChoices, + }); + this.tmdata.tms[this.data.tmIndex]['userchecked'] = e.detail.value + this.calydtm() + }, + checkboxChange: function (e) { + console.log('checkbox发生change事件,携带value值为:', e.detail.value); + + var answerChoices = this.data.answerChoices, values = e.detail.value; + for (var i = 0, lenI = answerChoices.length; i < lenI; ++i) { + answerChoices[i].checked = false; + + for (var j = 0, lenJ = values.length; j < lenJ; ++j) { + if (answerChoices[i].value == values[j]) { + answerChoices[i].checked = true; + break; + } + } + } + + this.setData({ + answerChoices: answerChoices, + }); + this.tmdata.tms[this.data.tmIndex]['userchecked'] = e.detail.value + this.calydtm() + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + if(options.id){ + this.setData({ + testid:options.id + }) + wx.showLoading({}) + wx.request({ + url: getApp().globalData.serverUrl + 'api/examtest?a=detailtm&id=' + options.id, + header: { + 'content-type': 'application/json', // 默认值 + 'Cookie': wx.getStorageSync("sessionid"), + }, + success: res => { + if (res.statusCode === 200) { + wx.hideLoading() + console.log(res.data) + let tms = res.data + this.tmdata = tms + console.log(tms.duration) + let mil = tms.duration * 60 * 1000 + console.log(mil) + this.begin(mil) + this.showTm(0) + this.setData({ + tmtotal: tms.tms.length, + starttime: util.formatTime(new Date()) }) + } + + } + }); + } + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + // wx.showModal({ + // title: '系统提示', + // content: '未完成答卷,是否要提交答卷!', + // confirmText: "提交", + // cancelText: "点错了", + // success: function (res) { + // if (res.confirm) { + // } else { + // this.onShow() + // } + // } + // }) + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + }, + begin: function (mil) { + var temp = formatmil(mil); + this.setData({ + countdown: temp, + }); + + if (mil < 2000) { + wx.showLoading({ + title: '时间到,正在交卷..', + }); + this.handtest() + return + }; + + setTimeout( + () => { + mil -= 1000; + this.begin(mil); + }, 1000 + ); + }, + showTm: function (index) { + var that = this + var currentTm = that.tmdata.tms[index] + console.log(currentTm) + that.setData({ 'currentTm': currentTm }) + var answer = currentTm.question__answer + var i = 0 + var x = ['A','B','C','D','E','F'] + var answerChoices = [] + for(var key in answer){ + if(answer[key]!=''){ + answerChoices.push({'name':x[i],'value':key,'checked':false}) + i = i + 1 + } + } + console.log(answerChoices) + that.setData({ 'answerChoices': answerChoices}) + }, + showChecked: function(index){ + var tm = this.tmdata.tms[index] + let choices = this.data.answerChoices + if(tm.userchecked){ + if (tm.question__type = 2) { + for (var i = 0, len = choices.length; i < len; i++) { + if (tm.userchecked.indexOf(choices[i].value) != -1) { + choices[i].checked = true + } + } + } else { + for (var i = 0, len = choices.length; i < len; i++) { + if (choices[i].value == tm.userchecked) { + choices[i].checked = true + } + } + } + this.setData({ + answerChoices: choices + }) + } + }, + next:function(){ + var that = this + var tmIndex = that.data.tmIndex+1 + that.showTm(tmIndex) + that.setData({ + tmIndex:tmIndex, + }) + that.showChecked(tmIndex) + }, + previous: function () { + var that = this + var tmIndex = that.data.tmIndex - 1 + that.showTm(tmIndex) + that.setData({ + tmIndex: tmIndex, + }) + that.showChecked(tmIndex) + }, + hand:function(){ + var that = this + if (that.data.ydtm < that.tmdata.tms.length){ + wx.showModal({ + title: '警告', + content: '答卷未完成,确定提交?', + confirmText: "确定", + cancelText: "取消", + success: function (res) { + if (res.confirm) { + that.handtest() + } + } + }) + }else{ + wx.showModal({ + content: '确定提交?', + confirmText: "确定", + cancelText: "取消", + success: function (res) { + if (res.confirm) { + that.handtest() + } + } + }) + } + }, + handtest:function(){ + var data={ + 'testid': this.data.testid, + 'starttime':this.data.starttime, + 'endtime': util.formatTime(new Date()), + 'sheet':this.tmdata.tms + } + wx.showLoading({ + title: '自动判卷中..', + }) + wx.request({ + url: getApp().globalData.serverUrl + 'api/examtestdetail?a=handtest&id=' + this.data.testid, + header: { + 'content-type': 'application/json', // 默认值 + 'Cookie': wx.getStorageSync("sessionid"), + }, + method: 'POST', + data: data, + success: res => { + if (res.statusCode === 200) { + wx.hideLoading() + wx.redirectTo({ + url: 'result?' + parseParams(res.data.data), + }) + + } + } + }); + } +}) +function formatmil(mil) { + var allSecond = Math.floor(mil / 1000); + var h = Math.floor(allSecond / 3600); + var m = Math.floor((allSecond - h * 3600) / 60); + var s = Math.floor(allSecond - h * 3600 - m * 60); + h = toTow(h); + m = toTow(m); + s = toTow(s); + return h + ":" + m + ":" + s; +} +function toTow(num) { + if (num < 10) { + return "0" + num; + } else { + return num; + } +} +function parseParams(data) { + try { + var tempArr = []; + for (var i in data) { + var key = encodeURIComponent(i); + var value = encodeURIComponent(data[i]); + tempArr.push(key + '=' + value); + } + var urlParamsStr = tempArr.join('&'); + return urlParamsStr; + } catch (err) { + return ''; + } +} \ No newline at end of file diff --git a/pages/examtest/main.json b/pages/examtest/main.json new file mode 100644 index 0000000..9c848e5 --- /dev/null +++ b/pages/examtest/main.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "考试中" +} \ No newline at end of file diff --git a/pages/examtest/main.wxml b/pages/examtest/main.wxml new file mode 100644 index 0000000..809eb2d --- /dev/null +++ b/pages/examtest/main.wxml @@ -0,0 +1,50 @@ + + + +倒计时 {{countdown}} + +答题卡: {{ydtm}}/{{tmtotal}} + + + + + + {{tmIndex+1}}. + 单选题 + 多选题 + 判断题 + ({{currentTm.score}}分) + + {{currentTm.question__title}} + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/examtest/main.wxss b/pages/examtest/main.wxss new file mode 100644 index 0000000..e51debe --- /dev/null +++ b/pages/examtest/main.wxss @@ -0,0 +1,18 @@ +.head{ + color:#fff; + background-color: cornflowerblue; +} +.txlabel{ + color:#fff; + background-color: rgb(216, 140, 0); + padding: 2px +} +.weui-btn{ + width:auto; + margin: 5px; +} +.sheet{ + color:#fff; + background-color: red; + float:right +} \ No newline at end of file diff --git a/pages/examtest/note.js b/pages/examtest/note.js new file mode 100644 index 0000000..0030b03 --- /dev/null +++ b/pages/examtest/note.js @@ -0,0 +1,86 @@ +// pages/examtest/note.js +var util = require('../../utils/util.js') +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + wx.request({ + url: getApp().globalData.serverUrl + 'api/examtest?a=detail&id='+options.examtestid, + header: { + 'content-type': 'application/json', // 默认值 + 'Cookie': wx.getStorageSync("sessionid"), + }, + success: res => { + if (res.statusCode === 200) { + let ksdata = res.data + if (ksdata.starttime != '') { ksdata.starttime = util.formatTime2(new Date(ksdata.starttime)) } + if (ksdata.endtime != '') { ksdata.endtime = util.formatTime2(new Date(ksdata.endtime)) } + this.setData(res.data) + } + } + }); + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + }, + start: function () { + wx.reLaunch({ + url: 'main?id='+this.data.id, + }) + }, +}) \ No newline at end of file diff --git a/pages/examtest/note.json b/pages/examtest/note.json new file mode 100644 index 0000000..28a2a8e --- /dev/null +++ b/pages/examtest/note.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "考试须知" +} \ No newline at end of file diff --git a/pages/examtest/note.wxml b/pages/examtest/note.wxml new file mode 100644 index 0000000..877792f --- /dev/null +++ b/pages/examtest/note.wxml @@ -0,0 +1,22 @@ + + 考试须知 + + + 1.考试详情 + 名称:{{name}} + 答卷时长:{{duration}}分钟 + 满分{{totalscore}};{{passscore}}以上通过 + {{exampaper__total.dx.num}}道单选题,{{exampaper__total.duox.num}}道多选题,{{exampaper__total.pd.num}}道判断题 + + + 2.答题须知 + 进入答题后请不要后退或返回桌面 + 用户可点击上一题/下一题进行切换答题 + 用户选择好选项后会自动跳转至下一题 + 请合理安排时间答题,可提前交卷,超时会自动提交 + + + + + + \ No newline at end of file diff --git a/pages/examtest/note.wxss b/pages/examtest/note.wxss new file mode 100644 index 0000000..5bbca33 --- /dev/null +++ b/pages/examtest/note.wxss @@ -0,0 +1,4 @@ +.weui-btn{ + width:auto; + margin: 5px; +} \ No newline at end of file diff --git a/pages/examtest/result.js b/pages/examtest/result.js new file mode 100644 index 0000000..95659d9 --- /dev/null +++ b/pages/examtest/result.js @@ -0,0 +1,83 @@ +// pages/examtest/result.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.setData({ + passcode: options.passcode, + score:options.score, + totalscore:options.totalscore, + rights:options.rights, + tmnum:options.tmnum, + detailid: options.examtestdetailid + }) + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + }, + detail:function(){ + wx.navigateTo({ + url: 'detail?detailid=' + this.data.detailid, + }) + }, + back:function(){ + wx.switchTab({ + url: '/pages/main/main' + }) + } +}) \ No newline at end of file diff --git a/pages/examtest/result.json b/pages/examtest/result.json new file mode 100644 index 0000000..3908474 --- /dev/null +++ b/pages/examtest/result.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "在线考试" +} \ No newline at end of file diff --git a/pages/examtest/result.wxml b/pages/examtest/result.wxml new file mode 100644 index 0000000..75bd39f --- /dev/null +++ b/pages/examtest/result.wxml @@ -0,0 +1,26 @@ + + + + + + + + + + 恭喜你,通过考试! + 得分{{score}},满分{{totalscore}} + 全对{{rights}}题,共{{tmnum}}题 + + + 很遗憾,下次加油! + 得分{{score}},满分{{totalscore}} + 全对{{rights}}题,共{{tmnum}}题 + + + + + + + + + \ No newline at end of file diff --git a/pages/examtest/result.wxss b/pages/examtest/result.wxss new file mode 100644 index 0000000..2285021 --- /dev/null +++ b/pages/examtest/result.wxss @@ -0,0 +1,8 @@ +.weui-btn{ + width:auto; + margin: 5px; +} +.b{ + color:red; + font-weight: bold +} \ No newline at end of file diff --git a/pages/examtest/sheet.js b/pages/examtest/sheet.js new file mode 100644 index 0000000..822418a --- /dev/null +++ b/pages/examtest/sheet.js @@ -0,0 +1,87 @@ +// pages/examtest/sheet.js + +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + + back: function (e) { + console.log(e.currentTarget.dataset.index); + var tmIndex = e.currentTarget.dataset.index + var pages = getCurrentPages(); + var prevPage = pages[pages.length - 2]; //上一个页面 + prevPage.setData({ + tmIndex:tmIndex + }) + prevPage.showTm(tmIndex) + prevPage.showChecked(tmIndex) + wx.navigateBack({ + }) + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + var pages = getCurrentPages(); + var prevPage = pages[pages.length - 2]; //上一个页面 + var tmlist = prevPage.tmdata.tms //取上页data里的数据也可以修改 + console.log(tmlist) + this.setData({ + tmlist:tmlist + }) + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/examtest/sheet.json b/pages/examtest/sheet.json new file mode 100644 index 0000000..6cfdd8d --- /dev/null +++ b/pages/examtest/sheet.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "答题卡" +} \ No newline at end of file diff --git a/pages/examtest/sheet.wxml b/pages/examtest/sheet.wxml new file mode 100644 index 0000000..05a9db7 --- /dev/null +++ b/pages/examtest/sheet.wxml @@ -0,0 +1,13 @@ + + + + + +{{index+1}} + + +{{index+1}} + + + + diff --git a/pages/examtest/sheet.wxss b/pages/examtest/sheet.wxss new file mode 100644 index 0000000..913bdd4 --- /dev/null +++ b/pages/examtest/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/pages/exercise/index.js b/pages/exercise/index.js new file mode 100644 index 0000000..0d37e7a --- /dev/null +++ b/pages/exercise/index.js @@ -0,0 +1,147 @@ +// pages/exercise/index.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + catsname:'', + start1:true, + start2:false + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + var that = this +wx.getStorage({ + key: 'questioncats', + success: function(res) { + let lst = res.data + let nst = [] + let nst1 = [] + if (lst) { + for (var i = 0; i < lst.length; i++) { + nst.push(lst[i]['name']) + nst1.push(lst[i]['id']) + } + that.setData({ + catsname: nst.join(','), + cats: nst1.join(','), + }) + } + }, +}) + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + var that=this + let lst = getApp().globalData.selectList + let nst = [] + let nst1 = [] + if (lst) { + for (var i = 0; i < lst.length; i++) { + nst.push(lst[i]['name']) + nst1.push(lst[i]['id']) + } + that.setData({ + catsname: nst.join(','), + cats: nst1.join(','), + }) + } + wx.getStorage({ + key: 'ydtms', + success: function (res) { + that.setData({ + start1: false, + start2: true + }) + }, + }) + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + }, + choosequestioncat:function(){ + wx.navigateTo({ + url: '/pages/questioncat/index', + }) + }, + start1:function(){ +if(this.data.catsname!=''){ +wx.navigateTo({ + url: 'main', +}) +}else{ + wx.showModal({ + content: '请选择题目分类!', + showCancel: false, + }) +} + }, + start2: function () { + if (this.data.catsname != '') { + wx.removeStorage({ + key: 'ydtms', + success: function(res) { + + }, + complete:function(){ + wx.navigateTo({ + url: 'main', + }) + } + }) + + } else { + wx.showModal({ + content: '请选择题目分类!', + showCancel: false, + }) + } + } +}) \ No newline at end of file diff --git a/pages/exercise/index.json b/pages/exercise/index.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/exercise/index.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/exercise/index.wxml b/pages/exercise/index.wxml new file mode 100644 index 0000000..8107526 --- /dev/null +++ b/pages/exercise/index.wxml @@ -0,0 +1,17 @@ + + + 模拟练习 + 选择题库分类进行练习。 + + + + 已选分类 + + {{catsname}} + + + + + + + \ No newline at end of file diff --git a/pages/exercise/index.wxss b/pages/exercise/index.wxss new file mode 100644 index 0000000..5adb1f8 --- /dev/null +++ b/pages/exercise/index.wxss @@ -0,0 +1,8 @@ +.button-sp-area{ + margin: 0 auto; + padding-top: 15px; + width: 60%; +} +.mini-btn{ + margin-right: 5px; +} \ No newline at end of file diff --git a/pages/exercise/main.js b/pages/exercise/main.js new file mode 100644 index 0000000..2b282a5 --- /dev/null +++ b/pages/exercise/main.js @@ -0,0 +1,247 @@ +// pages/examtest/main.js +var util = require('../../utils/util.js') +Page({ + + /** + * 页面的初始数据 + */ + data: { + tmIndex: 0, + answerChoices: [], + answerP:false + }, + tmdata: { + tms:[], + ydtms:[] + }, + radioChange: function (e) { + console.log('radio发生change事件,携带value值为:', e.detail.value); + var answerChoices = this.data.answerChoices; + for (var i = 0, len = answerChoices.length; i < len; ++i) { + answerChoices[i].checked = answerChoices[i].value == e.detail.value; + } + + this.setData({ + answerChoices: answerChoices, + }); + this.tmdata.tms[this.data.tmIndex]['userchecked'] = e.detail.value + this.setData({ + currentTm: this.tmdata.tms[this.data.tmIndex] + }) + this.showanswer() + }, + checkboxChange: function (e) { + console.log('checkbox发生change事件,携带value值为:', e.detail.value); + + var answerChoices = this.data.answerChoices, values = e.detail.value; + for (var i = 0, lenI = answerChoices.length; i < lenI; ++i) { + answerChoices[i].checked = false; + + for (var j = 0, lenJ = values.length; j < lenJ; ++j) { + if (answerChoices[i].value == values[j]) { + answerChoices[i].checked = true; + break; + } + } + } + this.tmdata.tms[this.data.tmIndex]['userchecked'] = e.detail.value + this.setData({ + answerChoices: answerChoices, + currentTm: this.tmdata.tms[this.data.tmIndex] + }); + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + var that = this + wx.getStorage({ + key: 'questioncats', + success: function (res) { + let lst = res.data + let nst = [] + let nst1 = [] + if (lst) { + for (var i = 0; i < lst.length; i++) { + nst.push(lst[i]['name']) + nst1.push(lst[i]['id']) + } + } + that.setData({ + tmlxs:nst1 + }) + wx.getStorage({ + key: 'ydtms', + success: function(res) { + that.tmdata.ydtms = res.data + that.getTms() + }, + fail:function(){ + that.getTms() + } + }) + + }, + }) + + }, + getTms: function () { + var that = this + wx.showLoading({}) + wx.request({ + url: getApp().globalData.serverUrl + 'api/question?a=exercise', + header: { + 'content-type': 'application/json', // 默认值 + 'Cookie': wx.getStorageSync("sessionid"), + }, + method: 'POST', + data: { 'tmlx': that.data.tmlxs,'ydtms':that.tmdata.ydtms }, + success: res => { + if (res.statusCode === 200) { + wx.hideLoading() + console.log(res.data) + let tms = res.data.rows + that.tmdata.tms = that.tmdata.tms.concat(tms) + that.showTm(that.data.tmIndex) //展示题目 + that.setData({ + tmtotal: res.data.total, + }) + } + + } + }); + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { +wx.setStorage({ + key: 'ydtms', + data: this.tmdata.ydtms, +}) + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + }, + showTm: function (index) { + var that = this + var currentTm = that.tmdata.tms[index] + console.log(currentTm) + that.setData({ 'currentTm': currentTm }) + var answer = currentTm.answer + var sorder = Object.keys(answer).sort(); + var answerChoices = [] + //对正确答案进行排序 + for(var i=0;ithat.tmdata.tms.length){ + that.getTms() + }else{ + that.showTm(tmIndex) + } + that.showChecked(tmIndex) + }, + previous: function () { + var that = this + var tmIndex = that.data.tmIndex - 1 + that.showTm(tmIndex) + that.setData({ + tmIndex: tmIndex, + answerP: false + }) + that.showChecked(tmIndex) + }, +}) diff --git a/pages/exercise/main.json b/pages/exercise/main.json new file mode 100644 index 0000000..6be8d7d --- /dev/null +++ b/pages/exercise/main.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "模拟练习" +} \ No newline at end of file diff --git a/pages/exercise/main.wxml b/pages/exercise/main.wxml new file mode 100644 index 0000000..ec0b92c --- /dev/null +++ b/pages/exercise/main.wxml @@ -0,0 +1,57 @@ + + + + 题量 {{tmIndex+1}}/{{tmtotal}} + + + + + {{tmIndex+1}}. + 单选题 + 多选题 + 判断题 + + {{currentTm.title}} + + + + + + + + + 正确答案是{{currentTm.right}},你的答案是{{currentTm.userchecked}} + + + 解析: {{currentTm.resoluation}} + + 解析: + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/exercise/main.wxss b/pages/exercise/main.wxss new file mode 100644 index 0000000..e51debe --- /dev/null +++ b/pages/exercise/main.wxss @@ -0,0 +1,18 @@ +.head{ + color:#fff; + background-color: cornflowerblue; +} +.txlabel{ + color:#fff; + background-color: rgb(216, 140, 0); + padding: 2px +} +.weui-btn{ + width:auto; + margin: 5px; +} +.sheet{ + color:#fff; + background-color: red; + float:right +} \ No newline at end of file diff --git a/pages/images/examtest.png b/pages/images/examtest.png new file mode 100644 index 0000000000000000000000000000000000000000..9ee22192ed7820405b4d23a0ddd67b0a6d69344d GIT binary patch literal 1295 zcmV+q1@QWbP)_7F%83$BOh+3lU_p6Tv%bx)u_c&C}J z_r9;IURTw7j8&*mp+bf10BL4G)1@MfYwy{b^lN2vXEo{90O>X$?Ui7=Lep0bxiDFp z0HD0LN+KUJyIqr>EJpyOn-M{62{h-0^yZuxn)5=LcLAxr?^Bs|#{98D$#ZGX4tO&+ zT~AFZ{f7YU^{!8W_6?W*`T$7F!=`3K(rK45OicSCl!I1W`Z|Ol`Q1&hMsL^A&bo{R zH2oI%YP9hYtyBl!%m}?uAi%1S=IJ8hDO7+uUO5FwTLXyyC(ta_l$~-OOn^cK0HnnMQ~qDj z_8sRz^v6_;0LPB`4}+#3V+6P%lzGl+05K>`0Itk@G6E-c`_%p$&~(YEvr&YQ z-drU>0s&ktfl}}M7)v35t0XvN*74@$<6N2fx~7wPb7zc=wg8|^3l3k*tTs;gkojk?+uwb-__LOlezdCDFK>qKM2~spJ?eQ`X-mF z@}vSxO#7lHJ$WxSEa13lA8XRg6ed6(NpMhwCpCGby{MhzeJMZ|@_@9JOEOF>fHoI6 z($#yhsETh!^7+*x%1VMq9{1`3O&0S1fU>XT7DyQaOgv@)l=&nB`M(8vFXtLe(E^M& zO#`&~EH!y;{}P&B$~~Z@0;E{0v3GYz6+Hq-pQnHG=1;EZh1|&(DS()wM*-=JwB!ZS z9~|xTPROSbfGc_pI-kOU#vTB|?B3LV9z9#&)^{>S$;45FloIJ8UMjlU$33X3ARD_+k;X#09%9yOebt zi0>?k6Cn}#x~7wP#FsSqoh*flVEPYAa(yBs^%L$E1w|Lr#+C>@eSz&^YqA#{>1u*c zT#8E!f2~#vN|nn~X6g^p!J!bSJ?xD|K8vbs#u>nvneWQJW)Y=yZu250F+sne{m9 zp3D-o)$Rh?>*14JC-K^~*zu880qqB!#)yL3zU?7=mm~eeHGRyr_u`SMmMS|& zXK0-8$Afje1xU-F=wj*R?jkWU?TcKhGZiXSs8GQT{s+tk>0x+{{5t>u002ovPDHLk FV1g8aYoh=F literal 0 HcmV?d00001 diff --git a/pages/images/exercise.png b/pages/images/exercise.png new file mode 100644 index 0000000000000000000000000000000000000000..94ef5d4fc05fc34faec8dbc99527ebcd82c73ae6 GIT binary patch literal 582 zcmV-M0=fN(P)YiZJ}xp6$Ax;K`e+j^-uf(!DH*GxAx}6570m8C)A_h#j_q%P>@#IgD8?F zBLO3A?Pe1_r16bMx6?gJBTMFYq$BvFR?BT-7t z>pv1XpW#2bvPo8<6fLchsBY7qnu0Q~H~@$camWmH<3XNo|B2Z7&;YPOR$&x4_*dwc9U`LH-CmhX6}`0^)4c!!yk z_K>s)zIL1TdXPk=CRJwdCZrKK@3!n?9RQX3u*1arp#X?=*lTfTGNw`=UNiBo>Rtel zunV99Kmlj~L=Y|j8~i~4eZVXlA)#BctRoTcfQin6YLf+Ngf5-Dbuwu1z@PZqscehq zb(m>2+W^#tZ6RvEwQ?7eEp53W<=mIsCb1itZH4_w2CJ^>=~XeAco)#UEQO5&fGoTX zq5=#M00lsS415tXU;u#vpa3Y4{;$H&00RUdf)GK7AVe_r{|y>wAUZ*~09*hr02hD@ zqlpM=dcOF1DZZz?THz&PO5&(=Mpj%yDC0ko5a+(C@exFC_qGA&(_^(r^UAZ zkA^B7tAZ}8Jhzs%_x}I)p8xwd>CxpSQ;IhlY`lMNQ?dRO7x%cjh`PFmx?#(6K7N(l zX?r?4`r-8iwdgnvR&Lc79oBva7X9&)da^BbNrlTR;@jXV;D7S0 zXD%a`>k6&|?;{&;e`Q-BGo|lbD9ep9r_J{mLN5Mxp2}!8x8T8V=chp3Zu&}F**0k0 zuP^zR&+sBGYmI4xtEJ8RkNQj56&%AP4xIC67iQ3zQc$>;X}7$l{=IkZAAVi_#kKzEI>^x$v4Kfd%gva^{)I^BbH$*P|a%%6?|^arqSr z!G$?h2elrz22EIb`xx+*M_`UuAe5FVdQ&MBb@03R0=CjbBd literal 0 HcmV?d00001 diff --git a/pages/images/operation.png b/pages/images/operation.png index 6525376dcca85f572b533106cc390446a5d527c0..0cbe2ea44ddfaa2c860da37937fd8631112bd01d 100644 GIT binary patch delta 2724 zcmV;V3S0Gy3#%27BYz5VNkl<@HVBJ912V^hLjV&yiM`X+ zcb3k<&i(A(?VW#OpD%{xVP@B}y*;kJV8JY>Tf@B7P-Vi|jA!a5EQN(RZwc=)!GaHjN*O<1gyW+^1Wb6EHQvZt)=YBJ zX#8bF@{5-6TTD3bofw6?av5O>&U>BL_@-6xSyoVWmwy@)%;iG6LpT0{32(X%S%P^> zSc$0g_^1$p5XnR-yjrO9tb_M5;iTi>Ehafx3D<29LWoG0_A=pH?a#nXR`A1>IL`_X zx$ljgm(!8P15L-9GDg8k0rFnQ!iC;lL@}iZY+F?71SJ{uH@BQ z31JHpdVjVT%tRqTeS!-0cr`uwV#2BZLsF;9=Gs%kQl``YI#AW1f9q zkErx`ri~honYP)NGnEjw<%hQ&}n2E<#=J;q?}LMR?s?stZ;efyE@YxO01 zUuA-tC73Z`>7e()en4QtJN<$XY1n5JzS9P#g6F&aZjA7xv-+kgW%*Fg&TD+LJ=n`y z^M91<{J}`@7%N#dg#SsO{TW$WUm(~x;YzQhd0*6bg$X`yG%TflyVwhGe&>^|U6$Lk ze>g0LB87(x;W?}Dve9T+!!af_oiFPh1gqtYW5|5B-v|*0VXI};(L1+XAk20i8%)q( zh0pY&yZxoZV#pF+$_s*f_FKYAuezDw)qmzyI5lP?9emY&Hd45Y71aFBx3=C(eFGpw zeh}h71Z}5@A^c;ndQDggt@kv78RXA=HS|&Neg!OJQ%n+W-1wdX9DrNbQ)p9x= zS1e&)vtV?vpFMYn9-O_)sYEInCN}_iKrmq`WP-Ug0IcAz{puYfJi>(aWv|X{+kXt^ zS>p*NIpzHCpDO~OUl1ljQ8I*W02sotTzccX#APOUJM)Cnc-Ih28C49+Enhaq*Qn+&<3L}M^nWTHxwixEj>u14|u*bhnCtZp2ORV8915s)z zc*K%)ms*1f7cIesOcthKVFeE};pLdwc26C=I*`a8Dcr^W%f}6);gx|Xb)*u)7EAaW zo60oZbH7jyu_-ZI3m&C#i+>4E=i%+rQVG{>unL}MjelST$83mSHwyL`1$!*vvrKrx z5KMDiGV@=36;uc0eCYstuBTSxbwlvNO5fi)PE*WOGH!AY1yn$mYn=(s4CJ^S6(V2-qfFjPZvFzLBZlB7F2EUq?KTtCl1`QhtMPE*?J`Yi?nh5n z)nJk}vvJJ_iqK=Ve31!V;=(^P+^_^st~Ahgl{gZk^%0DQ)F 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 + + + + + + + 我的安全资格证书 + + + + diff --git a/pages/main/main.js b/pages/main/main.js index 704b2b0..06677b8 100644 --- a/pages/main/main.js +++ b/pages/main/main.js @@ -5,14 +5,18 @@ Page({ * 页面的初始数据 */ data: { - + yhtodonum:0, + zytodonum:0, + noread:0, + dqdnum:0, + dknum:0, + kaoshi:false }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { - }, /** @@ -29,16 +33,20 @@ Page({ var that = this //获取待阅读通知数目 if(wx.getStorageSync("sessionid")){ + this.getrights() this.getnoread() this.getyhtodonum() this.getzytodonum() this.getpxqdnum() + this.getdknum() //待考 }else{ getApp().callback = () => { + this.getrights() this.getnoread() this.getyhtodonum() this.getzytodonum() this.getpxqdnum() + this.getdknum() }; } @@ -155,5 +163,47 @@ Page({ } } }); - } + }, + getdknum: function () { + var that = this + //获取待考 + wx.request({ + url: getApp().globalData.serverUrl + 'api/examtestdetail?a=dknum', + header: { + 'content-type': 'application/json', // 默认值 + 'Cookie': wx.getStorageSync("sessionid"), + }, + data: {}, + success: res => { + if (res.statusCode === 200) { + //console.log(res.data) + this.setData({ + dknum: res.data.dknum, + }) + } + } + }); + }, +getrights:function(){ + wx.request({ + url: getApp().globalData.serverUrl + 'api/rights?a=have', + header: { + 'content-type': 'application/json', // 默认值 + 'Cookie': wx.getStorageSync("sessionid"), + }, + data: {}, + success: res => { + if (res.statusCode === 200) { + //console.log(res.data.rights.indexOf('25')) + if (res.data.rights.indexOf('25') != -1) {//考试功能 + this.setData({ + kaoshi: true + }) + } + } + console.log(this.data.kaoshi) + } + }); +} + }) \ No newline at end of file diff --git a/pages/main/main.wxml b/pages/main/main.wxml index 6a03d8f..c573b1f 100644 --- a/pages/main/main.wxml +++ b/pages/main/main.wxml @@ -1,51 +1,56 @@ - - 数据采集 - - - - 事故隐患 - {{yhtodonum}} - - - - 行为观察 - - - - 未遂事件 - - - - 合理化建议 - - - - 作业许可 - {{zytodonum}} - - - 学习园地 - - - - 公告 - - - - 通知 - - {{noread}} - - - - 线下培训 - {{dqdnum}} - - - - 即将上线.. - - + + 数据采集 + + + + 事故隐患 + {{yhtodonum}} + + + + 行为观察 + + + + 未遂事件 + + + + 合理化建议 + + + + 作业许可 + {{zytodonum}} + + 学习园地 + + + + 公告 + + + + 通知 + + {{noread}} + + + + 线下培训 + {{dqdnum}} + + + + 在线考试 + {{dknum}} + + + + 模拟练习 + + + \ No newline at end of file diff --git a/pages/notice/detail.js b/pages/notice/detail.js index ecda2d6..cba195e 100644 --- a/pages/notice/detail.js +++ b/pages/notice/detail.js @@ -126,6 +126,7 @@ Page({ if (res.statusCode === 200) { var tzdata = res.data let material = [] + console.log(tzdata) console.log(tzdata.notice.material.length) for (var i = 0, len = tzdata.notice.material.length; i < len; i++) { let x = {} @@ -135,9 +136,12 @@ Page({ } console.log(material) this.setData({ - material: material + material: material, + title:tzdata.notice.title, + readpeople:tzdata.readpeople, + readsnum:tzdata.readsnum }) - this.setData(tzdata) + WxParse.wxParse('article', 'html', tzdata.notice.content, this, 0) } diff --git a/pages/notice/detail.wxml b/pages/notice/detail.wxml index 9e00620..bea177f 100644 --- a/pages/notice/detail.wxml +++ b/pages/notice/detail.wxml @@ -2,7 +2,7 @@ - {{notice.title}} + {{title}} 阅读人数:{{readpeople}} 阅读次数:{{readsnum}} 附件 diff --git a/pages/observe/observe.wxml b/pages/observe/observe.wxml index 005acb1..523f804 100644 --- a/pages/observe/observe.wxml +++ b/pages/observe/observe.wxml @@ -1,20 +1,20 @@ - + 共{{total}}条行为观察 - + - {{item.lookplace}} {{item.actname}} + {{item.lookplace}} {{item.actname}} {{item.looknum}} {{item.looker__name}}填报 {{item.looktime}} - + - + \ No newline at end of file diff --git a/pages/operation/list.js b/pages/operation/list.js new file mode 100644 index 0000000..9c56bd3 --- /dev/null +++ b/pages/operation/list.js @@ -0,0 +1,83 @@ +// pages/operation/list.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + getzylxlist: function () { + wx.request({ + url: getApp().globalData.serverUrl + 'getdickey?dicclass=33', + header: { + 'content-type': 'application/json', // + 'Cookie': wx.getStorageSync("sessionid"), + }, + method: 'GET', + success: res => { + if (res.statusCode === 200) { + let zylxlist = res.data.rows + this.setData({ + zylxlist: zylxlist, + }) + } + } + }) + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.getzylxlist() + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/operation/list.json b/pages/operation/list.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/operation/list.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/operation/list.wxml b/pages/operation/list.wxml new file mode 100644 index 0000000..53bb163 --- /dev/null +++ b/pages/operation/list.wxml @@ -0,0 +1,14 @@ + + 选择作业类型 + + + + + {{item.dickeyname}} + + {{item.detail}} + 审批流程:{{item.splcdetail}} + + + + \ No newline at end of file diff --git a/pages/operation/list.wxss b/pages/operation/list.wxss new file mode 100644 index 0000000..a458506 --- /dev/null +++ b/pages/operation/list.wxss @@ -0,0 +1,5 @@ +.head{ + color:#fff; + background-color: cornflowerblue; + text-align: center; +} \ No newline at end of file diff --git a/pages/operation/operation.js b/pages/operation/operation.js index 942abc0..84cc98a 100644 --- a/pages/operation/operation.js +++ b/pages/operation/operation.js @@ -19,7 +19,6 @@ Page({ if (that.data.activeIndex == 0) { that.getmyZylist(1) that.data.mypage = 1 - that.getzylxlist() } else if (that.data.activeIndex == 1) { that.gettodoZylist(1) @@ -135,20 +134,20 @@ Page({ success: res => { if (res.statusCode === 200) { if (res.data.rows.length == 0) { - if(page==1){ + if (page == 1) { this.setData({ todototal: 0, todozylist: [] }) } - else{ + else { wx.showModal({ content: "已经到底啦!", showCancel: false, confirmText: "确定", }) } - + } else { let list @@ -187,7 +186,6 @@ Page({ if (that.data.activeIndex == 0) { that.getmyZylist(1) that.data.mypage = 1 - that.getzylxlist() } else if (that.data.activeIndex == 1) { that.gettodoZylist(1) @@ -233,47 +231,12 @@ Page({ this.getallZylist(); } }, - getzylxlist: function () { - wx.request({ - url: getApp().globalData.serverUrl + 'getdickey?dicclass=33&a=combobox', - header: { - 'content-type': 'application/json', // - 'Cookie': wx.getStorageSync("sessionid"), - }, - method: 'GET', - success: res => { - if (res.statusCode === 200) { - let zylxlist=res.data - let zylxtext = [] - for (var i = 0; i < zylxlist.length; i++) { - zylxtext.push(zylxlist[i]['text']) - } - this.setData({ - zylxlist: zylxlist, - zylxtext: zylxtext - }) - } - } - }) - }, - open: function(){ - var that = this - console.log(that.data.zylxlist) - wx.showActionSheet({ - itemList: that.data.zylxtext, - success: function (res) { - if (!res.cancel) { - console.log(res.tapIndex) - if(false){ - }else{ - wx.navigateTo({ - url: 'operationadd?zylx=' + that.data.zylxlist[res.tapIndex]['value'], - }) - } - - } - } - }); - } + open: function () { + + wx.navigateTo({ + url: 'list', + }) + + }, }); \ No newline at end of file diff --git a/pages/operation/operation.wxml b/pages/operation/operation.wxml index e90058f..5455fa5 100644 --- a/pages/operation/operation.wxml +++ b/pages/operation/operation.wxml @@ -1,91 +1,88 @@ - - - - - - - {{item}} - - - + + + + + {{item}} - - - - + + + + + + + + + + \ No newline at end of file diff --git a/pages/operation/operationadd.js b/pages/operation/operationadd.js index eb45ca3..5479336 100644 --- a/pages/operation/operationadd.js +++ b/pages/operation/operationadd.js @@ -320,7 +320,9 @@ Page({ success: res => { if (res.statusCode === 200) { wx.hideLoading(); - wx.navigateBack() + wx.navigateBack({ + delta: 2 + }) } } }); diff --git a/pages/operation/operationdetail.json b/pages/operation/operationdetail.json index 8835af0..38e5b26 100644 --- a/pages/operation/operationdetail.json +++ b/pages/operation/operationdetail.json @@ -1,3 +1,4 @@ { - "usingComponents": {} + "usingComponents": {}, + "navigationBarTitleText": "作业详情" } \ No newline at end of file diff --git a/pages/public/detail.js b/pages/public/detail.js index 49b8923..949967a 100644 --- a/pages/public/detail.js +++ b/pages/public/detail.js @@ -136,11 +136,12 @@ Page({ x['value'] = ggdata.notice.material[i] material.push(x) } - console.log(material) + //console.log(material) this.setData({ - material: material + material: material, + title: ggdata.notice.title, + reads: ggdata.notice.reads }) - this.setData(ggdata) WxParse.wxParse('article', 'html', ggdata.notice.content, this, 0) } diff --git a/pages/public/detail.wxml b/pages/public/detail.wxml index d2438df..8ec9704 100644 --- a/pages/public/detail.wxml +++ b/pages/public/detail.wxml @@ -2,8 +2,8 @@ - {{notice.title}} - 阅读量:{{notice.reads}} + {{title}} + 阅读量:{{reads}} 附件 diff --git a/pages/questioncat/ArrayUtils.js b/pages/questioncat/ArrayUtils.js new file mode 100644 index 0000000..d094c7d --- /dev/null +++ b/pages/questioncat/ArrayUtils.js @@ -0,0 +1,22 @@ +export default { /** + * 给数组去重 + */ checkRepeat(list) { + let noRepList = [list[0]] + for (let i = 0; i < list.length; i++) { + let repeat = false + for (let j = 0; j < noRepList.length; j++) + { if (noRepList[j].id === list[i].id) { + repeat = true + break } } + if (!repeat) { noRepList.push(list[i]) } } + return noRepList + }, //删除list中id为 delId 的元素 + deleteItemById(list, delId){ + for (let i = 0; i < list.length; i++) { + if (list[i].id == delId) { + list.splice(i, 1) + return list; } + } + return list; + } + } \ No newline at end of file diff --git a/pages/questioncat/index.js b/pages/questioncat/index.js new file mode 100644 index 0000000..fe96fa0 --- /dev/null +++ b/pages/questioncat/index.js @@ -0,0 +1,351 @@ + +//import API from '../../../utils/API.js' +import ArrayUtils from 'ArrayUtils.js' +//import EventBus from '../../../components/NotificationCenter/WxNotificationCenter.js' + + + +Page({ + data: { + currentList: [], //当前展示的列表 + selectList: [], //已选择的元素列表 + originalList: [], //最原始的数据列表 + indexList: [], //存储目录层级的数组,用于准确的返回上一层 + selectList: [], //已选中的人员列表 + }, + + onLoad: function (options) { + wx.setNavigationBarTitle({ + title: '选择分类' + }) + this.init(); + }, + + init() { + //上次选中的列表,用于判断是不是取消选中了 + this.lastTimeSelect = [] + wx.request({ + url: getApp().globalData.serverUrl + 'api/questioncat?a=tree', + header: { + 'content-type': 'application/json', // 默认值 + 'Cookie': wx.getStorageSync("sessionid"), + }, + data: {}, + success: res => { + if (res.statusCode === 200) { + let list = convert(res.data) + this.setData({ + currentList: list, + originalList: list + }) + } + } + }) + }, + + clickItem(res) { + console.log(res) + let index = res.currentTarget.id; + let item = this.data.currentList[index] + + console.log("item", item) + if(item.children.length!=0){ + this.setData({ + currentList: item.children + }) + //将当前的索引存入索引目录中。索引多一个表示目录多一级 + let indexes = this.data.indexList + indexes.push(index) + //是目录不是具体的用户 + this.setData({ + indexList: indexes + }) + //清空上次选中的元素列表,并设置上一层的选中状态给lastTimeSelect + this.setLastTimeSelectList(); + } + + }, + + + //返回按钮 + goBack() { + let indexList = this.data.indexList + if (indexList.length > 0) { + //返回时删掉最后一个索引 + indexList.pop() + if (indexList.length == 0) { + //indexList长度为0说明回到了最顶层 + this.setData({ + currentList: this.data.originalList, + indexList: indexList + }) + } else { + //循环将当前索引的对应数组赋值给currentList + let list = this.data.originalList + for (let i = 0; i < indexList.length; i++) { + let index = indexList[i] + list = list[index].children + } + this.setData({ + currentList: list, + indexList: indexList + }) + } + //清空上次选中的元素列表,并设置上一层的选中状态给lastTimeSelect + this.setLastTimeSelectList(); + } + }, + + //清空上次选中的元素列表,并设置上一层的选中状态给lastTimeSelect + setLastTimeSelectList() { + this.lastTimeSelect = [] + this.data.currentList.forEach(item => { + if (item.checked) { + this.lastTimeSelect.push(item) + } + }) + }, + + //根据部门获取下列列表 + // _getUserByGroup(item) { + // wx.request({ + // url: getApp().globalData.serverUrl + 'api/partuser?a=getall&parentid=' + item.id, + // header: { + // 'content-type': 'application/json', // 默认值 + // 'Cookie': wx.getStorageSync("sessionid"), + // }, + // data: {}, + // success: res => { + // if (res.statusCode === 200) { + // let list = res.data.data + // console.log(res.list) + // this.setData({ + // currentList: list + // }) + // this.addList2DataTree() + // this.setLastTimeSelectList(); + // } + // } + // }) + // getApp().get(API.selectUserByGroup(), params, result => { + // console.log('result', result) + // let list = this.transformData(result.data.data, item.id) + // this.setData({ + // currentList: list + // }) + // this.addList2DataTree() + // //清空上次选中的元素列表,并设置上一层的选中状态给lastTimeSelect。写在这里防止异步请求时执行顺序问题 + // this.setLastTimeSelectList(); + // }) + // }, + + + + //将请求的数据转化为需要的格式 + // transformData(list, parentId) { + // //先将数据转化为固定的格式 + // let newList = [] + // for (let i = 0; i < list.length; i++) { + // let item = list[i] + // newList.push({ + // id: item.id, + // name: item.realName, + // parentId: parentId, + // checked: false, + // isPeople: true, + // userType: item.userType, + // gender: item.gender, + // children: [] + // }) + // } + // return newList; + // }, + + //将当前列表挂载在原数据树上, 目前支持5层目录,如需更多接着往下写就好 + addList2DataTree() { + let currentList = this.data.currentList; + let originalList = this.data.originalList; + let indexes = this.data.indexList + switch (indexes.length) { + case 1: + originalList[indexes[0]].children = currentList + break; + case 2: + originalList[indexes[0]].children[indexes[1]].children = currentList + break; + case 3: + originalList[indexes[0]].children[indexes[1]].children[indexes[2]].children = currentList + break; + case 4: + originalList[indexes[0]].children[indexes[1]].children[indexes[2]].children[indexes[3]].children = currentList + break; + case 5: + originalList[indexes[0]].children[indexes[1]].children[indexes[2]].children[indexes[3]].children[indexes[4]].children = currentList + break; + case 6: + originalList[indexes[0]].children[indexes[1]].children[indexes[2]].children[indexes[3]].children[indexes[4]].children[indexes[5]].children = currentList + break; + } + + this.setData({ + originalList: originalList + }) + console.log("originalList", originalList) + }, + + //选框变化回调 + checkChange(res) { + console.log(res) + let values = res.detail.value + let selectItems = [] + //将值取出拼接成 id,name 格式 + values.forEach(value => { + let arrs = value.split(",") + selectItems.push({ id: arrs[0], name: arrs[1] }) + }) + console.log("selectItems", selectItems) + console.log("lastTimeSelect", this.lastTimeSelect) + + //将本次选择的与上次选择的比对,本次比上次多说明新增了,本次比上次少说明删除了,找出被删除的那条数据,在footer中也删除 + if (selectItems.length > this.lastTimeSelect.length) { + //将 selectList 与 selectItems 拼接并去重 + let newList = this.data.selectList.concat(selectItems) + newList = ArrayUtils.checkRepeat(newList) + this.setData({ + selectList: newList + }) + } else { + //找出取消勾选的item,从selectList中删除 + //比对出取消勾选的是哪个元素 + let diffItem = {} + this.lastTimeSelect.forEach(item => { + let flag = false; + selectItems.forEach(item2 => { + if (item.id === item2.id) { + flag = true + } + }) + if (!flag) { + diffItem = item + console.log("diff=", item) + } + }) + //找出被删除的元素在 selectList 中的位置 + let list = this.data.selectList + let delIndex = 0; + for (let i = 0; i < list.length; i++) { + if (list[i].id === diffItem.id) { + delIndex = i; + break; + } + } + //从list中删除这个元素 + list.splice(delIndex, 1) + this.setData({ + selectList: list + }) + } + console.log("selectList", this.data.selectList) + //更新 currentList 选中状态并重新挂载在数据树上,以保存选择状态 + this.updateCurrentList(this.data.currentList, this.data.selectList) + }, + + //footer点击删除回调 + footerDelete(res) { + console.log(res) + this.setData({ + selectList: res.detail.selectList + }) + + console.log('selectList', this.data.selectList) + this.updateCurrentList(this.data.currentList, res.detail.selectList) + }, + + //点击 footer 的确定按钮提交数据 + submitData(res) { + let selectList = this.data.selectList + //通过 WxNotificationCenter 发送选择的结果通知 + //EventBus.postNotificationName("SelectPeopleDone", selectList) + //将选择结果存入 app.js 的 globalData + getApp().globalData.selectList = selectList + wx.setStorage({ + key: 'questioncats', + data: selectList, + success: function(res) {}, + fail: function(res) {}, + complete: function(res) {}, + }) + //返回 + wx.navigateBack({ + delta: 1 + }) + console.log("selectdone", selectList) + }, + + //更新 currentList 并将更新后的列表挂载在数据树上 + updateCurrentList(currentList, selectList) { + //let newList = [] + let selectids = [] + for (var i = 0; i < selectList.length; i++) { + selectids.push(selectList[i]['id']) + } + for (var i = 0; i < currentList.length; i++) { + if (selectids.indexOf(currentList[i]['id'].toString()) >= 0) { + currentList[i]['checked'] = true + } else { + currentList[i]['checked'] = false + } + } + console.log(currentList) + this.setData({ + currentList: currentList + }) + this.addList2DataTree() + this.setLastTimeSelectList() + } +}) +function convert(rows) { + function exists(rows, parentId) { + for (var i = 0; i < rows.length; i++) { + if (rows[i].id == parentId) return true; + } + return false; + } + + var nodes = []; + // get the top level nodes + for (var i = 0; i < rows.length; i++) { + var row = rows[i]; + if (!exists(rows, row.parentId)) { + nodes.push({ + id: row.id, + parentId: 0, + name: row.name, + checked:false, + children:[] + }); + } + } + + var toDo = []; + for (var i = 0; i < nodes.length; i++) { + toDo.push(nodes[i]); + } + while (toDo.length) { + var node = toDo.shift(); // the parent node + // get the children nodes + for (var i = 0; i < rows.length; i++) { + var row = rows[i]; + if (row.parentId == node.id) { + var child = { id: row.id, name: row.name,parentId:row.parentId,checked:false,children:[] }; + if (node.children) { + node.children.push(child); + } else { + node.children = [child]; + } + toDo.push(child); + } + } + } + return nodes; +} \ No newline at end of file diff --git a/pages/questioncat/index.json b/pages/questioncat/index.json new file mode 100644 index 0000000..59e4727 --- /dev/null +++ b/pages/questioncat/index.json @@ -0,0 +1,5 @@ +{ + "usingComponents": { + "footer": "/components/footer/footer" + } +} \ No newline at end of file diff --git a/pages/questioncat/index.wxml b/pages/questioncat/index.wxml new file mode 100644 index 0000000..fbf3e97 --- /dev/null +++ b/pages/questioncat/index.wxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + {{item.name}} + + + 暂无数据 + + + +