Browse Source

上传代码

master
杨豪 3 years ago
parent
commit
7b52a65598
  1. 2
      api/knowledge.js
  2. 11
      api/user.js
  3. 4
      config/index.js
  4. 6
      pages.json
  5. 162
      pages/authorization/agreementPage.vue
  6. 111
      pages/course/detail.vue
  7. 20
      pages/course/index.vue
  8. 39
      pages/course/signIn.vue
  9. 57
      pages/user/PersonalData/index.vue
  10. 160
      pages/user/User/index.vue
  11. 10
      pages/user/myCourses/index.vue
  12. 53
      utils/index.js
  13. 96
      wxcomponents/vant/button/index.vue
  14. 1
      wxcomponents/vant/common/index.css
  15. 1
      wxcomponents/vant/common/style/clearfix.css
  16. 1
      wxcomponents/vant/common/style/ellipsis.css
  17. 1
      wxcomponents/vant/common/style/hairline.css
  18. 0
      wxcomponents/vant/common/style/mixins/clearfix.css
  19. 0
      wxcomponents/vant/common/style/mixins/ellipsis.css
  20. 0
      wxcomponents/vant/common/style/mixins/hairline.css
  21. 0
      wxcomponents/vant/common/style/theme.css
  22. 0
      wxcomponents/vant/common/style/var.css
  23. 1012
      wxcomponents/vant/icon/index.vue
  24. 20
      wxcomponents/vant/info/index.vue
  25. 51
      wxcomponents/vant/loading/index.vue

2
api/knowledge.js

@ -118,7 +118,7 @@ export function enterCourse(data) {
* 课程扫码签到
*/
export function signCourse(data) {
return request.get("/user/signCourse?courseId="+data);
return request.get("/lession/signCourse?lessionId="+data);
}
/**

11
api/user.js

@ -1,5 +1,16 @@
import request from '@/utils/request'
/**
* 获取我参与的课程和学习榜
*/
export function myLession(data) {
return request.get('/user/myLession', data, {
// return request.get("/citys", data, {
login: true,
})
}
/**
* 省市区
*/

4
config/index.js

@ -1,7 +1,7 @@
// export const VUE_APP_API_URL = 'http://natapp.xinxintuan.co/api';
// export const VUE_APP_API_URL = 'https://wxapi.yixiang.co/api'
// export const VUE_APP_API_URL = 'http://192.168.0.112:8088/api'
// export const VUE_APP_API_URL = 'http://192.168.0.111:8088/api'
// export const VUE_APP_API_URL = 'http://10.11.32.109:8088/api'
// export const VUE_APP_API_URL = 'http://10.11.32.103:8088/api/'
export const VUE_APP_API_URL = 'https://www.cyjyyjy.com/api'
// export const VUE_APP_API_URL = 'http://natapp.xinxintuan.co/api';
// export const VUE_APP_API_URL = 'https://thapi.xinxintuan.co/api'

6
pages.json

@ -11,6 +11,12 @@
"style": {
"navigationBarTitleText": "微信授权"
}
},
{
"path": "pages/authorization/agreementPage",
"style": {
"navigationBarTitleText": "用户协议"
}
},
// {
// "path": "pages/user/Login/index",

162
pages/authorization/agreementPage.vue

@ -0,0 +1,162 @@
<template>
<view class="argeement-page">
用户协议<br/>
本隐私政策介绍本公司的隐私数据相关政策和惯例这将涵盖我们如何收集使用处理存储和/或披露那些通过本公司的移动App收集的关于您的个人信息请你仔细阅读我们的隐私政策<br/>
本公司如何收集您的个人信息<br/>
个人信息是可用于唯一地识别或联系某人的数据<br/>
当您使用本公司的系统注册用户过程中我们将会收集您的个人信息电子邮件地址电话号码为了保护个人隐私您不应提供除本公司特别要求之外的任何其它信息<br/>
本公司如何使用您的个人信息<br/>
1通过您的个人信息向您发送本公司移动App的服务信息<br/>
2通过您的个人信息实现密码找回功能<br/>
3除本公司发生重组合并或出售可将我们收集的一切个人信息转让给相关第三方外本公司不会向任何无关第三方提供出售出租分享或交易您的个人信息除非事先得到您的许可或该第三方和本公司单独或共同为您提供服务且在该服务结束后其将被禁止访问包括其以前能够访问的所有这些信息<br/>
个人信息安全<br/>
保证您的个人数据的安全对我们来说至关重要当您在本公司的移动App中注册输入个人数据时我们会利用安全套接字层技术 (SSL) 对这些信息进行加密<br/>
在数据传输和数据保管两个阶段里我们会通过广为接受的行业标准如防火墙加密和数据隐私法律要求来保护您向我们提交的信息<br/>
然而没有任何一种互联网传输或电子存储方法是100%安全的因此尽管我们通过商业上可接受的方式来保护您的个人信息但仍无法保证信息的绝对安全<br/>
本公司会将个人信息保存多久<br/>
一般来说本公司仅保留您的个人信息至履行收集目的所需的期限同时将遵守适用法律规定的数据保留期限<br/>
法律免责声明<br/>
在法律要求的情况下以及本公司认为必须披露与您有关的信息来保护本公司的法定权益和/或遵守司法程序法院指令或适用于本公司的系统的法律程序时我们有权透露您的个人信息<br/>
如果本公司确定为了执行本公司的条款和条件或保护我们的经营披露是合理必须的则我们可披露与您有关的信息<br/>
本隐私政策的更改<br/>
如果决定更改隐私政策我们会在本政策中本公司网站中以及我们认为适当的位置发布这些更改以便您了解我们如何收集使用您的个人信息哪些人可以访问这些信息以及在什么情况下我们会透露这些信息<br/>
本公司保留随时修改本政策的权利因此请经常查看如对本政策作出重大更改本公司会通过网站通知的形式告知<br/>
用户协议<br/>
特别提示<br/>
云生态在此特别提醒您用户在注册成为用户之前请认真阅读本用户协议以下简称协议确保您充分理解本协议中各条款请您审慎阅读并选择接受或不接受本协议除非您接受本协议所有条款否则您无权注册登录或使用本协议所涉服务您的注册登录使用等行为将视为对本协议的接受并同意接受本协议各项条款的约束<br/>
本协议约定云生态与用户之间关于云生态软件服务以下简称服务的权利义务用户是指注册登录使用本服务的个人本协议可由云生态随时更新更新后的协议条款一旦公布即代替原来的协议条款恕不再另行通知用户可在本网站查阅最新版协议条款在云生态修改协议条款后如果用户不接受修改后的条款请立即停止使用云生态提供的服务用户继续使用云生态提供的服务将被视为接受修改后的协议<br/>
用户个人信息保护<br/>
1用户在注册帐号或使用本服务的过程中可能需要填写或提交一些必要的个人信息如法律法规规章规范性文件以下称法律法规规定的需要填写的身份信息如用户提交的信息不完整或不符合法律法规的规定则用户可能无法使用本服务或在使用本服务的过程中受到限制<br/>
2用户个人信息包括<br/>
1用户自行提供的用户个人信息如注册时填写的手机号码电子邮件等个人信息使用服务时提供的共享信息等<br/>
2其他方分享的用户个人信息<br/>
3云生态为提供服务而合法收集的用户必要个人信息如使用服务时系统自动采集的设备或软件信息浏览历史信息通讯时间信息等技术信息用户开启定位功能并使用服务时的地理位置信息等
其中个人隐私信息是指涉及用户个人身份或个人隐私的信息比如用户真实姓名身份证号手机号码手机设备识别码IP地址用户聊天记录非个人隐私信息是指用户对本服务的操作状态以及使用习惯等明确且客观反映在云生态服务器端的基本记录信息个人隐私信息范围外的其它普通信息以及用户同意公开的上述隐私信息云生态保证在取得用户书面同意的情况下收集使用或公开用户的个人隐私信息用户同意云生态无需获得用户的另行确认与授权即可收集使用或公开用户的非个人隐私信息<br/>
3尊重用户个人信息的私有性是云生态的一贯制度云生态将采取技术措施和其他必要措施确保用户个人信息安全防止在本服务中收集的用户个人信息泄露毁损或丢失在发生前述情形或者云生态发现存在发生前述情形的可能时云生态将及时采取补救措施并告知用户用户如发现存在前述情形亦需立即与云生态联系<br/>
4云生态未经用户同意不向任何第三方公开 透露用户个人隐私信息但以下特定情形除外<br/>
(1) 云生态根据法律法规规定或有权机关的指示提供用户的个人隐私信息<br/>
(2) 由于用户将其用户密码告知他人或与他人共享注册帐户与密码由此导致的任何个人信息的泄漏或其他非因云生态原因导致的个人隐私信息的泄露<br/>
(3) 用户自行向第三方公开其个人隐私信息<br/>
(4) 用户与云生态及合作单位之间就用户个人隐私信息的使用公开达成约定云生态因此向合作单位公开用户个人隐私信息<br/>
(5) 任何由于黑客攻击电脑病毒侵入及其他不可抗力事件导致用户个人隐私信息的泄露<br/>
(6) 用户个人信息已经经过处理无法识别特定个人且不能复原<br/>
5用户同意云生态可在以下事项中使用用户的个人隐私信息<br/>
(1) 云生态向用户及时发送重要通知如软件更新本协议条款的变更<br/>
(2) 云生态内部进行审计数据分析和研究等以改进云生态的产品服务和与用户之间的沟通<br/>
(3) 依本协议约定云生态管理审查用户信息及进行处理措施<br/>
(4) 适用法律法规规定的其他事项<br/>
除上述事项外如未取得用户事先同意云生态不会将用户个人隐私信息使用于任何其他用途<br/>
内容规范<br/>
1本条所述内容是指用户使用本服务过程中所制作上载复制发布传播的任何内容包括但不限于帐号头像名称用户说明等注册信息及认证资料或文字语音图片视频图文等发送回复或自动回复消息和相关链接页面以及其他使用帐号或本服务所产生的内容<br/>
2用户不得利用云生态帐号或本服务制作上载复制发布传播如下法律法规和政策禁止的内容<br/>
(1) 反对宪法所确定的基本原则的<br/>
(2) 危害国家安全泄露国家秘密颠覆国家政权破坏国家统一的<br/>
(3) 损害国家荣誉和利益的<br/>
(4) 煽动民族仇恨民族歧视破坏民族团结的<br/>
(5) 破坏国家宗教政策宣扬邪教和封建迷信的<br/>
(6) 散布谣言扰乱社会秩序破坏社会稳定的<br/>
(7) 散布淫秽色情赌博暴力凶杀恐怖或者教唆犯罪的<br/>
(8) 侮辱或者诽谤他人侵害他人合法权益的<br/>
(9) 不遵守法律法规底线社会主义制度底线国家利益底线公民合法权益底线社会公共秩序底线道德风尚底线和信息真实性底线的七条底线要求的<br/>
(10) 含有法律行政法规禁止的其他内容的信息<br/>
3用户不得利用云生态帐号或本服务制作上载复制发布传播如下干扰云生态正常运营以及侵犯其他用户或第三方合法权益的内容<br/>
(1) 含有任何性或性暗示的<br/>
(2) 含有辱骂恐吓威胁内容的<br/>
(3) 含有骚扰垃圾广告恶意信息诱骗信息的<br/>
(4) 涉及他人隐私个人信息或资料的<br/>
(5) 侵害他人名誉权肖像权知识产权商业秘密等合法权利的<br/>
(6) 含有其他干扰本服务正常运营和侵犯其他用户或第三方合法权益内容的信息<br/>
使用规则<br/>
1用户在本服务中或通过本服务所传送发布的任何内容并不反映或代表也不得被视为反映或代表云生态的观点立场或政策云生态对此不承担任何责任<br/>
2用户不得利用云生态帐号或本服务进行如下行为<br/>
(1) 提交发布虚假信息或盗用他人头像或资料冒充利用他人名义的<br/>
(2) 强制诱导其他用户关注点击链接页面或分享信息的<br/>
(3) 虚构事实隐瞒真相以误导欺骗他人的<br/>
(4) 利用技术手段批量建立虚假帐号的<br/>
(5) 利用云生态帐号或本服务从事任何违法犯罪活动的<br/>
(6) 制作发布与以上行为相关的方法工具或对此类方法工具进行运营或传播无论这些行为是否为商业目的<br/>
(7) 其他违反法律法规规定侵犯其他用户合法权益干扰云生态正常运营或云生态未明示授权的行为<br/>
3用户须对利用云生态帐号或本服务传送信息的真实性合法性无害性准确性有效性等全权负责与用户所传播的信息相关的任何法律责任由用户自行承担与云生态无关如因此给云生态或第三方造成损害的用户应当依法予以赔偿<br/>
4云生态提供的服务中可能包括广告用户同意在使用过程中显示云生态和第三方供应商合作伙伴提供的广告除法律法规明确规定外用户应自行对依该广告信息进行的交易负责对用户因依该广告信息进行的交易或前述广告商提供的内容而遭受的损失或损害云生态不承担任何责任<br/>
5除非云生态书面许可用户不得从事下列任一行为<br/>
(1) 删除软件及其副本上关于著作权的信息<br/>
(2) 对软件进行反向工程反向汇编反向编译或者以其他方式尝试发现软件的源代码<br/>
(3) 对云生态拥有知识产权的内容进行使用出租出借复制修改链接转载汇编发表出版建立镜像站点等<br/>
(4) 对软件或者软件运行过程中释放到任何终端内存中的数据软件运行过程中客户端与服务器端的交互数据以及软件运行所必需的系统数据进行复制修改增加删除挂接运行或创作任何衍生作品形式包括但不限于使用插件外挂或非经云生态授权的第三方工具/服务接入软件和相关系统<br/>
(5) 通过修改或伪造软件运行中的指令数据增加删减变动软件的功能或运行效果或者将用于上述用途的软件方法进行运营或向公众传播无论这些行为是否为商业目的<br/>
(6) 通过非云生态开发授权的第三方软件插件外挂系统登录或使用云生态软件及服务或制作发布传播非云生态开发授权的第三方软件插件外挂系统<br/>
账户管理<br/>
1 云生态帐号的所有权归云生态所有用户完成申请注册手续后获得云生态帐号的使用权该使用权仅属于初始申请注册人禁止赠与借用租用转让或售卖云生态因经营需要有权回收用户的云生态帐号<br/>
2用户可以通过<br/>
1查看与编辑个人资料页<br/>
2设置页面里的账号与安全页面来查询更改删除注销云生态帐户上的个人资料注册信息及传送内容等但需注意删除有关信息的同时也会删除用户储存在系统中的文字和图片用户需承担该风险<br/>
3用户有责任妥善保管注册帐号信息及帐号密码的安全因用户保管不善可能导致遭受盗号或密码失窃责任由用户自行承担用户需要对注册帐号以及密码下的行为承担法律责任用户同意在任何情况下不使用其他用户的帐号或密码在用户怀疑他人使用其帐号或密码时用户同意立即通知云生态<br/>
4用户应遵守本协议的各项条款正确适当地使用本服务如因用户违反本协议中的任何条款云生态在通知用户后有权依据协议中断或终止对违约用户云生态帐号提供服务同时云生态保留在任何时候收回云生态帐号用户名的权利<br/>
5如用户注册云生态帐号后一年不登录通知用户后云生态可以收回该帐号以免造成资源浪费由此造成的不利后果由用户自行承担<br/>
6用户可以通过设置页面里的账号与安全页面来进行账号注销服务用户确认注销账号是不可恢复的操作用户应自行备份与云生态账号相关的信息和数据用户确认操作之前与云生态账号相关的所有服务均已进行妥善处理用户确认并同意注销账号后并不代表本云生态账号注销前的账号行为和相关责任得到豁免或减轻如在注销期间用户的账号被他人投诉被国家机关调查或者正处于诉讼仲裁程序中云生态有限自行终止用户的账号注销并无需另行得到用户的同意<br/>
数据储存<br/>
1云生态不对用户在本服务中相关数据的删除或储存失败负责<br/>
2云生态可以根据实际情况自行决定用户在本服务中数据的最长储存期限并在服务器上为其分配数据最大存储空间等用户可根据自己的需要自行备份本服务中的相关数据<br/>
3如用户停止使用本服务或本服务终止云生态可以从服务器上永久地删除用户的数据本服务停止终止后云生态没有义务向用户返还任何数据<br/>
风险承担<br/>
1用户理解并同意云生态仅为用户提供信息分享传送及获取的平台用户必须为自己注册帐号下的一切行为负责包括用户所传送的任何内容以及由此产生的任何后果用户应对云生态及本服务中的内容自行加以判断并承担因使用内容而引起的所有风险包括因对内容的正确性完整性或实用性的依赖而产生的风险云生态无法且不会对因用户行为而导致的任何损失或损害承担责任
2用户理解并同意因业务发展需要云生态保留单方面对本服务的全部或部分服务内容变更暂停终止或撤销的权利用户需承担此风险<br/>
知识产权声明<br/>
1除本服务中涉及广告的知识产权由相应广告商享有外云生态在本服务中提供的内容包括但不限于网页文字图片音频视频图表等的知识产权均归云生态所有但用户在使用本服务前对自己发布的内容已合法取得知识产权的除外<br/>
2除另有特别声明外云生态提供本服务时所依托软件的著作权专利权及其他知识产权均归云生态所有<br/>
3云生态在本服务中所涉及的图形文字或其组成以及其他云生态标志及产品服务名称以下统称云生态标识其著作权或商标权归云生态所有未经云生态事先书面同意用户不得将云生态标识以任何方式展示或使用或作其他处理也不得向他人表明用户有权展示使用或其他有权处理云生态标识的行为<br/>
4上述及其他任何云生态或相关广告商依法拥有的知识产权均受到法律保护未经云生态或相关广告商书面许可用户不得以任何形式进行使用或创造相关衍生作品<br/>
5用户在使用云生态服务时发表上传的文字图片视频音频软件以及表演等信息此部分信息的知识产权归用户责任由用户承担但用户的发表上传行为视为对云生态的授权用户理解并同意授予云生态及其关联公司全球范围内完全免费不可撤销独家永久可转授权和可再许可的权利包括但不限于复制权发行权出租权展览权表演权放映权广播权信息网络传播权摄制权改编权翻译权汇编权以及著作权法规定的由著作权人享有的其他著作财产权利及邻接权利云生态可自行选择是否使用以及使用方式包括但不限于将前述信息在云生态旗下的服务平台上使用与传播将上述信息再次编辑后使用以及由云生态授权给合作方使用编辑与传播等<br/>
十一法律责任<br/>
1如果云生态发现或收到他人举报或投诉用户违反本协议约定的云生态有权不经通知随时对相关内容包括但不限于用户资料聊天记录进行审查删除并视情节轻重对违规帐号处以包括但不限于警告帐号封禁 设备封禁 功能封禁 的处罚且通知用户处理结果<br/>
2因违反用户协议被封禁的用户在封禁期限届满后自助解封其中被实施功能封禁的用户会在封禁期届满后自动恢复被封禁功能被封禁用户可向云生态网站相关页面提交申诉云生态将对申诉进行审查并自行合理判断决定是否变更处罚措施<br/>
3用户理解并同意云生态有权依合理判断对违反有关法律法规或本协议规定的行为进行处罚对违法违规的任何用户采取适当的法律行动并依据法律法规保存有关信息向有关部门报告等用户应承担由此而产生的一切法律责任<br/>
4用户理解并同意因用户违反本协议约定导致或产生的任何第三方主张的任何索赔要求或损失包括合理的律师费用户应当赔偿云生态与合作公司关联公司并使之免受损害<br/>
十二不可抗力及其他免责事由<br/>
1用户理解并确认在使用本服务的过程中可能会遇到不可抗力等风险因素使本服务发生中断不可抗力是指不能预见不能克服并不能避免且对一方或双方造成重大影响的客观事件包括但不限于自然灾害如洪水地震瘟疫流行和风暴等以及社会事件如战争动乱政府行为等出现上述情况时云生态将努力在第一时间与相关单位配合及时进行修复但是由此给用户或第三方造成的损失云生态及合作单位在法律允许的范围内免责<br/>
2本服务同大多数互联网服务一样受包括但不限于用户原因网络服务质量社会环境等因素的差异影响可能受到各种安全问题的侵扰如他人利用用户的资料造成现实生活中的骚扰用户下载安装的其它软件或访问的其他网站中含有特洛伊木马等病毒威胁到用户的计算机信息和数据的安全继而影响本服务的正常使用等等用户应加强信息安全及使用者资料的保护意识要注意加强密码保护以免遭致损失和骚扰<br/>
3用户理解并确认本服务存在因不可抗力计算机病毒或黑客攻击系统不稳定用户所在位置用户关机以及其他任何技术互联网络通信线路原因等造成的服务中断或不能满足用户要求的风险因此导致的用户或第三方任何损失云生态不承担任何责任<br/>
4用户理解并确认在使用本服务过程中存在来自任何他人的包括误导性的欺骗性的威胁性的诽谤性的令人反感的或非法的信息或侵犯他人权利的匿名或冒名的信息以及伴随该等信息的行为因此导致的用户或第三方的任何损失云生态不承担任何责任<br/>
5用户理解并确认云生态需要定期或不定期地对云生态平台或相关的设备进行检修或者维护如因此类情况而造成服务在合理时间内的中断云生态无需为此承担任何责任但云生态应事先进行通告<br/>
6云生态重视对未成年人的保护云生态将依赖用户提供的个人信息判断用户是否为未成年人任何18岁以下的未成年人均不得注册帐号或使用本服务<br/>
7因云生态提供的服务系基于地理位置提供的移动社交服务用户确认其地理位置信息为非个人隐私信息用户成功注册云生态帐号视为确认授权云生态提取公开及使用用户的地理位置信息<br/>用户地理位置信息将作为用户公开资料之一由云生态向其他用户公开以便云生态向用户提供基于地理位置的移动社交服务如用户需要终止向其他用户公开其地理位置信息可随时自行设置为隐身状态<br/>
8为了改善云生态的技术和服务向用户提供更好的服务体验云生态或可会自行收集使用或向第三方提供用户的非个人隐私信息<br/>
9云生态保证在合法正当与必要的原则下收集使用或者公开用户个人信息且不会收集与提供的服务无关的用户个人信息<br/>
10云生态十分注重保护用户的个人隐私并制定了云生态隐私权政策用户亦可以通过设置页面里的帮助来进行具体查看用户确认并同意使用云生态提供的服务将被视为接受云生态隐私权政策<br/>
2如发生下列任何一种情形云生态有权变更中断或终止向用户提供的免费服务或收费服务而无需对用户或任何第三方承担任何责任<br/>
(1) 根据法律规定用户应提交真实信息而用户提供的个人资料不真实或与注册时信息不一致又未能提供合理证明<br/>
(2) 用户违反相关法律法规或本协议的约定<br/>
(3) 按照法律规定或有权机关的要求<br/>
(4) 出于安全的原因或其他必要的情形<br/>
十四活动服务说明与免责条款<br/>
1云生态活动功能板块是以地理位置为基础发布用户周边文化活动信息的活动信息共享平台下称本平台<br/><br/>
2本平台发布之全部文化活动信息,包括但不限于活动地理位置信息均直接或者间接来自于文化活动主办方<br/>
3本平台发布文化活动信息意在宣传文化活动丰富用户文化生活本平台用户于本平台活动功能板块发布的留言评论等信息均系用户自行发布本平台不对上述信息的真实性准确性或及时性完整性负责<br/>
十五其他<br/>
1云生态郑重提醒用户注意本协议中免除云生态责任和限制用户权利的条款请用户仔细阅读自主考虑风险<br/>
2本协议的效力解释及纠纷的解决适用于中华人民共和国法律若用户和云生态之间发生任何纠纷或争议首先应友好协商解决协商不成的用户同意将纠纷或争议提交云生态住所地有管辖权的人民法院管辖<br/>
3本协议的任何条款无论因何种原因无效或不具可执行性其余条款仍有效对双方具有约束力<br/>
4由于互联网高速发展您与云生态签署的本协议列明的条款可能并不能完整罗列并覆盖您云生态所有权利与义务现有的约定也不能保证完全符合未来发展的需求因此云生态隐私权政策云生态平台行为规范等均为本协议的补充协议与本协议不可分割且具有同等法律效力如您使用云生态平台服务视为您同意上述补充协议
</view>
</template>
<script>
export default{
data(){
return {
}
}
}
</script>
<style scoped>
.argeement-page{
padding: 0 20rpx 90rpx;
font-size: 28rpx;
color: rgb(51, 51, 51);
}
</style>

111
pages/course/detail.vue

@ -3,13 +3,8 @@
<view v-if="$store.getters.token || userInfo.uid">
<view class="swiper-box">
<view class="swiper-item">
<image :src="detail.coverImg" mode="aspectFill" :key="index"></image>
<image :src="detail.coverImg" mode="aspectFill"></image>
</view>
<!-- <swiper :indicator-dots="true" :autoplay="true" :interval="3000" :duration="1000">
<swiper-item v-for="(item,index) in detail.imageArr" :key="index">
<view class="swiper-item"><image :src="item" mode="aspectFill"></image></view>
</swiper-item>
</swiper> -->
</view>
<view class="course-info-box">
<view class="course-title acea-row row-between-wrapper">
@ -19,7 +14,7 @@
</view>
<view class="tips-box">
<view class="tip-item blue">{{detail.categoryName}}</view>
<view class="tip-item orange">{{detail.flag[0]}}</view>
<!-- <view class="tip-item orange">{{detail.flag[0]}}</view> -->
</view>
</view>
<view class="tab-box acea-row row-around" :class="isFixedTop?'fixed':''">
@ -38,8 +33,8 @@
<scroll-view class="scroll-view_H" scroll-x="true">
<view class="info-box" v-for="(item,index) in detail.masterDtos" :key="index">
<image :src="item.photoPath"></image>
<view class="name">{{item.name}}</view>
<view class="tip">禪易能量高级讲师</view>
<view class="name">{{item.realName}}</view>
<!-- <view class="tip">{{item.title}}</view> -->
<view class="desc" :class="item.introductionType == 0 ? 'left' : 'center'">{{item.introduction}}</view>
</view>
</scroll-view>
@ -91,7 +86,6 @@
<span>课程安排</span>
</view>
<view class="plan-box acea-row-nowrap" v-for="(item,index) in detail.scheduleList" :key="index">
<!-- <text class="plan-time">{{index+1}}</text> -->
<text>{{item}}</text>
</view>
</view>
@ -113,11 +107,7 @@
<view class="time">{{item.courseStartTime.split(' ')[0]}}-{{item.courseEndTime.split(' ')[0]}}</view>
<view class="address">{{item.coursePlace}}</view>
<view class="type-box acea-row row-between row-middle">
<!-- <view class="price">{{item.levelName}}</view> -->
<view></view>
<!-- <view class="price" v-if="item.level == 2">{{item.courseCharge}}</view>
<view class="price colG" v-if="item.chargeType == 0">免费</view> -->
<view class="signin-btn yellow">去报名</view>
</view>
</view>
@ -128,7 +118,7 @@
</view>
<view class="footer-box acea-row row-between-wrapper">
<view class="footer-left">
<view class="price" v-if="detail.signState == 1">座位号{{detail.seat}}</view>
<!-- <view class="price" v-if="detail.signState == 1">座位号{{detail.seat}}</view> -->
</view>
<view class="footer-right">
<view class="btn-box acea-row row-between-wrapper" v-if="yhStatus == 1 || yhStatus == 3 ">
@ -138,14 +128,15 @@
</view>
<view class="signin-btn" @click="signInClick(2)">立即报名</view>
</view>
<view class="signin-btn" v-if="yhStatus == 2 ">报名已截止 请关注下期</view>
<view class="signin-btn" v-if="yhStatus == 2 && (yhStatus == 1 || yhStatus == 3)">报名已截止 请关注下期</view>
<!-- 在线直播 -->
<view class="signin-btn call-btn" v-if="yhStatus == 4 " @click="signInClick(3)" >立即观看</view>
<view class="signin-btn call-btn" v-if="yhStatus == 5 " @click="signInClick(3)" >查看回放</view>
<view class="signin-btn call-btn default-btn" v-if="yhStatus == 6" >签到</view>
<view class="signin-btn call-btn default-btn" v-if="yhStatus == 7" >签到</view>
<view class="signin-btn call-btn" v-if="yhStatus == 6" @click="signTipClick">报名成功签到</view>
<view class="signin-btn call-btn" v-if="yhStatus == 7" >签到</view>
<view class="signin-btn call-btn" v-if="yhStatus == 8 " @click="signInClick(1)" >等待确认 联系服务老师</view>
<view class="signin-btn call-btn default" v-if="yhStatus == 9 " @click="signInClick(1)" >审核未通过 联系服务老师</view>
<!-- #ifdef MP-WEIXIN -->
<button open-type="getPhoneNumber"
@ -198,6 +189,7 @@
// import WucTab from '@/components/wuc-tab/wuc-tab.vue';
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'
import { getUserInfo, bindingPhone, wxappBindingPhone } from '@/api/user'
import { bindPhoneNumber } from '@/utils/index.js'
import { getCourseDetail ,enterCourse } from '@/api/knowledge';
import Authorization from '@/pages/authorization/index'
export default {
@ -267,54 +259,17 @@
},
methods: {
getPhoneNumber: function(e) {
let thit = this
//
if (e.mp.detail.errMsg == 'getPhoneNumber:ok') {
uni.showLoading({
title: '绑定中',
})
wxappBindingPhone({
encryptedData: e.mp.detail.encryptedData,
iv: e.mp.detail.iv,
})
.then(res => {
bindPhoneNumber(e).then((res)=>{
if(res.success){
thit.$store.dispatch('userInfo', true)
uni.hideLoading()
uni.showToast({
title: res.msg,
icon: 'success',
duration: 2000,
})
} else{
uni.hideLoading()
uni.showModal({
title:'提示!',
content:'授权已过期,请重新授权后绑定手机号',
success:function(res){
if(res.confirm){
thit.$store.commit('logout')
}
},
title: '绑定成功!',
duration: 1500
})
setTimeout(()=>{
this.getDetail()
},1500)
}
})
.catch(error => {
uni.hideLoading()
thit.$store.dispatch('userInfo', true)
uni.showToast({
title: error.msg || error.response.data.msg || error.response.data.message,
icon: 'none',
duration: 2000,
})
})
} else {
uni.showToast({
title: '已拒绝授权',
icon: 'none',
duration: 2000,
})
}
},
setDate(t){
let str = t.split(" ")[0].split("-")[1] + "." + t.split(" ")[0].split("-")[2]
@ -328,12 +283,16 @@
},
})
},
test(){
setStatus(){
let yhStatus = 0;
let detail = this.detail;
let enterEndTime = detail.enterEndTime.replace(/-/g, '/')
let enterStartTime = detail.enterStartTime.replace(/-/g, '/')
let courseEndTime = detail.courseEndTime.replace(/-/g, '/')
if(!this.userInfo.phone){
this.yhStatus = -1;
return
}
if ( !detail.enterState ){
yhStatus = 0;
if( new Date(enterEndTime) >= new Date() && new Date(enterStartTime) <= new Date() ){
@ -343,7 +302,6 @@
}else if(new Date(enterStartTime) > new Date()){
yhStatus = 3; //
}
}else{
//
if (detail.status == 1 && detail.courseType == 1){
@ -353,20 +311,29 @@
yhStatus = 5; //
}
}else if (detail.status == 1 && detail.courseType == 0){
if (detail.signState == 0){
yhStatus = 6; //线
if(detail.payState == 0){
yhStatus = 9 //
} else{
if(detail.signState == 0){
yhStatus = 6; //线
} else if(detail.signState == 1){
yhStatus = 7; //
}
}else {
if (detail.status == 0 ){
yhStatus = 8; //
}
}else if(detail.status == 0){
yhStatus = 8; //
}
}
this.yhStatus = yhStatus;
// console.log(this.yhStatus)
},
signTipClick(){
uni.showModal({
title: '提示!',
content: '您已经报名成功,请到开课地点使用微信扫一扫扫描课程二维码签到。',
showCancel: false
})
},
getDetail(){
uni.showLoading({
title:'正在加载中...'
@ -386,9 +353,8 @@
// console.log(this.times,'times')
uni.stopPullDownRefresh()
}).then(()=>{
this.test();
this.setStatus();
})
},
signInClick(type){
if(this.userInfo.realName == null){
@ -453,7 +419,10 @@
uni.showModal({
title: '提示!',
content: res.msg,
showCancel:false
showCancel:false,
success: (result)=> {
this.getDetail()
}
});
}
})

20
pages/course/index.vue

@ -12,7 +12,7 @@
<!-- #endif -->
<!-- </view> -->
<view class="content-box">
<view class="tab-box" :class="isFixedTop ? 'fixed' : ''">
<view class="tab-box">
<!-- <wuc-tab :tab-list="tabList" :tabCur.sync="TabCur" @change="tabChange"
tab-class="text-center text-black bg-white" select-class="text-orange text-xl">
</wuc-tab> -->
@ -107,8 +107,9 @@
onLoad() {
//
uni.createSelectorQuery().select('.tab-box').boundingClientRect((res) => {
if (res && res.top > 0) {
this.tabInitTop= res.top;
console.log(res)
if (res && res.height > 0) {
this.tabInitTop= res.height;
}
}).exec();
getCategory().then((res) => {
@ -141,6 +142,7 @@
methods: {
onPageScroll(res) {
let scrollTop = res.scrollTop;
console.log(this.tabInitTop)
var isSatisfy = scrollTop >= this.tabInitTop? true : false;
//
if (this.isFixedTop === isSatisfy) {
@ -185,7 +187,7 @@
this.active == null ? cid = this.currentTab.id : cid = this.active
getCourses({categoryId: cid,listState:0}).then((res) => {
if (res.success) {
this.courseList = res.data
this.courseList = res.data.reverse()
}
uni.hideLoading()
uni.stopPullDownRefresh()
@ -260,8 +262,13 @@
}
.content-box{
width: 100%;
padding-top: 96rpx;
box-sizing: border-box;
.tab-box{
width: 100%;
height: 96rpx;
position: fixed;
top: 0;
box-shadow: 0px 6px 12px 0px rgba(227,227,227,0.29);
.tabs{
width:auto;
@ -292,8 +299,9 @@
padding: 30rpx 32rpx;
}
.fixed{
position: -webkit-sticky;
position: sticky;
width: 100%;
// position: -webkit-sticky;
position: fixed;
top: 0;
z-index: 99;
}

39
pages/course/signIn.vue

@ -3,7 +3,7 @@
<view v-if="$store.getters.token || userInfo.uid">
<view class="swiper-box">
<view class="swiper-item">
<image :src="detail.imageArr[0]" mode="aspectFill" :key="index"></image>
<image :src="detail.coverImg" mode="aspectFill"></image>
</view>
</view>
<view class="course-info-box">
@ -14,7 +14,7 @@
</view>
<view class="tips-box">
<view class="tip-item blue">{{detail.categoryName}}</view>
<view class="tip-item orange">{{detail.levelName}}</view>
<!-- <view class="tip-item orange">{{detail.levelName}}</view> -->
</view>
</view>
<view class="course-desc-box content" id="content2">
@ -50,7 +50,16 @@
</view>
</view>
</view>
<view class="sign-btn" @click="signIn">立即签到</view>
<view class="course-desc-box" >
<view class="title-box acea-row row-middle">
<view class="left-line"></view>
<span>课程安排</span>
</view>
<view class="plan-box acea-row-nowrap" v-for="(item,index) in detail.scheduleList" :key="index">
<text>{{item}}</text>
</view>
</view>
<view class="sign-btn" @click="signIn">{{detail.signState == 0 ? '立即签到' : '已签到' }}</view>
</view>
<Authorization v-else />
</view>
@ -81,7 +90,7 @@
if (!url) {
url = handleUrlParam(getCurrentPageUrlWithArgs())
}
console.log(url)
console.log(url,'urlurlurlurl')
if (url && url.id) {
this.courseId = url.id
}
@ -89,6 +98,9 @@
this.getDetail()
}
},
onPullDownRefresh() {
this.getDetail()
},
methods:{
getDetail(){
uni.showLoading({
@ -97,25 +109,18 @@
let nowTime = Date.parse(new Date())/1000;
getCourseDetail({id:this.courseId}).then((res)=>{
uni.hideLoading()
res.data.courseIntroduce = res.data.courseIntroduce.replace(/\<img/g, "<img style='width: 100%;'")
this.detail = res.data
let t = res.data.signEndTime.replace(/-/g, '/');
let endTime = Date.parse(new Date(t))/1000
this.times = endTime - nowTime;
this.day = Math.floor(this.times / (60 * 60 * 24));
this.hour = Math.floor(this.times / (60 * 60)) - (this.day * 24);
this.minute = Math.floor(this.times / 60) - (this.day * 24 * 60) - (this.hour * 60);
this.second = Math.floor(this.times) - (this.day * 24 * 60 * 60) - (this.hour * 60 * 60) - (this.minute * 60);
// console.log(this.times)
uni.stopPullDownRefresh()
})
},
signIn(){
if(this.detail.signState == 0){
signCourse(this.courseId).then((res)=>{
if(res.success){
uni.showModal({
title:'提示!',
content:'签到成功!'
content:'签到成功!',
showCancel: false
})
} else{
uni.showToast({
@ -125,6 +130,7 @@
})
}
})
}
},
}
}
@ -202,9 +208,12 @@
width: 100%;
background:#fff;
border-radius: 8rpx;
padding: 0rpx 24rpx 30rpx;
padding: 30rpx 24rpx;
margin-bottom: 20rpx;
}
.content{
padding-top: 0;
}
.course-card-item{
font-size: 26rpx;
margin-bottom: 12rpx;

57
pages/user/PersonalData/index.vue

@ -74,6 +74,18 @@
</picker>
</view>
</view>
<view class="item acea-row row-between-wrapper">
<view>常住地址</view>
<view class="input">
<input type="text" v-model="addres" placeholder="请输入常住地址" />
</view>
</view>
<view class="item acea-row row-between-wrapper">
<view>紧急联系人</view>
<view class="input">
<input type="text" v-model="contacts" placeholder="请输入紧急联系人" />
</view>
</view>
<!--
<view class="item acea-row row-between-wrapper" @click="goChangePassword()">
<view>密码</view>
@ -85,6 +97,15 @@
-->
</view>
<view class="tips">会员信息仅用于身份确认不做他用</view>
<view class="argeement-box">
<checkbox-group @change="argeementClick">
<checkbox value="1" style="transform:scale(0.7);position: relative; top: 3rpx;" :checked="isCheck" />
</checkbox-group>
<view class="acea-row">
我已阅读并同意
<navigator url="/pages/authorization/agreementPage" open-type="navigate" style="color: rgb(255, 50, 50);">用户协议及隐私政策</navigator>
</view>
</view>
<view class="modifyBnt" @click="submit">保存修改</view>
<!-- #ifndef MP-WEIXIN -->
<view
@ -125,7 +146,10 @@ export default {
second: 60,
time: null,
city: '省/市/区',
verifyCode:''
verifyCode:'',
address: '',
contacts: '',
isCheck: false
};
},
computed: mapGetters(["userInfo"]),
@ -133,9 +157,12 @@ export default {
this.avatar = this.userInfo.avatar;
this.isWeixin = isWeixin();
this.getUserInfo();
this.userInfo.city ? this.city = this.userInfo.city : this.userInfo.city = '省/市/区';
this.userInfo.city ? this.city = this.userInfo.city : '省/市/区';
},
methods: {
argeementClick(e){
e.detail.value > 0 ? this.isCheck = true : this.isCheck = false
},
bindPickerChange(e){
this.city = e.detail.value.join(' ')
},
@ -251,6 +278,13 @@ export default {
submit: function () {
let userInfo = this.userInfo;
console.log(userInfo)
if(!this.isCheck){
uni.showToast({
title:'请填阅读并勾选用户协议',
icon: "none"
})
return
}
if(userInfo.realName == '' || userInfo.realName == null){
uni.showToast({
title:'请填写真实姓名',
@ -272,7 +306,9 @@ export default {
idCard: this.userInfo.idCard,
code: this.verifyCode,
phone: this.userInfo.phone,
city: this.city
city: this.city,
address: this.address,
contacts: this.contacts
}).then(
(res) => {
if(res.success){
@ -328,6 +364,9 @@ export default {
};
</script>
<style scoped lang="less">
.personal-data .list .item{
font-size: 28rpx !important;
}
.modifyBnt{
height: 80rpx !important;
line-height: 80rpx !important;
@ -363,4 +402,16 @@ export default {
margin-right: 10rpx;
}
}
.argeement-box{
font-size: 24rpx;
color: #666;
text-align: center;
display: flex;
align-items: center;
justify-content: start;
padding-left: 20rpx;
}
.argeement-box view{
width: 60%;
}
</style>

160
pages/user/User/index.vue

@ -43,37 +43,37 @@
<text @click="call">{{userInfo.sellerName || '点击联系服务老师'}} </text>
</view>
<view class=" teacher-box-l acea-row-nowrap row-between row-middle" v-if="userInfo.isPromoter == 0">
<!-- <text>服务老师</text> -->
<image src="../../../static/call-icon.png" class="call-icon" @click="call"></image>
<!-- <view class="vertical-line"></view> -->
</view>
<view class="" style="color: #fff;" v-else @click="toServiceIndex()">服务老师主页</view>
</view>
<view class="myjoin-box" v-if="(userInfo.memberStudyVo.cyCourseDtos && userInfo.memberStudyVo.cyCourseDtos.length > 0) || (userInfo.memberStudyVo.studyListDtos && userInfo.memberStudyVo.studyListDtos.length > 0)">
<view class="myjoin-box"
v-if="(memberStudyVo.courseDtos && memberStudyVo.courseDtos.length > 0) || (memberStudyVo.studyListDtos && memberStudyVo.studyListDtos.length > 0)">
<view class="t-word">我参与的</view>
<scroll-view class="scroll-view_H" scroll-x="true">
<view class="course-box"
v-for="(item,index) in userInfo.memberStudyVo.cyCourseDtos" :key="index"
<view class="course-box" v-for="(item,index) in memberStudyVo.courseDtos" :key="index"
@click="toCourseDetail(item.id)">
<view class="course-info">
<view class="course-name line1">{{item.courseName}}</view>
<view class="time">{{item.courseStartTime.split(' ')[0]}}~{{item.courseEndTime.split(' ')[0]}}</view>
<view class="course-name line2">{{item.courseName}}</view>
<view class="time">{{item.courseStartTime}}~{{item.courseEndTime}}</view>
</view>
<view class="address-box acea-row row-between row-middle">
<view class="address line1">地点{{item.coursePlace}}</view>
<!-- <view class="btn" @click.stop="startQr()" v-if="item.signState == 2 ">扫一扫</view> -->
<view class="btn" v-if="item.signState == 1">已签到</view>
<!-- <view class="btn">已报名</view> -->
</view>
</view>
</scroll-view>
<view class="bangdan-box">
<view class="bangdan-list">
<scroll-view class="scroll-view_H" scroll-x="true">
<view class="bangdan-item" v-for="(item,index) in userInfo.memberStudyVo.studyListDtos" :key="index">
<view class="bangdan-item" v-for="(item,index) in memberStudyVo.studyListDtos" :key="index"
@click="toStudyDetail(item.id)">
<view class="bangdan-name line1">{{item.listName}}</view>
<view class="acea-row row-between-wrapper">
<view class="signin-day">已连续{{item.signTimes}}</view>
<view class="signin-btn" @click="toStudyDabang(item)">{{item.enterState ? '已打卡' : '立即打卡'}}</view>
<view class="signin-day">已打卡{{item.signTimes || 0}}</view>
<view class="signin-btn" @click="toStudyDabang(item)">
{{item.enterState ? '已打卡' : '立即打卡'}}</view>
</view>
</view>
</scroll-view>
@ -139,14 +139,16 @@
<view @click="goMyOrder(3)" class="item">
<view class="pictrue">
<image src="../../../static/myorder-icon4.png" />
<text class="order-status-num" v-if="userInfo.orderStatusNum.evaluatedCount > 0">{{ userInfo.orderStatusNum.evaluatedCount }}</text>
<text class="order-status-num"
v-if="userInfo.orderStatusNum.evaluatedCount > 0">{{ userInfo.orderStatusNum.evaluatedCount }}</text>
</view>
<text>待评价</text>
</view>
<view @click="goReturnList()" class="item">
<view class="pictrue">
<image src="../../../static/myorder-icon5.png" />
<text class="order-status-num" v-if="userInfo.orderStatusNum.refundCount > 0">{{ userInfo.orderStatusNum.refundCount }}</text>
<text class="order-status-num"
v-if="userInfo.orderStatusNum.refundCount > 0">{{ userInfo.orderStatusNum.refundCount }}</text>
</view>
<text>售后/退款</text>
</view>
@ -219,13 +221,31 @@
</view>
</template>
<script>
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'
import { getUserInfo, getMenuUser, bindingPhone, wxappBindingPhone } from '@/api/user'
import { isWeixin, VUE_APP_RESOURCES_URL } from '@/utils'
import {
mapState,
mapGetters,
mapMutations,
mapActions
} from 'vuex'
import {
getUserInfo,
getMenuUser,
bindingPhone,
wxappBindingPhone,
myLession
} from '@/api/user'
import {
isWeixin,
VUE_APP_RESOURCES_URL,
bindPhoneNumber,
handleUrlParam
} from '@/utils'
import cookie from '@/utils/store/cookie'
import SwitchWindow from '@/components/SwitchWindow'
import Authorization from '@/pages/authorization/index'
import { signCourse } from '@/api/knowledge'
import {
signCourse
} from '@/api/knowledge'
const NAME = 'User'
export default {
@ -239,18 +259,23 @@ export default {
return {
MyMenus: [],
switchActive: false,
isWeixin: false
isWeixin: false,
memberStudyVo: {}
}
},
computed: mapGetters(['userInfo']),
watch: {},
mounted() {
this.getMyLession()
},
methods: {
...mapMutations(['updateAuthorizationPage']),
startQr: function() {
uni.scanCode({
success: res => {
// let option = handleUrlParam(res.result)
let id = res.result;
console.log(handleUrlParam(res.result).id)
let id = handleUrlParam(res.result).id;
signCourse(id).then((res) => {
if (res.success) {
uni.showModal({
@ -268,6 +293,13 @@ export default {
},
})
},
getMyLession() {
myLession().then((res) => {
this.memberStudyVo = res.data
})
},
call() {
uni.makePhoneCall({
phoneNumber: this.userInfo.sellerPhone || this.userInfo.customerPhone
@ -302,33 +334,22 @@ export default {
id: id,
},
})
},
toStudyDabang(item) {
if(item.enterState){
this.$yrouter.push({
path: '/pages/study/dabang',
query: {
id: item.id,
},
})
} else{
if(item.isClockTime){
},
toStudyDetail(id) {
this.$yrouter.push({
path: '/pages/study/editDabang',
path: '/pages/study/detail',
query: {
id: item.id,
id: id,
},
})
} else{
uni.showToast({
title:'未到打卡时间!',
icon:'none',
duration:2000
})
}
}
},
goMyOrder(type) {
this.$yrouter.push({
@ -356,7 +377,6 @@ export default {
duration: 2000
})
}
},
goUserPromotion() {
this.$yrouter.push('/pages/user/promotion/UserPromotion/index')
@ -370,46 +390,17 @@ export default {
this.$yrouter.push('/pages/user/PersonalData/index')
},
getPhoneNumber: function(e) {
let thit = this
//
if (e.mp.detail.errMsg == 'getPhoneNumber:ok') {
uni.showLoading({
title: '绑定中',
})
wxappBindingPhone({
encryptedData: e.mp.detail.encryptedData,
iv: e.mp.detail.iv,
})
.then(res => {
// this.User();
bindPhoneNumber(e).then((res) => {
if (res.success) {
thit.$store.dispatch('userInfo', true)
uni.hideLoading()
uni.showToast({
title: res.msg,
icon: 'success',
duration: 2000,
})
} else{
uni.hideLoading()
uni.showModal({
title:'提示!',
content:'授权已过期,请重新授权后绑定手机号',
success:function(res){
if(res.confirm){
thit.$store.commit('logout')
}
},
title: '绑定成功!',
duration: 1500
})
setTimeout(() => {
this.$store.dispatch('getUser', true)
}, 1500)
}
})
} else {
uni.showToast({
title: '已拒绝授权',
icon: 'none',
duration: 2000,
})
}
},
changeswitch: function(data) {
this.switchActive = data
@ -488,6 +479,7 @@ export default {
this.$store.dispatch('getUser', true)
// this.MenuUser()
this.isWeixin = isWeixin()
this.getMyLession()
}
},
@ -504,6 +496,7 @@ export default {
height: 336rpx !important;
padding: 0 !important;
position: relative !important;
.header-bg {
width: 100%;
height: 100%;
@ -511,10 +504,12 @@ export default {
top: 0;
z-index: 2;
}
.picTxt {
position: absolute !important;
left: 32rpx;
z-index: 3;
.text {
.name {
font-size: 36rpx;
@ -522,11 +517,13 @@ export default {
color: #A8873D;
}
}
.binding {
background: #BF922B !important;
border-color: #BF922B !important;
}
}
.jifen-box {
width: 200rpx;
height: 62rpx;
@ -555,27 +552,33 @@ export default {
top: -56rpx;
margin-left: -345rpx;
z-index: 7;
.teacher-box-l {
color: #FFFADD;
font-size: 28rpx;
.call-icon {
width: 56rpx;
height: 56rpx;
}
text {
display: inline-block;
margin-left: 20rpx;
margin-right: 14rpx;
}
.vertical-line {
width: 2rpx;
height: 34rpx;
background: #FFFADD;
}
}
.teacher-box-r {
color: #F9EDCC;
font-size: 24rpx;
image {
width: 88rpx;
height: 88rpx;
@ -585,6 +588,7 @@ export default {
}
}
}
.myjoin-box {
width: 690rpx;
// height: 506rpx;
@ -592,11 +596,13 @@ export default {
border-radius: 10rpx;
padding: 30rpx;
margin: -26rpx auto 0;
.t-word {
font-size: 32rpx;
color: #222;
margin-bottom: 30rpx;
}
.course-box {
width: 94%;
height: 190rpx;
@ -613,9 +619,9 @@ export default {
display: inline-block;
}
.course-info {
margin-bottom: 10rpx;
.course-name {
width: 100%;
color: #C89560;
font-size: 28rpx;
line-height: 40rpx;
@ -623,10 +629,12 @@ export default {
font-weight: 500;
}
}
.address-box {
.address {
width: calc(100% - 190rpx);
}
.btn {
width: 172rpx;
height: 56rpx;
@ -639,13 +647,16 @@ export default {
}
}
}
.scroll-view_H {
white-space: nowrap;
width: 100%;
}
.bangdan-box {
width: 100%;
box-sizing: border-box;
.bangdan-item {
width: 310rpx;
height: 152rpx;
@ -657,12 +668,15 @@ export default {
border-radius: 10rpx;
font-size: 28rpx;
margin-right: 20rpx;
.bangdan-name {
margin-bottom: 28rpx;
}
.signin-day {
font-size: 24rpx;
}
.signin-btn {
width: 122rpx;
height: 48rpx;
@ -677,9 +691,11 @@ export default {
}
}
}
.content {
padding-bottom: 100rpx;
}
.user .wrapper {
background: #F5F6F7;
padding: 0 30rpx;
@ -720,9 +736,11 @@ export default {
border: 1px solid #e8695e;
color: #ffffff;
}
.noBorder {
border: none !important;
}
.by {
text-align: center;
padding: 30rpx 0;

10
pages/user/myCourses/index.vue

@ -17,17 +17,15 @@
<view class="info-box">
<view class="">时间{{item.courseStartTime.split(' ')[0]}}{{item.courseEndTime.split(' ')[0]}}</view>
<view class="">地点{{item.coursePlace}}</view>
<view class="">座位号{{item.seat || '暂未安排座位'}}</view>
<!-- <view class="">酒店安排江汉区江汉路22号武汉大酒店0801号房</view> -->
</view>
</view>
</view>
<view class="course-item-r acea-row" v-if="active == 1" @click="startQr()">
<view class="saoyisao" v-if="item.signState == 2"><image src="../../../static/saoyisao-icon.png"></image></view>
<text>{{item.signState == 1 ? '已签到' : '扫一扫'}}</text>
<view class="course-item-r acea-row" v-if="active == 1">
<!-- <view class="saoyisao" v-if="item.signState == 2"><image src="../../../static/saoyisao-icon.png"></image></view>
<text>{{item.signState == 1 ? '已签到' : '扫一扫'}}</text> -->
<text>已签到</text>
</view>
<view class="course-item-r colG acea-row" v-else>
<!-- <view class="saoyisao"><image src="../../../static/saoyisao-icon.png"></image></view> -->
<text>已结束</text>
</view>
</view>

53
utils/index.js

@ -2,7 +2,7 @@ import Vue from 'vue'
// import MpvueRouterPatch from 'mpvue-router-patch'
// Vue.use(MpvueRouterPatch)
import { wxappAuth, getUserInfo } from '@/api/user'
import { wxappAuth, getUserInfo, wxappBindingPhone } from '@/api/user'
import store from '@/store'
import dayjs from 'dayjs'
import cookie from '@/utils/store/cookie'
@ -1132,3 +1132,54 @@ export function handleErrorMessage(err) {
duration: 2000,
})
}
// 微信小程序绑定手机号
export function bindPhoneNumber(e){
return new Promise((resolve) =>{
// 判断一下这里是不是小程序 如果是小程序,走获取微信手机号进行绑定
if (e.mp.detail.errMsg == 'getPhoneNumber:ok') {
uni.showLoading({ title: '绑定中...', })
uni.login({
provider: 'weixin',
success: function (loginRes) {
wxappBindingPhone({
encryptedData: e.mp.detail.encryptedData,
iv: e.mp.detail.iv,
code: loginRes.code
}).then(res => {
resolve(res)
if(res.success){
store.dispatch('userInfo', true)
uni.hideLoading()
} else{
uni.hideLoading()
uni.showModal({
title:'提示!',
content:'授权已过期,请重新授权后绑定手机号',
success:function(res){
if(res.confirm){
store.commit('logout')
}
},
})
}
}).catch(error => {
uni.hideLoading()
store.dispatch('userInfo', true)
uni.showToast({
title: error.msg || error.response.data.msg || error.response.data.message,
icon: 'none',
duration: 2000,
})
})
}
});
} else {
uni.showToast({
title: '不在微信小程序',
icon: 'none',
duration: 2000,
})
}
})
}

96
wxcomponents/vant/button/index.vue

@ -0,0 +1,96 @@
<template>
<uni-shadow-root class="vant-button-index"><button :id="id" :class="'custom-class '+(utils.bem('button', [type, size, { block, round, plain, square, loading, disabled, hairline, unclickable: disabled || loading }]))+' '+(hairline ? 'van-hairline--surround' : '')" hover-class="van-button--active hover-class" :lang="lang" :style="(style)+' '+(customStyle)" :open-type="openType" :business-id="businessId" :session-from="sessionFrom" :send-message-title="sendMessageTitle" :send-message-path="sendMessagePath" :send-message-img="sendMessageImg" :show-message-card="showMessageCard" :app-parameter="appParameter" :aria-label="ariaLabel" @click="onClick" @getuserinfo="bindGetUserInfo" @contact="bindContact" @getphonenumber="bindGetPhoneNumber" @error="bindError" @launchapp="bindLaunchApp" @opensetting="bindOpenSetting">
<block v-if="loading">
<van-loading custom-class="loading-class" :size="loadingSize" :type="loadingType" :color="type === 'default' ? '#c9c9c9' : 'white'"></van-loading>
<view v-if="loadingText" class="van-button__loading-text">
{{ loadingText }}
</view>
</block>
<block v-else>
<van-icon v-if="icon" size="1.2em" :name="icon" class="van-button__icon" custom-style="line-height: inherit;"></van-icon>
<view class="van-button__text">
<slot></slot>
</view>
</block>
</button></uni-shadow-root>
</template>
<wxs src="../wxs/utils.wxs" module="utils"></wxs>
<script>
import VanIcon from '../icon/index.vue'
import VanLoading from '../loading/index.vue'
global['__wxVueOptions'] = {components:{'van-icon': VanIcon,'van-loading': VanLoading}}
global['__wxRoute'] = 'vant/button/index'
import { VantComponent } from '../common/component';
import { button } from '../mixins/button';
import { openType } from '../mixins/open-type';
VantComponent({
mixins: [button, openType],
classes: ['hover-class', 'loading-class'],
data: {
style: ''
},
props: {
icon: String,
plain: Boolean,
block: Boolean,
round: Boolean,
square: Boolean,
loading: Boolean,
hairline: Boolean,
disabled: Boolean,
loadingText: String,
customStyle: String,
loadingType: {
type: String,
value: 'circular'
},
type: {
type: String,
value: 'default'
},
size: {
type: String,
value: 'normal'
},
loadingSize: {
type: String,
value: '20px'
},
color: {
type: String,
observer(color) {
let style = '';
if (color) {
style += `color: ${this.data.plain ? color : 'white'};`;
if (!this.data.plain) {
// Use background instead of backgroundColor to make linear-gradient work
style += `background: ${color};`;
}
// hide border when color is linear-gradient
if (color.indexOf('gradient') !== -1) {
style += 'border: 0;';
}
else {
style += `border-color: ${color};`;
}
}
if (style !== this.data.style) {
this.setData({ style });
}
}
}
},
methods: {
onClick() {
if (!this.data.disabled && !this.data.loading) {
this.$emit('click');
}
}
}
});
export default global['__wxComponents']['vant/button/index']
</script>
<style platform="mp-weixin">
@import '../common/index.css';.van-button{position:relative;display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;box-sizing:border-box;padding:0;line-height:20px;text-align:center;vertical-align:middle;-webkit-appearance:none;-webkit-text-size-adjust:100%;height:44px;height:var(--button-default-height,44px);font-size:16px;font-size:var(--button-default-font-size,16px);transition:opacity .2s;transition:opacity var(--animation-duration-fast,.2s);border-radius:2px;border-radius:var(--button-border-radius,2px)}.van-button:before{position:absolute;top:50%;left:50%;width:100%;height:100%;border:inherit;border-radius:inherit;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;content:" ";background-color:#000;background-color:var(--black,#000);border-color:#000;border-color:var(--black,#000)}.van-button:after{border-width:0}.van-button--active:before{opacity:.15}.van-button--unclickable:after{display:none}.van-button--default{color:#323233;color:var(--button-default-color,#323233);background-color:#fff;background-color:var(--button-default-background-color,#fff);border:1px solid #ebedf0;border:1px solid var(--button-default-border-color,#ebedf0)}.van-button--primary{color:#fff;color:var(--button-primary-color,#fff);background-color:#07c160;background-color:var(--button-primary-background-color,#07c160);border:1px solid #07c160;border:1px solid var(--button-primary-border-color,#07c160)}.van-button--info{color:#fff;color:var(--button-info-color,#fff);background-color:#1989fa;background-color:var(--button-info-background-color,#1989fa);border:1px solid #1989fa;border:1px solid var(--button-info-border-color,#1989fa)}.van-button--danger{color:#fff;color:var(--button-danger-color,#fff);background-color:#ee0a24;background-color:var(--button-danger-background-color,#ee0a24);border:1px solid #ee0a24;border:1px solid var(--button-danger-border-color,#ee0a24)}.van-button--warning{color:#fff;color:var(--button-warning-color,#fff);background-color:#ff976a;background-color:var(--button-warning-background-color,#ff976a);border:1px solid #ff976a;border:1px solid var(--button-warning-border-color,#ff976a)}.van-button--plain{background-color:#fff;background-color:var(--button-plain-background-color,#fff)}.van-button--plain.van-button--primary{color:#07c160;color:var(--button-primary-background-color,#07c160)}.van-button--plain.van-button--info{color:#1989fa;color:var(--button-info-background-color,#1989fa)}.van-button--plain.van-button--danger{color:#ee0a24;color:var(--button-danger-background-color,#ee0a24)}.van-button--plain.van-button--warning{color:#ff976a;color:var(--button-warning-background-color,#ff976a)}.van-button--large{width:100%;height:50px;height:var(--button-large-height,50px)}.van-button--normal{padding:0 15px;font-size:14px;font-size:var(--button-normal-font-size,14px)}.van-button--small{min-width:60px;min-width:var(--button-small-min-width,60px);height:30px;height:var(--button-small-height,30px);padding:0 8px;padding:0 var(--padding-xs,8px);font-size:12px;font-size:var(--button-small-font-size,12px)}.van-button--mini{display:inline-block;min-width:50px;min-width:var(--button-mini-min-width,50px);height:22px;height:var(--button-mini-height,22px);font-size:10px;font-size:var(--button-mini-font-size,10px)}.van-button--mini+.van-button--mini{margin-left:5px}.van-button--block{display:-webkit-flex;display:flex;width:100%}.van-button--round{border-radius:999px;border-radius:var(--button-round-border-radius,999px)}.van-button--square{border-radius:0}.van-button--disabled{opacity:.5;opacity:var(--button-disabled-opacity,.5)}.van-button__text{display:inline}.van-button__icon+.van-button__text:not(:empty),.van-button__loading-text{margin-left:4px}.van-button__icon{min-width:1em;line-height:inherit!important;vertical-align:top}.van-button--hairline{padding-top:1px;border-width:0}.van-button--hairline:after{border-color:inherit;border-width:1px;border-radius:4px;border-radius:calc(var(--button-border-radius, 2px)*2)}.van-button--hairline.van-button--round:after{border-radius:999px;border-radius:var(--button-round-border-radius,999px)}.van-button--hairline.van-button--square:after{border-radius:0}
</style>

1
wxcomponents/vant/common/index.css

@ -0,0 +1 @@
.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}.van-clearfix:after{display:table;clear:both;content:""}.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}

1
wxcomponents/vant/common/style/clearfix.css

@ -0,0 +1 @@
.van-clearfix:after{display:table;clear:both;content:""}

1
wxcomponents/vant/common/style/ellipsis.css

@ -0,0 +1 @@
.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}

1
wxcomponents/vant/common/style/hairline.css

@ -0,0 +1 @@
.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}

0
wxcomponents/vant/common/style/mixins/clearfix.css

0
wxcomponents/vant/common/style/mixins/ellipsis.css

0
wxcomponents/vant/common/style/mixins/hairline.css

0
wxcomponents/vant/common/style/theme.css

0
wxcomponents/vant/common/style/var.css

1012
wxcomponents/vant/icon/index.vue

File diff suppressed because it is too large Load Diff

20
wxcomponents/vant/info/index.vue

@ -0,0 +1,20 @@
<template>
<uni-shadow-root class="vant-info-index"><view v-if="info !== null && info !== '' || dot" :class="'custom-class van-info '+(utils.bem('info', { dot }))" :style="customStyle">{{ dot ? '' : info }}</view></uni-shadow-root>
</template>
<wxs src="../wxs/utils.wxs" module="utils"></wxs>
<script>
global['__wxRoute'] = 'vant/info/index'
import { VantComponent } from '../common/component';
VantComponent({
props: {
dot: Boolean,
info: null,
customStyle: String
}
});
export default global['__wxComponents']['vant/info/index']
</script>
<style platform="mp-weixin">
@import '../common/index.css';.van-info{position:absolute;top:0;right:0;box-sizing:border-box;white-space:nowrap;text-align:center;-webkit-transform:translate(50%,-50%);transform:translate(50%,-50%);-webkit-transform-origin:100%;transform-origin:100%;min-width:16px;min-width:var(--info-size,16px);padding:0 3px;padding:var(--info-padding,0 3px);color:#fff;color:var(--info-color,#fff);font-weight:500;font-weight:var(--info-font-weight,500);font-size:12px;font-size:var(--info-font-size,12px);font-family:PingFang SC,Helvetica Neue,Arial,sans-serif;font-family:var(--info-font-family,PingFang SC,Helvetica Neue,Arial,sans-serif);line-height:14px;line-height:calc(var(--info-size, 16px) - var(--info-border-width, 1px)*2);background-color:#ee0a24;background-color:var(--info-background-color,#ee0a24);border:1px solid #fff;border:var(--info-border-width,1px) solid var(--white,#fff);border-radius:16px;border-radius:var(--info-size,16px)}.van-info--dot{min-width:0;border-radius:100%;width:8px;width:var(--info-dot-size,8px);height:8px;height:var(--info-dot-size,8px);background-color:#ee0a24;background-color:var(--info-dot-color,#ee0a24)}
</style>

51
wxcomponents/vant/loading/index.vue

@ -0,0 +1,51 @@
<template>
<uni-shadow-root class="vant-loading-index"><view :class="'custom-class van-loading '+(vertical ? 'van-loading--vertical' : '')">
<view :class="'van-loading__spinner van-loading__spinner--'+(type)" :style="'color: '+(color)+'; width: '+(sizeWithUnit)+'; height: '+(sizeWithUnit)">
<view v-for="(item,index) in ('item in 12')" :key="item.index" v-if="type === 'spinner'" class="van-loading__dot"></view>
</view>
<view class="van-loading__text" :style="'font-size: '+(textSizeWithUnit)+';'">
<slot></slot>
</view>
</view></uni-shadow-root>
</template>
<script>
global['__wxRoute'] = 'vant/loading/index'
import { VantComponent } from '../common/component';
import { addUnit } from '../common/utils';
VantComponent({
props: {
color: String,
vertical: Boolean,
type: {
type: String,
value: 'circular'
},
size: {
type: String,
observer: 'setSizeWithUnit'
},
textSize: {
type: String,
observer: 'setTextSizeWithUnit'
}
},
methods: {
setSizeWithUnit(size) {
this.setData({
sizeWithUnit: addUnit(size)
});
},
setTextSizeWithUnit(size) {
this.set({
textSizeWithUnit: addUnit(size)
});
}
}
});
export default global['__wxComponents']['vant/loading/index']
</script>
<style platform="mp-weixin">
@import '../common/index.css';.vant-loading-index{font-size:0;line-height:1}.van-loading{display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;color:#c8c9cc;color:var(--loading-spinner-color,#c8c9cc)}.van-loading__spinner{position:relative;box-sizing:border-box;width:30px;width:var(--loading-spinner-size,30px);max-width:100%;max-height:100%;height:30px;height:var(--loading-spinner-size,30px);-webkit-animation:van-rotate .8s linear infinite;animation:van-rotate .8s linear infinite;-webkit-animation:van-rotate var(--loading-spinner-animation-duration,.8s) linear infinite;animation:van-rotate var(--loading-spinner-animation-duration,.8s) linear infinite}.van-loading__spinner--spinner{-webkit-animation-timing-function:steps(12);animation-timing-function:steps(12)}.van-loading__spinner--circular{border:1px solid transparent;border-top-color:initial;border-radius:100%}.van-loading__text{margin-left:8px;margin-left:var(--padding-xs,8px);color:#969799;color:var(--loading-text-color,#969799);font-size:14px;font-size:var(--loading-text-font-size,14px);line-height:20px;line-height:var(--loading-text-line-height,20px)}.van-loading__text:empty{display:none}.van-loading--vertical{-webkit-flex-direction:column;flex-direction:column}.van-loading--vertical .van-loading__text{margin:8px 0 0;margin:var(--padding-xs,8px) 0 0}.van-loading__dot{position:absolute;top:0;left:0;width:100%;height:100%}.van-loading__dot:before{display:block;width:2px;height:25%;margin:0 auto;background-color:currentColor;border-radius:40%;content:" "}.van-loading__dot:first-of-type{-webkit-transform:rotate(30deg);transform:rotate(30deg);opacity:1}.van-loading__dot:nth-of-type(2){-webkit-transform:rotate(60deg);transform:rotate(60deg);opacity:.9375}.van-loading__dot:nth-of-type(3){-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:.875}.van-loading__dot:nth-of-type(4){-webkit-transform:rotate(120deg);transform:rotate(120deg);opacity:.8125}.van-loading__dot:nth-of-type(5){-webkit-transform:rotate(150deg);transform:rotate(150deg);opacity:.75}.van-loading__dot:nth-of-type(6){-webkit-transform:rotate(180deg);transform:rotate(180deg);opacity:.6875}.van-loading__dot:nth-of-type(7){-webkit-transform:rotate(210deg);transform:rotate(210deg);opacity:.625}.van-loading__dot:nth-of-type(8){-webkit-transform:rotate(240deg);transform:rotate(240deg);opacity:.5625}.van-loading__dot:nth-of-type(9){-webkit-transform:rotate(270deg);transform:rotate(270deg);opacity:.5}.van-loading__dot:nth-of-type(10){-webkit-transform:rotate(300deg);transform:rotate(300deg);opacity:.4375}.van-loading__dot:nth-of-type(11){-webkit-transform:rotate(330deg);transform:rotate(330deg);opacity:.375}.van-loading__dot:nth-of-type(12){-webkit-transform:rotate(1turn);transform:rotate(1turn);opacity:.3125}@-webkit-keyframes van-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes van-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}
</style>
Loading…
Cancel
Save