| @@ -6,7 +6,8 @@ | |||
| "pages/payHistory/payHistory", | |||
| "pages/chat/chat", | |||
| "pages/orderDetail/orderDetail", | |||
| "pages/userProtocol/userProtocol" | |||
| "pages/userProtocol/userProtocol", | |||
| "pages/mine/mine" | |||
| ], | |||
| "window": { | |||
| "backgroundTextStyle": "light", | |||
| @@ -14,6 +15,24 @@ | |||
| "navigationBarTitleText": "Weixin", | |||
| "navigationBarTextStyle": "black" | |||
| }, | |||
| "tabBar": { | |||
| "color": "#9F9F9F", | |||
| "selectedColor": "#07c160", | |||
| "list": [ | |||
| { | |||
| "pagePath": "pages/index/index", | |||
| "iconPath": "./asset/icon/Home.png", | |||
| "selectedIconPath": "./asset/icon/HomeSelect.png", | |||
| "text": "首页" | |||
| }, | |||
| { | |||
| "pagePath": "pages/mine/mine", | |||
| "iconPath": "./asset/icon/User.png", | |||
| "selectedIconPath": "./asset/icon/UserSelect.png", | |||
| "text": "我的" | |||
| } | |||
| ] | |||
| }, | |||
| "style": "v2", | |||
| "sitemapLocation": "sitemap.json" | |||
| } | |||
| @@ -0,0 +1,23 @@ | |||
| // components/userNumberSync.ts | |||
| Component({ | |||
| /** | |||
| * 组件的属性列表 | |||
| */ | |||
| properties: { | |||
| }, | |||
| /** | |||
| * 组件的初始数据 | |||
| */ | |||
| data: { | |||
| }, | |||
| /** | |||
| * 组件的方法列表 | |||
| */ | |||
| methods: { | |||
| } | |||
| }) | |||
| @@ -0,0 +1,4 @@ | |||
| { | |||
| "component": true, | |||
| "usingComponents": {} | |||
| } | |||
| @@ -0,0 +1 @@ | |||
| /* components/userNumberSync.wxss */ | |||
| @@ -0,0 +1,2 @@ | |||
| <!--components/userNumberSync.wxml--> | |||
| <text>components/userNumberSync.wxml</text> | |||
| @@ -177,6 +177,21 @@ Page({ | |||
| } | |||
| }, | |||
| apply() { | |||
| request.get({ | |||
| url: '/api/user/apply' | |||
| }).then(res => { | |||
| console.log(res, 'apply'); | |||
| wx.showToast({ | |||
| title: '申请成功!', | |||
| icon: 'success' | |||
| }) | |||
| this.checkUserInfo() | |||
| }).catch(err => { | |||
| console.log(err, 'err'); | |||
| }) | |||
| }, | |||
| /** | |||
| * @description 检查用户信息 | |||
| * @returns userInfo | |||
| @@ -22,9 +22,8 @@ | |||
| </view> | |||
| <view class="buttons"> | |||
| <block wx:if="{{!isDevMode}}"> | |||
| <block wx:if="{{!userInfo.phone}}"> | |||
| <block wx:if="{{userInfo.isMember == 0 && userInfo.isValid == 0}}"> | |||
| <view class="userProtocolModel"> | |||
| <view class="textInside"> | |||
| <view class="{{isNotRead ? 'agreeButton' : 'agreeButton active'}}" bindtap="agreedClick">√</view> | |||
| @@ -32,33 +31,33 @@ | |||
| <text class="userProtocol" bindtap="checkUserProtocol">《用户协议及隐私政策》</text> | |||
| </view> | |||
| </view> | |||
| <button type="primary" open-type="getPhoneNumber" bindgetphonenumber="getUserPhone" disabled="{{isNotRead}}">授权手机号使用</button> | |||
| <button type="primary" bindtap="apply" disabled="{{isNotRead}}">申请使用</button> | |||
| </block> | |||
| <block wx:if="{{userInfo.isMember == 1 && userInfo.isValid == 1}}"> | |||
| <view class="userPhone">当前用户:{{userInfo.coverPhone}}</view> | |||
| <view wx:if="{{userInfo.coverPhone}}" class="userPhone">当前用户:{{userInfo.coverPhone}}</view> | |||
| <view class="userPhone" wx:if="{{userInfo.validEndTime}}">到期时间:{{userInfo.validEndTime}}</view> | |||
| <view class="payHistory"> | |||
| <text style="margin-right: 20rpx;" bindtap="checkUserProtocol">用户协议</text> | |||
| <text bindtap="checkPayHistory">购买历史</text> | |||
| <text bindtap="checkPayHistory">延续历史</text> | |||
| </view> | |||
| <button type="primary" bindtap="goToChat">开始聊天</button> | |||
| </block> | |||
| <block wx:if="{{userInfo.isMember == 1 && userInfo.isValid == 0}}"> | |||
| <view class="userPhone">当前用户:{{userInfo.coverPhone}}</view> | |||
| <view wx:if="{{userInfo.coverPhone}}" class="userPhone">当前用户:{{userInfo.coverPhone}}</view> | |||
| <view class="userPhone" wx:if="{{userInfo.validEndTime}}">到期时间:{{userInfo.validEndTime}}</view> | |||
| <view class="payHistory"> | |||
| <text bindtap="checkUserProtocol">用户协议</text> | |||
| <text bindtap="checkPayHistory">购买历史</text> | |||
| <text bindtap="checkPayHistory">延续历史</text> | |||
| </view> | |||
| <button type="primary" bindtap="goToBuy">续费会员</button> | |||
| <button type="primary" bindtap="goToBuy">延续使用</button> | |||
| </block> | |||
| <block wx:if="{{userInfo.phone && userInfo.isMember == 0 && userInfo.isValid == 0}}"> | |||
| <!-- <block wx:if="{{userInfo.phone && userInfo.isMember == 0 && userInfo.isValid == 0}}"> | |||
| <view class="userPhone">当前用户:{{userInfo.coverPhone}}</view> | |||
| <button type="primary" bindtap="goToBuy">购买会员</button> | |||
| </block> | |||
| </block> --> | |||
| </block> | |||
| <block wx:if="{{isDevMode}}"> | |||
| @@ -0,0 +1,66 @@ | |||
| // pages/mine/mine.ts | |||
| Page({ | |||
| /** | |||
| * 页面的初始数据 | |||
| */ | |||
| data: { | |||
| }, | |||
| /** | |||
| * 生命周期函数--监听页面加载 | |||
| */ | |||
| onLoad() { | |||
| }, | |||
| /** | |||
| * 生命周期函数--监听页面初次渲染完成 | |||
| */ | |||
| onReady() { | |||
| }, | |||
| /** | |||
| * 生命周期函数--监听页面显示 | |||
| */ | |||
| onShow() { | |||
| }, | |||
| /** | |||
| * 生命周期函数--监听页面隐藏 | |||
| */ | |||
| onHide() { | |||
| }, | |||
| /** | |||
| * 生命周期函数--监听页面卸载 | |||
| */ | |||
| onUnload() { | |||
| }, | |||
| /** | |||
| * 页面相关事件处理函数--监听用户下拉动作 | |||
| */ | |||
| onPullDownRefresh() { | |||
| }, | |||
| /** | |||
| * 页面上拉触底事件的处理函数 | |||
| */ | |||
| onReachBottom() { | |||
| }, | |||
| /** | |||
| * 用户点击右上角分享 | |||
| */ | |||
| onShareAppMessage() { | |||
| } | |||
| }) | |||
| @@ -0,0 +1,3 @@ | |||
| { | |||
| "usingComponents": {} | |||
| } | |||
| @@ -0,0 +1 @@ | |||
| /* pages/mine/mine.wxss */ | |||
| @@ -0,0 +1,2 @@ | |||
| <!--pages/mine/mine.wxml--> | |||
| <text>pages/mine/mine.wxml</text> | |||
| @@ -8,9 +8,11 @@ Page({ | |||
| */ | |||
| data: { | |||
| userInfo: {}, | |||
| salePrice: '', | |||
| price: '', | |||
| days: '' | |||
| firstData: null,// 首充数据 | |||
| orderList: [], | |||
| imgUrl: 'https://formall.oss-accelerate.aliyuncs.com/ga/payOrder-1.png', | |||
| currentIndex: null, | |||
| currentId: '' | |||
| }, | |||
| /** | |||
| @@ -20,31 +22,77 @@ Page({ | |||
| this.setData({ | |||
| userInfo: JSON.parse(options.userInfo) | |||
| }) | |||
| this.getProductDetail() | |||
| // **已弃用 | |||
| // this.getProductDetail() | |||
| this.getProductList() | |||
| }, | |||
| getProductDetail() { | |||
| // 获取产品详情(价格、库存等)**已弃用 | |||
| // getProductDetail() { | |||
| // const that = this | |||
| // request.get({ | |||
| // url: '/api/product/detail', | |||
| // }).then(res => { | |||
| // console.log(res, 'getProductDetail'); | |||
| // that.setData({ | |||
| // salePrice: res.data.salePrice, | |||
| // price: res.data.price, | |||
| // days: res.data.days, | |||
| // }) | |||
| // }).catch(err => { | |||
| // console.log(err, 'err'); | |||
| // }) | |||
| // }, | |||
| getProductList() { | |||
| const that = this | |||
| request.get({ | |||
| url: '/api/product/detail', | |||
| url: '/api/product/list', | |||
| }).then(res => { | |||
| console.log(res, 'getProductDetail'); | |||
| that.setData({ | |||
| salePrice: res.data.salePrice, | |||
| price: res.data.price, | |||
| days: res.data.days, | |||
| }) | |||
| console.log(res, 'getProductList'); | |||
| const firstData = res.data.filter(item => item.first == 1) | |||
| // 首充数据 | |||
| if (firstData.length) { | |||
| const data = { | |||
| days: firstData[0].days, | |||
| price: firstData[0].price, | |||
| salePrice: firstData[0].salePrice, | |||
| } | |||
| this.setData({ | |||
| firstData: data | |||
| }) | |||
| // 非首冲数据 | |||
| } else { | |||
| this.setData({ | |||
| orderList: res.data | |||
| }) | |||
| } | |||
| }).catch(err => { | |||
| console.log(err, 'err'); | |||
| }) | |||
| }, | |||
| selectItem(e) { | |||
| const index = e.currentTarget.dataset.index | |||
| const id = e.currentTarget.dataset.id | |||
| const currentIndex = this.data.currentIndex | |||
| this.setData({ | |||
| currentIndex: index == currentIndex ? null : index, | |||
| currentId: index == currentIndex ? '' : id | |||
| }) | |||
| }, | |||
| createPayOrder() { | |||
| const data = { | |||
| appId: request.appId | |||
| } | |||
| if (this.data.currentId) { | |||
| data.id = this.data.currentId | |||
| } | |||
| request.post({ | |||
| url: '/api/pay/createPayOrder', | |||
| data: { | |||
| appId: request.appId | |||
| } | |||
| data | |||
| }).then(res => { | |||
| console.log(res, 'createPayOrder'); | |||
| this.requestPayment(res.data.data) | |||
| @@ -1,4 +1,5 @@ | |||
| { | |||
| "navigationBarTitleText": "购买会员", | |||
| "navigationBarTitleText": "延续会员", | |||
| "navigationBarBackgroundColor": "#ededed", | |||
| "usingComponents": {} | |||
| } | |||
| @@ -1,3 +1,7 @@ | |||
| page { | |||
| background-color: #ededed; | |||
| } | |||
| .content { | |||
| padding: 50rpx 0; | |||
| @@ -35,13 +39,15 @@ | |||
| text-align: center; | |||
| margin: auto; | |||
| .payInfo { | |||
| .firstPayInfo { | |||
| position: relative; | |||
| width: 550rpx; | |||
| height: 200rpx; | |||
| border: 1px dashed #9f9b88; | |||
| border-radius: 30rpx; | |||
| background-color: #f7f7f7; | |||
| margin: 50rpx auto; | |||
| overflow: hidden; | |||
| .saleInfo { | |||
| font-size: 45rpx; | |||
| @@ -69,6 +75,90 @@ | |||
| font-weight: 600; | |||
| } | |||
| } | |||
| .firstCharge { | |||
| position: absolute; | |||
| top: 28rpx; | |||
| right: -50rpx; | |||
| width: 200rpx; | |||
| height: 40rpx; | |||
| font-size: 25rpx; | |||
| transform: rotate(45deg); | |||
| background-color: red; | |||
| color: #ffffff; | |||
| } | |||
| } | |||
| .payInfo { | |||
| width: 650rpx; | |||
| background-color: #ffffff; | |||
| border-radius: 25rpx; | |||
| margin: 50rpx auto; | |||
| padding-bottom: 40rpx; | |||
| .continue { | |||
| text-align: left; | |||
| padding: 25rpx; | |||
| margin-bottom: 20rpx; | |||
| .grey { | |||
| margin-left: 15rpx; | |||
| font-size: 23rpx; | |||
| color: #a3a3a3; | |||
| } | |||
| } | |||
| .infoBox { | |||
| display: flex; | |||
| justify-content: space-between; | |||
| align-items: center; | |||
| flex-flow: row wrap; | |||
| padding: 0 25rpx; | |||
| .item { | |||
| width: 180rpx; | |||
| height: 180rpx; | |||
| background-color: #f2f5fa; | |||
| border-radius: 20rpx; | |||
| padding: 20rpx; | |||
| margin-bottom: 30rpx; | |||
| box-sizing: border-box; | |||
| border: 5rpx solid #f2f5fa; | |||
| transition: all 0.4s; | |||
| &.active { | |||
| border: 5rpx solid #666666; | |||
| } | |||
| .remainDays { | |||
| font-size: 38rpx; | |||
| font-weight: 600; | |||
| margin-bottom: 10rpx; | |||
| .days { | |||
| font-size: 28rpx; | |||
| margin-left: 10rpx; | |||
| } | |||
| } | |||
| .salePrice { | |||
| font-size: 28rpx; | |||
| margin-bottom: 10rpx; | |||
| .lightHigh { | |||
| color: #ff0000; | |||
| } | |||
| } | |||
| .price { | |||
| font-size: 22rpx; | |||
| text-decoration: line-through; | |||
| color: #727272; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| .btn { | |||
| @@ -1,23 +1,39 @@ | |||
| <!--pages/payOrder.wxml--> | |||
| <view class="content"> | |||
| <view class="backGround"> | |||
| <image src="../../asset/image/payOrder.png" mode="" /> | |||
| <image src="{{imgUrl}}" mode="" /> | |||
| </view> | |||
| <view class="orderList"> | |||
| <view class="payInfo"> | |||
| <view class="firstPayInfo" wx:if="{{firstData}}"> | |||
| <view class="saleInfo"> | |||
| 售价: | |||
| <text class="salePrice">{{salePrice / 100 }}</text> | |||
| <text class="price">{{price / 100}}</text> | |||
| <text class="salePrice">{{firstData.salePrice / 100 }}</text> | |||
| <text class="price">{{firstData.price / 100}}</text> | |||
| 元 | |||
| </view> | |||
| <view class="validInfo"> | |||
| 有效期:自购买日起 | |||
| <text class="day">{{days}}</text> | |||
| <text class="day">{{firstData.days}}</text> | |||
| 天 | |||
| </view> | |||
| <view class="firstCharge">首充优惠</view> | |||
| </view> | |||
| <view class="payInfo" wx:else> | |||
| <view class="continue"> | |||
| <text>延续会员</text> | |||
| <text class="grey">有效期:自购买日起/天</text> | |||
| </view> | |||
| <view class="infoBox"> | |||
| <view wx:for="{{orderList}}" class="{{currentIndex == index ? 'item active' : 'item'}}" wx:key="index" bindtap="selectItem" data-index="{{index}}" data-id="{{item.id}}"> | |||
| <view class="remainDays">{{item.days}}<text class="days">天</text></view> | |||
| <view class="salePrice">特价<text class="lightHigh">{{item.salePrice / 100}}</text>元</view> | |||
| <view class="price">原价{{item.price / 100}}元</view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <button class="btn" type="primary" bindtap="createPayOrder">立即购买</button> | |||
| </view> | |||
| </view> | |||
| @@ -33,7 +33,10 @@ | |||
| "miniprogram/pages/payOrder/payOrder.js", | |||
| "miniprogram/pages/payHistory/payHistory.js", | |||
| "miniprogram/pages/chat/chat.js", | |||
| "miniprogram/pages/orderDetail/orderDetail.js", "miniprogram/pages/userProtocol/userProtocol.js", | |||
| "miniprogram/pages/orderDetail/orderDetail.js", | |||
| "miniprogram/pages/userProtocol/userProtocol.js", | |||
| "miniprogram/pages/mine/mine.js", | |||
| "miniprogram/components/userNumberSync.js", | |||
| ], | |||
| "exclude": [ | |||
| "node_modules" | |||