diff --git a/.gitignore b/.gitignore index d9e1198..9f490f6 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ $RECYCLE.BIN/ lib_refer towxml project.config.json +.idea # Node.js node_modules/ diff --git a/README.md b/README.md index 151fe0c..55931de 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,22 @@ # 功能介绍 -- 学员可以在点击右下角”加入课堂”选择课程加入,教员可以在“加入课堂中”新建课程 +## 教室 +- 学员可以输入邀请码进入课堂 -- 长按相应课程可以退出学习 +- 进入教室界面会显示在位,头像为彩色,若退出课堂界面则会显示灰色头像 -- 进入课堂界面会显示在位,头像为彩色,若退出课堂界面则会显示灰色头像 - -- 教员在课堂界面中可以直观地看到学员在位情况,可以选择学员让其起立回答问题,并且对学员可以进行加分、减分操作 +- 教员在教室界面中可以直观地看到学员在位情况,可以选择学员让其起立回答问题,并且对学员可以进行加分、减分操作 - 学员可以收到教员让其起立提问、回答的提示,还可以点击“我要提问、回答” -- 课堂内有讨论区,可以交流 +- 教室内有讨论区,可以交流 + +## 课程资源 + +- 在课程界面进入“资源”可以查看本课堂的课程文件资源 -- 在课堂界面右下角进入“资源”可以查看本课堂的课程文件资源 # 发布版要长按白色底部栏进入 +- 支持打开ppt doc xls pdf文件 -- 教员可以在课程的设置界面中更新课程的名称,还可以将学员移除本课程的学习 +## 试卷作答 -## 其他 - -- 用户可以在设置中更改姓名、用户名 \ No newline at end of file +- 学员在课程内可以看到老师发布的试卷,并且回答 \ No newline at end of file diff --git a/app.js b/app.js index d4b3f12..f65e7c9 100644 --- a/app.js +++ b/app.js @@ -38,35 +38,17 @@ App({ console.log("onLauch"); console.log(this.client.get_user_info({ success: res=>{ - console.log("userinfo get success"); + console.log("app.js: userinfo get success"); console.log(res); - console.log(this); if(res.data.user_id == 2){ this.enter_login(); } }, fail:error=>{ - console.log("get user info fail"); + console.warn("app.js: get user info fail"); this.enter_login(); } })); login(); - //.then((user) => { - // //console.log(user); - // //console.log(AV.User.current()); - // if (!user.get("name_setted")) { - // wx.navigateTo({ - // url: '../user/user', - // }); - // wx.showToast({ - // title: '请修改你的姓名', - // duration: 5000, - // icon: "none" - // }) - // } - // }); - // wx.cloud.init({ - // env: 'test-tkkvk' - // }) } }); \ No newline at end of file diff --git a/app.json b/app.json index d529f77..46c76eb 100644 --- a/app.json +++ b/app.json @@ -1,6 +1,9 @@ { "pages": [ + "pages/my_courses/my_courses", + "pages/courses/courses", + "pages/exercise/exercise", "pages/setting/setting", "pages/changeuser/changeuser", "pages/user/user", @@ -12,8 +15,11 @@ "pages/createclass/createclass", "pages/login/login", "pages/test/test", - "pages/courses/courses", - "pages/course_detail/course_detail" + "pages/course_detail/course_detail", + "pages/files/files", + "pages/exercises/exercises", + "pages/mark_detail/mark_detail" + ], "window": { "backgroundTextStyle": "dark", diff --git a/app.wxss b/app.wxss index 6429400..65b721c 100644 --- a/app.wxss +++ b/app.wxss @@ -30,33 +30,3 @@ page { .warning{ color: orange; } - -.lab { - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-between; - padding: 200rpx 0; - box-sizing: border-box; -} -.lab .status image { - width: 70px; - height: 70px; - border-radius: 100%; -} -.lab .hint { - text-align: center; - width: 80%; -} -.lab .interactive { - width: 80%; -} -.lab .interactive input { - border-bottom: 4rpx solid #EEE; -} -.lab .command { - height: 200rpx; -} -.lab .command button { - margin: 10px; -} \ No newline at end of file diff --git a/data/client.js b/data/client.js index 3cb9395..ed1ed6b 100644 --- a/data/client.js +++ b/data/client.js @@ -1,9 +1,9 @@ -import {Account, Course} from "./eduapi" +import {Account, Course, Exercise, ExerciseQuestion} from "./eduapi" import {Session} from "./requests"; import {Cookie} from "./cookie"; /** - * 客户端类,其method实现客户端各种操作,将接口Promise化从而使其调用更加方便简洁, + * 客户端类,其method实现客户端各种操作,将接口Promise化, * 要在此处实现网络数据及cookie的缓存 */ @@ -16,7 +16,23 @@ export class Client{ } this.load_cached_cookies(); this.current_user = {}; - console.log(this.session); + this.load_current_user(); + } + load_current_user(){ + var value = wx.getStorageSync('current_user'); + if(value) { + this.current_user = value; + console.log("read current_user from storage"); + console.log(this.current_user); + } + } + save_current_user(){ + console.log("save current user to storage"); + console.log(this.current_user); + wx.setStorageSync("current_user", this.current_user); + } + clear_current_user(){ + wx.setStorageSync("current_user", {}); } load_cached_cookies(){ try { @@ -28,17 +44,17 @@ export class Client{ if (value) { this.session.set_cookie(new Cookie(value)); } - console.log("read cookies"); + console.log("read cookies from wx.Storage:"); console.log(this.session.cookies); } catch (e) { // Do something when catch error - console.log("there is not cachede cookie") + console.error("there is not cached cookie") console.error(e); } } save_cookies(){ for(var cookie of Object.values(this.session.cookies)){ - console.log("client save cookie"); + console.log("client save new cookie"); console.log(cookie); cookie.save(); } @@ -68,6 +84,8 @@ export class Client{ success: res => { this.save_cookies(); this.current_user = {...this.current_user, ...res.data}; + console.log("current_user info update"); + console.log(this.current_user); this.get_user_info(); if (typeof success == "function") { success(res); @@ -94,43 +112,46 @@ export class Client{ }, complete: complete}); }) } - get_user_info({success, fail, complete}={}){ + register({login, password, code, success, fail, complete}){ return new Promise((resolve, reject) => { - Account.get_user_info({session: this.session, complete: complete, + Account.register({session: this.session, login:login, password:password, code:code, + complete:complete, success: res=>{ - this.current_user = {...this.current_user, ...res.data}; + this.save_cookies(); if(typeof success == "function"){ success(res); } resolve(res); }, - fail: error=>{ - if(typeof fail == "function"){ + fail:error=>{ + if(typeof fail == "function") { fail(error); } - reject(error); + reject(error) } - }) + }); }); } - register({login, password, code, success, fail, complete}){ + get_user_info({success, fail, complete}={}){ return new Promise((resolve, reject) => { - Account.register({session: this.session, login:login, password:password, code:code, - complete:complete, + Account.get_user_info({session: this.session, complete: complete, success: res=>{ - this.save_cookies(); + this.current_user = {...this.current_user, ...res.data}; + console.log("current_user info update"); + console.log(this.current_user); if(typeof success == "function"){ success(res); } resolve(res); + this.save_current_user(); }, - fail:error=>{ - if(typeof fail == "function") { + fail: error=>{ + if(typeof fail == "function"){ fail(error); } - reject(error) + reject(error); } - }); + }) }); } get_verification_code_for_register({login, success, fail, complete}){ @@ -142,41 +163,239 @@ export class Client{ search_courses({limit=20, page=1, order="all", search="", success, fail, complete}={}){ return new Promise((resolve, reject) => { Course.search({session: this.session, page: page, order: order, search: search, complete: complete, - success: res=>{ - if(typeof success == "function"){ - success(res); + success: res=>{ + if(typeof success == "function"){ + success(res); + } + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); } - resolve(res); - }, - fail: error=>{ - if(typeof fail == "function"){ - fail(error); + }); + }); + } + get_course_info({course_id, success, fail, complete}){ + return new Promise((resolve, reject) => { + Course.get_course_info({ + session: this.session, + course_id: course_id, + complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + } + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); } - reject(error); + }) + }); + + } + get_user_courses({page=1, per_page=16, success, fail, complete}={}){ + return new Promise((resolve, reject) => { + Account.get_user_courses({ + session: this.session, + page: page, + per_page: per_page, + user: this.current_user.login, + 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, - success: res=>{ - if(typeof success == "function"){ - success(res); + success: res=>{ + if(typeof success == "function"){ + success(res); + } + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); } - resolve(res); - }, - fail: error=>{ - if(typeof fail == "function"){ - fail(error); + }) + }); + } + get_course_files({course_id, page_size=15, page=1,search="",sort=0, sort_type="created_on", success, fail, complete}){ + return new Promise((resolve, reject) => { + Course.get_files({ + session: this.session,course_id:course_id, page_size: page_size, page:page, search: search, sort: sort, sort_type: sort_type, complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + }; + resolve(res); + }, + fail: error=>{ + if(typeof success == "function"){ + fail(error); + } + reject(error); + } + }); + }); + } + get_course_students({course_id, order=1,sort="asc",page=1, limit=20, course_group_id="", success, fail, complete}){ + return new Promise((resolve, reject) => { + Course.get_students({ + session: this.session, + course_id: course_id, + order: order, + sort: sort, + page: page, + limit: limit, + course_group_id: course_group_id, + complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + }; + resolve(res); + }, + fail: error=>{ + if(typeof success == "function"){ + fail(error); + } + reject(error); + } + }) + }) + } + search_exercises({course_id, type="", page=1, limit=15, success, fail, complete}){ + return new Promise((resolve, reject) => { + Exercise.search({ + session: this.session, + course_id: course_id, + type: type, + page: page, + limit: limit, + complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + }; + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); + } + }) + }); + } + start_answer_exercise({exercise_id, success, fail, complete}){ + return new Promise((resolve, reject) => { + Exercise.start_answer({ + session: this.session, + exercise_id: exercise_id, + login: this.current_user.login, + complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + }; + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); + } + }) + }); + } + answer_exercise_question({question_id, exercise_choice_id,answer_text ,success, fail, complete}){ + return new Promise((resolve, reject) =>{ + ExerciseQuestion.answer({ + session: this.session, + question_id: question_id, + answer_text: answer_text, + exercise_choice_id: exercise_choice_id, + 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({ + session: this.session, + exercise_id: exercise_id, + complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + }; + resolve(res); + }, + fail: error=>{ + if(typeof success == "function"){ + fail(error); + } + reject(error); + } + }) + }); + } + commit_exercise({exercise_id, commit_method=1, success, fail , complete}){ + return new Promise((resolve, reject) => { + Exercise.commit({ + session: this.session, + exercise_id: exercise_id, + commit_method: commit_method, + complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + }; + resolve(res); + }, + fail: error=>{ + if(typeof success == "function"){ + fail(error); + } + reject(error); } - reject(error); - } }) }); } - search_exercise(){} - start_answer_exercise(){} - answer_exercise_question(){} } \ No newline at end of file diff --git a/data/cookie.js b/data/cookie.js index aa6e1ab..6e0dfd1 100644 --- a/data/cookie.js +++ b/data/cookie.js @@ -13,11 +13,9 @@ export class Cookie{ } analyse_cookie(str){ this.string = str.slice(0, str.indexOf(";")); - //console.log(this.string); let idx = this.string.indexOf("="); this.key = this.string.slice(0, idx); this.value = this.string.slice(idx+1); - //console.log(this); } toString(){ return this.string; @@ -26,7 +24,7 @@ export class Cookie{ save(){ if(!this.key){ - throw new Error("没有键值"); + console.error("cookie保存时: 没有键值key"); } wx.setStorageSync(this.key, this.origin_str); } diff --git a/data/eduapi.js b/data/eduapi.js index 51f3b16..33bae61 100644 --- a/data/eduapi.js +++ b/data/eduapi.js @@ -90,6 +90,17 @@ export class Account{ 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 + }) + } } export class Course{ @@ -142,6 +153,17 @@ export class Course{ 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, @@ -165,13 +187,22 @@ export class Course{ 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}; return session.request({ - url: api_base_url + "/courses/"+course_id+"/exercises,json", + url: api_base_url + "/courses/"+course_id+"/exercises.json", method: "GET", data: data, success: success, @@ -185,22 +216,89 @@ export class Exercise{ url: api_base_url + "/exercises/" + exercise_id + "/start_answer.json", method: "GET", data: data, - success: success, + 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: 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", + success: success, + fail: fail, + complete: complete + }) + } + static commit({session, exercise_id, commit_method=1, success, fail, complete}){ + let data = {commit_method: commit_method}; + return session.request({ + url: api_base_url+ "/exercises/"+exercise_id+"/commit_exercise.json", + method: "POST", + data: data, + success: success, + fail: fail, + complete: complete + }) + } } export class ExerciseQuestion { - static answer({session, question_id, exercise_choice_id, login, success, fail, complete}){ - let data = {exercise_choice_id: exercise_choice_id}; + 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_answer.json", + url: api_base_url + "/exercise_questions/" + question_id +"/exercise_answers.json", method: "POST", data: data, - success: success, - fail: fail, + 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 }) } diff --git a/data/error.js b/data/error.js new file mode 100644 index 0000000..282f42e --- /dev/null +++ b/data/error.js @@ -0,0 +1,10 @@ +/** + * @todo: Error类, to be finished + */ + +export default class EduError extends Error{ + constructor({message=null, code=-1}){ + super(message); + this.code = code; + } +} \ No newline at end of file diff --git a/data/requests.js b/data/requests.js index 1c1cb4f..406c6bf 100644 --- a/data/requests.js +++ b/data/requests.js @@ -13,10 +13,12 @@ export class Session { } get cookie_str(){ let cookie_strs = Object.values(this.cookies).map(cookie=>cookie.toString()); - //console.log("cookie_strs:"+cookie_strs); return cookie_strs.join(";"); } request({url, data, header, method, dataType, responseType, success, fail, complete}) { + console.log("request data and headers: "); + console.log({url: url, data: data, header: {...header, "Cookie": this.cookie_str}, method: method, dataType: dataType, responseType: responseType}) + return wx.request({ url: url, data: data, @@ -27,46 +29,45 @@ export class Session { success: (res) => { if ("cookies" in res) { let cookies = res["cookies"]; - //console.log(cookies); - console.log("request: this:"); - console.log(this); for (var i = 0; i < cookies.length; i++) { this.set_cookie(new Cookie(cookies[i])); } + console.log("set new cookies:"); + console.log(this.cookies); } else { - console.log("request.js: no cookies in this request"); + console.warn("request.js: no cookies setted in this request"); } - //console.log(this.cookies); if (typeof success == "function") { success(res); } else { - console.warn("requests.session.request success is not function"); + console.warn("requests.session.request.success is not function"); } }, fail: fail, complete: complete }); + + } + uploadFile({url, filePath, name, header, formData, success, fail, complete}){ + return wx.uploadFile({ + url: url, + filePath: filePath, + name: name, + header: {...header, "content-type": "multipart/form-data", "Cookie": this.cookie_str}, + formData: formData, + success: success, + fail: fail, + complete: complete + }) } - uploadFile({url, filePath, name, header, formData, success, fail, complete}){ - return wx.uploadFile({ - url: url, - filePath: filePath, - name: name, - header: {...header, "content-type": "multipart/form-data", "Cookie": this.cookie_str}, - formData: formData, - success: success, - fail: fail, - complete: complete - }) - } - downloadFile({url, header, filePath, success, fail, complete}){ - return wx.downloadFile({ - url: url, - header: {...header, "Cookie": this.cookie_str}, - filePath: filePath, - success: success, - fail: fail, - complete: complete - }) - } + downloadFile({url, header, filePath, success, fail, complete}){ + return wx.downloadFile({ + url: url, + header: {...header, "Cookie": this.cookie_str}, + filePath: filePath, + success: success, + fail: fail, + complete: complete + }) } +} diff --git a/images/nodata.png b/images/nodata.png new file mode 100644 index 0000000..ad4c76b Binary files /dev/null and b/images/nodata.png differ diff --git a/model/grade.js b/model/grade.js index d88fa83..9da78bf 100644 --- a/model/grade.js +++ b/model/grade.js @@ -3,7 +3,7 @@ const AV = require('../lib/av-live-query-weapp-min'); //数据储存模板--分数 class Grade extends AV.Object { get mark() { - return this.get('done'); + return this.get('mark'); } set mark(value) { this.set('mark', value); @@ -33,7 +33,25 @@ class Grade extends AV.Object { this.set("date", value) } add_mark(value){ - this.increment(value); + this.increment("mark",value); + } + get edu_course_id(){ + return this.get("edu_course_id"); + } + set edu_course_id(value){ + this.set("edu_course_id", value); + } + get presence(){ + return this.get("presence"); + } + set presence(value){ + this.set("presence", value) + } + get edu_account_login(){ + return this.get("edu_account_login"); + } + set edu_account_login(value){ + this.set("edu_account_login", value); } } diff --git a/model/message.js b/model/message.js index 7747a8a..838a77a 100644 --- a/model/message.js +++ b/model/message.js @@ -19,6 +19,24 @@ class Message extends AV.Object{ set class(value){ this.set("class", value); } + get sender_name(){ + return this.get("sender_name"); + } + set sender_name(value){ + this.set("sender_name", vlaue); + } + get edu_account_login() { + return this.get("edu_account_login"); + } + set edu_account_login(value) { + this.set("edu_account_login", value); + } + get edu_course_id() { + return this.get("edu_course_id"); + } + set edu_course_id(value) { + this.set("edu_course_id", value); + } } AV.Object.register(Message, "Message"); diff --git a/model/presence.js b/model/presence.js index ee253b7..51b60da 100644 --- a/model/presence.js +++ b/model/presence.js @@ -7,6 +7,7 @@ class Presence extends AV.Object{ get user(){ return this.get("user"); } + set class(value){ this.set("class", value); } @@ -26,7 +27,7 @@ class Presence extends AV.Object{ this.set("present", value); } get mark() { - return this.get('done'); + return this.get('mark'); } set mark(value) { this.set('mark', value); @@ -34,6 +35,12 @@ class Presence extends AV.Object{ add_mark(value) { this.increment(value); } + get edu_account_login() { + return this.get("edu_account_login"); + } + set edu_account_login(value) { + this.set("edu_account_login", value); + } enter(){ console.log("presence.enter"); console.log(this); diff --git a/pages/about/about.js b/pages/about/about.js index 73e27d5..fb33282 100644 --- a/pages/about/about.js +++ b/pages/about/about.js @@ -6,7 +6,7 @@ Page({ /** * 页面的初始数据 */ - md: '# 功能介绍\n\n- 学员可以在点击右下角”加入课堂”选择课程加入,教员可以在“加入课堂中”新建课程\n\n- 长按相应课程可以退出学习\n\n- 进入课堂界面会显示在位,头像为彩色,若退出课堂界面则会显示灰色头像\n\n- 教员在课堂界面中可以直观地看到学员在位情况,可以选择学员让其起立回答问题,并且对学员可以进行加分、减分操作\n\n- 学员可以收到教员让其起立提问、回答的提示,还可以点击“我要提问、回答”\n\n- 课堂内有讨论区,可以交流\n\n- 在课堂界面右下角进入“资源”可以查看本课堂的课程文件资源\n - 发布版要长按白色底部栏进入\n\n- 教员可以在课程的设置界面中更新课程的名称,还可以将学员移除本课程的学习\n\n## 其他\n \n- 用户可以在设置中更改姓名、用户名\n\n\n.', + md: '# 功能介绍\n\n## 教室\n- 学员可以输入邀请码进入课堂\n\n- 进入教室界面会显示在位,头像为彩色,若退出课堂界面则会显示灰色头像\n\n- 教员在教室界面中可以直观地看到学员在位情况,可以选择学员让其起立回答问题,并且对学员可以进行加分、减分操作\n\n- 学员可以收到教员让其起立提问、回答的提示,还可以点击“我要提问、回答”\n\n- 教室内有讨论区,可以交流\n\n## 课程资源\n\n- 在课程界面进入“资源”可以查看本课堂的课程文件资源\n\n- 支持打开ppt doc xls pdf文件\n\n## 试卷作答\n\n- 学员在课程内可以看到老师发布的试卷,并且回答', data: { article: {} diff --git a/pages/about/about.wxml b/pages/about/about.wxml index e6b3152..ef14407 100644 --- a/pages/about/about.wxml +++ b/pages/about/about.wxml @@ -1,4 +1,4 @@ -