From 48a110907ea15cb3cfa9d0ed2f43b3bffc821482 Mon Sep 17 00:00:00 2001 From: educoder_weapp Date: Sat, 9 Nov 2019 16:36:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B3=A8=E5=86=8C=E3=80=81?= =?UTF-8?q?=E6=89=BE=E5=9B=9E=E5=AF=86=E7=A0=81=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=88=9B=E5=BB=BA=E8=AF=BE=E5=A0=82=E7=9A=84?= =?UTF-8?q?=E7=95=8C=E9=9D=A2UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 +- README.md | 7 + app.json | 11 +- app.wxss | 7 +- data/client.js | 87 ++- data/eduapi.js | 547 ++++++++++-------- images/educoder.png | Bin 9049 -> 11616 bytes images/weapp_code.png | Bin 0 -> 54196 bytes .../course_detail.js => course/course.js} | 2 +- .../course_detail.json => course/course.json} | 0 .../course_detail.wxml => course/course.wxml} | 6 +- .../course_detail.wxss => course/course.wxss} | 0 pages/course_setting/course_setting.js | 56 +- pages/course_setting/course_setting.wxml | 110 ++-- pages/course_setting/course_setting.wxss | 11 +- pages/exercise/exercise.wxml | 4 +- pages/exercise/exercise.wxss | 7 +- pages/login/login.js | 12 +- pages/login/login.json | 2 +- pages/login/login.wxml | 15 +- pages/login/login.wxss | 8 + pages/my_courses/my_courses.js | 4 +- pages/register/register.js | 55 +- pages/register/register.json | 3 +- pages/register/register.wxml | 33 +- pages/register/register.wxss | 47 +- pages/reset_password/reset_password.js | 119 ++++ pages/reset_password/reset_password.json | 4 + pages/reset_password/reset_password.wxml | 39 ++ pages/reset_password/reset_password.wxss | 46 ++ pages/setting/setting.js | 2 +- utils/dateutils.js | 15 + 32 files changed, 916 insertions(+), 348 deletions(-) create mode 100644 images/weapp_code.png rename pages/{course_detail/course_detail.js => course/course.js} (95%) rename pages/{course_detail/course_detail.json => course/course.json} (100%) rename pages/{course_detail/course_detail.wxml => course/course.wxml} (80%) rename pages/{course_detail/course_detail.wxss => course/course.wxss} (100%) create mode 100644 pages/reset_password/reset_password.js create mode 100644 pages/reset_password/reset_password.json create mode 100644 pages/reset_password/reset_password.wxml create mode 100644 pages/reset_password/reset_password.wxss create mode 100644 utils/dateutils.js diff --git a/.gitignore b/.gitignore index 9f490f6..edccf46 100644 --- a/.gitignore +++ b/.gitignore @@ -9,11 +9,12 @@ $RECYCLE.BIN/ .Spotlight-V100 .TemporaryItems .Trashes +project.config.json +app.js -lib_refer towxml -project.config.json .idea +api_docs # Node.js node_modules/ diff --git a/README.md b/README.md index d28ed1a..f73023b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,10 @@ +# 简介 +educoder微信小程序,帮助使用[educoder平台](https://www.educoder.net)的应用,方便在手机上使用。利用educoder网站的API搭建 + +## 小程序码 +![小程序码](./images/weapp_code.png) + + # 功能介绍 ## 教室 diff --git a/app.json b/app.json index e16e742..a707efa 100644 --- a/app.json +++ b/app.json @@ -1,7 +1,7 @@ { "pages": [ - "pages/my_courses/my_courses", + "pages/course_setting/course_setting", "pages/exercises/exercises", "pages/courses/courses", "pages/exercise/exercise", @@ -10,15 +10,14 @@ "pages/about/about", "pages/login/login", "pages/test/test", - "pages/course_detail/course_detail", + "pages/course/course", "pages/files/files", - "pages/course_setting/course_setting", - "pages/mark_detail/mark_detail" - + "pages/mark_detail/mark_detail", + "pages/reset_password/reset_password" ], "window": { "backgroundTextStyle": "dark", - "navigationBarTitleText": "积分教室", + "navigationBarTitleText": "EduCoder", "navigationBarTextStyle": "black", "backgroundColor": "#f2f2f2", "navigationBarBackgroundColor": "#fbfbfb" diff --git a/app.wxss b/app.wxss index 65b721c..d3e6aa2 100644 --- a/app.wxss +++ b/app.wxss @@ -7,9 +7,14 @@ page { flex-direction: row; } .form-wrap { - border-top: 1px solid #eee; + border-top: 1px solid #bbb; margin: 12px 0; } +.tappable{ + color: #1aad19; + padding: 0 12px; +} + .tappable:hover { opacity: .6; } diff --git a/data/client.js b/data/client.js index 897ebec..24b4093 100644 --- a/data/client.js +++ b/data/client.js @@ -136,6 +136,30 @@ export class Client{ }); }); } + reset_password({login, code, new_password, new_password_confirmation, success, fail, complete}){ + return new Promise((resolve, reject) => { + Account.reset_password({ + session: this.session, + login: login, + code: code, + new_password: new_password, + new_password_confirmation: new_password_confirmation, + complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + } + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); + } + }) + }) + } get_user_info({success, fail, complete}={}){ return new Promise((resolve, reject) => { Account.get_user_info({session: this.session, complete: complete, @@ -160,10 +184,46 @@ export class Client{ }); } get_verification_code_for_register({login, success, fail, complete}){ - return Account.get_verification_code({session: this.session, login: login, type: 1, - fail: fail, complete: complete, success: success}); + return new Promise((resolve, reject) => { + Account.get_verification_code({ + session: this.session, login: login, type: 1, + complete: complete, + success: res => { + if (typeof success == "function") { + success(res); + } + resolve(res); + }, + fail: error => { + if (typeof fail == "function") { + fail(error); + } + reject(error); + } + }); + }) + + } + get_verification_code_for_reset_password({login, success, fail, complete}){ + return new Promise((resolve, reject) => { + Account.get_verification_code({ + session: this.session, login: login, type: 2, + complete: complete, + success: res => { + if (typeof success == "function") { + success(res); + } + resolve(res); + }, + fail: error => { + if (typeof fail == "function") { + fail(error); + } + reject(error); + } + }); + }) } - get_verification_code_for_reset_password({}){} search_courses({limit=20, page=1, order="all", search="", success, fail, complete}={}){ return new Promise((resolve, reject) => { @@ -228,6 +288,27 @@ export class Client{ }); }); } + create_course({data, success, fail, complete}){ + return new Promise((resolve,reject)=>{ + Course.create({ + session: this.session, + data: data, + complete: complete, + success: res => { + if (typeof success == "function") { + success(res); + } + resolve(res); + }, + fail: error => { + if (typeof fail == "function") { + fail(error); + } + reject(error); + } + }) + }); + } join_course({invite_code, professor=null,assistant_professor=null,student=null, success, fail, complete}){ return new Promise((resolve, reject)=>{ Course.join({session: this.session, invite_code: invite_code, professor: professor, assistant_professor: assistant_professor, student: student, complete: complete, diff --git a/data/eduapi.js b/data/eduapi.js index 16f1349..92971ea 100644 --- a/data/eduapi.js +++ b/data/eduapi.js @@ -3,70 +3,68 @@ const api_base_url = "https://www.educoder.net/api"; * https://www.educoder.net的api接口,通过其实现用户与后端进行交互 */ export class Account{ - static login({session, login, password, autologin, success, fail, complete}) { - console.log("login"); - let data = {login: login, password: password, autologin: autologin}; - session.request({ - url: api_base_url + "/accounts/login.json", - method: "POST", - data: data, - header: {"content-type": "application/json"}, - success: (res)=>{ - if("status" in res.data && res.data.status<0){ - fail(new Error(res.data.message)); - return; - } - console.log("type of success:"+ typeof success); - if(typeof success == "function") { - success(res); - } - }, - fail: fail, - complete: complete - }); - } - static get_user_info({session, success, fail, complete}){ - let data = {school: 1} - session.request({ - url: api_base_url + "/users/get_user_info.json", - method: "GET", - data: data, - success: success, - fail: fail, - complete: complete - }) - } - static get_verification_code({session, login, type, success, fail, complete}){ - let data = {login: login, type: type}; - //@notice: type: 验证码用途 type=1=> 注册 type=2 => 重置密码 - session.request({ - url: api_base_url + "/accounts/get_verification_code.json", - method: "GET", - data: data, - success: success, - fail: fail, - complete: complete - }) - } - static register({session, login, password, code, success, fail, complete}){ - let data = {login: login, password: password, code: code}; - session.request({ - url: api_base_url + "/accounts/register.json", - method: "POST", - data:data, - success(res) { - if("status" in res.data && res.data.status<0){ - fail(new Error(res.data.message)); - return; - } - success(res); - }, - fail: fail, - complete: complete - }) - } - static attendance({session, success, fail, complete}){ - session.request({ + static register({session, login, password, code, success, fail, complete}){ + let data = {login: login, password: password, code: code}; + session.request({ + url: api_base_url + "/accounts/register.json", + method: "POST", + data:data, + success(res) { + if("status" in res.data && res.data.status<0){ + fail(new Error(res.data.message)); + return; + } + success(res); + }, + fail: fail, + complete: complete + }) + } + static login({session, login, password, autologin, success, fail, complete}) { + console.log("login"); + let data = {login: login, password: password, autologin: autologin}; + session.request({ + url: api_base_url + "/accounts/login.json", + method: "POST", + data: data, + header: {"content-type": "application/json"}, + success: (res)=>{ + if("status" in res.data && res.data.status<0){ + fail(new Error(res.data.message)); + return; + } + console.log("type of success:"+ typeof success); + if(typeof success == "function") { + success(res); + } + }, + fail: fail, + complete: complete + }); + } + static logout({session, success, fail, complete}){ + session.request({ + url: api_base_url + "/accounts/logout.json", + method: "GET", + success: success, + fail: fail, + complete: complete + }) + } + static get_verification_code({session, login, type, success, fail, complete}){ + let data = {login: login, type: type}; + //@notice: type: 验证码用途 type=1=> 注册 type=2 => 重置密码 + session.request({ + url: api_base_url + "/accounts/get_verification_code.json", + method: "GET", + data: data, + success: success, + fail: fail, + complete: complete + }) + } + static attendance({session, success, fail, complete}){ + session.request({ url: api_base_url + "/users/attendance.json", success(res) { if("status" in res.data && res.data.status<0){ @@ -81,156 +79,177 @@ export class Account{ complete: complete }) } - static logout({session, success, fail, complete}){ - session.request({ - url: api_base_url + "/accounts/logout.json", - method: "GET", - success: success, - fail: fail, - complete: complete - }) - } - static get_user_courses({session,user,page=1, per_page=16, success, fail, complete}){ - let data = {page: page, per_page: per_page}; - return session.request({ - url: api_base_url + "/users/"+user +"/courses.json", - method: "GET", - data: data, - success: success, - fail: fail, - complete: complete - }) - } + static get_user_info({session, success, fail, complete}){ + let data = {school: 1} + session.request({ + url: api_base_url + "/users/get_user_info.json", + method: "GET", + data: data, + success: success, + fail: fail, + complete: complete + }) + } + static get_user_courses({session,user,page=1, per_page=16, success, fail, complete}){ + let data = {page: page, per_page: per_page}; + return session.request({ + url: api_base_url + "/users/"+user +"/courses.json", + method: "GET", + data: data, + success: success, + fail: fail, + complete: complete + }) + } + static reset_password({session, login, code, new_password, new_password_confirmation, success, fail, complete}){ + let data ={ + login: login, + code: code, + new_password: new_password, + new_password_confirmation: new_password_confirmation + }; + return session.request({ + url: api_base_url + "/accounts/reset_password.json", + method: "POST", + data: data, + success(res) { + if("status" in res.data && res.data.status<0){ + fail(new Error(res.data.message)); + return; + } + success(res); + }, + fail: fail, + complete: complete + }) + } + static set_password({}){ + + } } export class Course{ - static create({session, data, success, fail, complete}){ + static create({session, data, success, fail, complete}){ + return session.request({ + url: api_base_url + "/courses.json", + method: "POST", + data: data, + success: res => { + if ("status" in res.data && res.data.status < 0) { + fail(new Error(res.data.message)); + return; + } + if (typeof success == "function") { + success(res); + } + }, + fail: fail, + complete: complete + }) + } + static setting({session, course_id, data, success, fail, complete}){ + return session.request({ - } - static search({session, limit=20, page=1, order="all", search="", success, fail, complete}){ - let data = {limit: limit, page: page, order: order, search: search}; - return session.request({ - url: api_base_url + "/courses.json", - method: "GET", + }) + } + static search({session, limit=20, page=1, order="all", search="", success, fail, complete}){ + let data = {limit: limit, page: page, order: order, search: search}; + return session.request({ + url: api_base_url + "/courses.json", + method: "GET", + data: data, + success: success, + fail: fail, + complete: complete + }) + } + static join({session, invite_code, professor=null,assistant_professor=null,student=null, success, fail, complete}){ + let data = { + invite_code: invite_code, + professor: professor, + assistant_professor: assistant_professor, + student: student + }; + return session.request({ + url: api_base_url + "/courses/apply_to_join_course.json", + method:"POST", data: data, - success: success, - fail: fail, - complete: complete - }) - } - static join({session, invite_code, professor=null,assistant_professor=null,student=null, success, fail, complete}){ - let data = { - invite_code: invite_code, - professor: professor, - assistant_professor: assistant_professor, - student: student - }; - return session.request({ - url: api_base_url + "/courses/apply_to_join_course.json", - method:"POST", - data: data, - success: res=>{ - if("status" in res.data && res.data.status<0){ - fail(new Error(res.data.message)); - return; + success: res=>{ + if("status" in res.data && res.data.status<0){ + fail(new Error(res.data.message)); + return; + } + if(typeof success == "function"){ + success(res); } - if(typeof success == "function"){ - success(res); + }, + fail: fail, + complete: complete + }) + } + static get_user_info({session, course_id, success, fail, complete}){ + let data = {course_id: course_id, school: 1} + return session.request({ + url: api_base_url + "/users/get_user_info.json", + method: "GET", + data: data, + success: success, + fail: fail, + complete: complete + }) + } + static get_files({session, course_id, page_size=15, page=1,search="",sort=0, sort_type="created_on", success, fail, complete}){ + let data = {course_id: course_id, page_size: page_size, page: page, search: search, sort: sort, sort_type: sort_type}; + return session.request({ + url: api_base_url + "/files.json", + method: "GET", + data: data, + success: success, + fail: fail, + complete: complete + }) + } + static get_students({session, course_id, order=1,sort="asc",page=1, limit=20, course_group_id="", success, fail, complete}){ + let data = { + order: order, + sort: sort, + page: page, + limit: limit, + course_group_id: course_group_id + }; + return session.request({ + url: api_base_url + "/courses/" + course_id + "/students.json", + method: "GET", + data: data, + success(res){ + if("status" in res.data && "message" in res.data){ + fail(new Error(res.data.message)); + return; } + success(res); }, - fail: fail, - complete: complete - }) - } - static get_user_info({session, course_id, success, fail, complete}){ - let data = {course_id: course_id, school: 1} - return session.request({ - url: api_base_url + "/users/get_user_info.json", - method: "GET", - data: data, - success: success, - fail: fail, - complete: complete - }) - } - static get_files({session, course_id, page_size=15, page=1,search="",sort=0, sort_type="created_on", success, fail, complete}){ - let data = {course_id: course_id, page_size: page_size, page: page, search: search, sort: sort, sort_type: sort_type}; - return session.request({ - url: api_base_url + "/files.json", - method: "GET", - data: data, - success: success, - fail: fail, - complete: complete - }) - } - static get_students({session, course_id, order=1,sort="asc",page=1, limit=20, course_group_id="", success, fail, complete}){ - let data = { - order: order, - sort: sort, - page: page, - limit: limit, - course_group_id: course_group_id - }; - return session.request({ - url: api_base_url + "/courses/" + course_id + "/students.json", - method: "GET", - data: data, - success(res){ - if("status" in res.data && "message" in res.data){ - fail(new Error(res.data.message)); - return; - } - success(res); - }, - fail: fail, - complete: complete - }) - } - static get_course_info({session, course_id, success, fail, complete}){ - session.request({ - url: api_base_url + "/courses/"+course_id+"/top_banner.json", - method : "GET", - success: success, - fail: fail, - complete: complete - }) - } + fail: fail, + complete: complete + }) + } + static get_course_info({session, course_id, success, fail, complete}){ + session.request({ + url: api_base_url + "/courses/"+course_id+"/top_banner.json", + method : "GET", + success: success, + fail: fail, + complete: complete + }) + } } export class Exercise{ - static search({session,course_id, page=1, limit=15, success, fail, complete}){ - let data = {page:page, limit:limit}; + static search({session,course_id, page=1, limit=15, success, fail, complete}){ + let data = {page:page, limit:limit}; return session.request({ - url: api_base_url + "/courses/"+course_id+"/exercises.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 start_answer({session, exercise_id, login, success, fail, complete}){ - let data = {login: login}; - return session.request({ - url: api_base_url + "/exercises/" + exercise_id + "/start_answer.json", - method: "GET", - data: data, + url: api_base_url + "/courses/"+course_id+"/exercises.json", + method: "GET", + data: data, success(res) { if ("status" in res.data ) { if (res.data.status < 0){ @@ -247,11 +266,37 @@ export class Exercise{ success(res); } }, - fail: fail, - complete: complete - }) - } - static save({session, exercise_id, success, fail, complete}){ + fail:fail, + complete: complete + }) + } + static start_answer({session, exercise_id, login, success, fail, complete}){ + let data = {login: login}; + return session.request({ + url: api_base_url + "/exercises/" + exercise_id + "/start_answer.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 save({session, exercise_id, success, fail, complete}){ return session.request({ url: api_base_url + "/exercises/"+exercise_id+"/begin_commit.json", method: "GET", @@ -262,7 +307,7 @@ export class Exercise{ } static commit({session, exercise_id, commit_method=1, success, fail, complete}){ let data = {commit_method: commit_method}; - return session.request({ + return session.request({ url: api_base_url+ "/exercises/"+exercise_id+"/commit_exercise.json", method: "POST", data: data, @@ -274,49 +319,49 @@ export class Exercise{ } export class ExerciseQuestion { - 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;} - if(answer_text){data["answer_text"] = answer_text} - return session.request({ - url: api_base_url + "/exercise_questions/" + question_id +"/exercise_answers.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 -1: - fail(new Error("???")); - return; - }*/ - } - if(typeof success == "function") { - success(res); - } - }, - fail: error=>{ - // console.error("wx.request error:"); - // console.log(error); - // console.log(error.toString()); - // console.log(error.message); - // console.log(error.errMsg); - let e = error; - if(!("message" in error)){ - if("errMsg" in error){ - e = new Error(error.errMsg); - } - } - if(typeof fail == "function") { - fail(e); - } - }, - 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;} + if(answer_text){data["answer_text"] = answer_text} + return session.request({ + url: api_base_url + "/exercise_questions/" + question_id +"/exercise_answers.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 -1: + fail(new Error("???")); + return; + }*/ + } + if(typeof success == "function") { + success(res); + } + }, + fail: error=>{ + // console.error("wx.request error:"); + // console.log(error); + // console.log(error.toString()); + // console.log(error.message); + // console.log(error.errMsg); + let e = error; + if(!("message" in error)){ + if("errMsg" in error){ + e = new Error(error.errMsg); + } + } + if(typeof fail == "function") { + fail(e); + } + }, + complete: complete + }) + } } export class Ui{ diff --git a/images/educoder.png b/images/educoder.png index 05b9d163e5267afb1d933b189a1d6210fc2fe634..4c3212a1cec22f1206eeb224ee74df869506267e 100644 GIT binary patch literal 11616 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 literal 9049 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 diff --git a/images/weapp_code.png b/images/weapp_code.png new file mode 100644 index 0000000000000000000000000000000000000000..d2c5367375249799461847e6415506a89d43deca GIT binary patch literal 54196 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¥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 + + 进入教室 试卷 资源 - \ No newline at end of file + + \ No newline at end of file diff --git a/pages/course_detail/course_detail.wxss b/pages/course/course.wxss similarity index 100% rename from pages/course_detail/course_detail.wxss rename to pages/course/course.wxss diff --git a/pages/course_setting/course_setting.js b/pages/course_setting/course_setting.js index 2143c6c..0b7e499 100644 --- a/pages/course_setting/course_setting.js +++ b/pages/course_setting/course_setting.js @@ -1,18 +1,70 @@ // pages/course_setting/course_setting.js +import { getNowFormatDate } from "../../utils/dateutils"; + +const app = getApp(); + Page({ /** * 页面的初始数据 */ + initial_form_data: { + //course_module_types + shixun_homework: true, + common_homework: true, + group_homework: true, + exercise: true, + attachment: true, + course_group: true, + //course_module_types + end_date: "", + school: "" + }, data: { - + current_date: getNowFormatDate(), + form_data: {} + }, + reset: function () { + this.setData({ form_data: this.initial_form_data }); + }, + create_course: function ({ detail: { value } }) { + console.info(value); + if (this.intent == "create") { + app.client.create_course({ + data: value, + success: res => { + console.info("create course") + console.info(res); + wx.navigateTo({ + url:"/pages/course/course?course_id="+res.course_id + }) + wx.showToast({ + title: "创建成功", + duration: 5000 + }); + }, + fail: error => { + wx.showToast({ + title: error.toString(), + icon: "none" + }) + } + }) + } + }, + updateCourseListName({ detail: { value } }) { + this.setData({ "form_data.name": value }); + }, + updateEndDate({ detail: { value } }) { + console.log(value); + this.setData({ "form_data.end_date": value }); }, - /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { this.intent = options.intent; + if (this.intent == "create") this.reset(); console.log(options); console.log(this.intent); }, diff --git a/pages/course_setting/course_setting.wxml b/pages/course_setting/course_setting.wxml index a948cfc..88c4485 100644 --- a/pages/course_setting/course_setting.wxml +++ b/pages/course_setting/course_setting.wxml @@ -1,23 +1,11 @@ - -
+ 课程名称 @@ -25,13 +13,15 @@ 课堂名称 - + value="{{form_data.name}}" + name="name"> + 总学时 @@ -39,47 +29,53 @@ 学分 + + 结束时间 + {{form_data.end_date||"请选择结束时间"}} + + + + 课堂模块 + + 公告栏 + 实训作业 + 普通作业 + 分组作业 + 毕业设计 + 试卷 + 问卷 + 资源 + 讨论 + 分班 + 统计 + + + + 加入课堂条件 + 已实名认证 + 已职业认证 + + + 公开设置 + 公开课堂 + + + 课堂所属单位 + + + +
- -
- - \ No newline at end of file + \ No newline at end of file diff --git a/pages/course_setting/course_setting.wxss b/pages/course_setting/course_setting.wxss index f7bec2c..6a63586 100644 --- a/pages/course_setting/course_setting.wxss +++ b/pages/course_setting/course_setting.wxss @@ -1 +1,10 @@ -/* pages/course_setting/course_setting.wxss */ \ No newline at end of file +input.form-item{ + border: 1rpx solid gray; + border-radius: 8rpx; + padding: 12rpx 18rpx; +} + +.form-wrap{ + margin: 24rpx -12rpx; + padding: 2rpx 10rpx; +} \ No newline at end of file diff --git a/pages/exercise/exercise.wxml b/pages/exercise/exercise.wxml index f839f09..8236352 100644 --- a/pages/exercise/exercise.wxml +++ b/pages/exercise/exercise.wxml @@ -3,9 +3,9 @@ 第{{question.q_position}}题 - + - + {{choice.choice_text}} 正确答案 diff --git a/pages/exercise/exercise.wxss b/pages/exercise/exercise.wxss index 1845b4e..adbb573 100644 --- a/pages/exercise/exercise.wxss +++ b/pages/exercise/exercise.wxss @@ -28,7 +28,7 @@ } .question-title{ - display: block; + display: inline-block; margin: 5rpx 0rpx 12rpx 0rpx; } @@ -40,7 +40,8 @@ margin-bottom: 12rpx; } .choice-text{ - margin-left: 10rpx; + display: inline-block; + width: 600rpx; } .main-input{ @@ -68,4 +69,4 @@ input.null-input{ standard-null-input{ align-items: center; -} \ No newline at end of file +} diff --git a/pages/login/login.js b/pages/login/login.js index 82cbf60..99c1dfc 100644 --- a/pages/login/login.js +++ b/pages/login/login.js @@ -9,7 +9,11 @@ Page({ data: { error: "", login: "", - password: "" + password: "", + password_focus: false + }, + password_focus: function(){ + this.setData({password_focus: true}); }, save_input:function(){ wx.setStorage({ @@ -59,7 +63,11 @@ Page({ * 生命周期函数--监听页面加载 */ onLoad: function (options) { - this.load_input(); + if(options.login){ + this.setData({login: options.login}) + }else{ + this.load_input(); + } }, /** diff --git a/pages/login/login.json b/pages/login/login.json index 30a4cd6..bece5b9 100644 --- a/pages/login/login.json +++ b/pages/login/login.json @@ -1,4 +1,4 @@ { - "navigationBarTitleText": "登陆educoder", + "navigationBarTitleText": "登陆", "usingComponents": {} } \ No newline at end of file diff --git a/pages/login/login.wxml b/pages/login/login.wxml index 05fcad6..ca7c852 100644 --- a/pages/login/login.wxml +++ b/pages/login/login.wxml @@ -4,25 +4,28 @@ - {{error}} - + - - + 注册 + 忘记密码 diff --git a/pages/login/login.wxss b/pages/login/login.wxss index 5cb5840..cc9ea3b 100644 --- a/pages/login/login.wxss +++ b/pages/login/login.wxss @@ -31,4 +31,12 @@ } textarea { width: 100%; +} +.register{ + position: fixed; + right: 36rpx; +} +.reset_password{ + position: fixed; + left: 36rpx; } \ No newline at end of file diff --git a/pages/my_courses/my_courses.js b/pages/my_courses/my_courses.js index 1a8e533..04cffd2 100644 --- a/pages/my_courses/my_courses.js +++ b/pages/my_courses/my_courses.js @@ -51,7 +51,7 @@ Page({ title: res.data.message }) wx.navigateTo({ - url: "../course_detail/course_detail?course_id=" + res.data.course_id + url: "../course/course?course_id=" + res.data.course_id }); this.cancel_join_course_modal(); }) @@ -69,7 +69,7 @@ Page({ console.log(event); let {id, course_name} = event.currentTarget.dataset; wx.navigateTo({ - url: "../course_detail/course_detail?id="+id+"&course_name="+course_name, + url: "../course/course?course_id="+id+"&course_name="+course_name, }) }, diff --git a/pages/register/register.js b/pages/register/register.js index 1513315..1ebc947 100644 --- a/pages/register/register.js +++ b/pages/register/register.js @@ -1,13 +1,64 @@ // pages/register/register.js +const app = getApp(); Page({ /** * 页面的初始数据 */ data: { - + login:"", + countDownNum: 0 + }, + register: function({detail:{value}}){ + console.log("register"); + console.info(value); + app.client.register(value).then(res=>{ + wx.showToast({ + title: res.message, + }); + wx.navigateBack({ + delta: 1 + }) + }).catch(error=>{ + wx.showToast({ + title: error.toString(), + icon: "none" + }) + }); + }, + updateLogin: function({detail:{value}}) { + this.setData({login: value}); + }, + send_code: function(){ + if (!this.data.login) return; + this.countDown(); + app.client.get_verification_code_for_register({ + login: this.data.login, + success:res=>{ + wx.showToast({ + title: "发送成功" + }) + } + }).catch(console.error); + }, + countDown: function () { + let that = this; + let countDownNum = 30; + that.setData({ + countDownNum: countDownNum + }); + that.setData({ + timer: setInterval(function () { + countDownNum--; + that.setData({ + countDownNum: countDownNum + }) + if (countDownNum == 0) { + clearInterval(that.data.timer); + } + }, 1000) + }) }, - /** * 生命周期函数--监听页面加载 */ diff --git a/pages/register/register.json b/pages/register/register.json index 8835af0..ffba85d 100644 --- a/pages/register/register.json +++ b/pages/register/register.json @@ -1,3 +1,4 @@ { - "usingComponents": {} + "usingComponents": {}, + "navigationBarTitleText": "注册" } \ No newline at end of file diff --git a/pages/register/register.wxml b/pages/register/register.wxml index 8b13789..ddbd1eb 100644 --- a/pages/register/register.wxml +++ b/pages/register/register.wxml @@ -1 +1,32 @@ - + + + + +
+ + + + + + + + + + + + + + +
+ +
diff --git a/pages/register/register.wxss b/pages/register/register.wxss index cb8065a..6c360d6 100644 --- a/pages/register/register.wxss +++ b/pages/register/register.wxss @@ -1 +1,46 @@ -/* pages/register/register.wxss */ \ No newline at end of file +.logo-view{ + display: flex; + flex-direction: column; +} +.logo{ + align-self: center; + width: 160rpx; + height: 160rpx; + margin-top: 40rpx; +} +.input-wrap { + background: #fff; + border-bottom: 1px solid #eee; + margin: 0 -12px; + padding: 0 12px; + height: 46px; + line-height: 46px; +} +.label { + color: #999; + width: 4.5em; +} +.form-input { + font-size: 18px; + line-height: 100%; + height: 100%; + width: 100%; +} +input.code{ + width: 60%; +} +view.code{ + display: flex; + flex-direction: row; +} +button.code{ + display: block; +} +.submit{ + margin: 24rpx 36rpx; +} +.login{ + position: fixed; + right: 36rpx; +} + diff --git a/pages/reset_password/reset_password.js b/pages/reset_password/reset_password.js new file mode 100644 index 0000000..ad3a5af --- /dev/null +++ b/pages/reset_password/reset_password.js @@ -0,0 +1,119 @@ +// pages/register/register.js +const app = getApp(); +Page({ + + /** + * 页面的初始数据 + */ + data: { + login: "", + countDownNum: 0 + }, + reset_password: function ({ detail: { value } }) { + console.log("reset_password"); + console.info(value); + app.client.reset_password(value).then(res => { + console.info(res); + wx.showToast({ + title: "重置成功", + }); + wx.redirectTo({ + url: '/pages/login/login?login='+this.data.login, + }); + }).catch(error => { + console.error(error); + wx.showToast({ + title: error.toString(), + icon: "none" + }) + }); + }, + updateLogin: function ({ detail: { value } }) { + this.setData({ login: value }); + }, + send_code: function () { + if(!this.data.login)return; + this.countDown(); + app.client.get_verification_code_for_reset_password({ + login: this.data.login, + success: res => { + wx.showToast({ + title: "发送成功" + }) + } + }).catch(console.error); + }, + countDown: function () { + let that = this; + let countDownNum = 30; + that.setData({ + countDownNum: countDownNum + }); + that.setData({ + timer: setInterval(function () { + countDownNum--; + that.setData({ + countDownNum: countDownNum + }) + if (countDownNum == 0) { + clearInterval(that.data.timer); + } + }, 1000) + }) + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/reset_password/reset_password.json b/pages/reset_password/reset_password.json new file mode 100644 index 0000000..b75ab6b --- /dev/null +++ b/pages/reset_password/reset_password.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "找回密码" +} \ No newline at end of file diff --git a/pages/reset_password/reset_password.wxml b/pages/reset_password/reset_password.wxml new file mode 100644 index 0000000..1f3d7aa --- /dev/null +++ b/pages/reset_password/reset_password.wxml @@ -0,0 +1,39 @@ + + + + +
+ + + + + + + + + + + + + + + + + + +
+ +
diff --git a/pages/reset_password/reset_password.wxss b/pages/reset_password/reset_password.wxss new file mode 100644 index 0000000..6c360d6 --- /dev/null +++ b/pages/reset_password/reset_password.wxss @@ -0,0 +1,46 @@ +.logo-view{ + display: flex; + flex-direction: column; +} +.logo{ + align-self: center; + width: 160rpx; + height: 160rpx; + margin-top: 40rpx; +} +.input-wrap { + background: #fff; + border-bottom: 1px solid #eee; + margin: 0 -12px; + padding: 0 12px; + height: 46px; + line-height: 46px; +} +.label { + color: #999; + width: 4.5em; +} +.form-input { + font-size: 18px; + line-height: 100%; + height: 100%; + width: 100%; +} +input.code{ + width: 60%; +} +view.code{ + display: flex; + flex-direction: row; +} +button.code{ + display: block; +} +.submit{ + margin: 24rpx 36rpx; +} +.login{ + position: fixed; + right: 36rpx; +} + diff --git a/pages/setting/setting.js b/pages/setting/setting.js index 4274371..5d3079b 100644 --- a/pages/setting/setting.js +++ b/pages/setting/setting.js @@ -52,7 +52,7 @@ Page({ title: res.data.message }) wx.navigateTo({ - url: "../course_detail/course_detail?course_id="+res.data.course_id + url: "../course/course?course_id="+res.data.course_id }); this.cancel_join_course_modal(); }) diff --git a/utils/dateutils.js b/utils/dateutils.js new file mode 100644 index 0000000..ae4ef0a --- /dev/null +++ b/utils/dateutils.js @@ -0,0 +1,15 @@ +export function getNowFormatDate() { + var date = new Date(); + var seperator1 = "-"; + var year = date.getFullYear(); + var month = date.getMonth() + 1; + var strDate = date.getDate(); + if (month >= 1 && month <= 9) { + month = "0" + month; + } + if (strDate >= 0 && strDate <= 9) { + strDate = "0" + strDate; + } + var currentdate = year + seperator1 + month + seperator1 + strDate; + return currentdate; +} \ No newline at end of file