增加课堂实时交流功能

smart_class
educoder_weapp 5 years ago
parent 3eeb0195b2
commit 5d0dd54a2b

@ -1,5 +1,6 @@
{
"pages": [
"pages/classes/classes",
"pages/changeuser/changeuser",
"pages/index/index",
@ -10,11 +11,11 @@
"pages/game/game",
"pages/shouquan/shouquan",
"pages/outside/outside",
"pages/classroom/classroom",
"pages/setting/setting",
"pages/user/user",
"pages/addclass/addclass",
"pages/classdetail/classdetail",
"pages/classroom/classroom",
"pages/classsetting/classsetting"
],
"window": {

@ -1,10 +1,11 @@
@font-face {font-family: "iconfont";
src: url('iconfont.eot?t=1571740835844'); /* IE9 */
src: url('iconfont.eot?t=1571740835844#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAcoAAsAAAAADOAAAAbaAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDSAqMQIooATYCJAMYCw4ABCAFhG0HahvwChFVpJWT/RhwN6bvicrMSrUYPYtc3yJlmXlxR7hlswnhaIxwxqm1TdVPJW3DURMJrUPrEaQqgtSUFxF4+P9Dve/9kaRjbox3Uo9XCxLAEmzQghahFq5ZCVWFWaFKshZ9n3Q+NwHaA/z5Y6mXTYf5rmouF/Wu0xZVOBqPEmhAkfU3wpvhRHDH2iTMwmh0Z/Vr3A8QQNrDQ0/FlSIYVF4Y4VGT4UP7g6GSUXukyDDeOefWlWgVEIa5FLsHACuT30f/0DQMANMKeA8ShhQNgtwgE5yLSyFJL1wCab4SACgXARzgAehAb9zKFMAz5JPIFG9nnWcAoA2lOlczWgRLguOCc0MhKkGvgcz4EfQfXqoaqAOJ0JhZ2U0QZEIzwAm2MANEsMQMMILjzEBHcG4GCJzQz9iRBrA5kv0GT8DbHtMUy4itjEgSGaMmFM2wRm6q7rrJ6VE6BoUZcTomZrTfXxsIWNEDP4rtLQGfRfJWgq+f1zvjhldM/7YqBUByRnq9Cet9lkAgeYO/VnUjZDM/DCC/fyZ77FECtv5xC6Y/ok4+TcY3PGk5bsce217HbmlXBiOX0ExytdLDQDrTt3vFzb4q70QZQNnt2IvQLm6gmH2WxxZa3iXtphjHXtueIaAdbAGHD7ze4Zx9jpLZpKhDZtp3AUgjbmjbI6o7djmjLIriMGueaLFW3eZ0la3Njp1mzT2aTp0/Q5SdUcp2ymG2ah73jrFKEo1sK/VQt2UU10DKEW/V3P12tr3ka7D7ciwoCkW5zocSx8X4EzSErhYErH5/LxJRCKHIOupSMPX68wSf5XITcO3OVFwUd2LZzr3xFLRt912XciJBIkl43xXJ7XsQGoRQ9JX8A3cftl461m5dYpelMpCmHWDVbNFqt+kH9lDtkYIsna9/V80mkpLCyKjyQHu0God79kb1V6TIfnJPzDpBr0SZNHOYGs3J03VSJJmmkG0d95LJSLqYQGhmozIJaRfbAaBEUadA7UAIPQRY1dhpP7wcggmQu6rXnHDCkWcXdMe0Gd3xbrhzBn5MqCYdBM/FJ4NyceHlEPLpgF8nWnEXFLaZbHpmakL/dGgiO7cA40+Wr0GrEUvyWGXARPbQT3STrhe0nVyEuyZaofnR30senWMKmHPvGCbwbNSle9YZ9y51Luj3uuGbht83/K4fm7kwvsb4XcODnwVgHeeewtaOXNQ5zdRqGIMNXrp0MDZk2XIYxDjfZRLTR61geuB4HToyuRmLGQcuWzQk7Kf3ma6s6GtT59QfC1MKudccu+WLhFI0YAAqLR08aOXggWWorH9/m1Hjpn/UAJMgpUhcIVfb8FAifwxc9nRC+2VNi4r/jNixp8NMeasQ493vufNJiO0i0Hz96tvf/pxf07t/3e3PQkwXPc3zVbebpqQIsZ9vV8nttL6LEJMp1u3fuVoYFPvpjme/t0a2uj7foPWpp8ubFs2oOL2DjNjUrHBEZdbg8ZimYRMaJIrHyob/t6HOGyopYXAiF96QT6LekBvqqa1LoTdM0LSU7ZtyNmUjggcXXS6+/Hpe2Lzc7dOwzZuxaTCgXaX8pwsN4bjZR3/kfjw6m+OGIJdhQRvJgTBt4+aqE+VLjOlbKYpns+5Gc9HfRrM8TW2NaLdzc1xNPWzEihUjsJEYCyH5euKKcaPGjhotcntMhZOneCqLLxdXedIBosnybdsBy13P828am2ZJZ4YwTYua04N6s4ZAgAveDMMvGAb+ic3Efvqr/pmv0p/Vv7ggur/h4YJYSw65adgmkv10sx+LmhPCpFydWa+fRBBmQvg1V9dcl/urEDo1Johf9XqTLneSQJgIYpJe37zrZTALAABCF8t6fCgAAP6L/Q1CO9t63JoopfIQl1ovlcu4aN2Pb8U/e/oa2/9moP7Bq557/9tKUiG1NK4iIeSiwD6xOWfwNxrRftQAxe7EhR5AoPCC1D0GljsSU/4yRGRjyZu5Yqtgn+CPrRaQBnahGDqhVuYNNNPG0A3dwpRrJRdPWzbBVNQRrixEEBYchDTnD4oF913YhZmvoVnzHXQLMYUpL3G45rSzsJt7CVEjo/+BrOSkgny9SUd/oJsgynIgUfyirGwrXY7neu8bCeUcJ1Stvta1IlVypBd6GEJgykt2kPXR1HV+O50U7wVHyXG08agEQg0yZICBtRxOYolaubZpNP8DtEYglD2LWi1/Qalit06aaKgxgPqOJNCie5k4UUu7mkRKCoUzSywixaQEwe9iZBx/Lwek2tGwER25m0ZkqSHQyHH9WPzKm2CKt0uPjBI1WnzXj8xObG8F9w2GRqS5aWwm9h61SLqJq2RgZZD0vjOroeGe9GgEAAA=') format('woff2'),
url('iconfont.woff?t=1571740835844') format('woff'),
url('iconfont.ttf?t=1571740835844') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
url('iconfont.svg?t=1571740835844#iconfont') format('svg'); /* iOS 4.1- */
src: url('iconfont.eot?t=1571919948950'); /* IE9 */
src: url('iconfont.eot?t=1571919948950#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),
url('iconfont.woff?t=1571919948950') format('woff'),
url('iconfont.ttf?t=1571919948950') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
url('iconfont.svg?t=1571919948950#iconfont') format('svg'); /* iOS 4.1- */
}
.iconfont {
@ -32,6 +33,11 @@
.myicon-internet_class:before {
content: "\e67f";
}
.myicon-close:before {
content: "\e637";
}
.myicon__info {
color: #fff;
left: 100%;

@ -1,4 +1,5 @@
module.exports = (subscription, initialStats, onChange) => {
console.log("query_bingding");
let stats = [...initialStats]
const remove = value => {
stats = stats.filter(target => target.id !== value.id)
@ -7,7 +8,7 @@ module.exports = (subscription, initialStats, onChange) => {
const upsert = value => {
let existed = false;
stats = stats.map(target => (target.id === value.id ? ((existed = true), value) : target))
if (!existed) stats = [value, ...stats]
if (!existed) stats = [...stats,value]
return onChange(stats)
}
subscription.on('create', upsert)

@ -0,0 +1,26 @@
const AV = require("../lib/av-live-query-weapp-min")
class Message extends AV.Object{
get text(){
return this.get("text");
}
set text(value){
this.set("text", value);
}
get sender(){
return this.get("sender");
}
set sender(value){
this.set("sender", value);
}
get class(){
return this.get("class");
}
set class(value){
this.set("class", value);
}
}
AV.Object.register(Message, "Message");
module.exports = Message;

@ -20,6 +20,5 @@
</view>
</block>
</view>
</view>
</view>

@ -52,6 +52,7 @@
.label {
color: #999;
display: inline;
}
.create-class{

@ -2,6 +2,7 @@
const AV = require("../../lib/av-live-query-weapp-min")
const { jsonify } = require('../../utils/leancloudutils');
const bind = require("../../lib/live-query-binding")
const Message = require("../../model/message")
Page({
/**
@ -14,10 +15,12 @@ Page({
student.present 是否出席
student.isasking :0:没有提问,1:提问,2:请回答
*/
class:null,
students: [],
presences: [],
my_presence: null,
is_askiny: null,
asking_presence: null,
idStudentMap: {},
data: {
//以下数据的同步由该代码文件实现数据的呈现由classroom.wxml实现
students: [], // 该课程所有的学生, 元素类型见上文中的student
@ -29,6 +32,59 @@ Page({
//属性如下objectId, username, name
class_name: "", //课程名称
class_id: "", //该课程的主键(编号)
message_text: "",
messages: [],
show_conversation: true
},
pull_messages: function(){
query = new AV.Query("Message");
query.equalTo("class", this.class);
query.include("sender");
set_messages = this.set_messages.bind(this);
return AV.Promise.all([query.find().then(set_messages), query.subscribe()]).then(([messages, subscription]) => {
this.messageSubscription = subscription;
if (this.messageUnbind) this.messageUnbind();
this.messageUnbind = bind(subscription, messages, set_messages);
}).catch(error => console.error(error.message));
},
set_messages: function(messages){
console.log("set_messages");
messages = messages.map(message=>{
sender = message.get("sender");
console.log(this.idStudentMap);
console.log(sender.id);
console.log(!sender.get("name") && sender.id in this.idStudentMap)
if(!sender.get("name")&&sender.id in this.idStudentMap){
sender = this.idStudentMap[sender.id];
}
message.set("sender_name", sender.get("name"));
message.set("sender_username", sender.get("username"));
return message;
})
console.log(jsonify({ messages }));
this.setData(jsonify({messages}));
return messages;
},
send_message:function(event){
let {message_text} = this.data;
if(message.trim()==""){return;}
message = new Message({
text: message_text,
class: this.class,
sender: AV.User.current()
})
message.save().then(()=>{
this.setData({message_text: ""});
console.log("send_message")
}).catch(console.error);
},
close_conversation: function(event){
this.setData({show_conversation: false});
this.messageSubscription.unsubscribe();
this.messageUnbind();
},
update_message:function({detail:{value}}){
this.setData({message_text: value});
},
enter_setting: function(event){
wx.navigateTo({
@ -43,9 +99,9 @@ Page({
},
select_stu: function(event){
id = event.currentTarget.dataset.id;
if(id!='none'){
console.log(id);
}else{console.log("none");id=""}
if(id=='none'){
id="";
}
this.setData({select_stu_id: id});
},
@ -53,14 +109,13 @@ Page({
userid = event.currentTarget.dataset.id;
status = event.currentTarget.dataset.status;
console.log("set_isasking");
console.log(status);
console.log(typeof status);
this.asking_present = this.presences.filter(presence=>presence.get("user").id==userid)[0];
this.asking_present.isasking = status;
this.asking_presence = this.presences.filter(presence=>presence.get("user").id==userid)[0];
console.log(this.asking_presence);
this.asking_presence.isasking = status;
wx.showLoading({
title: '请稍候',
})
this.asking_present.save().then(()=>{
this.asking_presence.save().then(()=>{
wx.hideLoading();
}, ()=>{
wx.hideLoading();
@ -71,11 +126,10 @@ Page({
});
},
add_mark: function(event){
console.log("add_mark");
id = event.currentTarget.dataset.id;
mark = event.currentTarget.dataset.mark;
console.log("add_mark");
console.log(mark);
console.log(typeof mark);
console.log(this.presences);
presence = this.presences.filter(presence => presence.get("user").id == id)[0];
if(presence==null){
console.warn("没有选择学生");
@ -90,21 +144,22 @@ Page({
pull_presence: function(){
var query = new AV.Query("Presence");
//console.log(this.class);
query.equalTo("class", this.class);
query.include("user");
set_presence = this.set_presence.bind(this);
return AV.Promise.all([query.find().then(set_presence), query.subscribe()]).then(([presents, subscription])=>{
this.PresentSubscription = subscription;
if(this.presentUnbind) this.presentUnbind();
this.presentUnbind = bind(subscription, presents, set_presence);
return AV.Promise.all([query.find().then(set_presence), query.subscribe()]).then(([presences, subscription])=>{
this.presenceSubscription = subscription;
if(this.presenceUnbind) this.presenceUnbind();
console.log("shwo set_presence");
console.log(presences);
console.log(set_presence);
this.presenceUnbind = bind(subscription, presences, set_presence);
}).catch(error=> console.error(error.message));
},
set_presence: function(presences){
console.log("set_presence");
//console.log(presences);
console.log(presences);
this.presences = presences;
console.log(this.presences);
students = this.presences.map((presence)=>{
student = presence.get("user");
if(student.get("username")==null){
@ -115,6 +170,7 @@ Page({
student.fetch();
}
}
this.idStudentMap[student.id]=student;
student.set("present", presence.get("present"));
student.set("isasking",presence.get("isasking"));
student.set("mark", presence.get("mark"));
@ -125,7 +181,6 @@ Page({
return student;
});
this.students = students;
console.log(students);
this.setData(jsonify({students}));
return presences;
},
@ -135,23 +190,14 @@ Page({
query.equalTo("objectId", class_id);
query.include("teacher");
return query.find().then((classes) => {
//console.log(this.class);
this.class = classes[0];
teacher = this.class.get("teacher");
console.log("pull_class");
console.log(teacher);
teacher = teacher.toJSON();
// if(typeof teacher.toJson == "function"){
// teacher = teacher.toJson();
// console.log("toJson");
// }
this.setData({
class_name: this.class.get("name"),
class_id: this.class.get("objectId"),
teacher: teacher
});
console.log(teacher);
//this.setData(teacher);
}).catch(error=>console.error(error.message))
},
@ -164,16 +210,18 @@ Page({
})
this.setData({current_user: AV.User.current().toJSON()});
this.class_id = options.class_id;
this.class = AV.Object.createWithoutData("Class_", this.class_id);
this.pull_presence.bind(this)().then((presences) => {
this.my_presence.enter();
});
this.pull_class.bind(this)(this.class_id)
.then(()=>{
wx.setNavigationBarTitle({
title: this.data.class_name,
})
console.log("pull_presence");
this.pull_presence.bind(this)().then((presences) => { this.my_presence.enter(); this.presences = presences;});
wx.hideLoading();
console.log("hideLoading");
});
.then(() => {
wx.setNavigationBarTitle({
title: this.data.class_name,
})
wx.hideLoading();//better place??
});
this.pull_messages.bind(this)();
console.log("onLoad");
},
@ -189,9 +237,8 @@ Page({
*/
onShow: function () {
console.log("onShow");
console.log("enter class when onShow");
console.log(AV.User.current());
if(this.my_presence){
console.log("enter class when onShow");
this.my_presence.enter();
}
},
@ -210,14 +257,17 @@ Page({
onUnload: function () {
this.my_presence.leave();
console.log("onUnload");
this.PresentSubscription.unsubscribe();
this.presentUnbind();
this.presenceSubscription.unsubscribe();
this.presenceUnbind();
this.messageSubscription.unsubscribe();
this.messageUnbind();
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
console.log(this.idStudentMap);
this.pull_presence.bind(this)();
this.pull_class.bind(this)(this.class_id)
.then(() => {

@ -1,4 +1,24 @@
<view bindtap="select_stu" data-id="none">
<view class="classroom" bindtap="select_stu" data-id="none">
<movable-area>
<movable-view wx:if="{{show_conversation}}" direction="all" y="{{240}}">
<myicon type="close" class="close" bindtap="close_conversation"></myicon>
<scroll-view scroll-y="{{true}}" class="message-list">
<block wx:for="{{messages}}" wx:for-item="message" wx:key="objectId">
<view class="message flex-wrap">
<text>{{message.sender_name}}</text><text>{{message.text}}</text>
</view>
</block>
</scroll-view>
<view class="message-footer flex-wrap">
<input
placeholder="请输入消息:{{classname}}"
bindinput="update_message"
bindconfirm="send_message"
value="{{message_text}}"
class="message"/>
<text style="display: {{message_text ? 'inline': 'none'}}" class="send-message" ontap="send_message">发送</text>
</view>
</movable-view>
<text class="hint">课程名称:{{class_name}} 教员姓名:{{teacher.name}}</text>
<view class="student-list">
<block wx:for="{{students}}" wx:for-item="student" wx:key="objectId">
@ -31,4 +51,5 @@
<text hidden="{{teacher.objectId==current_user.objectId}}">我的得分:{{current_user.mark}}分</text>
<text class="tappable class-detail" bindtap="enter_detail">更多</text>
</view>
</movable-area>
</view>

@ -1,55 +1,48 @@
.grid-celll
{
margin-left:auto;
margin-right:auto;
text-align: center;
width:230rpx;
display: flex;
flex-direction: column;
flex-wrap: wrap;
movable-area{
height: 100%;
width: 100%;
}
movable-view{
.grid-cell {
padding: 30rpx 0;
border-bottom: 1rpx solid #eee;
position: relative;
background: lightgrey;
opacity: .6;
width: 130px;
height: 200px;
font-size: 10px;
}
.bla {
color:black;
.close{
position: fixed;
right: 0;
top: 0;
}
.reed {
color: red;
position: absolute;
right: 3rpx;
top: 50%;
height: 40rpx;
line-height: 40rpx;
margin-top: -20rpx;
.message-list{
height: 175px;
width: 130px;
}
.gre {
color: greenyellow;
.message-footer{
position: fixed;
bottom: 0;
width: 100%;
border-color: gray;
border-top: 1rpx solid;
}
.message{
padding-left: 4px;
}
.send-message{
align-self: center;
color: green;
position: absolute;
right: 3rpx;
top: 50%;
height: 40rpx;
line-height: 40rpx;
margin-top: -20rpx;
right:0;
}
.index {
font-family: 'PingFang SC';
.send-message:hover{
opacity: 0.6;
}
.sco {
margin: 20rpx 50rpx;
.classroom{
width: 100%;
height: 100%;
}
.student-list{
display: -webkit-flex;
display: flex;

@ -45,6 +45,9 @@ Page({
query_presence = new AV.Query("Presence");
query_presence.equalTo("class", class_);
query_presence.find().then(AV.Object.destroyAll);
query_message = new AV.Query("Message");
query_message.equalTo("class", class_);
query_message.find().then(AV.Object.destroyAll);
query_file = new AV.Query("File_");
query_file.equalTo("class", class_);
query_file.find().then(files=>{

@ -0,0 +1,68 @@
// pages/test/test.js
Page({
/**
* 页面的初始数据
*/
data: {
data:[{index:2,value:"一"},
{index:1, value:"二"},
{index:2, value:'三'}]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})

@ -0,0 +1,3 @@
{
"usingComponents": {}
}

@ -0,0 +1,6 @@
<!--pages/test/test.wxml-->
<text>pages/test/test.wxml</text>
<view wx:for="{{data}}" wx:for-item="d" wx:key="index">
<text>{{d.value}}</text>
</view>

@ -0,0 +1 @@
/* pages/test/test.wxss */
Loading…
Cancel
Save