add service contact function

master
educoder_weapp 5 years ago
parent efb71c8ca9
commit fc5d403db0

2
.gitignore vendored

@ -14,7 +14,7 @@ app.js
towxml towxml
we-cropper we-cropper
components/weui-miniprogram components/weui
.idea .idea
api_docs api_docs

@ -3,14 +3,14 @@
import {Session} from "./data/requests"; import {Session} from "./data/requests";
import {Client} from "./data/client"; import {Client} from "./data/client";
import {Account, Course, Exercise, ExerciseQuestion} from "./data/eduapi" import {Account, Course, Exercise, ExerciseQuestion} from "./data/eduapi";
const AV = require('./lib/av-live-query-weapp-min'); const AV = require('./lib/av-live-query-weapp-min');
const Towxml = require('/towxml/main'); const Towxml = require('/towxml/main');
const login = require("./model/user"); const login = require("./model/user");
AV.init({ AV.init({
appId: 'eVHYNBdT5D2lDxNj5jtJXsWT-MdYXbMMI', appId: 'fQCxN98zS5thYY3AceKdI8Pj-MdYXbMMI',
appKey: 'waM3bwf1ftpsMLjRBqqVyJIQ', appKey: 'Tdi1DcLlVYrTabFiBaA00pjj',
}); });

@ -20,12 +20,14 @@
"pages/question_setting/question_setting", "pages/question_setting/question_setting",
"pages/exercise_grade/exercise_grade", "pages/exercise_grade/exercise_grade",
"pages/course_invite/course_invite", "pages/course_invite/course_invite",
"pages/exercise_result/exercise_result" "pages/exercise_result/exercise_result",
"pages/feedback/feedback",
"pages/agreement/agreement",
"pages/contact/contact"
], ],
"window": { "window": {
"backgroundTextStyle": "dark", "backgroundTextStyle": "dark",
"navigationBarTitleText": "积分教室", "navigationBarTitleText": "EduCoder",
"navigationBarTextStyle": "black", "navigationBarTextStyle": "black",
"backgroundColor": "#f2f2f2", "backgroundColor": "#f2f2f2",
"navigationBarBackgroundColor": "#fbfbfb" "navigationBarBackgroundColor": "#fbfbfb"

@ -1,4 +1,4 @@
@import './components/weui-miniprogram/weui-wxss/dist/style/weui.wxss'; @import './components/weui/weui-wxss/dist/style/weui.wxss';
page { page {
height: 100%; height: 100%;

@ -0,0 +1,37 @@
# add-tips
> **微信小程序UI插件**
> 用于提示用户首次进入小程序时,点击右上角菜单进行【添加到我的小程序】操作
## 文档
首先,把这个仓库下载/克隆到你的小程序目录,比如`/components/weplug-add-tips/`
然后,在首页`index.json`配置文件中,引入该组件:
``` json
{
"usingComponents": {
"add-tips": "/components/weplug-add-tips/index"
}
}
```
最后,在首页`index.wxml`文件中,调用该组件即可:
``` wxml
<add-tips />
```
## 参数
你可以传递两个参数进行自定义操作:
### 1. text提示的文字内容
``` wxml
<add-tips text="点击添加到小程序" />
```
### 2. duration提示关闭时间单位秒
``` wxml
<add-tips duration="10" />
```
## 截图
![](https://i.loli.net/2019/03/29/5c9e0b1924201.png)
## 你也可以扫一扫小程序进行体验效果:
![](https://i.loli.net/2019/03/29/5c9e0b6bbd8f4.jpg)

@ -0,0 +1,66 @@
const STORAGE_KEY = 'PLUG-ADD-MYAPP-KEY';
Component({
/**
* 组件的属性列表
*/
properties: {
// 提示文字
text: {
type: String,
value: '点击「添加小程序」,下次访问更便捷 >'
},
// 多少秒后关闭
duration: {
type: Number,
value: 5
}
},
/**
* 组件的初始数据
*/
data: {
SHOW_TOP: false,
SHOW_MODAL: false
},
ready: function () {
// 判断是否已经显示过
let cache = wx.getStorageSync(STORAGE_KEY);
if (cache) return;
// 没显示过,则进行展示
this.setData({
SHOW_TOP: true
});
// 关闭时间
setTimeout(() => {
this.setData({
SHOW_TOP: false
})
}, this.data.duration * 1000);
},
/**
* 组件的方法列表
*/
methods: {
// 显示全屏添加说明
showModal: function () {
this.setData({
SHOW_TOP: false,
SHOW_MODAL: true
});
},
okHandler: function () {
this.setData({
SHOW_MODAL: false
});
wx.setStorage({
key: STORAGE_KEY,
data: +new Date,
});
}
}
})

@ -0,0 +1,24 @@
<view class="box" wx:if="{{SHOW_TOP}}">
<view class='arrow'></view>
<view class='body' bindtap='showModal'>
<text>{{text}}</text>
</view>
</view>
<!-- modal -->
<view class='modal' catchtap wx:if="{{SHOW_MODAL}}">
<view style='flex-direction: row;align-items:center;'>
<text>1. 点击右上角按钮</text>
<image src='./assets/fav-1.jpg' style='width:100px;height:40px;'></image>
</view>
<view>
<text>2. 点击「添加到我的小程序」</text>
<image src='./assets/fav-2.jpg' style='width:100%;' mode="widthFix"></image>
</view>
<!-- 知道了 -->
<view class='ok-btn' hover-class='btn-hover' bindtap='okHandler'>
<view>
<text>我知道了!</text>
</view>
</view>
</view>

@ -0,0 +1,89 @@
.box {
position: fixed;
top: 0;
/* left: 0; */
right: 0;
z-index: 999;
display: flex;
justify-content: flex-end;
align-items: flex-end;
flex-direction: column;
width: 600rpx;
}
.arrow {
width: 0;
height: 0;
margin-right: 120rpx;
border-width: 20rpx;
border-style: solid;
border-color: transparent transparent #fbbd08 transparent;
}
.body {
background-color: #fbbd08;
box-shadow: 0 10rpx 20rpx -10rpx #fbbd08;
border-radius: 12rpx;
display: flex;
align-items: center;
justify-content: center;
height: 84rpx;
padding: 0 20rpx;
margin-right: 40rpx;
}
.body > text {
color: #FFF;
font-size: 28rpx;
font-weight: 400;
}
.modal {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 999;
background-color: rgba(255, 255, 255, 0.9);
padding: 20px;
}
.modal > view {
margin: 10px 0;
display: flex;
/* align-items: center; */
flex-direction: column;
}
.modal > view > text {
font-size: 16px;
font-weight: 400;
margin-bottom: 5px;
color: #333;
}
.modal > view > image {
border-radius: 10px;
overflow: hidden;
}
.ok-btn {
width: 100%;
margin-top: 40px;
display: flex;
align-items: center;
justify-content: center;
}
.ok-btn > view {
height: 40px;
width: 120px;
background-color: #fbbd08;
box-shadow: 0 5px 10px -px #fbbd08;
display: flex;
align-items: center;
justify-content: center;
border-radius: 40px;
}
.ok-btn > view > text {
font-size: 14px;
color: #fff;
font-weight: 400;
}
.btn-hover {
opacity: 0.6;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

@ -1 +0,0 @@
/* components/educoder/course/course.wxss */

@ -0,0 +1,73 @@
const app = getApp();
Component({
/**
* 组件的属性列表
*/
properties: {
hidden:{
type:Boolean,
value: false,
}
},
/**
* 组件的初始数据
*/
data: {
invite_code:"",
identities:[],
hidden:false
},
/**
* 组件的方法列表
*/
methods: {
cancel: function (event) {
this.setData({ hidden: true });
},
update_invite_code: function ({ detail: { value } }) {
this.setData({ invite_code: value });
},
update_identities: function ({ detail: { value } }) {
this.setData({ identities: value })
},
join_course: function (event) {
const { invite_code, identities } = this.data;
let data = { invite_code: invite_code };
for (var identity of identities) {
data[identity] = 1;
}
console.log(data);
console.log({ ...data });
app.client.join_course({ ...data })
.then(res => {
if (res.data.status == 401) {
wx.showToast({
title: "请先登陆",
icon: "none"
});
return;
}
console.log(res);
wx.showToast({
title: res.data.message
})
if (res.data.course_id){
wx.navigateTo({
url: `/pages/course/course?course_id=${res.data.course_id}`
});
}
this.cancel();
})
.catch(error => {
wx.showToast({
title: error.toString(),
icon: "none"
});
console.warn(error);
})
}
}
})

@ -1,5 +1,4 @@
<!--components/modal/join_course/join_course.wxml--> <modal class="join_course" hidden="{{hidden}}" title="加入课堂" confirm-text="提交" cancel-text="取消" bindcancel="cancel" bindconfirm="join_course">
<modal id="modal" hidden="{{!show_join_course_modal}}" title="加入课堂" confirm-text="提交" cancel-text="取消" bindcancel="cancel_join_course_modal" bindconfirm="join_course">
<input type='text' bindinput="update_invite_code" class="code-input" placeholder="邀请码" auto-focus/> <input type='text' bindinput="update_invite_code" class="code-input" placeholder="邀请码" auto-focus/>
<checkbox-group bindchange="update_identities"> <checkbox-group bindchange="update_identities">
<text>身份:</text> <text>身份:</text>
@ -7,4 +6,4 @@
<lable class="identity"><checkbox value="assistant_professor"/>助教</lable> <lable class="identity"><checkbox value="assistant_professor"/>助教</lable>
<lable class="identity"><checkbox value="student"/>学生</lable> <lable class="identity"><checkbox value="student"/>学生</lable>
</checkbox-group> </checkbox-group>
</modal> </modal>

@ -3,7 +3,13 @@
border: 1rpx solid; border: 1rpx solid;
height: 36px; height: 36px;
margin-bottom: 24rpx; margin-bottom: 24rpx;
padding-left: 16rpx;
} }
lable.identity{ lable.identity{
margin-right: 16rpx; margin-right: 16rpx;
}
.loading{
text-align:center;
padding: 14rpx 0;
} }

@ -1,23 +0,0 @@
// components/modal/join_course/join_course.js
Component({
/**
* 组件的属性列表
*/
properties: {
},
/**
* 组件的初始数据
*/
data: {
},
/**
* 组件的方法列表
*/
methods: {
}
})

@ -1,10 +1,13 @@
// components/educoder/course/course.js // components/test/test.js
Component({ Component({
/** /**
* 组件的属性列表 * 组件的属性列表
*/ */
properties: { properties: {
hiddened:{
type: Boolean,
value: true
}
}, },
/** /**
@ -18,6 +21,6 @@ Component({
* 组件的方法列表 * 组件的方法列表
*/ */
methods: { methods: {
} }
}) })

@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

@ -0,0 +1,5 @@
<!--components/test/test.wxml-->
<view>
<text>components/test/test.wxml</text>
<text>{{hiddened}}</text>
</view>

@ -0,0 +1 @@
/* components/test/test.wxss */

@ -0,0 +1,12 @@
export const contact= {
wechat: 'wxid_jja9klxyquox22',
email: '1460454420@qq.com',
qq: '1460454420',
phone: ""
};
export const leancloud={
//@todo
appid: "",
appkey: ""
}

@ -232,11 +232,12 @@ export class Client{
} }
upload_avatar({avatar_path, success, fail, complete}){ upload_avatar({avatar_path, success, fail, complete}){
console.log("upload_avatar"); console.log("upload_avatar");
console.log(this.current_user);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
Account.upload_avatar({ Account.upload_avatar({
session: this.session, session: this.session,
avatar_path: avatar_path, avatar_path: avatar_path,
login: this.current_user.login, login: this.current_user.login||this.current_user.user_id,
complete: complete, complete: complete,
success: res => { success: res => {
if (typeof success == "function") { if (typeof success == "function") {

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 947 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 968 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 997 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -6,7 +6,7 @@ Page({
/** /**
* 页面的初始数据 * 页面的初始数据
*/ */
md: '# 简介\n## 源码\n[https://github/jinke18/smart_class](https://github.com/jinke18/smart_class)\n\n## 小程序码\n![小程序码](/images/weapp_code_smart_class.jpg)\n\n# 功能介绍\n\n## 教室\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- 学员在课程内可以看到老师发布的试卷,并且回答\n\n- 试卷截止后并且老师选择了公开答案,学生可以看到公布的答案\n\n- 老师可以创建试卷,发布试卷,查看学员作答分数\n\n## 其他\n账号的注册、登陆、找回密码、头像更改等\n\n# 实现\n## educoder平台接入\n使用HTTP与平台的api接口交互\n\n接口列表如下\n- 搜索课堂https://www.educoder.net/api/courses.json\n\n- 查询用户的课堂https://www.educoder.net/api/users/<user_id>/courses.json\n\n- 查询学校https://www.educoder.net/api/schools/school_list.json\n\n- 新建课堂https://www.educoder.net/api/courses.json\n\n- 加入课堂https://www.educoder.net/api/courses/apply_to_join_course.json\n\n- 新建试卷https://www.educoder.net/api/courses/<course_id>/exercises/new.json\n\n- 查询试卷https://www.educoder.net/api/courses/<course_id>/exercises.json\n\n- 班级文件资源https://www.educoder.net/api/files.json\n\n# 教室学员在位情况及分数的同步实现\n使用了[leancloud](https://www.leancloud.cn/)提供的javascript开发包实现数据同步功能, 如学员在位情况、分数的同步, 其底部技术为websocket' md: '# 简介\n## 源码\n[https://github/jinke18/educoder_weapp](https://github.com/jinke18/educoder_weapp)\n\n## 小程序码\n![小程序码](/images/weapp_code.jpg)\n\n# 功能介绍\n\n## 教室\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- 学员在课程内可以看到老师发布的试卷,并且回答\n\n- 试卷截止后并且老师选择了公开答案,学生可以看到公布的答案\n\n- 老师可以创建试卷,发布试卷,查看学员作答分数\n\n## 其他\n账号的注册、登陆、找回密码、头像更改等\n\n# 实现\n## educoder平台接入\n使用HTTP与平台的api接口交互\n\n接口列表如下\n- 搜索课堂https://www.educoder.net/api/courses.json\n\n- 查询用户的课堂https://www.educoder.net/api/users/<user_id>/courses.json\n\n- 查询学校https://www.educoder.net/api/schools/school_list.json\n\n- 新建课堂https://www.educoder.net/api/courses.json\n\n- 加入课堂https://www.educoder.net/api/courses/apply_to_join_course.json\n\n- 新建试卷https://www.educoder.net/api/courses/<course_id>/exercises/new.json\n\n- 查询试卷https://www.educoder.net/api/courses/<course_id>/exercises.json\n\n- 班级文件资源https://www.educoder.net/api/files.json\n\n# 教室学员在位情况及分数的同步实现\n使用了[leancloud](https://www.leancloud.cn/)提供的javascript开发包实现数据同步功能, 如学员在位情况、分数的同步, 其底部技术为websocket\n## 服务条款\n[查看服务条款](/pages/agreement/agreement)'
, ,
data: { data: {

@ -1,4 +1,4 @@
<import src="/towxml/entry.wxml"/> <import src="/towxml/entry.wxml"/>
<view class="container"> <view>
<template is="entry" data="{{...article}}"/> <template is="entry" data="{{...article}}"/>
</view> </view>

@ -0,0 +1,71 @@
// pages/agreement/agreement.js
const app = getApp();
Page({
agreement: '# 服务协议\n\n尊敬的用户您好\n欢迎使用本网站在您使用本网站前请您认真阅读并遵守《服务协议》以下简称”本协议”请您务必审慎阅读、充分理解协议的各条款内容。\n当您在注册过程中点击查看”看过并同意本服务协议”按照注册流程成功注册为网站的用户即表示您已充分阅读、理解并完全接受本协议中的全部条款。您承诺接受并遵守本协议的约定届时您不应以未阅读本协议的内容等理由主张本协议无效或本协议中的某些条款无效或要求撤销本协议。\n\n## 本网站权利和义务\n1. 尊重用户隐私:尊重用户隐私,保障用户隐私安全是网站的一项基本政策;\n2. 管理网站用户:网站依据国家法律、地方法律和国际法律等的标准以及本行业的规则来管理网站注册用户;\n3. 处理用户反馈:网站的相关人员会及时处理用户反馈的问题并给予及时回复。\n## 用户权利和义务\n1. 用户在使用网站的过程中,必须遵守如下原则:\n2. 遵守中国的有关法律和法规;\n3. 使用网络服务不作非法用途;\n4. 不干扰和混乱网络服务;\n5. 遵守所有使用网络服务的网络协议、规定、程序和惯例;\n6. 不传输任何非法的、骚扰性的、中伤他人的、辱骂性的、恐吓性的、伤害性的、庸俗的,淫秽等信息资料;\n7. 不传输任何教唆他人构成犯罪行为的资料;\n8. 用户不得故意或者过失损害网站合法权利和利益。及时回复。\n## 关于责任\n鉴于网络服务的特殊性本网站有权在事先通知的情况下变更、中断、升级部分网络服务。本网站不担保网络服务不会中断但承诺在用户可承受的时间内快速恢复服务同时确保用户数据的安全性和可靠性。\n\n## 免责条款\n鉴于互联网服务的特点本网站对用户自行上传的资料不承担任何法律责任希望各网友对网站提供的互动服务中的内容进行监督若发现存在侵犯任何第三人著作权等合法权益的内容请及时告知我们将严格按照《信息网络传播权保护条例》中的规定予以删除。\n\n1. 本网站属于非赢利性网站转载的文章遵循原作者的版权声明如果原文没有版权声明按照目前互联网开放的原则我们将在不通知作者的情况下转载文章如果原文明确注明“禁止转载”我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话请来信告知zhongjin@educoder.net\n2. 本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。\n3. 任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。\n4. 本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。\n## 侵权投诉\nEducoder平台是一个接受外来投稿的平台部分图片和文字来自互联网或原作者自行编辑。投稿到Educoder平台的文章默认作者授权其全部图文内容在Educoder平台、在其微信公众号及微博帐号进行发布Educoder平台对这一部分内容不进行预先审查。\n如您发现平台上文章或图片涉嫌侵犯您的权利请您将所涉及的文章 URL 和侵权理由以邮件形式发送到邮箱zhongjin@educoder.net我们将在核实情况后依照《中华人民共和国侵权责任法》及其司法解释对内容进行屏蔽、删除和通知原作者。\n\n## 服务条款的修改\n本网站保留在必要时对本协议修改的权利一旦发生变动这些条款可由网站项目组及时更新且毋须另行通知修改后的条款一旦在网页上公布即有效代替原来的服务条款。您可随时查阅最新版服务条款。\n\n**本协议最终解释权归本网站所有**。'
,
data: {
article: {}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
const _ts = this;
let data = app.towxml.toJson(this.agreement, 'markdown');
_ts.setData({
article: data
});
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})

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

@ -0,0 +1,4 @@
<import src="/towxml/entry.wxml"/>
<view>
<template is="entry" data="{{...article}}"/>
</view>

@ -0,0 +1,17 @@
/* pages/about/about.wxss */
/**基础风格样式**/
@import '/towxml/style/main.wxss';
/**如果页面有动态主题切换,则需要将使用到的样式全部引入**/
/**主题配色(浅色样式)**/
@import '/towxml/style/theme/light.wxss';
/**主题配色(深色样式)**/
@import '/towxml/style/theme/dark.wxss';
.container{
padding-bottom: 40rpx;
}

@ -1,6 +1,6 @@
{ {
"usingComponents": { "usingComponents": {
"myicon": "/components/icon/myicon" "myicon": "/components/myicon/myicon"
}, },
"enablePullDownRefresh": true "enablePullDownRefresh": true
} }

@ -0,0 +1,45 @@
var app = getApp();
import {contact} from "../../config";
Page({
/**
* 页面的初始数据
*/
data: {
weixin: contact.wechat,
email: contact.email,
qq: contact.qq,
phone:contact.phone,
banner: "/images/contact.jpg"
},
onLoad() {
},
//复制
copy(e) {
wx.setClipboardData({
data: e.currentTarget.dataset.copy,
success: res => {
wx.showToast({
title: '复制' + e.currentTarget.dataset.name+'成功',
icon: 'success',
duration: 1000,
})
}
})
},
//电话拨打
phone(e) {
wx.makePhoneCall({
phoneNumber: e.currentTarget.dataset.phone
})
},
//预览图片
preview(e) {
wx.previewImage({
urls: e.currentTarget.dataset.link.split(",")
});
},
})

@ -0,0 +1,5 @@
{
"navigationBarTitleText": "联系客服",
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black"
}

@ -0,0 +1,87 @@
<view class="contain">
<view style="height:20rpx;"></view>
<!--顶部图-->
<image src="{{banner}}" class="slide-image" />
<!--在线咨询-->
<view class="card">
<view class="card1">
<image class="wechatimg" src="/images/online.png" />
</view>
<view class="borderbox">
<view class="border"></view>
</view>
<view class="centercontain">
<view class="name">在线咨询</view>
<view class="des">点击即可在线咨询客服</view>
</view>
<view class="rightico">
<image class="rightimg" src="/images/right.png" />
</view>
<button open-type="contact"></button>
</view>
<!--微信联系-->
<view class="card" bindtap="copy" data-copy="{{weixin}}" data-name="微信">
<view class="card1">
<image class="wechatimg" src="/images/weixin.png" />
</view>
<view class="borderbox">
<view class="border"></view>
</view>
<view class="centercontain">
<view class="name">官方微信</view>
<view class="des">点击即可复制官方微信</view>
</view>
<view class="rightico">
<image class="rightimg" src="/images/right.png" />
</view>
</view>
<!--QQ联系-->
<view class="card" bindtap="copy" data-copy="{{qq}}" data-name="QQ">
<view class="card1">
<image class="wechatimg" src="/images/qq.png" />
</view>
<view class="borderbox">
<view class="border"></view>
</view>
<view class="centercontain">
<view class="name">QQ联系</view>
<view class="des">点击即可复制客服QQ</view>
</view>
<view class="rightico">
<image class="rightimg" src="/images/right.png" />
</view>
</view>
<view class="card" bindtap="copy" data-copy="{{email}}" data-name="email">
<view class="card1">
<image class="wechatimg" src="/images/email.png" />
</view>
<view class="borderbox">
<view class="border"></view>
</view>
<view class="centercontain">
<view class="name">邮箱联系</view>
<view class="des">点击即可复制客服邮箱</view>
</view>
<view class="rightico">
<image class="rightimg" src="/images/right.png" />
</view>
</view>
<!--电话联系-->
<view wx:if="{{phone}}" class="card" bindtap="phone" data-phone="{{phone}}">
<view class="card1">
<image class="wechatimg" src="/images/phone.png" />
</view>
<view class="borderbox">
<view class="border"></view>
</view>
<view class="centercontain">
<view class="name">24小时服务热线</view>
<view class="des">{{phone}}</view>
</view>
<view class="rightico">
<image class="rightimg" src="/images/right.png" />
</view>
</view>
</view>

@ -0,0 +1,84 @@
.contain{
width: 100%;
padding: 0 46rpx;
box-sizing: border-box;
}
.slide-image{
width: 100%;
height: 310rpx;
border-radius: 20rpx;
}
.card{
margin-top: 40rpx;
border-radius: 20rpx;
width: 100%;
height: 162rpx;
box-sizing: border-box;
box-shadow: 0 0 20rpx #eee;
display: flex;
position: relative;
}
.card button{
width: 100%;
height: 100%;
position: absolute;
left: 0rpx;
top: 0rpx;
opacity: 0.01;
}
.card1{
width: 140rpx;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.wechatimg{
width: 90rpx;
height:90rpx;
}
.borderbox{
width: 10rpx;
height: 100%;
display: flex;
align-items: center;
}
.border{
width: 4rpx;
height: 82rpx;
border-left: 3rpx solid #eee;
box-sizing: border-box;
}
.centercontain{
width: 420rpx;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
padding-left: 20rpx;
}
.name{
font-size: 32rpx;
font-weight: 600;
letter-spacing: 2rpx;
}
.des{
padding-top: 10rpx;
font-size: 28rpx;
color: rgb(161, 161, 161);
letter-spacing: 2rpx;
}
.rightico{
width: 40rpx;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.rightimg{
width: 30rpx;
height: 30rpx;
}

@ -1,7 +1,7 @@
{ {
"usingComponents": { "usingComponents": {
"myicon": "/components/icon/myicon", "myicon": "/components/myicon/myicon",
"mp-searchbar": "/components/weui-miniprogram/searchbar/searchbar" "mp-searchbar": "/components/weui/searchbar/searchbar"
} }
} }

@ -0,0 +1,66 @@
// pages/feedback/feedback.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
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,2 @@
<!--pages/feedback/feedback.wxml-->
<text>pages/feedback/feedback.wxml</text>

@ -0,0 +1 @@
/* pages/feedback/feedback.wxss */

@ -41,50 +41,6 @@ Page({
show_join_course_modal: function (event) { show_join_course_modal: function (event) {
this.setData({ show_join_course_modal: true }); this.setData({ show_join_course_modal: true });
}, },
cancel_join_course_modal: function (event) {
this.setData({ show_join_course_modal: false });
},
update_invite_code: function ({ detail: { value } }) {
this.setData({ invite_code: value });
},
update_identities: function ({ detail: { value } }) {
this.setData({ identities: value })
},
join_course: function (event) {
const { invite_code, identities } = this.data;
let data = { invite_code: invite_code };
for (var identity of identities) {
data[identity] = 1;
}
console.log(data);
console.log({ ...data });
app.client.join_course({ ...data })
.then(res => {
if (res.data.status == 401) {
wx.showToast({
title: "请先登陆",
icon: "none"
});
return;
}
console.log(res);
wx.showToast({
title: res.data.message
})
wx.navigateTo({
url: "../course/course?course_id=" + res.data.course_id
});
this.cancel_join_course_modal();
})
.catch(error => {
wx.showToast({
title: error.toString(),
icon: "none"
});
console.warn(error);
})
},
enter_course: function(event){ enter_course: function(event){
console.log(event); console.log(event);

@ -1,7 +1,9 @@
{ {
"navigationBarTitleText": "我的课程", "navigationBarTitleText": "我的课程",
"usingComponents": { "usingComponents": {
"myicon": "/components/icon/myicon" "myicon": "/components/myicon/myicon",
"add-tips":"/components/add-tips/add-tips",
"join-course-modal":"/components/modal/join-course/join-course"
}, },
"enablePullDownRefresh": true "enablePullDownRefresh": true
} }

@ -23,15 +23,7 @@
</view> </view>
</view> </view>
<myicon class="add-class" type="add" color="#00C7B7" size="56" bindtap="show_join_course_modal"></myicon> <myicon class="add-class" type="add" color="#00C7B7" size="56" bindtap="show_join_course_modal"></myicon>
<modal id="modal" hidden="{{!show_join_course_modal}}" title="加入课堂" confirm-text="提交" cancel-text="取消" bindcancel="cancel_join_course_modal" bindconfirm="join_course"> <add-tips/>
<input type='text' bindinput="update_invite_code" class="code-input" placeholder="邀请码" auto-focus/> <join-course-modal hidden="{{!show_join_course_modal}}"/>
<checkbox-group bindchange="update_identities">
<text>身份:</text>
<lable class="identity"><checkbox value="professor"/>教师</lable>
<lable class="identity"><checkbox value="assistant_professor"/>助教</lable>
<lable class="identity"><checkbox value="student"/>学生</lable>
</checkbox-group>
</modal>

@ -66,21 +66,4 @@ image.none-content{
.add-class:hover{ .add-class:hover{
opacity: 0.6; opacity: 0.6;
}
.code-input{
border-radius: 10rpx;
border: 1rpx solid;
height: 36px;
margin-bottom: 24rpx;
padding-left: 16rpx;
}
lable.identity{
margin-right: 16rpx;
}
.loading{
text-align:center;
padding: 14rpx 0;
} }

@ -59,50 +59,7 @@ Page({
show_join_course_modal: function(event){ show_join_course_modal: function(event){
this.setData({show_join_course_modal: true}); this.setData({show_join_course_modal: true});
}, },
cancel_join_course_modal: function(event){
this.setData({show_join_course_modal: false});
},
update_invite_code: function({detail: {value}}){
this.setData({invite_code: value});
},
update_identities: function({detail: {value}}){
this.setData({identities: value})
},
join_course: function(event){
const {invite_code, identities} = this.data;
let data = {invite_code: invite_code};
for(var identity of identities){
data[identity] = 1;
}
console.log(data);
console.log({ ...data });
app.client.join_course({...data})
.then(res=>{
if (res.data.status == 401) {
wx.showToast({
title: "请先登陆",
icon: "none"
});
return;
}
console.log(res);
wx.showToast({
title: res.data.message
})
wx.navigateTo({
url: "../course/course?course_id="+res.data.course_id
});
this.cancel_join_course_modal();
})
.catch(error=>{
wx.showToast({
title: error.toString(),
icon: "none"
});
console.warn(error);
})
},
onShow: function(){ onShow: function(){
app.client.get_user_info() app.client.get_user_info()
.then(res=>{ .then(res=>{

@ -1,4 +1,7 @@
{ {
"navigationBarTitleText": "设置", "navigationBarTitleText": "设置",
"enablePullDownRefresh": false "enablePullDownRefresh": false,
"usingComponents": {
"join-course-modal": "/components/modal/join-course/join-course"
}
} }

@ -1,26 +1,16 @@
<view class="setting"> <view class="setting">
<view class="user-view bg_user"> <view class="user-view bg_user">
<!--open-data type="userAvatarUrl" class="avatar" default-avatar="../../images/avatar.png"></open-data-->
<image class="avatar" bindtap="onTapAvatar" data-src="{{avatar_url?avatar_url:'/images/avatar.png'}}" src="{{avatar_url?avatar_url:'/images/avatar.png'}}"></image> <image class="avatar" bindtap="onTapAvatar" data-src="{{avatar_url?avatar_url:'/images/avatar.png'}}" src="{{avatar_url?avatar_url:'/images/avatar.png'}}"></image>
<text class="user-text" bindtap="enter_usersetting">{{current_user.real_name}} | {{current_user.username}}</text> <text class="user-text" bindtap="enter_usersetting">{{current_user.real_name}} | {{current_user.user_school||current_user.school}}</text>
</view> </view>
<view class="nav-list"> <view class="nav-list">
<!--navigator url="../user/user" class="nav user" bindlongpress="enter_changeuser">登陆信息修改</navigator>
<navigator hidden="{{true}}" url="../changeuser/changeuser" class="nav user">更换登陆用户</navigator-->
<navigator class="nav addclass" bindtap="show_join_course_modal">加入课程</navigator> <navigator class="nav addclass" bindtap="show_join_course_modal">加入课程</navigator>
<navigator url="../course_setting/course_setting?intent=create" class="nav createclass">创建课程</navigator> <navigator url="../course_setting/course_setting?intent=create" class="nav createclass">创建课程</navigator>
<button open-type="feedback" class="nav">意见反馈</button>
<navigator class="nav" url="../contact/contact">联系客服</navigator>
<navigator url="../about/about" class="nav about">关于</navigator> <navigator url="../about/about" class="nav about">关于</navigator>
</view> </view>
<button class="login" type="primary" wx:if="{{current_user.user_id==2}}" bindtap="enter_login">登陆</button> <button class="login" type="primary" wx:if="{{current_user.user_id==2}}" bindtap="enter_login">登陆</button>
<button class="logout" wx:else bindtap="logout">退出登陆</button> <button class="logout" wx:else bindtap="logout">退出登陆</button>
</view> </view>
<modal id="modal" hidden="{{!show_join_course_modal}}" title="加入课堂" confirm-text="提交" cancel-text="取消" bindcancel="cancel_join_course_modal" bindconfirm="join_course"> <join-course-modal hidden="{{!show_join_course_modal}}"/>
<input type='text' bindinput="update_invite_code" class="code-input" placeholder="邀请码" auto-focus/>
<checkbox-group bindchange="update_identities">
<text>身份:</text>
<lable class="identity"><checkbox value="professor"/>教师</lable>
<lable class="identity"><checkbox value="assistant_professor"/>助教</lable>
<lable class="identity"><checkbox value="student"/>学生</lable>
</checkbox-group>
</modal>

@ -1,11 +1,13 @@
@import"../../images/base64/bg_user.wxss"; @import"../../images/base64/bg_user.wxss";
.nav { .nav {
font-size: 16px;
background: white; background: white;
border-bottom: 1px solid #eee; border-bottom: 1px solid #eee;
padding: 0 14px; padding: 0 14px;
height: 46px; height: 46px;
line-height: 46px; line-height: 46px;
text-align: left;
} }
@ -41,13 +43,3 @@
color: white; color: white;
margin: 16rpx 70rpx; margin: 16rpx 70rpx;
} }
.code-input{
border-radius: 10rpx;
border: 1rpx solid;
height: 36px;
margin-bottom: 24rpx;
padding-left: 16rpx;
}
lable.identity{
margin-right: 16rpx;
}
Loading…
Cancel
Save