From b9cf792f7f441ea9bb0ff4c81bce19f623c9b86b Mon Sep 17 00:00:00 2001 From: educoder_weapp Date: Wed, 13 Nov 2019 13:24:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=99=E5=91=98=E5=8F=AF=E4=BB=A5=E5=8F=91?= =?UTF-8?q?=E5=B8=83=E6=96=B0=E8=AF=95=E5=8D=B7=EF=BC=8C=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=E5=88=86=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + README.md | 34 +- app.json | 22 +- app.wxss | 2 + data/client.js | 197 ++++- data/eduapi.js | 178 ++++- images/avatar_blue.png | Bin 10742 -> 0 bytes images/loading.svg | 1 - images/weapp_code_smart_class.jpg | Bin 0 -> 90684 bytes lib/co.js | 237 ------ lib/emitter.js | 20 - lib/lab.js | 19 - lib/promisify.js | 4 - lib/regenerator-runtime.js | 713 ------------------- lib/tunnel.js | 44 -- model/file.js | 37 - model/studentclassmap.js | 29 - pages/classroom/classroom.js | 5 + pages/classroom/classroom.wxml | 6 +- pages/course/course.wxml | 15 +- pages/courses/courses.js | 18 +- pages/courses/courses.json | 4 +- pages/courses/courses.wxml | 5 +- pages/exercise/exercise.js | 6 +- pages/exercise/exercise.wxml | 12 +- pages/exercise/exercise.wxss | 6 +- pages/exercise_grade/exercise_grade.js | 72 ++ pages/exercise_grade/exercise_grade.json | 3 + pages/exercise_grade/exercise_grade.wxml | 14 + pages/exercise_grade/exercise_grade.wxss | 21 + pages/exercise_setting/exercise_setting.js | 124 ++++ pages/exercise_setting/exercise_setting.json | 3 + pages/exercise_setting/exercise_setting.wxml | 89 +++ pages/exercise_setting/exercise_setting.wxss | 63 ++ pages/exercises/exercises.js | 25 + pages/exercises/exercises.wxml | 10 +- pages/mark_detail/mark_detail.wxss | 4 +- pages/question_setting/question_setting.js | 78 ++ pages/question_setting/question_setting.json | 3 + pages/question_setting/question_setting.wxml | 14 + pages/question_setting/question_setting.wxss | 6 + utils/dateutils.js | 13 + 42 files changed, 993 insertions(+), 1164 deletions(-) delete mode 100644 images/avatar_blue.png delete mode 100644 images/loading.svg create mode 100644 images/weapp_code_smart_class.jpg delete mode 100644 lib/co.js delete mode 100644 lib/emitter.js delete mode 100644 lib/lab.js delete mode 100644 lib/promisify.js delete mode 100644 lib/regenerator-runtime.js delete mode 100644 lib/tunnel.js delete mode 100644 model/file.js delete mode 100644 model/studentclassmap.js create mode 100644 pages/exercise_grade/exercise_grade.js create mode 100644 pages/exercise_grade/exercise_grade.json create mode 100644 pages/exercise_grade/exercise_grade.wxml create mode 100644 pages/exercise_grade/exercise_grade.wxss create mode 100644 pages/exercise_setting/exercise_setting.js create mode 100644 pages/exercise_setting/exercise_setting.json create mode 100644 pages/exercise_setting/exercise_setting.wxml create mode 100644 pages/exercise_setting/exercise_setting.wxss create mode 100644 pages/question_setting/question_setting.js create mode 100644 pages/question_setting/question_setting.json create mode 100644 pages/question_setting/question_setting.wxml create mode 100644 pages/question_setting/question_setting.wxss diff --git a/.gitignore b/.gitignore index 18cb9a3..80be709 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ app.js towxml we-cropper +components/weui-miniprogram .idea api_docs diff --git a/README.md b/README.md index 857454f..169190d 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ educoder微信小程序,帮助使用[educoder平台](https://www.educoder.net) ## 小程序码 ![小程序码](./images/weapp_code.png) - # 功能介绍 ## 教室 @@ -17,6 +16,8 @@ educoder微信小程序,帮助使用[educoder平台](https://www.educoder.net) - 教员在教室界面中可以直观地看到学员在位情况,可以选择学员让其起立回答问题,并且对学员可以进行加分、减分操作 +- 在分数列表中可以看到加减分记录(数据在后台可以导出) + - 学员可以收到教员让其起立提问、回答的提示,还可以点击“我要提问、回答” - 教室内有讨论区,可以交流 @@ -31,4 +32,33 @@ educoder微信小程序,帮助使用[educoder平台](https://www.educoder.net) - 学员在课程内可以看到老师发布的试卷,并且回答 -- 试卷截止后可以学生可以看到公布的答案 \ No newline at end of file +- 试卷截止后并且老师选择了公开答案,学生可以看到公布的答案 + +- 老师可以创建试卷,发布试卷,查看学员作答分数(developing) + +## 其他 +账号的注册、登陆、找回密码、头像更改等 + +# 实现 +## educoder平台接入 +使用HTTP与平台的api接口交互 + +接口列表如下 +- 搜索课堂https://www.educoder.net/api/courses.json + +- 查询用户的课堂https://www.educoder.net/api/users//courses.json + +- 查询学校https://www.educoder.net/api/schools/school_list.json + +- 新建课堂https://www.educoder.net/api/courses.json + +- 加入课堂https://www.educoder.net/api/courses/apply_to_join_course.json + +- 新建试卷https://www.educoder.net/api/courses//exercises/new.json + +- 查询试卷https://www.educoder.net/api/courses//exercises.json + +- 班级文件资源https://www.educoder.net/api/files.json + +# 教室学员在位情况及分数的同步实现 +使用了[leancloud](https://www.leancloud.cn/)提供的javascript开发包实现数据同步功能, 如学员在位情况、分数的同步, 其底部技术为websocket \ No newline at end of file diff --git a/app.json b/app.json index 9e39ef7..bd1752a 100644 --- a/app.json +++ b/app.json @@ -1,7 +1,9 @@ { "pages": [ - "pages/findmore/findmore", "pages/my_courses/my_courses", + "pages/findmore/findmore", + "pages/exercise_setting/exercise_setting", + "pages/login/login", "pages/course_setting/course_setting", "pages/exercises/exercises", @@ -10,13 +12,14 @@ "pages/setting/setting", "pages/classroom/classroom", "pages/about/about", - "pages/test/test", "pages/course/course", "pages/files/files", "pages/mark_detail/mark_detail", "pages/reset_password/reset_password", - "pages/image_crop/image_crop" + "pages/image_crop/image_crop", + "pages/question_setting/question_setting", + "pages/exercise_grade/exercise_grade" ], "window": { "backgroundTextStyle": "dark", @@ -34,18 +37,19 @@ "iconPath": "images/tabbar-icon/tabbar_study_default.png", "selectedIconPath": "images/tabbar-icon/tabbar_study_pressed.png" }, - { - "pagePath": "pages/findmore/findmore", - "text": "发现", - "iconPath": "images/tabbar-icon/tabbar_findmore_default.png", - "selectedIconPath": "images/tabbar-icon/tabbar_findmore_pressed.png" - }, + { "pagePath": "pages/courses/courses", "text": "课程列表", "iconPath": "images/tabbar-icon/tabbar_contact_default.png", "selectedIconPath": "images/tabbar-icon/tabbar_contact_pressed.png" }, + { + "pagePath": "pages/findmore/findmore", + "text": "发现", + "iconPath": "images/tabbar-icon/tabbar_findmore_default.png", + "selectedIconPath": "images/tabbar-icon/tabbar_findmore_pressed.png" + }, { "pagePath": "pages/setting/setting", "iconPath": "images/tabbar-icon/tabbar_settings_default.png", diff --git a/app.wxss b/app.wxss index bfd62ec..a2a6713 100644 --- a/app.wxss +++ b/app.wxss @@ -1,3 +1,5 @@ +@import './components/weui-miniprogram/weui-wxss/dist/style/weui.wxss'; + page { height: 100%; background-color: #f2f2f2; diff --git a/data/client.js b/data/client.js index fd98295..7627593 100644 --- a/data/client.js +++ b/data/client.js @@ -4,7 +4,7 @@ * @author jinke18 */ -import {Account, Course, Exercise, ExerciseQuestion, School, Ui} from "./eduapi" +import {Account, Course, Exercise, Question, School, Ui} from "./eduapi" import {Session} from "./requests"; import {Cookie} from "./cookie"; @@ -451,9 +451,9 @@ export class Client{ }) }); } - answer_exercise_question({question_id, exercise_choice_id,answer_text ,success, fail, complete}){ + answer_question({question_id, exercise_choice_id,answer_text ,success, fail, complete}){ return new Promise((resolve, reject) =>{ - ExerciseQuestion.answer({ + Question.answer({ session: this.session, question_id: question_id, answer_text: answer_text, @@ -474,6 +474,163 @@ export class Client{ }) } ); } + create_question({exercise_id, data,success, fail, complete}){ + return new Promise((resolve, reject) => { + Question.create({ + session: this.session, + exercise_id, + data, + complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + } + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); + } + }); + }); + } + update_question({question_id, data, success, fail, complete}){ + return new Promise((resolve, reject) => { + Question.update({ + session: this.session, + question_id, + data, + complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + } + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); + } + }); + }); + } + create_exercise({course_id ,exercise_name, exercise_description, success, fail, complete}){ + return new Promise((resolve, reject) => { + Exercise.create({ + session: this.session, + course_id, + exercise_name, + exercise_description, + complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + } + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); + } + }); + }); + } + update_exercise({exercise_id, exercise_name, exercise_description, success, fail, complete}){ + return new Promise((resolve, reject) => { + Exercise.update({ + session: this.session, + exercise_id, + exercise_name, + exercise_description, + complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + } + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); + } + }) + }) + } + get_exercise_edit({exercise_id, success, fail, complete}){ + return new Promise((resolve, reject) => { + Exercise.get_edit({ + session: this.session, + exercise_id, + complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + } + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); + } + }) + }); + } + publish_exercise({course_id, exercise_ids, end_time, success, fail, complete}){ + return new Promise((resolve, reject) => { + Exercise.publish({ + session: this.session, + course_id, + exercise_ids, + end_time, + complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + } + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); + } + }) + }) + } + get_exercise_grade({exercise_id,order="end_at", search="", success, fail, complete}){ + return new Promise((resolve, reject) => { + Exercise.get_grade({ + session: this.session, + exercise_id, + order, + search, + complete: complete, + success: res => { + if (typeof success == "function") { + success(res); + } + resolve(res); + }, + fail: error => { + if (typeof fail == "function") { + fail(error); + } + reject(error); + } + }); + }); + } save_exercise({exercise_id, success, fail, complete}){ return new Promise((resolve, reject) => { Exercise.save({ @@ -517,24 +674,24 @@ export class Client{ }) }); } - search_schools({search = "", success, fail, complete} = {}){ - return new Promise((resolve, reject) => { - School.search({ - session: this.session, search: search, complete: complete, - success: res => { - if (typeof success == "function") { - success(res); - } - resolve(res); - }, - fail: error => { - if (typeof fail == "function") { - fail(error); - } - reject(error); - } + search_schools({search = "", success, fail, complete} = {}){ + return new Promise((resolve, reject) => { + School.search({ + session: this.session, search: search, complete: complete, + success: res => { + if (typeof success == "function") { + success(res); + } + resolve(res); + }, + fail: error => { + if (typeof fail == "function") { + fail(error); + } + reject(error); + } + }); }); - }); } get_home_page({success, fail, complete}={}){ return new Promise((resolve, reject) => { diff --git a/data/eduapi.js b/data/eduapi.js index c773c27..477b199 100644 --- a/data/eduapi.js +++ b/data/eduapi.js @@ -200,7 +200,7 @@ export class Course{ complete: complete }) } - static setting({session, course_id, data, success, fail, complete}){ + static update({session, course_id, data, success, fail, complete}){ return session.request({ }) @@ -349,6 +349,103 @@ export class Exercise{ complete: complete }) } + static create({ session, course_id ,exercise_name, exercise_description, success, fail, complete}){ + let data = {exercise_name:exercise_name, exercise_description: exercise_description}; + return session.request({ + url: api_base_url +`/courses/${course_id}/exercises.json`, + method: "POST", + data: data, + success(res) { + if ("status" in res.data) { + if (res.data.status < 0) { + fail(new Error(res.data.message)); + return; + } + // switch (res.data.status) { + // case 409: + // fail(new Error(res.data.message)); + // return; + // } + } + if (typeof success == "function") { + success(res); + } + }, + fail: fail, + complete: complete + }) + } + static update({session, exercise_id, exercise_name, exercise_description, success, fail, complete}){ + let data = {session, exercise_id, exercise_name, exercise_description, success, fail, complete}; + session.request({ + url: api_base_url+`/exercises/${exercise_id}.json`, + method: "PUT", + data: data, + success(res) { + if ("status" in res.data) { + if (res.data.status < 0) { + fail(new Error(res.data.message)); + return; + } + // switch (res.data.status) { + // case 409: + // fail(new Error(res.data.message)); + // return; + // } + } + if (typeof success == "function") { + success(res); + } + }, + fail: fail, + complete: complete + }) + } + static get_edit({session, exercise_id, success, fail, complete}){ + session.request({ + url: api_base_url + `/exercises/${exercise_id}/edit.json`, + method: "GET", + success(res) { + if ("status" in res.data) { + if (res.data.status < 0) { + fail(new Error(res.data.message)); + return; + } + } + if (typeof success == "function") { + success(res); + } + }, + fail: fail, + complete: complete + }) + } + static publish({session,course_id, exercise_ids, end_time, success, fail, complete}){ + let data = {check_ids: exercise_ids, end_time}; + session.request({ + url: api_base_url+ `/courses/${course_id}/exercises/publish.json`, + method: "POST", + data: data, + success(res) { + if ("status" in res.data) { + if (res.data.status < 0) { + fail(new Error(res.data.message)); + return; + } + // switch (res.data.status) { + // case 409: + // fail(new Error(res.data.message)); + // return; + // } + } + if (typeof success == "function") { + success(res); + } + }, + fail: fail, + complete: complete + }) + } static save({session, exercise_id, success, fail, complete}){ return session.request({ url: api_base_url + "/exercises/"+exercise_id+"/begin_commit.json", @@ -358,6 +455,32 @@ export class Exercise{ complete: complete }) } + static get_grade({session, exercise_id,order="end_at", search="", success, fail, complete}){ + let data = {order, search}; + session.request({ + url: api_base_url + `/exercises/${exercise_id}/exercise_lists.json`, + method: "GET", + data: data, + success(res) { + if ("status" in res.data) { + if (res.data.status < 0) { + fail(new Error(res.data.message)); + return; + } + // switch (res.data.status) { + // case 409: + // fail(new Error(res.data.message)); + // return; + // } + } + if (typeof success == "function") { + success(res); + } + }, + fail: fail, + complete: complete + }) + } static commit({session, exercise_id, commit_method=1, success, fail, complete}){ let data = {commit_method: commit_method}; return session.request({ @@ -371,7 +494,58 @@ export class Exercise{ } } -export class ExerciseQuestion { +export class Question { + static create({session, exercise_id, data, success, fail, complete}){ + let data_ = {...data, exercise_bank_id: exercise_id}; + session.request({ + url: api_base_url + `/exercises/${exercise_id}/exercise_questions.json`, + method: "POST", + data: data_, + success(res) { + if ("status" in res.data) { + if (res.data.status < 0) { + fail(new Error(res.data.message)); + return; + } + // switch (res.data.status) { + // case 409: + // fail(new Error(res.data.message)); + // return; + // } + } + if (typeof success == "function") { + success(res); + } + }, + fail: fail, + complete: complete + }) + } + static update({session, question_id, data, success, fail, complete}){ + session.request({ + url: api_base_url + `/exercise_questions/${question_id}.json`, + method: "PUT", + data: data, + success(res) { + if ("status" in res.data) { + if (res.data.status < 0) { + fail(new Error(res.data.message)); + return; + } + // switch (res.data.status) { + // case 409: + // fail(new Error(res.data.message)); + // return; + // } + } + if (typeof success == "function") { + success(res); + } + }, + fail: fail, + complete: complete + }) + } static answer({session, question_id, exercise_choice_id, answer_text, success, fail, complete}){ let data = {}; if(exercise_choice_id){data["exercise_choice_id"] = exercise_choice_id;} diff --git a/images/avatar_blue.png b/images/avatar_blue.png deleted file mode 100644 index 05d6370a4ba131a347da51785c9ab4ac482cd726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10742 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 \ No newline at end of file diff --git a/images/weapp_code_smart_class.jpg b/images/weapp_code_smart_class.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e75966383bef0e8aafc71cafc298a6e0b7d992e6 GIT binary patch literal 90684 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 2) res = slice.call(arguments, 1); - resolve(res); - }); - }); -} - -/** - * Convert an array of "yieldables" to a promise. - * Uses `Promise.all()` internally. - * - * @param {Array} obj - * @return {Promise} - * @api private - */ - -function arrayToPromise(obj) { - return Promise.all(obj.map(toPromise, this)); -} - -/** - * Convert an object of "yieldables" to a promise. - * Uses `Promise.all()` internally. - * - * @param {Object} obj - * @return {Promise} - * @api private - */ - -function objectToPromise(obj){ - var results = new obj.constructor(); - var keys = Object.keys(obj); - var promises = []; - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - var promise = toPromise.call(this, obj[key]); - if (promise && isPromise(promise)) defer(promise, key); - else results[key] = obj[key]; - } - return Promise.all(promises).then(function () { - return results; - }); - - function defer(promise, key) { - // predefine the key in the result - results[key] = undefined; - promises.push(promise.then(function (res) { - results[key] = res; - })); - } -} - -/** - * Check if `obj` is a promise. - * - * @param {Object} obj - * @return {Boolean} - * @api private - */ - -function isPromise(obj) { - return 'function' == typeof obj.then; -} - -/** - * Check if `obj` is a generator. - * - * @param {Mixed} obj - * @return {Boolean} - * @api private - */ - -function isGenerator(obj) { - return 'function' == typeof obj.next && 'function' == typeof obj.throw; -} - -/** - * Check if `obj` is a generator function. - * - * @param {Mixed} obj - * @return {Boolean} - * @api private - */ -function isGeneratorFunction(obj) { - var constructor = obj.constructor; - if (!constructor) return false; - if ('GeneratorFunction' === constructor.name || 'GeneratorFunction' === constructor.displayName) return true; - return isGenerator(constructor.prototype); -} - -/** - * Check for plain object. - * - * @param {Mixed} val - * @return {Boolean} - * @api private - */ - -function isObject(val) { - return Object == val.constructor; -} diff --git a/lib/emitter.js b/lib/emitter.js deleted file mode 100644 index 9beed1b..0000000 --- a/lib/emitter.js +++ /dev/null @@ -1,20 +0,0 @@ - -module.exports = { - setup(target) { - let listeners = []; - - Object.assign(target, { - on(type, handle) { - if (typeof handle == 'function') { - listeners.push([type, handle]); - } - }, - emit(type, ...params) { - listeners.forEach(([listenType, handle]) => type == listenType && handle(...params)); - }, - removeAllListeners() { - listeners = []; - } - }); - } -} \ No newline at end of file diff --git a/lib/lab.js b/lib/lab.js deleted file mode 100644 index 2746212..0000000 --- a/lib/lab.js +++ /dev/null @@ -1,19 +0,0 @@ -function getFinishLabs() { - const sto = wx.getStorageSync('finishLabs'); - if (sto) { - return JSON.parse(sto); - } - return {}; -} - -function finish(id) { - const current = getFinishLabs(); - current[id] = 1; - wx.setStorageSync('finishLabs', JSON.stringify(current)); -} - -function clear() { - wx.setStorageSync('finishLabs', ''); -} - -module.exports = { getFinishLabs, finish, clear }; \ No newline at end of file diff --git a/lib/promisify.js b/lib/promisify.js deleted file mode 100644 index cc269d4..0000000 --- a/lib/promisify.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = (api) => - (options, ...params) => new Promise( - (resolve, reject) => api(Object.assign({}, options, { success: resolve, fail: reject }), ...params) - ); \ No newline at end of file diff --git a/lib/regenerator-runtime.js b/lib/regenerator-runtime.js deleted file mode 100644 index eedd8cd..0000000 --- a/lib/regenerator-runtime.js +++ /dev/null @@ -1,713 +0,0 @@ -!(function(global) { - "use strict"; - - var Op = Object.prototype; - var hasOwn = Op.hasOwnProperty; - var undefined; // More compressible than void 0. - var $Symbol = typeof Symbol === "function" ? Symbol : {}; - var iteratorSymbol = $Symbol.iterator || "@@iterator"; - var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; - - var inModule = typeof module === "object"; - var runtime = global.regeneratorRuntime; - if (runtime) { - if (inModule) { - // If regeneratorRuntime is defined globally and we're in a module, - // make the exports object identical to regeneratorRuntime. - module.exports = runtime; - } - // Don't bother evaluating the rest of this file if the runtime was - // already defined globally. - return; - } - - // Define the runtime globally (as expected by generated code) as either - // module.exports (if we're in a module) or a new, empty object. - runtime = global.regeneratorRuntime = inModule ? module.exports : {}; - - function wrap(innerFn, outerFn, self, tryLocsList) { - // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. - var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; - var generator = Object.create(protoGenerator.prototype); - var context = new Context(tryLocsList || []); - - // The ._invoke method unifies the implementations of the .next, - // .throw, and .return methods. - generator._invoke = makeInvokeMethod(innerFn, self, context); - - return generator; - } - runtime.wrap = wrap; - - // Try/catch helper to minimize deoptimizations. Returns a completion - // record like context.tryEntries[i].completion. This interface could - // have been (and was previously) designed to take a closure to be - // invoked without arguments, but in all the cases we care about we - // already have an existing method we want to call, so there's no need - // to create a new function object. We can even get away with assuming - // the method takes exactly one argument, since that happens to be true - // in every case, so we don't have to touch the arguments object. The - // only additional allocation required is the completion record, which - // has a stable shape and so hopefully should be cheap to allocate. - function tryCatch(fn, obj, arg) { - try { - return { type: "normal", arg: fn.call(obj, arg) }; - } catch (err) { - return { type: "throw", arg: err }; - } - } - - var GenStateSuspendedStart = "suspendedStart"; - var GenStateSuspendedYield = "suspendedYield"; - var GenStateExecuting = "executing"; - var GenStateCompleted = "completed"; - - // Returning this object from the innerFn has the same effect as - // breaking out of the dispatch switch statement. - var ContinueSentinel = {}; - - // Dummy constructor functions that we use as the .constructor and - // .constructor.prototype properties for functions that return Generator - // objects. For full spec compliance, you may wish to configure your - // minifier not to mangle the names of these two functions. - function Generator() {} - function GeneratorFunction() {} - function GeneratorFunctionPrototype() {} - - // This is a polyfill for %IteratorPrototype% for environments that - // don't natively support it. - var IteratorPrototype = {}; - IteratorPrototype[iteratorSymbol] = function () { - return this; - }; - - var getProto = Object.getPrototypeOf; - var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); - if (NativeIteratorPrototype && - NativeIteratorPrototype !== Op && - hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { - // This environment has a native %IteratorPrototype%; use it instead - // of the polyfill. - IteratorPrototype = NativeIteratorPrototype; - } - - var Gp = GeneratorFunctionPrototype.prototype = - Generator.prototype = Object.create(IteratorPrototype); - GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; - GeneratorFunctionPrototype.constructor = GeneratorFunction; - GeneratorFunctionPrototype[toStringTagSymbol] = - GeneratorFunction.displayName = "GeneratorFunction"; - - // Helper for defining the .next, .throw, and .return methods of the - // Iterator interface in terms of a single ._invoke method. - function defineIteratorMethods(prototype) { - ["next", "throw", "return"].forEach(function(method) { - prototype[method] = function(arg) { - return this._invoke(method, arg); - }; - }); - } - - runtime.isGeneratorFunction = function(genFun) { - var ctor = typeof genFun === "function" && genFun.constructor; - return ctor - ? ctor === GeneratorFunction || - // For the native GeneratorFunction constructor, the best we can - // do is to check its .name property. - (ctor.displayName || ctor.name) === "GeneratorFunction" - : false; - }; - - runtime.mark = function(genFun) { - if (Object.setPrototypeOf) { - Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); - } else { - genFun.__proto__ = GeneratorFunctionPrototype; - if (!(toStringTagSymbol in genFun)) { - genFun[toStringTagSymbol] = "GeneratorFunction"; - } - } - genFun.prototype = Object.create(Gp); - return genFun; - }; - - // Within the body of any async function, `await x` is transformed to - // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test - // `hasOwn.call(value, "__await")` to determine if the yielded value is - // meant to be awaited. - runtime.awrap = function(arg) { - return { __await: arg }; - }; - - function AsyncIterator(generator) { - function invoke(method, arg, resolve, reject) { - var record = tryCatch(generator[method], generator, arg); - if (record.type === "throw") { - reject(record.arg); - } else { - var result = record.arg; - var value = result.value; - if (value && - typeof value === "object" && - hasOwn.call(value, "__await")) { - return Promise.resolve(value.__await).then(function(value) { - invoke("next", value, resolve, reject); - }, function(err) { - invoke("throw", err, resolve, reject); - }); - } - - return Promise.resolve(value).then(function(unwrapped) { - // When a yielded Promise is resolved, its final value becomes - // the .value of the Promise<{value,done}> result for the - // current iteration. If the Promise is rejected, however, the - // result for this iteration will be rejected with the same - // reason. Note that rejections of yielded Promises are not - // thrown back into the generator function, as is the case - // when an awaited Promise is rejected. This difference in - // behavior between yield and await is important, because it - // allows the consumer to decide what to do with the yielded - // rejection (swallow it and continue, manually .throw it back - // into the generator, abandon iteration, whatever). With - // await, by contrast, there is no opportunity to examine the - // rejection reason outside the generator function, so the - // only option is to throw it from the await expression, and - // let the generator function handle the exception. - result.value = unwrapped; - resolve(result); - }, reject); - } - } - - if (typeof process === "object" && process.domain) { - invoke = process.domain.bind(invoke); - } - - var previousPromise; - - function enqueue(method, arg) { - function callInvokeWithMethodAndArg() { - return new Promise(function(resolve, reject) { - invoke(method, arg, resolve, reject); - }); - } - - return previousPromise = - // If enqueue has been called before, then we want to wait until - // all previous Promises have been resolved before calling invoke, - // so that results are always delivered in the correct order. If - // enqueue has not been called before, then it is important to - // call invoke immediately, without waiting on a callback to fire, - // so that the async generator function has the opportunity to do - // any necessary setup in a predictable way. This predictability - // is why the Promise constructor synchronously invokes its - // executor callback, and why async functions synchronously - // execute code before the first await. Since we implement simple - // async functions in terms of async generators, it is especially - // important to get this right, even though it requires care. - previousPromise ? previousPromise.then( - callInvokeWithMethodAndArg, - // Avoid propagating failures to Promises returned by later - // invocations of the iterator. - callInvokeWithMethodAndArg - ) : callInvokeWithMethodAndArg(); - } - - // Define the unified helper method that is used to implement .next, - // .throw, and .return (see defineIteratorMethods). - this._invoke = enqueue; - } - - defineIteratorMethods(AsyncIterator.prototype); - runtime.AsyncIterator = AsyncIterator; - - // Note that simple async functions are implemented on top of - // AsyncIterator objects; they just return a Promise for the value of - // the final result produced by the iterator. - runtime.async = function(innerFn, outerFn, self, tryLocsList) { - var iter = new AsyncIterator( - wrap(innerFn, outerFn, self, tryLocsList) - ); - - return runtime.isGeneratorFunction(outerFn) - ? iter // If outerFn is a generator, return the full iterator. - : iter.next().then(function(result) { - return result.done ? result.value : iter.next(); - }); - }; - - function makeInvokeMethod(innerFn, self, context) { - var state = GenStateSuspendedStart; - - return function invoke(method, arg) { - if (state === GenStateExecuting) { - throw new Error("Generator is already running"); - } - - if (state === GenStateCompleted) { - if (method === "throw") { - throw arg; - } - - // Be forgiving, per 25.3.3.3.3 of the spec: - // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume - return doneResult(); - } - - context.method = method; - context.arg = arg; - - while (true) { - var delegate = context.delegate; - if (delegate) { - var delegateResult = maybeInvokeDelegate(delegate, context); - if (delegateResult) { - if (delegateResult === ContinueSentinel) continue; - return delegateResult; - } - } - - if (context.method === "next") { - // Setting context._sent for legacy support of Babel's - // function.sent implementation. - context.sent = context._sent = context.arg; - - } else if (context.method === "throw") { - if (state === GenStateSuspendedStart) { - state = GenStateCompleted; - throw context.arg; - } - - context.dispatchException(context.arg); - - } else if (context.method === "return") { - context.abrupt("return", context.arg); - } - - state = GenStateExecuting; - - var record = tryCatch(innerFn, self, context); - if (record.type === "normal") { - // If an exception is thrown from innerFn, we leave state === - // GenStateExecuting and loop back for another invocation. - state = context.done - ? GenStateCompleted - : GenStateSuspendedYield; - - if (record.arg === ContinueSentinel) { - continue; - } - - return { - value: record.arg, - done: context.done - }; - - } else if (record.type === "throw") { - state = GenStateCompleted; - // Dispatch the exception by looping back around to the - // context.dispatchException(context.arg) call above. - context.method = "throw"; - context.arg = record.arg; - } - } - }; - } - - // Call delegate.iterator[context.method](context.arg) and handle the - // result, either by returning a { value, done } result from the - // delegate iterator, or by modifying context.method and context.arg, - // setting context.delegate to null, and returning the ContinueSentinel. - function maybeInvokeDelegate(delegate, context) { - var method = delegate.iterator[context.method]; - if (method === undefined) { - // A .throw or .return when the delegate iterator has no .throw - // method always terminates the yield* loop. - context.delegate = null; - - if (context.method === "throw") { - if (delegate.iterator.return) { - // If the delegate iterator has a return method, give it a - // chance to clean up. - context.method = "return"; - context.arg = undefined; - maybeInvokeDelegate(delegate, context); - - if (context.method === "throw") { - // If maybeInvokeDelegate(context) changed context.method from - // "return" to "throw", let that override the TypeError below. - return ContinueSentinel; - } - } - - context.method = "throw"; - context.arg = new TypeError( - "The iterator does not provide a 'throw' method"); - } - - return ContinueSentinel; - } - - var record = tryCatch(method, delegate.iterator, context.arg); - - if (record.type === "throw") { - context.method = "throw"; - context.arg = record.arg; - context.delegate = null; - return ContinueSentinel; - } - - var info = record.arg; - - if (! info) { - context.method = "throw"; - context.arg = new TypeError("iterator result is not an object"); - context.delegate = null; - return ContinueSentinel; - } - - if (info.done) { - // Assign the result of the finished delegate to the temporary - // variable specified by delegate.resultName (see delegateYield). - context[delegate.resultName] = info.value; - - // Resume execution at the desired location (see delegateYield). - context.next = delegate.nextLoc; - - // If context.method was "throw" but the delegate handled the - // exception, let the outer generator proceed normally. If - // context.method was "next", forget context.arg since it has been - // "consumed" by the delegate iterator. If context.method was - // "return", allow the original .return call to continue in the - // outer generator. - if (context.method !== "return") { - context.method = "next"; - context.arg = undefined; - } - - } else { - // Re-yield the result returned by the delegate method. - return info; - } - - // The delegate iterator is finished, so forget it and continue with - // the outer generator. - context.delegate = null; - return ContinueSentinel; - } - - // Define Generator.prototype.{next,throw,return} in terms of the - // unified ._invoke helper method. - defineIteratorMethods(Gp); - - Gp[toStringTagSymbol] = "Generator"; - - Gp.toString = function() { - return "[object Generator]"; - }; - - function pushTryEntry(locs) { - var entry = { tryLoc: locs[0] }; - - if (1 in locs) { - entry.catchLoc = locs[1]; - } - - if (2 in locs) { - entry.finallyLoc = locs[2]; - entry.afterLoc = locs[3]; - } - - this.tryEntries.push(entry); - } - - function resetTryEntry(entry) { - var record = entry.completion || {}; - record.type = "normal"; - delete record.arg; - entry.completion = record; - } - - function Context(tryLocsList) { - // The root entry object (effectively a try statement without a catch - // or a finally block) gives us a place to store values thrown from - // locations where there is no enclosing try statement. - this.tryEntries = [{ tryLoc: "root" }]; - tryLocsList.forEach(pushTryEntry, this); - this.reset(true); - } - - runtime.keys = function(object) { - var keys = []; - for (var key in object) { - keys.push(key); - } - keys.reverse(); - - // Rather than returning an object with a next method, we keep - // things simple and return the next function itself. - return function next() { - while (keys.length) { - var key = keys.pop(); - if (key in object) { - next.value = key; - next.done = false; - return next; - } - } - - // To avoid creating an additional object, we just hang the .value - // and .done properties off the next function object itself. This - // also ensures that the minifier will not anonymize the function. - next.done = true; - return next; - }; - }; - - function values(iterable) { - if (iterable) { - var iteratorMethod = iterable[iteratorSymbol]; - if (iteratorMethod) { - return iteratorMethod.call(iterable); - } - - if (typeof iterable.next === "function") { - return iterable; - } - - if (!isNaN(iterable.length)) { - var i = -1, next = function next() { - while (++i < iterable.length) { - if (hasOwn.call(iterable, i)) { - next.value = iterable[i]; - next.done = false; - return next; - } - } - - next.value = undefined; - next.done = true; - - return next; - }; - - return next.next = next; - } - } - - // Return an iterator with no values. - return { next: doneResult }; - } - runtime.values = values; - - function doneResult() { - return { value: undefined, done: true }; - } - - Context.prototype = { - constructor: Context, - - reset: function(skipTempReset) { - this.prev = 0; - this.next = 0; - // Resetting context._sent for legacy support of Babel's - // function.sent implementation. - this.sent = this._sent = undefined; - this.done = false; - this.delegate = null; - - this.method = "next"; - this.arg = undefined; - - this.tryEntries.forEach(resetTryEntry); - - if (!skipTempReset) { - for (var name in this) { - // Not sure about the optimal order of these conditions: - if (name.charAt(0) === "t" && - hasOwn.call(this, name) && - !isNaN(+name.slice(1))) { - this[name] = undefined; - } - } - } - }, - - stop: function() { - this.done = true; - - var rootEntry = this.tryEntries[0]; - var rootRecord = rootEntry.completion; - if (rootRecord.type === "throw") { - throw rootRecord.arg; - } - - return this.rval; - }, - - dispatchException: function(exception) { - if (this.done) { - throw exception; - } - - var context = this; - function handle(loc, caught) { - record.type = "throw"; - record.arg = exception; - context.next = loc; - - if (caught) { - // If the dispatched exception was caught by a catch block, - // then let that catch block handle the exception normally. - context.method = "next"; - context.arg = undefined; - } - - return !! caught; - } - - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - var record = entry.completion; - - if (entry.tryLoc === "root") { - // Exception thrown outside of any try block that could handle - // it, so set the completion value of the entire function to - // throw the exception. - return handle("end"); - } - - if (entry.tryLoc <= this.prev) { - var hasCatch = hasOwn.call(entry, "catchLoc"); - var hasFinally = hasOwn.call(entry, "finallyLoc"); - - if (hasCatch && hasFinally) { - if (this.prev < entry.catchLoc) { - return handle(entry.catchLoc, true); - } else if (this.prev < entry.finallyLoc) { - return handle(entry.finallyLoc); - } - - } else if (hasCatch) { - if (this.prev < entry.catchLoc) { - return handle(entry.catchLoc, true); - } - - } else if (hasFinally) { - if (this.prev < entry.finallyLoc) { - return handle(entry.finallyLoc); - } - - } else { - throw new Error("try statement without catch or finally"); - } - } - } - }, - - abrupt: function(type, arg) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.tryLoc <= this.prev && - hasOwn.call(entry, "finallyLoc") && - this.prev < entry.finallyLoc) { - var finallyEntry = entry; - break; - } - } - - if (finallyEntry && - (type === "break" || - type === "continue") && - finallyEntry.tryLoc <= arg && - arg <= finallyEntry.finallyLoc) { - // Ignore the finally entry if control is not jumping to a - // location outside the try/catch block. - finallyEntry = null; - } - - var record = finallyEntry ? finallyEntry.completion : {}; - record.type = type; - record.arg = arg; - - if (finallyEntry) { - this.method = "next"; - this.next = finallyEntry.finallyLoc; - return ContinueSentinel; - } - - return this.complete(record); - }, - - complete: function(record, afterLoc) { - if (record.type === "throw") { - throw record.arg; - } - - if (record.type === "break" || - record.type === "continue") { - this.next = record.arg; - } else if (record.type === "return") { - this.rval = this.arg = record.arg; - this.method = "return"; - this.next = "end"; - } else if (record.type === "normal" && afterLoc) { - this.next = afterLoc; - } - - return ContinueSentinel; - }, - - finish: function(finallyLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.finallyLoc === finallyLoc) { - this.complete(entry.completion, entry.afterLoc); - resetTryEntry(entry); - return ContinueSentinel; - } - } - }, - - "catch": function(tryLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.tryLoc === tryLoc) { - var record = entry.completion; - if (record.type === "throw") { - var thrown = record.arg; - resetTryEntry(entry); - } - return thrown; - } - } - - // The context.catch method must only be called with a location - // argument that corresponds to a known catch block. - throw new Error("illegal catch attempt"); - }, - - delegateYield: function(iterable, resultName, nextLoc) { - this.delegate = { - iterator: values(iterable), - resultName: resultName, - nextLoc: nextLoc - }; - - if (this.method === "next") { - // Deliberately forget the last sent value so that we don't - // accidentally pass it on to the delegate. - this.arg = undefined; - } - - return ContinueSentinel; - } - }; -})( - // Among the various tricks for obtaining a reference to the global - // object, this seems to be the most reliable technique that does not - // use indirect eval (which violates Content Security Policy). - typeof global === "object" ? global : - typeof window === "object" ? window : - typeof self === "object" ? self : this -); \ No newline at end of file diff --git a/lib/tunnel.js b/lib/tunnel.js deleted file mode 100644 index c86804e..0000000 --- a/lib/tunnel.js +++ /dev/null @@ -1,44 +0,0 @@ - -const Emitter = require('./emitter'); - -/** - * 基于小程序 WebSocket 接口封装信道 - */ -module.exports = class Tunnel { - constructor() { - Emitter.setup(this.emitter = {}); - } - - connect(url, header) { - - // 小程序 wx.connectSocket() API header 参数无效,把会话信息附加在 URL 上 - const query = Object.keys(header).map(key => `${key}=${encodeURIComponent(header[key])}`).join('&'); - const seperator = url.indexOf('?') > -1 ? '&' : '?'; - url = [url, query].join(seperator); - - return new Promise((resolve, reject) => { - wx.onSocketOpen(resolve); - wx.onSocketError(reject); - wx.onSocketMessage(packet => { - try { - const { message, data } = JSON.parse(packet.data); - this.emitter.emit(message, data); - } catch (e) { - console.log('Handle packet failed: ' + packet.data, e); - } - }); - wx.onSocketClose(() => this.emitter.emit('close')); - wx.connectSocket({ url, header }); - }); - } - - on(message, handle) { - this.emitter.on(message, handle); - } - - emit(message, data) { - wx.sendSocketMessage({ - data: JSON.stringify({ message, data }) - }); - } -} \ No newline at end of file diff --git a/model/file.js b/model/file.js deleted file mode 100644 index 74a080a..0000000 --- a/model/file.js +++ /dev/null @@ -1,37 +0,0 @@ -const AV = require("../lib/av-live-query-weapp-min") - -class File extends AV.Object{ - get url(){ - return this.get("url"); - } - set url(value){ - this.set("url", value); - } - get fileid(){ - return this.get("fileid"); - } - set fileid(value){ - this.set("fileid", value); - } - get class(){ - return this.get("class"); - } - set class(value){ - this.set("class", value); - } - get filename(){ - return this.get("filename"); - } - set filename(value){ - this.set("filename", value); - } - get uploader(){ - return this.get("uploader"); - } - set uploader(value){ - this.set("uploader", value); - } -} - -AV.Object.register(File, "File_"); -module.exports = File; \ No newline at end of file diff --git a/model/studentclassmap.js b/model/studentclassmap.js deleted file mode 100644 index 79dbbb3..0000000 --- a/model/studentclassmap.js +++ /dev/null @@ -1,29 +0,0 @@ -const AV = require("../..//lib/av-live-query-weapp-min") - - -class StudentClassMap extends AV.Object{ - get class(){ - return this.get("class"); - } - set class(value){ - this.set("class", value); - } - get user(){ - return this.get("user"); - } - set user(value){ - this.set("user", value); - } - get mark() { - return this.get('done'); - } - set mark(value) { - this.set('mark', value); - } - add_mark(value) { - this.increment(value); - } -} - -AV.Object.register(StudentClassMap, "StudentClassMap"); -module.exports=StudentClassMap; \ No newline at end of file diff --git a/pages/classroom/classroom.js b/pages/classroom/classroom.js index bdc5146..75ec089 100644 --- a/pages/classroom/classroom.js +++ b/pages/classroom/classroom.js @@ -83,6 +83,7 @@ Page({ let login = event.currentTarget.dataset.login; let status = event.currentTarget.dataset.status; console.log("set_isasking"); + console.log(this.presences); let asking_presence = this.presences.filter(presence=>presence.get("edu_account_login")==login)[0]; console.log(asking_presence); asking_presence.isasking = status; @@ -169,6 +170,10 @@ Page({ } } console.log(students); + let stus = students.filter(student => student.login == app.client.current_user.login); + if(stus.length==1){ + this.setData({current_user: stus[0]}); + } this.setData({students: students}); return presences; }, diff --git a/pages/classroom/classroom.wxml b/pages/classroom/classroom.wxml index b669731..8099b25 100644 --- a/pages/classroom/classroom.wxml +++ b/pages/classroom/classroom.wxml @@ -45,10 +45,10 @@ diff --git a/pages/course/course.wxml b/pages/course/course.wxml index 41e6457..6f8e4e7 100644 --- a/pages/course/course.wxml +++ b/pages/course/course.wxml @@ -1,7 +1,14 @@ - - 进入教室 - 试卷 - 资源 + + + + + + + + + 进入教室 + 试卷 + 资源 \ No newline at end of file diff --git a/pages/courses/courses.js b/pages/courses/courses.js index ac68fed..c64d45f 100644 --- a/pages/courses/courses.js +++ b/pages/courses/courses.js @@ -2,7 +2,7 @@ const app = getApp(); Page({ - + options: {}, data: { courses: [], loading: true, @@ -10,6 +10,18 @@ Page({ show_join_course_modal:false, loaded_all: false, }, + search_courses: function({detail: {value}}){ + this.setData({ loaded_all: false }); + this.options.search = value; + this.fetch_courses(this.options).then(res => { + console.log(res); + this.set_courses(res.data.courses); + if (res.data.courses.length<=10) { + this.setData({ loaded_all: true }) + } + }) + + }, show_join_course_modal: function(event){ this.setData({show_join_course_modal: true}); }, @@ -100,14 +112,14 @@ Page({ wx.pageScrollTo({ selector: ".loading" }) - this.fetch_courses({ page: this.data.page + 1 }) + this.fetch_courses({ page: this.data.page + 1 ,...this.options}) .then(res => { this.setData({ page: this.data.page + 1}); if(res.data.courses.length==0){ this.setData({loaded_all: true}) }else{ this.add_courses(res.data.courses); - } + } }) } }, diff --git a/pages/courses/courses.json b/pages/courses/courses.json index feb3267..0cf83b4 100644 --- a/pages/courses/courses.json +++ b/pages/courses/courses.json @@ -1,5 +1,7 @@ { "usingComponents": { - "myicon": "/components/icon/myicon" + "myicon": "/components/icon/myicon", + "mp-searchbar": "/components/weui-miniprogram/searchbar/searchbar" } + } \ No newline at end of file diff --git a/pages/courses/courses.wxml b/pages/courses/courses.wxml index 9c80940..88076b2 100644 --- a/pages/courses/courses.wxml +++ b/pages/courses/courses.wxml @@ -1,6 +1,9 @@ - + + + + 没有可以加入的课程了 diff --git a/pages/exercise/exercise.js b/pages/exercise/exercise.js index f77120f..bd5b281 100644 --- a/pages/exercise/exercise.js +++ b/pages/exercise/exercise.js @@ -54,7 +54,7 @@ Page({ console.log("answer_main_question"); console.log(value); console.log(dataset); - app.client.answer_exercise_question({ question_id: dataset.question_id, exercise_choice_id:dataset.exercise_choice_id, answer_text: value }) + app.client.answer_question({ question_id: dataset.question_id, exercise_choice_id:dataset.exercise_choice_id, answer_text: value }) .then(res => { console.log("answer_main_question"); console.log(res); }) .catch(error => { console.error(error); @@ -68,7 +68,7 @@ Page({ console.log("answer_main_question"); console.log(value); console.log(dataset); - app.client.answer_exercise_question({ question_id: dataset.question_id, answer_text: value }) + app.client.answer_question({ question_id: dataset.question_id, answer_text: value }) .then(res => { console.log("answer_main_question"); console.log(res); }) .catch(error => { console.error(error); @@ -82,7 +82,7 @@ Page({ console.log("answer_question"); console.log(value); console.log(dataset); - app.client.answer_exercise_question({ question_id: dataset.question_id, exercise_choice_id: value}) + app.client.answer_question({ question_id: dataset.question_id, exercise_choice_id: value}) .then(res=>{console.log("answer_question");console.log(res);}) .catch(error=>{ console.error(error); diff --git a/pages/exercise/exercise.wxml b/pages/exercise/exercise.wxml index 8236352..c999457 100644 --- a/pages/exercise/exercise.wxml +++ b/pages/exercise/exercise.wxml @@ -7,8 +7,10 @@ - {{choice.choice_text}} - 正确答案 + + {{choice.choice_text}} + 正确答案 + @@ -16,8 +18,10 @@ - {{choice.choice_text}} - 正确答案 + + {{choice.choice_text}} + 正确答案 + diff --git a/pages/exercise/exercise.wxss b/pages/exercise/exercise.wxss index adbb573..10fd0fb 100644 --- a/pages/exercise/exercise.wxss +++ b/pages/exercise/exercise.wxss @@ -36,11 +36,11 @@ display: flex; flex-direction: column; } -.choice{ +checkbox.choice{ margin-bottom: 12rpx; } -.choice-text{ - display: inline-block; + +view.choice{ width: 600rpx; } diff --git a/pages/exercise_grade/exercise_grade.js b/pages/exercise_grade/exercise_grade.js new file mode 100644 index 0000000..9d80d43 --- /dev/null +++ b/pages/exercise_grade/exercise_grade.js @@ -0,0 +1,72 @@ +// pages/exercise_grade/exercise_grade.js +const app = getApp(); +Page({ + + /** + * 页面的初始数据 + */ + data: { + grades:[] + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.exercise_id = options.exercise_id; + app.client.get_exercise_grade({exercise_id: this.exercise_id}) + .then(res=>{ + console.log(res); + this.setData({ grades: res.data.exercise_users}) + }) + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/exercise_grade/exercise_grade.json b/pages/exercise_grade/exercise_grade.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/exercise_grade/exercise_grade.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/exercise_grade/exercise_grade.wxml b/pages/exercise_grade/exercise_grade.wxml new file mode 100644 index 0000000..bf66ac0 --- /dev/null +++ b/pages/exercise_grade/exercise_grade.wxml @@ -0,0 +1,14 @@ + + + + + {{grade.user_name}} + {{grade.score||'--'}} + + + + + 分数未公布 + + + diff --git a/pages/exercise_grade/exercise_grade.wxss b/pages/exercise_grade/exercise_grade.wxss new file mode 100644 index 0000000..4e32f27 --- /dev/null +++ b/pages/exercise_grade/exercise_grade.wxss @@ -0,0 +1,21 @@ +.container{ + height: 100%; +} + +.grade{ + background: white; + padding: 20rpx 10rpx; + border-bottom: 1rpx solid gray; +} + +.grade text{ + margin: 0rpx 20rpx; +} + +.mark{ + position: absolute; + right: 3rpx; + padding: 3rpx 23rpx; + width: 45rpx; + text-align: center; +} diff --git a/pages/exercise_setting/exercise_setting.js b/pages/exercise_setting/exercise_setting.js new file mode 100644 index 0000000..f3af882 --- /dev/null +++ b/pages/exercise_setting/exercise_setting.js @@ -0,0 +1,124 @@ +// pages/exercise_setting/exercise_setting.js +import { getNowFormatDate, getNowFormatTime} from "../../utils/dateutils" +const app = getApp(); +Page({ + + /** + * 页面的初始数据 + */ + data: { + exercise_id: null, + exercise: {}, + exercise_questions:[], + }, + start_publish: function(){ + if (!this.data.exercise_id) { + console.error("请先保存试卷"); + return; + } + console.log({ + course_id: this.course_id, exercise_ids: [this.data.exercise_id], + end_time: getNowFormatDate() + " " + getNowFormatTime() + }); + let end_time = getNowFormatDate() + " " + getNowFormatTime(); + end_time = end_time.replace("-11", "-12"); + app.client.publish_exercise({ + course_id: this.course_id, exercise_ids: [this.data.exercise_id], + end_time: end_time + }).then(res=>{ + console.log(res); + wx.navigateBack({ + delta: 1 + }) + } + ) + }, + create_question: function(){ + if(!this.data.exercise_id){ + console.error("请先保存试卷"); + return; + } + wx.navigateTo({ + url: `../question_setting/question_setting?exercise_id=${this.data.exercise_id}`, + }) + }, + create_exercise: function({detail:{value}}){ + console.log(value); + app.client.create_exercise({...value, course_id: this.course_id}) + .then(res=>{ + console.log(res); + this.setData({ exercise_id: res.data.data.exercise_id}); + }) + .catch(error=>{ + console.error(error); + }); + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.course_id = options.course_id; + this.intent=options.intent; + if(options.exercise_id){ + this.setData({exercise_id: options.exercise_id}); + } + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + if(this.data.exercise_id){ + app.client.get_exercise_edit({exercise_id: this.data.exercise_id}) + .then(res=>{ + console.log(res); + this.setData( + { + exercise_questions: res.data.exercise_questions, + exercise: res.data.exercise + }) + }) + } + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/exercise_setting/exercise_setting.json b/pages/exercise_setting/exercise_setting.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/exercise_setting/exercise_setting.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/exercise_setting/exercise_setting.wxml b/pages/exercise_setting/exercise_setting.wxml new file mode 100644 index 0000000..4289961 --- /dev/null +++ b/pages/exercise_setting/exercise_setting.wxml @@ -0,0 +1,89 @@ + + +
+ + + + + + + + + + +
+ + + +
+ + + + 第{{question.q_position}}题 + + + + + + {{choice.choice_text}} + + + + + + 暂不支持填空题... + + + + + + + 暂不支持实训题... + + + + +
+ \ No newline at end of file diff --git a/pages/exercise_setting/exercise_setting.wxss b/pages/exercise_setting/exercise_setting.wxss new file mode 100644 index 0000000..4322211 --- /dev/null +++ b/pages/exercise_setting/exercise_setting.wxss @@ -0,0 +1,63 @@ +page{ + height: 100%; +} +.question{ + background: white; + margin: 20rpx -6rpx; + padding: 4rpx 20rpx 22rpx 22rpx; + border-radius: 18rpx; +} + +.question-title{ + display: inline-block; + margin: 5rpx 0rpx 12rpx 0rpx; +} + +.choices{ + display: flex; + flex-direction: column; +} +checkbox.choice{ + margin-bottom: 12rpx; +} + +view.choice{ + width: 600rpx; +} + +.main-input{ + height: 120rpx; + margin: 18rpx 0 4rpx 18rpx; + border: 1rpx solid lightgray; + border-radius: 12rpx; + padding: 12rpx 10rpx; +} + +view.null-input{ + align-items: center; +} + +input.null-input{ + border: 1rpx solid lightgray; + padding: 12rpx 6rpx; + margin: 6rpx 10rpx; + border-radius: 10rpx; +} + +.standard-choice{ + margin-left: 24rpx; +} + +standard-null-input{ + align-items: center; +} + +/**tmp*/ + + +textarea, input{ + border: 1rpx solid gray; + border-radius: 10rpx; + padding: 10rpx; + width: 100%; +} \ No newline at end of file diff --git a/pages/exercises/exercises.js b/pages/exercises/exercises.js index 37c4b44..306378a 100644 --- a/pages/exercises/exercises.js +++ b/pages/exercises/exercises.js @@ -44,10 +44,30 @@ Page({ exercise_status: 3, course_identities: [2, 5, 6] }, + { + text: "未发布", + exercise_status: 1, + course_identities: [2] + }, ], currentTab: 0, navScrollLeft: 0 }, + see_grade: function({currentTarget:{dataset}}){ + wx.navigateTo({ + url: `../exercise_grade/exercise_grade?exercise_id=${dataset.exercise_id}`, + }) + }, + edit_exercise: function({currentTarget:{dataset}}){ + wx.navigateTo({ + url: `../exercise_setting/exercise_setting?course_id=${this.course_id}&exercise_id=${dataset.exercise_id}`, + }) + }, + create_exercise: function(){ + wx.navigateTo({ + url: `../exercise_setting/exercise_setting?course_id=${this.course_id}`, + }) + }, pull_courses_info: function(){ app.client.get_user_info() .then(); @@ -99,6 +119,11 @@ Page({ //事件处理函数 onLoad: function (options) { this.course_id = options.id; + app.client.get_course_info({course_id: this.course_id}) + .then(res=>{ + this.setData({course:res.data}) + console.log(res) + }) }, onShow: function(){ this.setData({require_login: false}); diff --git a/pages/exercises/exercises.wxml b/pages/exercises/exercises.wxml index ae435a5..0779b6d 100644 --- a/pages/exercises/exercises.wxml +++ b/pages/exercises/exercises.wxml @@ -23,20 +23,24 @@
- + {{exercise.exercise_name}} 还有{{exercise.exercise_left_time||' '}}截止 {{exercise.exercise_tips[0]}} - 进入答题 - 查看答题 + 进入答题 + 查看答题 + 编辑 + + +
diff --git a/pages/mark_detail/mark_detail.wxss b/pages/mark_detail/mark_detail.wxss index 2ab8ed8..93897fd 100644 --- a/pages/mark_detail/mark_detail.wxss +++ b/pages/mark_detail/mark_detail.wxss @@ -44,12 +44,12 @@ margin: 0rpx 20rpx; } .time{ - position: fixed; + position: absolute; right: 180rpx; } .mark{ - position: fixed; + position: absolute; right: 3rpx; padding: 3rpx 23rpx; width: 45rpx; diff --git a/pages/question_setting/question_setting.js b/pages/question_setting/question_setting.js new file mode 100644 index 0000000..131c92b --- /dev/null +++ b/pages/question_setting/question_setting.js @@ -0,0 +1,78 @@ +// pages/question_setting/question_setting.js +const app = getApp(); +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + create_question: function({detail:{value}}){ + console.log(value); + let data = { + question_title:value.question_title,question_type:0,question_score:5,question_choices:[value.question_choices_0, value.question_choices_1, value.question_choices_2, value.question_choices_3],standard_answers:value.standard_answers} + app.client.create_question({exercise_id: this.exercise_id, data}) + .then(res=>{ + console.log(res); + wx.navigateBack({ + delta: 1 + }) + }) + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + this.exercise_id = options.exercise_id; + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/question_setting/question_setting.json b/pages/question_setting/question_setting.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/question_setting/question_setting.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/question_setting/question_setting.wxml b/pages/question_setting/question_setting.wxml new file mode 100644 index 0000000..1dccbb0 --- /dev/null +++ b/pages/question_setting/question_setting.wxml @@ -0,0 +1,14 @@ + +
+ + + + + + + + + + +
+
\ No newline at end of file diff --git a/pages/question_setting/question_setting.wxss b/pages/question_setting/question_setting.wxss new file mode 100644 index 0000000..3709995 --- /dev/null +++ b/pages/question_setting/question_setting.wxss @@ -0,0 +1,6 @@ +textarea, input{ + border: 1rpx solid gray; + border-radius: 10rpx; + padding: 10rpx; + width: 100%; +} \ No newline at end of file diff --git a/utils/dateutils.js b/utils/dateutils.js index ae4ef0a..6483c3e 100644 --- a/utils/dateutils.js +++ b/utils/dateutils.js @@ -12,4 +12,17 @@ export function getNowFormatDate() { } var currentdate = year + seperator1 + month + seperator1 + strDate; return currentdate; +} + +export function getNowFormatTime(){ + var now = new Date(); + var hour = now.getHours();//得到小时 + var minu = now.getMinutes();//得到分钟 + var sec = now.getSeconds();//得到秒 + if (hour < 10) hour = "0" + hour; + if (minu < 10) minu = "0" + minu; + if (sec < 10) sec = "0" + sec; + var time = ""; + time = hour + ":" + minu + ":" + sec; + return time; } \ No newline at end of file