Compare commits

...

16 Commits

  1. 13
      api/knowledge.js
  2. 34
      api/user.js
  3. 15
      components/ProductConSwiper.vue
  4. 2
      components/ProductWindow.vue
  5. 95
      components/sSwiper.vue
  6. 3
      components/uni-easyinput/common.js
  7. 5
      config/index.js
  8. 1
      main.js
  9. 47
      pages.json
  10. 10
      pages/Loading/index.vue
  11. 162
      pages/authorization/agreementPage.vue
  12. 238
      pages/course/detail.vue
  13. 13
      pages/course/index.vue
  14. 37
      pages/course/signIn.vue
  15. 24
      pages/home/index.vue
  16. 2
      pages/knowledge/detail.vue
  17. 27
      pages/knowledge/index.vue
  18. 119
      pages/shop/GoodsClass/index.vue
  19. 108
      pages/shop/GoodsCon/index.vue
  20. 56
      pages/study/dabang.vue
  21. 62
      pages/study/editDabang.vue
  22. 57
      pages/user/PersonalData/index.vue
  23. 306
      pages/user/User/index.vue
  24. 108
      pages/user/bindCard/index.vue
  25. 167
      pages/user/cashOut/index.vue
  26. 12
      pages/user/myCourses/index.vue
  27. 114
      pages/user/myTeam/index.vue
  28. BIN
      static/car-icon.png
  29. BIN
      static/gwd.png
  30. BIN
      static/gwd.zip
  31. BIN
      static/img1.png
  32. BIN
      static/loading.gif
  33. BIN
      static/myorder-icon1.png
  34. BIN
      static/myorder-icon2.png
  35. BIN
      static/myorder-icon3.png
  36. BIN
      static/myorder-icon4.png
  37. BIN
      static/myorder-icon5.png
  38. BIN
      static/profit.png
  39. BIN
      static/template.png
  40. BIN
      static/templateHL.png
  41. BIN
      static/templateIndex.png
  42. BIN
      static/user-menu1.png
  43. BIN
      static/user-menu2.png
  44. BIN
      static/user-menu3.png
  45. BIN
      static/user-menu4.png
  46. BIN
      static/user-menu5.png
  47. BIN
      static/user-menu6.png
  48. 5
      store/index.js
  49. 52
      utils/index.js
  50. 96
      wxcomponents/vant/button/index.vue
  51. 1
      wxcomponents/vant/common/index.css
  52. 1
      wxcomponents/vant/common/style/clearfix.css
  53. 1
      wxcomponents/vant/common/style/ellipsis.css
  54. 1
      wxcomponents/vant/common/style/hairline.css
  55. 0
      wxcomponents/vant/common/style/mixins/clearfix.css
  56. 0
      wxcomponents/vant/common/style/mixins/ellipsis.css
  57. 0
      wxcomponents/vant/common/style/mixins/hairline.css
  58. 0
      wxcomponents/vant/common/style/theme.css
  59. 0
      wxcomponents/vant/common/style/var.css
  60. 1012
      wxcomponents/vant/icon/index.vue
  61. 20
      wxcomponents/vant/info/index.vue
  62. 51
      wxcomponents/vant/loading/index.vue

13
api/knowledge.js

@ -62,7 +62,7 @@ export function enterStudyList(data) {
* 获取榜单打榜进度
*/
export function myProgress(data) {
return request.get("/StudyList/myProgress?studyListId="+data);
return request.get("/StudyList/myProgress",data);
}
/**
@ -72,6 +72,13 @@ export function studyListPublish(data) {
return request.post("/StudyList/studyListPublish",data);
}
/**
* 补卡打榜分享
*/
export function studyListRepublish(data) {
return request.post("/StudyList/studyListRepublish",data);
}
/**
* 发布打榜点赞
*/
@ -104,14 +111,14 @@ export function getCourseDetail(data) {
* 报名
*/
export function enterCourse(data) {
return request.post("/user/enterCourse",data);
return request.post("/lession/enterCourse",data);
}
/**
* 课程扫码签到
*/
export function signCourse(data) {
return request.get("/user/signCourse?courseId="+data);
return request.get("/lession/signCourse?lessionId="+data);
}
/**

34
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,
})
}
/**
* 省市区
*/
@ -439,7 +450,7 @@ export function getRechargeApi() {
* 获取我的课程列表
* */
export function getMyCourseList(q) {
return request.get('/Course/listCoursesByMemberId?type='+q)
return request.get('/lession/myLessionList?type='+q)
}
/*
@ -461,3 +472,24 @@ export function integral(q) {
export function signIntegral(q) {
return request.post('/sign/integral')
}
/*
* 获取我的团队
* */
export function getMyTeam(){
return request.post('user/myTeam')
}
/*
* 提现
* */
export function cash(data){
return request.post('extract/cash',data)
}
/*
* 绑定银行卡
* */
export function bingCard(data){
return request.post('userBank/saveBankInfo',data)
}

15
components/ProductConSwiper.vue

@ -3,11 +3,14 @@
<swiper
class="swiper-wrapper"
@change="handleChange"
:indicator-dots="true"
indicator-color="#868884"
indicator-active-color="#fff"
v-if="imgUrls.length > 0"
>
<block v-for="(item, imgUrlsIndex) in imgUrls" :key="imgUrlsIndex">
<swiper-item>
<image :src="item" @tap="previewImage(imgUrlsIndex)" class="slide-image" />
<image :src="item" @tap="previewImage(imgUrlsIndex)" class="slide-image" mode="aspectFill" />
</swiper-item>
</block>
</swiper>
@ -16,7 +19,7 @@
<image :src="item" class="slide-image" />
</swiperSlide>
</swiper>-->
<view class="pages">{{ currents || 1 }}/{{ imgUrls.length || 1 }}</view>
<!-- <view class="pages">{{ currents || 1 }}/{{ imgUrls.length || 1 }}</view> -->
</view>
</template>
<script>
@ -69,3 +72,11 @@ export default {
},
};
</script>
<style lang="less">
.product-bg{
height: 600rpx;
swiper{
height: 100%;
}
}
</style>

2
components/ProductWindow.vue

@ -140,6 +140,6 @@ export default {
</script>
<style scoped lang="less">
.product-window{
padding-bottom: 190rpx;
padding-bottom: 270rpx;
}
</style>

95
components/sSwiper.vue

@ -0,0 +1,95 @@
<template>
<swiper class="swiper-block" circular="true" previous-margin="100rpx" next-margin="100rpx" current="0" @change="swiperChange">
<swiper-item v-for="(item, index) in list" :key="index">
<view class="swiper-item" :class="(swiperIndex == index ? 'active' : '')" @click="toDetail(item.id)">
<image mode="aspectFill" :src="item.imageInput" class="slide-image"></image>
<view class="title line1">{{item.title}}</view>
<view class="intro line2">{{item.synopsis}}</view>
</view>
</swiper-item>
</swiper>
</template>
<script>
export default{
props: {
imgs: {
type: Array,
default: []
},
list: {
type: Array,
default: []
}
},
data(){
return {
swiperIndex: 0
}
},
methods: {
swiperChange(e) {
this.swiperIndex = e.detail.current
},
toDetail(id){
this.$yrouter.push({
path: '/pages/knowledge/detail',
query: {
id: id,
},
})
},
}
}
</script>
<style lang="less">
.swiper-block {
width: 100%;
height: 780rpx;
}
swiper-item{
width: 100%;
height: 780rpx;
}
.swiper-item {
width: 420rpx;
height: 740rpx;
margin: 0 auto;
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
overflow: unset;
position: relative;
}
.slide-image {
width: 420rpx;
height: 578rpx;
border-radius: 230rpx 230rpx 34rpx 34rpx;
border: 1rpx solid #B67827;
z-index: 1;
}
.title{
width: 420rpx;
height: 96rpx;
background: #B67827;
color: #FFCB85;
text-align: center;
line-height: 96rpx;
margin-top: -96rpx;
padding: 0 12rpx;
border-radius: 0rpx 0rpx 34rpx 34rpx;
z-index: 99;
}
.intro{
font-size: 28rpx;
color: #222;
margin-top: 20rpx;
}
.active {
transform: scale(1.1);
transition: all 0.2s linear;
z-index: 20;
}
</style>

3
components/uni-easyinput/common.js

@ -8,9 +8,10 @@ export const debounce = function(func, wait = 1000, immediate = true) {
let timer;
console.log(1);
return function() {
console.log(123);
console.log(timer,'timer');
let context = this,
args = arguments;
console.log(args,'argsargs')
if (timer) clearTimeout(timer);
if (immediate) {
let callNow = !timer;

5
config/index.js

@ -1,9 +1,10 @@
// 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.68.126:8088/api'
// export const VUE_APP_API_URL = 'https://www.cyjyyjy.com/api'
// export const VUE_APP_API_URL = 'http://192.168.68.126: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'
// export const VUE_APP_API_URL = 'https://h5api.xinxintuan.co/api';
// export const VUE_APP_API_URL = 'https://h5api.xinxintuan.co/api';
export const VUE_APP_RESOURCES_URL = 'https://h5.yixiang.co/static'

1
main.js

@ -40,6 +40,7 @@ Object.defineProperty(Vue.prototype, '$yroute', {
})
Vue.prototype.$VUE_APP_API_URL = VUE_APP_API_URL
Vue.prototype.$VUE_APP_RESOURCES_URL = VUE_APP_RESOURCES_URL
Vue.component('cu-custom', cuCustom)
let deviceType = ''

47
pages.json

@ -11,6 +11,12 @@
"style": {
"navigationBarTitleText": "微信授权"
}
},
{
"path": "pages/authorization/agreementPage",
"style": {
"navigationBarTitleText": "用户协议"
}
},
// {
// "path": "pages/user/Login/index",
@ -50,20 +56,6 @@
"enablePullDownRefresh": true
}
},
// {
// "path": "pages/diandeng/index",
// "style": {
// "navigationBarTitleText": "",
// "navigationStyle": "custom"
// }
// },
// {
// "path": "pages/diandeng/lighting",
// "style": {
// "navigationBarTitleText": "",
// "navigationStyle": "custom"
// }
// },
{
"path": "pages/course/index",
"style": {
@ -305,6 +297,33 @@
// "navigationBarTitleText": "商家订单统计"
// }
// }
,{
"path" : "pages/user/myTeam/index",
"style" :
{
"navigationBarTitleText": "我的团队",
"enablePullDownRefresh": true
}
}
,{
"path" : "pages/user/cashOut/index",
"style" :
{
"navigationBarTitleText": "提现",
"enablePullDownRefresh": false
}
}
,{
"path" : "pages/user/bindCard/index",
"style" :
{
"navigationBarTitleText": "绑定银行卡",
"enablePullDownRefresh": false
}
}
],
"subPackages": [
{

10
pages/Loading/index.vue

@ -1,7 +1,7 @@
<template>
<view class="lottie-bg">
<view id="lottie">
<image src="@/static/live-logo.gif" rel="preload" mode="widthFix" style="width: 100%" />
<image src="../../static/loading.gif" rel="preload" mode="widthFix" style="width: 100%;height:100%;" />
</view>
</view>
</template>
@ -23,13 +23,12 @@ export default {
return {}
},
onShow() {
console.log('getUser',this.userInfo)
var url = handleQrCode()
if (!url) {
url = handleUrlParam(getCurrentPageUrlWithArgs())
}
console.log(url)
console.log('判断是否是分销')
// console.log(url)
// console.log('')
//
if (url) {
let urlSpread = parseInt(url.spread)
@ -109,7 +108,8 @@ export default {
}
#lottie {
width: 35%;
width: 42rpx;
height: 42rpx;
display: block;
overflow: hidden;
transform: translate3d(0, 0, 0);

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>

238
pages/course/detail.vue

@ -38,8 +38,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>
@ -50,7 +50,7 @@
<span>课程简介</span>
</view>
<!-- <text class="desc">{{detail.courseIntroduce}}</text> -->
<rich-text class="content" :nodes="detail.courseIntroduce"></rich-text>
<rich-text class="content" :nodes="detail.content"></rich-text>
</view>
<view class="course-desc-box content" id="content2">
<view class="title-box acea-row row-middle">
@ -91,7 +91,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 +112,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,10 +123,9 @@
</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 ">
<view class="count-down">
<view>距离截止时间还剩</view>
@ -140,16 +134,13 @@
<view class="signin-btn" @click="signInClick(2)">立即报名</view>
</view>
<view class="signin-btn" v-if="yhStatus == 2">报名已截止 请关注下期</view>
<!-- <view class="btn-box acea-row row-between-wrapper" v-if="yhStatus == 2 ">
</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"
@ -203,6 +194,7 @@
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'
import dayjs from 'dayjs'
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 {
@ -272,55 +264,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.commit('login', res.data.token, dayjs(res.data.expires_time))
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]
@ -334,40 +288,56 @@
},
})
},
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(detail.enterEndTime) >= new Date() && new Date(detail.enterStartTime) <= new Date() ){
if( new Date(enterEndTime) >= new Date() && new Date(enterStartTime) <= new Date() ){
yhStatus = 1; //
}else if(new Date(detail.enterEndTime) < new Date()){
}else if(new Date(enterEndTime) < new Date()){
yhStatus = 2; //
}else if(new Date(detail.enterStartTime) > new Date()){
}else if(new Date(enterStartTime) > new Date()){
yhStatus = 3; //
}
}else{
//
if (detail.status == 1 && detail.courseType == 1){
if( new Date(detail.courseEndTime) >= new Date() ){
if( new Date(courseEndTime) >= new Date() ){
yhStatus = 4; //
}else{
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({
@ -376,18 +346,19 @@
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%;'")
// res.data.content = res.data.content.replace(/\<img/g, "<img style='width: 100%;'")
this.detail = res.data;
this.test();
let t = res.data.signEndTime.replace(/-/g, '/');
let t = res.data.enterEndTime.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)
// console.log(this.times,'times')
uni.stopPullDownRefresh()
}).then(()=>{
this.setStatus();
})
},
@ -425,7 +396,7 @@
})
} else if(type == 1){ //
uni.makePhoneCall({
phoneNumber: this.userInfo.sellerPhone
phoneNumber: this.userInfo.seller.phone
});
} else{
this.sign()
@ -451,11 +422,17 @@
},1500)
} else if(res.data.state == 2){
this.payment(res.data.payData)
} else if(res.data.status == 4045){
this.maskDialog = true
return
} else{
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
uni.showModal({
title: '提示!',
content: res.msg,
showCancel:false,
success: (result)=> {
this.getDetail()
}
});
}
})
@ -629,6 +606,104 @@
}
}
}
.mask-box2{
width: 100%;
height: 100%;
background: rgba(0,0,0,.6);
position: fixed;
top: 0;
z-index: 99;
.dialog-bg{
width: 726rpx;
height: 1026rpx;
background: linear-gradient(180deg, #fbd8a5 0%, #fcc86a 100%);
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
border-radius: 8rpx;
}
.signUp-box{
width: 543rpx;
height: 836rpx;
background: #fff;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
display: flex;
flex-direction: column;
align-items: center;
border-radius: 8rpx;
.signup-success{
width: 470rpx;
height: 100rpx;
margin: 60rpx 0 46rpx;
}
.divsion-line{
width: 467rpx;
border-bottom: 1px dashed #fbd69e;
position: relative;
&::before{
display: inline-block;
content: '';
width: 50rpx;
height: 50rpx;
border-radius: 50px;
background: #FBD293;
position: absolute;
left: -62rpx;
top: -25rpx;
}
&::after{
display: inline-block;
content: '';
width: 50rpx;
height: 50rpx;
border-radius: 50px;
background: #FBD293;
position: absolute;
right: -62rpx;
top: -25rpx;
}
}
.er-code{
image{
width: 297rpx;
height: 297rpx;
}
}
.tips{
width: 340rpx;
font-size: 28rpx;
color: #000;
margin: 28rpx auto 12rpx;
text-align: center;
}
.longpress-btn{
width: 327rpx;
height: 75rpx;
text-align: center;
line-height: 75rpx;
font-size: 32rpx;
color: #fff;
background: linear-gradient(90deg, #F7D08E 0%, #E2B35D 99%);
border-radius: 37rpx;
margin-top: 32rpx;
}
}
.close-btn{
width: 80rpx;
height: 80rpx;
background: url(../../static/close-btn.png) no-repeat;
background-size: 100% 100%;
position: absolute;
bottom: 100rpx;
left: 50%;
margin-left: -40rpx;
}
}
.mask-box2{
width: 100%;
@ -1038,8 +1113,9 @@
background: #F99C10;
}
.call-btn{
width: 268rpx;
min-width: 230rpx;
height: 80rpx;
padding: 0 20rpx;
background: #F99C10;
border-radius: 44rpx;
text-align: center;

13
pages/course/index.vue

@ -1,5 +1,6 @@
<template>
<view class="konwledge-index index">
<view class="content-box">
<view class="tab-box" :class="isFixedTop ? 'fixed' : ''">
<view class="tabs">
@ -55,6 +56,8 @@
</view>
</view>
</view>
<!-- <view style="color:#000;z-index: 9999;" @click="dClick">按钮按钮</view>
<view style="color:#000;z-index: 9999;" @click="tClick">按钮C按钮</view> -->
</view>
</template>
<script module="utils" lang="wxs" src="../../utils/subutil.wxs"></script>
@ -73,6 +76,7 @@
getStudyList,
getCourses
} from '@/api/knowledge';
import { debounce, throttle } from '@/components/uni-easyinput/common.js'
export default {
computed: mapGetters(['userInfo']),
data() {
@ -117,9 +121,6 @@
this.getStudyList()
this.getCourses()
})
},
onShow() {
},
mounted() {
uni.getSystemInfo({
@ -129,6 +130,12 @@
})
},
methods: {
dClick: debounce(function(){
console.log('dClick')
}),
tClick: throttle(()=>{
console.log('throttleClick')
}),
onPageScroll(res) {
let scrollTop = res.scrollTop;
var isSatisfy = scrollTop >= this.tabInitTop ? true : false;

37
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>
@ -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;

24
pages/home/index.vue

@ -10,7 +10,7 @@
<swiper class="swiper-box">
<swiper-item>
<view class="swiper-item">
<image src="https://www.cyjyyjy.com:8081/static/home-banner.png" mode=""></image>
<image src="https://www.cyjyyjy.com:8081/static/home-banner.png" mode="aspectFill"></image>
</view>
</swiper-item>
</swiper>
@ -58,23 +58,23 @@
<view class="notice">点击下载直播APP在线观看</view>
</view> -->
<!-- 推荐直播 -->
<view class="liveCourse-list-box p30">
<view class="liveCourse-list-box p30" v-if="live.length> 0">
<ListTitleBox :titImg="'../../../static/tit1.png'"> </ListTitleBox>
<view class="liveCourse-list acea-row row-between">
<view class="item" v-for="item in live" :key="item.id">
<view class="item" v-for="item in live" :key="item.id" @click="toCourseDetail(item.id)">
<image :src="item.coverImge" mode="aspectFill"></image>
<text>{{item.name}}</text>
</view>
</view>
</view>
<!-- 推荐课程 -->
<view class="recommend-box p30">
<view class="recommend-box p30" v-if="courseList.length> 0">
<ListTitleBox :titImg="'../../../static/tit2.png'" :titWord="'查看更多课程'" @seeMoreClick="toCourse">
</ListTitleBox>
<CourseList :list="courseList"></CourseList>
</view>
<!-- 学习榜 -->
<view class="study-list-box p30">
<view class="study-list-box p30" v-if="studyList.length> 0">
<ListTitleBox :titImg="'../../../static/tit3.png'" :titWord="'查看更多打卡榜单'" @seeMoreClick="toCourse">
</ListTitleBox>
<StadyList :list="studyList"></StadyList>
@ -219,8 +219,6 @@
}
},
onLoad: function() {
this.getLocation()
let that = this
this.getDate();
@ -312,6 +310,14 @@
path: 'pages/home/index?spread=' + uni.getStorageSync('uid'),
}
},
toCourseDetail(id){
this.$yrouter.push({
path: '/pages/course/detail',
query: {
id:id,
},
})
},
toNoticePage() {
this.$yrouter.push({
path: '/pages/noticePage/index',
@ -522,7 +528,7 @@
width: 100%;
padding: 0 30rpx;
box-sizing: border-box;
margin-bottom: 20rpx;
margin-bottom: 36rpx;
.today-fortune-box {
width: 100%;
@ -671,7 +677,7 @@
color: #000;
font-weight: bold;
overflow: hidden;
margin-right: 18rpx;
margin-bottom: 20rpx;
image {
width: 100%;

2
pages/knowledge/detail.vue

@ -175,7 +175,7 @@ export default{
.charge-type-price{
background: #F99C10;
color: #FFEDCC;
border: 1px solid #F99C10;;
border: 1px solid #F99C10;
}
}
.audio-box{

27
pages/knowledge/index.vue

@ -13,7 +13,7 @@
<view class="right-box">
<view class="title-txt">{{currentTab.categoryName}}</view>
<view class="desc line5">
<text>{{currentTab.categoryDetails || '暂无'}}</text>
<text>{{currentTab.categoryDetails || '暂无简介'}}</text>
</view>
</view>
</view>
@ -25,24 +25,8 @@
</view>
<view class="content-box">
<view class="knowledge-list">
<view class="knowledge-item acea-row" v-if="articleList.length > 0" v-for="item in articleList" :key="item.id" @click="toDetail(item.id)">
<view class="img-box">
<image :src="item.imageInput" mode="aspectFill"></image>
</view>
<view class="knowledge-info-box acea-row row-column row-between">
<view style="width: 100%;">
<view class="title line2">{{item.title}}</view>
<view class="intro line1">{{item.synopsis}}</view>
</view>
<view class="type-box acea-row">
<view class="tip" :class="item.chargeType == 0 ? 'free-bg' : item.chargeType == 1 ? '' : 'jifen'">
{{item.chargeType == 0 ? '免费' : item.chargeType == 1 ? '收费' : '积分'}}
</view>
<view class="time">{{item.addTime}}</view>
</view>
</view>
</view>
<view class="no-content" v-if="articleList.length == 0">暂无内容...</view>
<sSwiper :list="articleList" v-else></sSwiper>
</view>
</view>
</view>
@ -51,6 +35,7 @@
<script>
import SecondMenu from './components/secondMenu.vue';
import { getArticleCategorys,getArticle } from '@/api/knowledge';
import sSwiper from '../../components/sSwiper.vue'
export default {
data() {
return {
@ -69,11 +54,14 @@
scrollTop:0
}
},
components: { SecondMenu },
components: { SecondMenu, sSwiper },
onShow() {
console.log(this.tabSelect,'tabSelect')
},
onLoad(){
uni.showLoading({
title: '正在加载中...'
})
getArticleCategorys().then((res)=>{
this.tabList = res.data
this.$set(this, 'currentTab', res.data[0])
@ -85,6 +73,7 @@
// this.$set(this, 'tabSelect', 0)
// this.scrollLeft = 0
}
uni.hideLoading()
}).then(()=>{
this.getArticle()
})

119
pages/shop/GoodsClass/index.vue

@ -1,26 +1,25 @@
<template>
<view class="productSort">
<view class="cart-btn-box" @click="goShoppingCart()">
<text class="iconfont icon-gouwuche1"></text>
</view>
<div class="index">
<view class="header acea-row row-center-wrapper">
<view @click="goGoodSearch()" class="search acea-row row-middle">
<text class="iconfont icon-xiazai5"></text>搜索商品
</view>
<view class="cart-btn-box" @click="goShoppingCart()">
<image src="../../../static/car-icon.png"></image>
</view>
</view>
</div>
<!-- <view class="banner-box">
<swiper class="swiper-box" :indicator-dots="true" :autoplay="true" :interval="3000" :duration="1000">
<swiper-item>
<view class="swiper-item">1</view>
</swiper-item>
<swiper-item>
<view class="swiper-item">2</view>
<view class="banner-box">
<swiper class="swiper-box" :indicator-dots="true" indicator-color="#868884" indicator-active-color="#fff" :autoplay="true" :interval="3000" :duration="1000">
<swiper-item v-for="item in category" :key="item.id">
<view class="swiper-item">
<image :src="item.pic" mode="aspectFill"></image>
</view>
</swiper-item>
</swiper>
</view> -->
<view class="userInfo-box acea-row row-between row-middle">
</view>
<!-- <view class="userInfo-box acea-row row-between row-middle">
<view class="userInfo-l acea-row row-center-wrapper">
<image :src="userInfo.avatar || '../../../static/default-headerimg.png'"></image>
<view class="userInfo">
@ -34,7 +33,7 @@
</view>
<view class="tips">您还有{{userInfo.integral || 0}}积分未使用</view>
</view>
</view>
</view> -->
<view class="goods-list-box">
<view class="goods-list-item" v-for="item in category" :key="item.id" v-if="item.children[0].products.length>0">
<view class="goods-type-box acea-row row-center row-middle">
@ -42,6 +41,7 @@
<view class="t-word">{{item.children[0].cateName}}</view>
<view class="icon-l"><image src="../../../static/titleR-icon.png"></image></view>
</view>
<view class="category-img"><image :src="item.pic" mode="aspectFill"></image></view>
<view class="goods-list acea-row">
<view class="goods-item" v-for="goods in item.children[0].products" :key="goods.id" @click="toGoodsDetail(goods.id)">
<image :src="goods.image"></image>
@ -51,30 +51,6 @@
<view class="buy-count">已出售{{goods.sales}}{{goods.unitName}}</view>
</view>
</view>
<!-- <view class="goods-item">
<image src="../../../static/img1.png"></image>
<view class="goods-desc-box">
<view class="goods-name">禅易香囊 纯手工制作提神</view>
<view class="price">199+100积分</view>
<view class="buy-count">51人购买</view>
</view>
</view>
<view class="goods-item">
<image src="../../../static/img1.png"></image>
<view class="goods-desc-box">
<view class="goods-name">禅易香囊 纯手工制作提神</view>
<view class="price">199+100积分</view>
<view class="buy-count">51人购买</view>
</view>
</view>
<view class="goods-item">
<image src="../../../static/img1.png"></image>
<view class="goods-desc-box">
<view class="goods-name">禅易香囊 纯手工制作提神</view>
<view class="price">199+100积分</view>
<view class="buy-count">51人购买</view>
</view>
</view> -->
</view>
</view>
</view>
@ -223,19 +199,16 @@ export default {
<style lang="less" scoped>
.productSort {
height: 100%;
background: #F5F6F7 !important;
background: #fff !important;
position: relative;
.cart-btn-box{
position: fixed;
top: 90%;
right: 16rpx;
width: 60rpx;
height: 60rpx;
background: #fff;
border-radius: 50px;
text-align: center;
line-height: 60rpx;
font-weight: bold;
width: 40rpx;
height: 40rpx;
margin-left: 12rpx;
image{
width: 100%;
height: 100%;
}
}
}
@ -244,17 +217,28 @@ export default {
}
.banner-box{
width: 100%;
height: 386rpx;
margin: 20rpx 0;
height: 272rpx;
margin: 40rpx 0;
background: #fff;
padding: 0 40rpx;
.swiper-box{
width: 100%;
height: 100%;
.swiper-item{
width: 100%;
height: 100%;
image{
width: 100%;
height: 100%;
border-radius: 14rpx;
}
}
}
}
.header .search{
border: 2rpx solid #EA533E;
background-color: #fff;
border: none;
background: #FAFAFC;
}
.userInfo-box{
width: 100%;
@ -297,9 +281,19 @@ export default {
}
.goods-list-box{
width: 100%;
padding: 0 30rpx;
padding: 0 40rpx;
.goods-list-item{
width: 100%;
.category-img{
width: 100%;
height: 182rpx;
margin: 36rpx 0;
image{
width: 100%;
height: 100%;
border-radius: 14rpx;
}
}
.goods-type-box{
image{
width: 94rpx;
@ -314,22 +308,23 @@ export default {
.goods-list{
width: 100%;
.goods-item{
width: 335rpx;
background: #fff;
margin-right: 18rpx;
width: 206rpx;
padding: 10rpx 12rpx 0rpx 12rpx;
background: #F9F9FB;
margin-bottom: 30rpx;
border-radius: 10rpx;
margin-right: 26rpx;
border-radius: 12rpx;
overflow: hidden;
image{
width: 100%;
height: 336rpx;
}
height: 172rpx;
border-radius: 8rpx;
}
.goods-item:nth-child(2n){
&:nth-child(3n){
margin-right: 0;
}
}
.goods-desc-box{
width: 100%;
padding: 16rpx;
font-size: 24rpx;
@ -340,7 +335,7 @@ export default {
font-size: 28rpx;
color: #E5270F;
line-height: 40rpx;
margin-bottom: 26rpx;
margin-bottom: 16rpx;
}
}
}

108
pages/shop/GoodsCon/index.vue

@ -6,12 +6,14 @@
<!-- 商品信息描述 -->
<view class="wrapper">
<view class="introduce">{{ storeInfo.storeName }}</view>
<view class="share acea-row row-between row-bottom">
<view class="money font-color-red" v-if="!isIntegral">
<view class="money" v-if="!isIntegral">
<text></text>
<text class="num">{{ attr.productSelect.price || storeInfo.price }}</text>
<text class="old-price">{{ storeInfo.otPrice }}</text>
<!-- <text class="vip-money" v-if="storeInfo.vipPrice && storeInfo.vipPrice > 0">{{ attr.productSelect.vipPrice || storeInfo.vipPrice }}</text> -->
<text class="vip-money" v-if="storeInfo.giveIntegral>0">+{{storeInfo.giveIntegral}}积分</text>
<text class="vip-money jifen">+{{storeInfo.giveIntegral || 0}}积分</text>
<!-- <image :src="`${$VUE_APP_RESOURCES_URL}/images/vip.png`" class="image" v-if="storeInfo.vipPrice && storeInfo.vipPrice > 0" /> -->
</view>
<view class="money font-color-red" v-if="isIntegral">
@ -19,9 +21,8 @@
</view>
<!-- <view class="iconfont icon-fenxiang" @click="listenerActionSheet"></view> -->
</view>
<view class="introduce">{{ storeInfo.storeName }}</view>
<view class="label acea-row row-between-wrapper">
<text v-if="!isIntegral">原价:{{ storeInfo.otPrice }}</text>
<!-- <text class="old-price" v-if="!isIntegral">原价:{{ storeInfo.otPrice }}</text> -->
<text>库存:{{ storeInfo.stock }}{{ storeInfo.unitName }}</text>
<text>销量:{{ storeInfo.sales }}{{ storeInfo.unitName }}</text>
</view>
@ -138,25 +139,29 @@
</view> -->
<!-- #endif -->
<view class="item acea-row row-column row-center-wrapper" @click="goHome">
<view class="iconfont icon-shouye-xianxing"></view>
<view class="acea-row row-column row-center-wrapper">
<image src="../../../static/icon-home.png"></image>
</view>
<text>首页</text>
</view>
<view class="item acea-row row-column row-center-wrapper" @click="setCollect" v-if="storeInfo.userCollect">
<!-- <view class="item acea-row row-column row-center-wrapper" @click="setCollect" v-if="storeInfo.userCollect">
<view class="iconfont icon-shoucang1"></view>
<text>收藏</text>
</view>
</view> -->
<!-- <view class="item" @click="setCollect" v-if="!storeInfo.userCollect">
<view class="iconfont icon-shoucang"></view>
<text>收藏</text>
</view> -->
<view @click="goShoppingCart()" v-if="animated" class="item animated bounceIn">
<view class="iconfont icon-gouwuche1">
<view class="acea-row row-column row-center-wrapper">
<image src="../../../static/gwd.png"></image>
<text class="num bg-color-red" v-if="CartCount > 0">{{ CartCount }}</text>
</view>
<text>购物车</text>
</view>
<view @click="goShoppingCart()" class="item animated" v-if="!animated">
<view class="iconfont icon-gouwuche1">
<view class="acea-row row-column row-center-wrapper">
<image src="../../../static/gwd.png"></image>
<text class="num bg-color-red" v-if="CartCount > 0">{{ CartCount }}</text>
</view>
<text>购物车</text>
@ -778,9 +783,78 @@ export default {
<style scoped lang="less">
.product-con{
padding-bottom: 160rpx;
padding-bottom: 230rpx;
.wrapper{
width: 710rpx;
padding: 20rpx;
border-radius: 20rpx;
margin: 20rpx auto;
.introduce{
font-size: 36rpx;
color: #222;
}
.share{
padding: 0;
}
.money{
color: #E5270F;
font-size: 32rpx;
.num{
color: #E5270F;
font-size: 56rpx;
}
.old-price{
font-size: 28rpx;
color: #999999;
text-decoration: line-through;
}
.jifen{
color: #E5270F;
font-size: 42rpx;
}
}
}
.attribute{
width: 710rpx;
margin: 20rpx auto;
border-radius: 20rpx;
}
.footer{
height: 160rpx;
height: 200rpx;
.item{
font-size: 26rpx;
color: #414141;
image{
width: 50rpx;
height: 50rpx;
}
}
.bnt{
width: auto;
height: 100rpx;
font-size: 32rpx;
.joinCart{
width: 216rpx;
height: 100rpx;
background: #222222;
border-radius: 50rpx;
text-align: center;
line-height: 100rpx;
color: #fff;
margin-right: 20rpx;
transform: scale(.9);
}
.buy{
width: 216rpx;
height: 100rpx;
background: linear-gradient(147deg, #FFE0AC 0%, #F5BF5F 100%);
border-radius: 50px;
text-align: center;
line-height: 100rpx;
color: #322E27;
transform: scale(.9);
}
}
}
}
.geoPage {
@ -952,6 +1026,18 @@ export default {
.product-con .product-intro .conter view {
width: 100% !important;
}
.product-con .product-intro{
.title {
color: #000000;
font-size: 32rpx;
margin: 20rpx auto;
align-items: center;
&::after{
background: #000;
}
}
}
.generate-posters {
width: 100%;

56
pages/study/dabang.vue

@ -40,9 +40,9 @@
</view>
<view class="progress-r acea-row row-column row-center-wrapper">
<text>{{detail.enterState ? '今日已打卡' : '今日未打卡'}}</text>
<view class="dabang-btn default" v-if="detail.enterState">已打卡</view>
<!-- <view class="dabang-btn default" v-if="detail.enterState">已打卡</view> -->
<view class="dabang-btn default" v-if="detail.studyListDto.listState == 0">未开始</view>
<view class="dabang-btn" @click="toEdit" v-if="detail.studyListDto.isClockTime && !detail.enterState && detail.studyListDto.listState == 1">立即打卡</view>
<view class="dabang-btn" @click="toEdit" v-if="detail.studyListDto.isClockTime && detail.studyListDto.listState == 1">立即打卡</view>
<view class="dabang-btn default" v-if="!detail.studyListDto.isClockTime && !detail.enterState && detail.studyListDto.listState == 1">未开始</view>
</view>
</view>
@ -53,7 +53,7 @@
</view>
<!-- 打榜分享 -->
<view class="dabang-share-box" v-if="active == 0">
<view class="dabang-share-item" v-for="(item,index) in detail.studyListRecordDtos" :key="index">
<view class="dabang-share-item" v-for="(item,index) in studyListRecordDtos" :key="index">
<view class="user-info-box acea-row row-middle">
<view class="header-img">
<image :src="item.avatar" mode="aspectFill"></image>
@ -93,7 +93,7 @@
</view>
</view>
</view>
<view class="loading-status">{{loadingStatus}}</view>
</view>
</template>
@ -110,15 +110,31 @@
finishTimes: 0,
progress: 0,
rank: 0,
studyListRecordDtos:[],
memberIntegralRankVos:[],
}
},
studyListRecordDtos:[],
page: 0,
pagesize: 10,
isLoad: true,
loadingStatus: '没有更多了...'
}
},
onLoad() {
this.studyId = this.$yroute.query.id;
this.getProgress();
},
onReachBottom(){
this.page = this.page + 1
this.getProgress()
console.log('上拉加载')
},
onPullDownRefresh() {
this.studyListRecordDtos = []
this.page = 0;
this.isLoad = true;
this.getProgress();
},
methods:{
previewImage(imgArr,idx) {
//
@ -128,18 +144,34 @@
});
},
getProgress(){
if(this.isLoad){
uni.showLoading({
title: "正在加载中..."
})
myProgress(this.studyId).then((res)=>{
this.loadingStatus = '加载中...'
const data = {
page: this.page,
size: this.pagesize,
studyListId: this.studyId
}
myProgress(data).then((res)=>{
if(res.success){
res.data.studyListDto.listStartTime = res.data.studyListDto.listStartTime.split(" ")[0];
res.data.studyListDto.listEndTime = res.data.studyListDto.listEndTime.split(" ")[0]
res.data.studyListDto.listEndTime = res.data.studyListDto.listEndTime.split(" ")[0];
this.detail = res.data;
this.studyListRecordDtos = this.studyListRecordDtos.concat(res.data.studyListRecordDtos.content)
uni.hideLoading()
uni.stopPullDownRefresh();
if(this.pagesize <= res.data.studyListRecordDtos.content.length){
this.isLoad = true;
this.loadingStatus = '上拉加载更多...'
} else{
this.isLoad = false;
this.loadingStatus = '没有更多了...'
}
}
})
}
},
voteClick(item){
let id = item.id,
@ -186,14 +218,16 @@
}
})
},
onPullDownRefresh() {
this.getProgress();
}
}
}
</script>
<style lang="less" scoped>
.loading-status{
text-align: center;
font-size: 28rpx;
color: #B9B9B9;
}
.dabang-index{
min-height: 100vh;
background: #fff;

62
pages/study/editDabang.vue

@ -20,13 +20,30 @@
<switch checked @change="switchChange" color="#FDBF68" />
<text>{{isShow == 1 ? '显示' : '不显示'}}</text>
</view>
<view class="tips">提示由于11月2728日系统升级导致部分打卡未成功的学员现可以根据自己需求进行补卡操作</view>
<view class="isShow-box acea-row row-middle row-right">
<text>是否为补打卡内容</text>
<switch :checked="isBuka" @change="switchChange2" color="#FDBF68" />
<text>{{isBuka == 1 ? '是' : '否'}}</text>
</view>
<view class="isShow-box acea-row row-middle row-right" v-if="isBuka">
<text>请选择补卡日期</text>
<radio-group @change="choseDate">
<label>
<radio value="2021-11-27" /><text>2021-11-27</text>
</label>
<label>
<radio value="2021-11-28" /><text>2021-11-28</text>
</label>
</radio-group>
</view>
<view class="submit-btn" @click="submitClick()">发布</view>
</view>
</template>
<script>
import { chooseImages } from "@/utils"
import { studyListPublish } from "@/api/knowledge"
import { studyListPublish, studyListRepublish } from "@/api/knowledge"
export default {
components: {
// VueCoreImageUpload
@ -37,7 +54,9 @@
studyId: '',
uploadPictures: [],
content: "",
unique: ""
unique: "",
isBuka: 0,
republishTime: ''
};
},
onLoad(){
@ -47,6 +66,12 @@
switchChange(e){
this.isShow = e.target.value ? 1 : 0
},
switchChange2(e){
this.isBuka = e.target.value ? 1 : 0
},
choseDate(e){
this.republishTime = e.detail.value
},
chooseImage() {
chooseImages(img => {
console.log(img)
@ -55,19 +80,35 @@
},
submitClick(){
if(this.content == ''){
uni.showToast({
return uni.showToast({
title: '请填写分享内容',
icon: 'none'
})
return
}
let data = {
if(this.isBuka == 1 && this.republishTime == ''){
return uni.showToast({
title: '请选择补卡日期',
icon: 'none'
})
}
const data = {
content: this.content,
imgPaths: this.uploadPictures,
studylistId: this.studyId,
isShow: this.isShow
}
if(this.isBuka){ //
data.republishTime = this.republishTime
studyListRepublish(data).then((res)=>{
this.fnCallBack(res)
})
} else{
studyListPublish(data).then((res)=>{
this.fnCallBack(res)
})
}
},
fnCallBack(res){
if(res.success){
uni.showToast({
title: '发布成功!',
@ -75,9 +116,6 @@
duration:1500
})
setTimeout(()=>{
// uni.navigateBack({
// delta:1
// })
uni.redirectTo({
url: '/pages/study/dabang?id=' + this.studyId
});
@ -88,8 +126,7 @@
icon:'none'
})
}
})
},
}
}
}
@ -134,9 +171,12 @@
}
}
.isShow-box{
.isShow-box,.tips{
font-size: 24rpx;
}
.tips{
color: #E2B35D;
}
.submit-btn{
width: 340rpx;
height: 88rpx;

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>

306
pages/user/User/index.vue

@ -8,7 +8,7 @@
<image :src="userInfo.avatar" />
</view>
<view class="text">
<view class="acea-row row-middle">
<view class="name-box acea-row row-middle">
<view class="name line1">{{ userInfo.nickname }}</view>
<view class="member acea-row row-middle">
<!-- <image :src="userInfo.vipIcon" /> -->
@ -40,7 +40,6 @@
<!-- <text class="iconfont icon-shezhi" @click="goPersonalData()"></text> -->
</view>
<!-- <view class="teacher-box acea-row-nowrap row-between row-middle">
<view class="teacher-box-r acea-row row-between row-middle" v-if="userInfo.isPromoter == 0">
<image :src="userInfo.workPhoto" v-if="userInfo.workPhoto"></image>
<image src="../../../static/default-headerimg.png" v-else></image>
@ -57,25 +56,25 @@
<view class="profit-box">
<view class="mt20">
<view>今日收益</view>
<view class="fz40">200积分</view>
<view class="fz40">{{userInfo.todayBrokerage || 0}}积分</view>
</view>
<view class="">
<view>累计收益</view>
<view class="fz40">200积分</view>
<view class="fz40">{{userInfo.brokeragePrice || 0}}积分</view>
</view>
<view class="panel-btn">去提现</view>
<view class="panel-btn" @click="toCashOut">去提现</view>
</view>
<!-- <view class="col-line"></view> -->
<view class="sale-box">
<view class="mt20">
<view>推广人数</view>
<view class="fz40">20</view>
<view class="fz40">{{userInfo.spreadCount || 0}}</view>
</view>
<view class="">
<view>今日收益</view>
<view class="fz40">20</view>
<view class="fz40">{{userInfo.todaySpreadNum || 0}}</view>
</view>
<view class="panel-btn">我的团队</view>
<view class="panel-btn" @click="toMyTeam">我的团队</view>
</view>
<!-- <view class="to-more-box">
<image src="../../images/jifen-icon.png" class="jifen-icon"></image>
@ -84,31 +83,33 @@
</view> -->
</view>
</view>
<view class="myjoin-box">
<view class="myjoin-box" v-if="userInfo.memberStudyVo.courseDtos.length > 0 || userInfo.memberStudyVo.studyListDtos.length > 0">
<view class="t-word">我参与的</view>
<scroll-view class="scroll-view_H" scroll-x="true" v-if="userInfo.memberStudyVo.courseDtos && userInfo.memberStudyVo.courseDtos.length > 0">
<view class="course-box"
v-for="(item,index) in userInfo.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" v-if="userInfo.memberStudyVo.studyListDtos && userInfo.memberStudyVo.studyListDtos.length > 0">
<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-name">{{item.listName}}</view>
<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>
@ -116,24 +117,6 @@
</view>
</view>
<view class="wrapper">
<!-- <view class="nav acea-row row-middle">
<view @click="goUserAccount()" class="item">
<text>我的余额</text>
<text class="num">{{ userInfo.nowMoney || 0 }}</text>
</view>
<view @click="goUserPromotion()" class="item" v-if="userInfo.isPromoter === 1 || userInfo.statu === 2">
<text>当前佣金</text>
<text class="num">{{ userInfo.brokeragePrice || 0 }}</text>
</view>
<view @click="goIntegral()" class="item" v-else>
<text>当前积分</text>
<text class="num">{{ userInfo.integral || 0 }}</text>
</view>
<view @click="goUserCoupon()" class="item">
<text>优惠券</text>
<text class="num">{{ userInfo.couponCount || 0 }}</text>
</view>
</view> -->
<view class="myOrder">
<view class="title acea-row row-between-wrapper">
<text>我的订单</text>
@ -145,7 +128,6 @@
<view class="orderState acea-row row-middle">
<view @click="goMyOrder(0)" class="item">
<view class="pictrue">
<!-- <image :src="`${$VUE_APP_RESOURCES_URL}/images/dfk.png`" /> -->
<image src="../../../static/myorder-icon1.png" />
<text class="order-status-num" v-if="userInfo.orderStatusNum.unpaidCount > 0">
{{ userInfo.orderStatusNum.unpaidCount }}
@ -174,14 +156,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>
@ -225,13 +209,13 @@
<view class="cell">收货地址</view>
<text class="iconfont icon-jiantou"></text>
</view>
<view class="item noBorder" @click="toServiceIndex()">
<!-- <view class="item noBorder" @click="toServiceIndex()">
<view class="pictrue">
<image src="../../../static/user-menu6.png" />
</view>
<view class="cell">我是服务老师</view>
<text class="iconfont icon-jiantou"></text>
</view>
</view> -->
<!-- <template v-for="(item, MyMenusIndex) in MyMenus">
<view class="item" :key="MyMenusIndex" @click="goPages(MyMenusIndex)">
<view class="pictrue">
@ -254,14 +238,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 dayjs from 'dayjs'
import {
signCourse
} from '@/api/knowledge'
const NAME = 'User'
export default {
@ -275,18 +276,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({
@ -304,6 +310,13 @@ export default {
},
})
},
getMyLession() {
myLession().then((res) => {
this.memberStudyVo = res.data
})
},
call() {
uni.makePhoneCall({
phoneNumber: this.userInfo.sellerPhone || this.userInfo.customerPhone
@ -338,33 +351,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({
@ -392,7 +394,6 @@ export default {
duration: 2000
})
}
},
goUserPromotion() {
this.$yrouter.push('/pages/user/promotion/UserPromotion/index')
@ -405,106 +406,24 @@ export default {
goPersonalData() {
this.$yrouter.push('/pages/user/PersonalData/index')
},
toMyTeam(){
this.$yrouter.push('/pages/user/myTeam/index')
},
toCashOut(){
this.$yrouter.push('/pages/user/cashOut/index')
},
getPhoneNumber: function(e) {
let thit = this
//
console.log(e)
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();
console.log(res.data)
bindPhoneNumber(e).then((res) => {
if (res.success) {
thit.$store.commit('login', res.data.token, dayjs(res.data.expires_time))
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)
}
})
// .catch(error => {
// uni.hideLoading()
// thit.$store.dispatch('userInfo', true)
// console.log(error)
// uni.showToast({
// title: error.msg || error.response.data.msg || error.response.data.message,
// icon: 'none',
// duration: 2000,
// })
// })
// //
// uni.getProvider({
// service: "oauth",
// success: function (res) {
// // h5
// if (res.provider) {
// uni.login({
// success: loginRes => {
// bindingPhone({
// code: loginRes.code,
// encryptedData: e.mp.detail.encryptedData,
// iv: e.mp.detail.iv
// })
// .then(res => {
// // this.User();
// thit.$store.dispatch("userInfo", true);
// uni.hideLoading();
// uni.showToast({
// title: res.msg,
// icon: "success",
// duration: 2000
// });
// })
// .catch(error => {
// uni.hideLoading();
// thit.$store.dispatch("userInfo", true);
// console.log(error);
// uni.showToast({
// title: error.msg ||
// error.response.data.msg ||
// error.response.data.message,
// icon: "none",
// duration: 2000
// });
// });
// },
// fail() {
// reject("");
// }
// });
// }
// },
// fail() {
// reject("");
// }
// });
} else {
uni.showToast({
title: '已拒绝授权',
icon: 'none',
duration: 2000,
})
}
},
changeswitch: function(data) {
this.switchActive = data
@ -578,6 +497,14 @@ export default {
this.isWeixin = isWeixin()
}
},
onPullDownRefresh() {
if (this.$store.getters.token) {
this.$store.dispatch('getUser', true)
// this.MenuUser()
this.isWeixin = isWeixin()
this.getMyLession()
}
},
onHide() {
console.log('离开用户中心')
@ -606,13 +533,18 @@ page{
left: 32rpx;
z-index: 3;
.text {
width: 390rpx;
.id{
color: #222 !important;
}
.name {
font-size: 36rpx;
max-width: 260rpx;
width: 100%;
color: #222;
font-weight: bold;
}
.member{
max-width: 120rpx;
padding: 0 6rpx;
background: linear-gradient(180deg, #FFCF61 0%, #FCA333 100%);
}
@ -646,49 +578,6 @@ page{
}
}
.teacher-box{
width: 690rpx;
height: 112rpx;
padding-left: 28rpx;
padding-right: 40rpx;
background: linear-gradient(180deg, #332810 0%, #4E4229 100%);
border-radius: 10rpx;
position: relative;
left: 50%;
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;
border: 1px solid #fff;
border-radius: 25px;
margin-right: 30rpx;
}
}
}
.panel-box{
width: 100%;
height: 376rpx;
@ -871,6 +760,23 @@ page{
font-weight: bold;
}
}
.serviceList{
padding: 20rpx 0 !important;
.item{
.pictrue{
width: 70rpx !important;
height: 70rpx !important;
image{
width: 70rpx !important;
height: 70rpx !important;
}
}
&:last-child{
border: none !important;
}
}
}
}
.footer-line-height {

108
pages/user/bindCard/index.vue

@ -0,0 +1,108 @@
<template>
<view class="bindcard-page">
<view class="form">
<view class="form-item">
<view class="label">持卡人</view>
<input type="text" v-model="form.name" placeholder="请输入持卡人姓名" />
</view>
<view class="form-item">
<view class="label">银行卡号</view>
<input type="text" v-model="form.card" placeholder="请输入银行卡号" />
</view>
<view class="form-item">
<view class="label">开户行</view>
<input type="text" v-model="form.bank" placeholder="请输入开户行" />
</view>
</view>
<view class="submit" @click="submit">确定</view>
</view>
</template>
<script>
import { bingCard } from '@/api/user.js'
export default {
data() {
return {
form: {
name: '',
card: '',
bank: ''
}
}
},
methods: {
submit(){
if(this.form.name == '' ){
return this.alertMessage('请输入持卡人姓名')
} else if(this.form.card == ''){
return this.alertMessage('请输入银行卡号')
} else if(this.form.bank == ''){
return this.alertMessage('请输入开户行')
}
bingCard({
bankName: this.form.bank,
cardNumber: this.form.card,
cardholderName: this.form.name
}).then((res)=>{
uni.showToast({
title: '绑定成功!',
})
setTimeout(()=>{
uni.navigateBack({
delta: 1,
})
},1500)
})
},
alertMessage(msg){
uni.showToast({
title: msg,
icon: 'none'
})
}
}
}
</script>
<style>
page{
width: 100%;
height: 100%;
background: #F8F8F8;
}
.bindcard-page{
width: 100%;
padding: 32rpx 38rpx;
}
.form{
width: 100%;
background: #fff;
border-radius: 18rpx;
}
.form-item{
width: 100%;
height: 100rpx;
padding: 0 36rpx;
font-size: 34rpx;
color: #000;
display: flex;
align-items: center;
justify-content: space-between;
border: 2rpx solid #F5F5F5;
}
.form-item input{
text-align: right;
font-size: 32rpx;
}
.submit{
width: 440rpx;
height: 88rpx;
background: #F7C37A;
border-radius: 44rpx;
text-align: center;
line-height: 88rpx;
font-size: 46rpx;
color: #fff;
margin: 60rpx auto;
}
</style>

167
pages/user/cashOut/index.vue

@ -0,0 +1,167 @@
<template>
<view class="cashout-page">
<view class="profit-box">
<image src="../../../static/profit.png" class="profit-bg"></image>
<view class="profit-info">
<view>当前可提现积分<text class="s-word">积分比例为1:1</text></view>
<view class="fz70">{{userInfo.brokeragePrice || 0}}</view>
</view>
</view>
<view class="tips">提现需在每月20-26日进行其他时间不可提现</view>
<view class="handle-box">
<view class="tit">提现金额</view>
<view class="inp-box acea-row row-between row-middle">
<text class="fz50"></text>
<input type="text" v-model="cashNum" placeholder="最低提现100积分" />
<view class="colO" @click="allCash">全部提现</view>
</view>
</view>
<view class="submit-btn" @click="cashClick">提现</view>
</view>
</template>
<script>
import { getUserInfo, cash } from '@/api/user.js'
import cookie from '@/utils/store/cookie'
export default {
data() {
return {
cashNum: '',
userInfo: {},
}
},
mounted() {
getUserInfo().then((res)=>{
this.userInfo = res.data
})
},
methods: {
allCash(){
this.cashNum = this.userInfo.brokeragePrice
},
cashClick(){
if(this.userInfo.userBank){
if(this.cashNum == '' || Number(this.cashNum) <= 100 || Number(this.cashNum) > this.userInfo.brokeragePrice){
return this.alertMessage('请输入正确的积分')
}
cash({
extractType: 'bank',
money: this.cashNum
}).then((res)=>{
uni.showToast({
title: '申请提现成功',
})
setTimeout(()=>{
uni.navigateBack({
delta: 1,
})
},1500)
})
} else{
uni.showModal({
title: '提示!',
content: '您还未绑定银行卡,点击确定按钮立即绑定。',
success: (res)=> {
if(res.confirm){
this.$yrouter.push({
path: '/pages/user/bindCard/index'
})
}
}
})
}
},
alertMessage(msg){
uni.showToast({
title: msg,
icon: 'none'
})
}
}
}
</script>
<style>
/* pages/user/cashOut/index.wxss */
.cashout-page{
width: 100%;
min-height: 100vh;
padding: 40rpx;
background: #F8F8F8;
}
.profit-box{
width: 100%;
height: 256rpx;
position: relative;
margin-top: 20rpx;
}
.profit-box image{
width: 100%;
height: 256rpx;
position: absolute;
top: 0;
}
.profit-info{
width: 100%;
height: 100%;
position: absolute;
top: 0;
z-index: 3;
padding: 48rpx 94rpx 0 36rpx;
color: #fff;
font-weight: 500;
}
.s-word{
font-size: 22rpx;
}
.fz70{
font-size: 70rpx;
font-weight: 500;
line-height: 98rpx;
}
.tips{
font-size: 20rpx;
color:#FF3434;
margin: 62rpx 0 20rpx;
font-weight: 600;
}
.handle-box{
background: #fff;
border-radius: 18rpx;
font-size: 28rpx;
}
.handle-box .tit{
width: 100%;
height: 98rpx;
line-height: 98rpx;
text-indent: 2em;
border-bottom: 2rpx solid #F5F5F5;
font-size: 28rpx;
}
.inp-box{
width: 100%;
padding: 0 32rpx;
height: 108rpx;
}
.inp-box input{
margin-left: -100rpx;
}
.fz50{
font-size: 50rpx;
}
.colO{
color: #F68514;
}
.submit-btn{
width: 440rpx;
height: 88rpx;
background: #F7C37A;
border-radius: 44rpx;
text-align: center;
line-height: 88rpx;
font-size: 42rpx;
color: #FFFFFF;
margin: 110rpx auto 0;
}
</style>

12
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>
@ -39,7 +37,7 @@
</view>
<view class="knowledge-item acea-row" v-for="item in courseList" @click="toDetail(item.id)">
<view class="img-box">
<image :src="item.imageArr[0]" mode="aspectFill"></image>
<image :src="item.coverImg" mode="aspectFill"></image>
</view>
<view class="knowledge-info-box">
<view class="title line1">{{item.courseName}}</view>

114
pages/user/myTeam/index.vue

@ -0,0 +1,114 @@
<template>
<view class="index-page">
<view class="data-panel-box acea-row row-between">
<view>
<view>今日新增</view>
<view class="fz40">{{teamInfo.todayNum}}</view>
</view>
<view>
<view>一级</view>
<view class="fz40">{{teamInfo.firstNum}}</view>
</view>
<view>
<view>二级</view>
<view class="fz40">{{teamInfo.secondNum}}</view>
</view>
</view>
<view class="t-header acea-row row-middle row-between">
<view class="h-item">成员名称</view>
<view class="h-item w180">一级积分收益</view>
<view class="h-item w180">二级积分收益</view>
</view>
<view class="t-body">
<view class="b-item acea-row row-middle row-between" v-for="(item,index) in teamInfo.teamList" wx:key="index">
<view class="name">{{item.name}}</view>
<view class="name w180">{{item.firstNum}}积分</view>
<view class="name w180">{{item.secondNum}}积分</view>
</view>
</view>
<view class="loading-status">{{loadingStatus}}</view>
</view>
</template>
<script>
import { getMyTeam } from '@/api/user.js'
import cookie from '@/utils/store/cookie'
export default {
data() {
return {
userInfo: {},
teamInfo: {},
loadingStatus: '没有更多了。。。'
}
},
mounted() {
this.userInfo = cookie.get('userInfo')
this.getTeam()
},
onPullDownRefresh: function () {
this.getTeam()
},
methods: {
getTeam(){
getMyTeam().then((res)=>{
this.teamInfo = res.data
console.log(this.teamInfo)
uni.stopPullDownRefresh()
})
},
}
}
</script>
<style>
.index-page{
width: 100%;
min-height: 100vh;
background: #F8F8F8;
padding: 32rpx 38rpx;
}
.data-panel-box{
width: 100%;
padding: 38rpx 66rpx;
background: #FFD092;
border-radius: 24rpx;
color: #fff;
}
.data-panel-box view{
text-align: center;
}
.fz40{
font-size: 40rpx;
line-height: 56rpx;
}
.t-header{
width: 100%;
height: 48rpx;
border-radius: 16rpx;
color: #AF681B;
font-size: 28rpx;
background: #fff;
padding: 0 22rpx;
margin: 16rpx 0;
}
.b-item{
width: 100%;
padding: 22rpx;
background: #fff;
border-radius: 24rpx;
margin-bottom: 24rpx;
font-size: 28rpx;
color: #CC8E46;
}
.w180{
width: 180rpx;
text-align: center;
}
.loading-status{
text-align: center;
font-size: 28rpx;
color: #B9B9B9;
}
</style>

BIN
static/car-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 838 B

BIN
static/gwd.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
static/gwd.zip

Binary file not shown.

BIN
static/img1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

BIN
static/loading.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
static/myorder-icon1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1007 B

After

Width:  |  Height:  |  Size: 560 B

BIN
static/myorder-icon2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 565 B

BIN
static/myorder-icon3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 852 B

BIN
static/myorder-icon4.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 912 B

After

Width:  |  Height:  |  Size: 990 B

BIN
static/myorder-icon5.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
static/profit.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

BIN
static/template.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 461 B

BIN
static/templateHL.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 B

BIN
static/templateIndex.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 606 B

BIN
static/user-menu1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
static/user-menu2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
static/user-menu3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
static/user-menu4.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

BIN
static/user-menu5.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
static/user-menu6.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

5
store/index.js

@ -25,9 +25,12 @@ const vuexStore = new Vuex.Store({
longitude: '',
},
storeItems: cookie.get('storeItems') || null,
goName: cookie.get('goName') || '',
goName: cookie.get('goName') || ''
},
mutations: {
setNewMsg(state,msg){
state.newMsg = msg
},
login(state, token, expires_time) {
state.token = token
cookie.set(loginKey, token, expires_time)

52
utils/index.js

@ -2,13 +2,23 @@ import Vue from 'vue'
// import MpvueRouterPatch from 'mpvue-router-patch'
// Vue.use(MpvueRouterPatch)
import { wxappAuth, getUserInfo } from '@/api/user'
import {
wxappAuth,
getUserInfo
} from '@/api/user'
import store from '@/store'
import dayjs from 'dayjs'
import cookie from '@/utils/store/cookie'
import stringify from '@/utils/querystring'
import { VUE_APP_API_URL } from '@/config'
import { wechat, auth, oAuth, toAuth } from '@/libs/wechat'
import {
VUE_APP_API_URL
} from '@/config'
import {
wechat,
auth,
oAuth,
toAuth
} from '@/libs/wechat'
export function dataFormat(time, option) {
time = +time * 1000
@ -29,7 +39,8 @@ export function dataFormat(time, option) {
if (option) {
// return parseTime(time, option);
} else {
let timeStr = d.getFullYear() + '年' + (d.getMonth() + 1) + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分'
let timeStr = d.getFullYear() + '年' + (d.getMonth() + 1) + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() +
'分'
return timeStr
}
}
@ -191,7 +202,9 @@ export const login = loginInfo => {
return new Promise((resolve, reject) => {
if (Vue.prototype.$deviceType == 'weixin') {
// 微信授权登录
const { code } = parseQuery()
const {
code
} = parseQuery()
if (code) {
auth(code)
.then(() => {
@ -218,8 +231,7 @@ export const login = loginInfo => {
path: '/pages/home/index',
})
})
} else {
}
} else {}
return
}
if (Vue.prototype.$deviceType == 'weixinh5') {
@ -268,7 +280,9 @@ export const login = loginInfo => {
code: code,
spread: cookie.get('spread'),
})
.then(({ data }) => {
.then(({
data
}) => {
console.log('登录接口调用成功')
console.log('开始处理登录信息保存,并获取用户详情')
uni.hideLoading()
@ -308,7 +322,9 @@ export const login = loginInfo => {
code: code,
spread: cookie.get('spread'),
})
.then(({ data }) => {
.then(({
data
}) => {
console.log('登录接口调用成功')
console.log('开始处理登录信息保存,并获取用户详情')
uni.hideLoading()
@ -446,7 +462,10 @@ export const handleGetUserInfo = () => {
export function parseUrl(location) {
if (typeof location === 'string') return location
const { path, query } = location
const {
path,
query
} = location
const queryStr = stringify(query)
@ -490,8 +509,7 @@ export function handleAuth() {
export const handleLoginStatus = (location, complete, fail, success) => {
// 不登录可访问的页面
let page = [
{
let page = [{
path: '/pages/Loading/index',
name: 'loading页面',
},
@ -1036,7 +1054,10 @@ export function chooseImage(callback) {
src: res.tempFilePaths[0],
success: image => {
console.log(image)
uni.showLoading({ title: '图片上传中', mask: true })
uni.showLoading({
title: '图片上传中',
mask: true
})
uni.uploadFile({
url: `${VUE_APP_API_URL}/api/upload`,
file: image,
@ -1083,7 +1104,10 @@ export function chooseImages(callback) {
uni.getImageInfo({
src: tempFilePaths[i],
success: image => {
uni.showLoading({ title: '图片上传中', mask: true })
uni.showLoading({
title: '图片上传中',
mask: true
})
uni.uploadFile({
url: `${VUE_APP_API_URL}/api/upload`,
file: image,

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