From ee98f5921d7a3fecc441b606e41b2ca57fbeeaba Mon Sep 17 00:00:00 2001 From: zhangjing Date: Mon, 4 Mar 2024 15:13:17 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=9C=80=E6=96=B0=E6=9B=B4=E6=96=B0]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/index.js | 6 +- api/interfaces/empower.js | 72 +++++ api/request.js | 4 +- app.json | 7 +- pages/account/index.wxml | 11 +- pages/account/index.wxss | 7 +- pages/bag/bag.js | 6 + pages/bag/bagConfirm/bagConfirm.js | 3 +- pages/empower/empowerBuy/empowerBuy.js | 137 ++++++++++ pages/empower/empowerBuy/empowerBuy.json | 3 + pages/empower/empowerBuy/empowerBuy.wxml | 42 +++ pages/empower/empowerBuy/empowerBuy.wxss | 190 +++++++++++++ pages/empower/empowerInfo/empowerInfo.js | 75 +++++ pages/empower/empowerInfo/empowerInfo.json | 3 + pages/empower/empowerInfo/empowerInfo.wxml | 36 +++ pages/empower/empowerInfo/empowerInfo.wxss | 104 +++++++ pages/empower/empowerOrder/empowerOrder.js | 178 ++++++++++++ pages/empower/empowerOrder/empowerOrder.json | 3 + pages/empower/empowerOrder/empowerOrder.wxml | 98 +++++++ pages/empower/empowerOrder/empowerOrder.wxss | 271 +++++++++++++++++++ pages/empower/index.js | 66 +++++ pages/empower/index.json | 3 + pages/empower/index.wxml | 2 + pages/empower/index.wxss | 1 + pages/empower/writeOff/writeOff.js | 76 ++++++ pages/empower/writeOff/writeOff.json | 3 + pages/empower/writeOff/writeOff.wxml | 72 +++++ pages/empower/writeOff/writeOff.wxss | 194 +++++++++++++ pages/mall/details/details.js | 9 +- pages/mall/index.js | 31 +++ pages/mall/index.wxml | 20 +- pages/mall/index.wxss | 52 ++++ pages/pay/index.js | 8 + pages/sign/sign.js | 109 ++++---- pages/sign/sign.wxml | 3 +- pages/sign/sign.wxss | 1 - pages/user/index.wxml | 7 + pages/user/index.wxss | 6 + project.private.config.json | 8 +- static/icons/empowerArrow.png | Bin 0 -> 1267 bytes static/icons/sign.png | Bin 0 -> 8849 bytes static/imgs/tool_00.png | Bin 0 -> 2087 bytes 42 files changed, 1853 insertions(+), 74 deletions(-) create mode 100644 api/interfaces/empower.js create mode 100644 pages/empower/empowerBuy/empowerBuy.js create mode 100644 pages/empower/empowerBuy/empowerBuy.json create mode 100644 pages/empower/empowerBuy/empowerBuy.wxml create mode 100644 pages/empower/empowerBuy/empowerBuy.wxss create mode 100644 pages/empower/empowerInfo/empowerInfo.js create mode 100644 pages/empower/empowerInfo/empowerInfo.json create mode 100644 pages/empower/empowerInfo/empowerInfo.wxml create mode 100644 pages/empower/empowerInfo/empowerInfo.wxss create mode 100644 pages/empower/empowerOrder/empowerOrder.js create mode 100644 pages/empower/empowerOrder/empowerOrder.json create mode 100644 pages/empower/empowerOrder/empowerOrder.wxml create mode 100644 pages/empower/empowerOrder/empowerOrder.wxss create mode 100644 pages/empower/index.js create mode 100644 pages/empower/index.json create mode 100644 pages/empower/index.wxml create mode 100644 pages/empower/index.wxss create mode 100644 pages/empower/writeOff/writeOff.js create mode 100644 pages/empower/writeOff/writeOff.json create mode 100644 pages/empower/writeOff/writeOff.wxml create mode 100644 pages/empower/writeOff/writeOff.wxss create mode 100644 static/icons/empowerArrow.png create mode 100644 static/icons/sign.png create mode 100644 static/imgs/tool_00.png diff --git a/api/index.js b/api/index.js index 49ce09b..1cbf0b7 100644 --- a/api/index.js +++ b/api/index.js @@ -39,6 +39,9 @@ import refund from "./interfaces/refund" // 购物袋 import bag from "./interfaces/bag" +// 增收赋能 +import empower from "./interfaces/empower" + export default { auth, bank, @@ -51,5 +54,6 @@ export default { idcard, withdraw, refund, - bag + bag, + empower } \ No newline at end of file diff --git a/api/interfaces/empower.js b/api/interfaces/empower.js new file mode 100644 index 0000000..55a10b4 --- /dev/null +++ b/api/interfaces/empower.js @@ -0,0 +1,72 @@ + /* + * 手太欠 + * 愿这世界都如故事里一样 美好而动人~ +*/ + +import { req } from "../request" + +//增收赋能 +const lists = () => req({ + url: "empower/index" +}) + +//增收赋能-详情 +const info = (id) => req({ + url: "empower/" + id + "/show" +}) + +//下单前置 +const buyInit = (id, data) => req({ + url : "empower/" + id + "/buy/init", + method : "POST", + data : data +}) + +//下单购买 +const buy = (data) => req({ + url : "empower/buy/order", + method : "POST", + data : data +}) + +// 订单列表初始化 +const orderInit = () => req({ + url : "empower/order/init" +}) + +// 订单列表 +const orderList = (data) => req({ + url : "empower/order/index", + data : data +}) + +// 取消订单 +const orderCancel = (order) => req({ + url : "empower/order/" + order + "/cancel", +}) + +// 核验列表 +const codes = (data) => req({ + url : "empower/code", + method : "POST", + data : data +}) + +// 确认核验 +const sign = (data) => req({ + url : "empower/code/sign", + method : "POST", + data : data +}) + +export default ({ + lists, + info, + buyInit, + buy, + orderInit, + orderList, + orderCancel, + codes, + sign +}) \ No newline at end of file diff --git a/api/request.js b/api/request.js index baffe03..1916203 100644 --- a/api/request.js +++ b/api/request.js @@ -7,9 +7,9 @@ import { errInfo } from './err' import { updToken } from './updateToken' // 正式地址 -const api = "https://api.xuanhuojk.com/api/" +// const api = "https://api.xuanhuojk.com/api/" // 测试地址 -// const api = "https://api.xhtest.douhuofalv.com/api/" +const api = "https://api.xhtest.douhuofalv.com/api/" const header = { "Accept" : "application/json" } diff --git a/app.json b/app.json index 2c15622..7ff5b81 100644 --- a/app.json +++ b/app.json @@ -40,7 +40,12 @@ "pages/refund/logs/logs", "pages/richText/richText", "pages/bag/bag", - "pages/bag/bagConfirm/bagConfirm" + "pages/bag/bagConfirm/bagConfirm", + "pages/empower/index", + "pages/empower/writeOff/writeOff", + "pages/empower/empowerInfo/empowerInfo", + "pages/empower/empowerBuy/empowerBuy", + "pages/empower/empowerOrder/empowerOrder" ], "window": { "backgroundTextStyle": "light", diff --git a/pages/account/index.wxml b/pages/account/index.wxml index ba22041..ed37d72 100644 --- a/pages/account/index.wxml +++ b/pages/account/index.wxml @@ -20,11 +20,18 @@ - 销售补贴考核进度 + + 销售补贴考核进度 + ¥{{examine.amount}} + - {{examine.amount}} + + + + 0 + {{examine.need}} + + + + {{empower.title}} + {{empower.sub_title}} + {{empower.price}} + + + + 报名人 + + 报名信息{{index + 1}}删除 + + + + + + + + + + + + + {{semesters[item.index].title}} + + + + + + 添加报名人 + + + + {{allPrice}} + 共计{{formData.length}}人报名 + + + + \ No newline at end of file diff --git a/pages/empower/empowerBuy/empowerBuy.wxss b/pages/empower/empowerBuy/empowerBuy.wxss new file mode 100644 index 0000000..75b10ae --- /dev/null +++ b/pages/empower/empowerBuy/empowerBuy.wxss @@ -0,0 +1,190 @@ +.content { + background: #f7f8f9; + padding: 30rpx 30rpx 210rpx; + min-height: calc(100vh - 44px); + box-sizing: border-box; +} + +/* 报名人信息 */ +.user-title { + padding-top: 30rpx; + font-size: 30rpx; + line-height: 40rpx; + color: gray; +} + +.user-block { + background: white; + margin-top: 30rpx; + border-radius: 20rpx; + padding: 20rpx 30rpx; +} + +.user-block-flex { + display: flex; + justify-content: space-between; + height: 90rpx; + align-items: center; + font-size: 30rpx; + color: gray; +} + +.user-block-remove { + color: #da2b56; + line-height: 90rpx; +} + +.user-block-input { + display: flex; + justify-content: space-between; + height: 90rpx; + align-items: center; + flex-wrap: wrap; +} + +label { + font-size: 32rpx; + width: 200rpx; +} + +picker, +input { + width: calc(100% - 200rpx); + font-size: 32rpx; +} + +picker { + position: relative; +} + +.user-block-picker { + padding-right: 30rpx; + box-sizing: border-box; + position: relative; + width: calc(100% - 42rpx); + display: inline-block; +} + +.picker-icon { + width: 42rpx; + height: 42rpx; +} + +.user-add { + text-align: center; + background: white; + border-radius: 20rpx; + margin-top: 30rpx; + display: flex; + align-items: center; + height: 120rpx; + justify-content: center; + color: #da2b56; + font-size: 32rpx; +} + +.user-add image { + width: 38rpx; + height: 38rpx; + margin-right: 15rpx; +} + +/* 报名课程信息 */ +.info { + display: flex; + background: white; + padding: 30rpx; + border-radius: 20rpx; + flex-wrap: wrap; + justify-content: space-between; +} + +.info-cover { + width: 180rpx; + height: 180rpx; + border-radius: 10rpx; +} + +.info-text { + width: calc(100% - 210rpx); +} + +.info-title { + font-size: 38rpx; + font-weight: bold; + line-height: 50rpx; + height: 50rpx; +} + +.info-subtitle { + line-height: 40rpx; + height: 80rpx; + font-size: 30rpx; +} + +.info-price { + font-weight: bold; + color: #da2b56; + font-size: 42rpx; + font-family: Arial, Helvetica, sans-serif; + line-height: 50rpx; + height: 50rpx; +} + +.info-price text { + font-size: 80%; + margin-right: 5rpx; +} + +/* 底部 */ +.footer { + position: fixed; + bottom: 0; + left: 0; + right: 0; + padding: 30rpx 30rpx 50rpx; + display: flex; + flex-wrap: wrap; + align-items: center; + z-index: 99; + box-shadow: 0 0 10rpx 10rpx rgba(0, 0, 0, .04); + background: white; +} + +.footer-text { + width: 200rpx; + margin-right: 30rpx; + flex: 1; +} + +.footer-text-price { + font-weight: bold; + color: #da2b56; + font-size: 40rpx; +} + +.footer-text-price text { + font-size: 80%; + margin-right: 5rpx; +} + +.footer-text-subtitle { + font-size: 28rpx; + color: gray; +} + +.footer-btn { + background: #da2b56; + color: white; + line-height: 100rpx; + border-radius: 50rpx; + flex: 1; + text-align: center; + font-weight: bold; + font-size: 36rpx; + padding: 0 80rpx; +} + +.footer-btn::after { + display: none; +} \ No newline at end of file diff --git a/pages/empower/empowerInfo/empowerInfo.js b/pages/empower/empowerInfo/empowerInfo.js new file mode 100644 index 0000000..a8505ee --- /dev/null +++ b/pages/empower/empowerInfo/empowerInfo.js @@ -0,0 +1,75 @@ +/* + * 手太欠 + * 愿这世界都如故事里一样 美好而动人~ +*/ + +Page({ + + /** + * 页面的初始数据 + */ + data: { + empowerId : '', //增收赋能id + id : '', + cover : '', + title : '', + subtitle : '', + price : '0.00', + semester : null, + count : {}, + content : [] + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + this.setData({ + empowerId: options.id + }) + this.indexInfo(options.id) + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() {}, + + /** + * 增收赋能-详情 + */ + indexInfo(id) { + wx.$api.empower.info(id).then(res => { + console.log(res.data) + let { cover, title, subtitle, price, semester_current, count, content, id } = res.data; + this.setData({ + id : id, + cover : cover, + title : title, + subtitle : subtitle, + price : price, + semester : semester_current, + count : count, + content : content.replace(/\ {}) + }, + + /** + * 增收赋能-立即购买 + */ + onBuy(){ + if(this.data.count.ing <= 0){ + wx.showToast({ + title: '暂无可报名学期', + icon : 'none' + }) + return + } + + wx.navigateTo({ + url: "/pages/empower/empowerBuy/empowerBuy?id=" + this.data.id + }) + } +}) \ No newline at end of file diff --git a/pages/empower/empowerInfo/empowerInfo.json b/pages/empower/empowerInfo/empowerInfo.json new file mode 100644 index 0000000..3928faa --- /dev/null +++ b/pages/empower/empowerInfo/empowerInfo.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/empower/empowerInfo/empowerInfo.wxml b/pages/empower/empowerInfo/empowerInfo.wxml new file mode 100644 index 0000000..6a813db --- /dev/null +++ b/pages/empower/empowerInfo/empowerInfo.wxml @@ -0,0 +1,36 @@ + + + + + + + + {{ title }} + {{ subtitle }} + + + + {{count.all || '-'}}期 + + + + {{count.over || 0}}期 + + + + {{semester.time.start || '-'}} + + + + ¥{{semester.price || '0.00'}} + + + + + + + + + 立即购买 + + \ No newline at end of file diff --git a/pages/empower/empowerInfo/empowerInfo.wxss b/pages/empower/empowerInfo/empowerInfo.wxss new file mode 100644 index 0000000..5d3fbbd --- /dev/null +++ b/pages/empower/empowerInfo/empowerInfo.wxss @@ -0,0 +1,104 @@ +.content { + padding-bottom: 180rpx; +} + +/* 封面图 */ +.cover { + position: relative; + padding-top: 70%; + background: #f7f8f9; +} + +.cover-src { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +/* 信息 */ +.info { + padding: 40rpx; +} + +.info-title { + font-weight: bold; + font-size: 50rpx; + margin-bottom: 20rpx; + line-height: 65rpx; + color: #333; + text-align: justify; +} + +.info-subtitle { + font-size: 30rpx; + line-height: 50rpx; + margin-bottom: 40rpx; + color: #333; + text-align: justify; +} + +.info-info { + background: #f7f8f9; + padding: 0 30rpx; + font-size: 30rpx; + border-radius: 20rpx; +} + +.info-info-item { + padding: 30rpx 0; + line-height: 40rpx; + display: flex; + justify-content: space-between; +} + +label { + font-weight: bold; + width: 170rpx; +} + +.info-info-item:last-child::after { + display: none; +} + +.info-value { + width: calc(100% - 170rpx); + text-align: right; + font-family: Arial, Helvetica, sans-serif; +} + +.info-value.price { + font-weight: bold; + color: #da2b56; +} + +/* 底部 */ +.footer { + position: fixed; + bottom: 0; + left: 0; + right: 0; + padding: 30rpx 30rpx 50rpx; + display: flex; + flex-wrap: wrap; + align-items: center; + z-index: 99; + background-color: white; + box-shadow: 0 0 10rpx 10rpx rgba(0, 0, 0, .04); +} + +.footer-btn { + background: #da2b56; + color: white; + line-height: 100rpx; + border-radius: 50rpx; + flex: 1; + text-align: center; + font-weight: bold; + font-size: 36rpx; +} + +.footer-btn.in { + opacity: .6; +} \ No newline at end of file diff --git a/pages/empower/empowerOrder/empowerOrder.js b/pages/empower/empowerOrder/empowerOrder.js new file mode 100644 index 0000000..8eea376 --- /dev/null +++ b/pages/empower/empowerOrder/empowerOrder.js @@ -0,0 +1,178 @@ +/* + * 手太欠 + * 愿这世界都如故事里一样 美好而动人~ +*/ +Page({ + + /** + * 页面的初始数据 + */ + data: { + statusArr : [{ title: '全部订单', id: '' }], + empowerArr : [{ title: '全部课程', id: '' }], + statusIndex : 0, + empowerIndex: 0, + // 报名信息 + users : [], + usersTotal : 0, + usersShow : false, + // 订单列表 + orders : [], + // 分页 + page : {}, // 分页信息 + lodingStats : false,// 加载状态 + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + wx.$api.empower.orderInit().then(res => { + let { status, empower } = res.data; + this.setData({ + statusArr : status, + empowerArr : [...this.data.empowerArr, ...empower] + }) + // 获取列表 + this.getList() + }).catch(err => {}) + }, + + // 筛选类型 + onPickerChange(e){ + this.setData({ + statusIndex: e.detail.value + }) + this.getList() + }, + + // 筛选类型-课程 + onPickerClass(e){ + this.setData({ + empowerIndex: e.detail.value + }) + this.getList() + }, + + /** + * 获取列表 + */ + getList(page) { + wx.$api.empower.orderList({ + page : page || 1, + status : this.data.statusArr[this.data.statusIndex].id, + empower : this.data.empowerArr[this.data.empowerIndex].id + }).then(res => { + let listArr = this.data.orders, + newData = [] + if(page == 1 || page == undefined) listArr = [] + newData = listArr.concat(res.data.data) + newData.map(val => { + val.is_show_type = false + }) + this.setData({ + orders : newData, + page : res.data.page, + lodingStats : false + }) + wx.stopPullDownRefresh() + }).catch(err => {}) + }, + + /** + * 课程数量 + */ + typeTap(e) { + let index = e.currentTarget.dataset.index + this.setData({ + [`orders[${index}].is_show_type`]: !this.data.orders[index].is_show_type + }); + }, + + /** + * 报名信息 + */ + onShowUsers(val) { + let { count, lists } = val.currentTarget.dataset.items + this.setData({ + users : lists, + usersTotal : count, + usersShow : true + }) + }, + + /** + * 报名信息弹出关闭 + */ + usersHide() { + this.setData({ + usersShow: false + }) + }, + + /** + * 取消订单 + */ + onCancel(e){ + let id = e.currentTarget.dataset.id + wx.showModal({ + title : '提示', + content : '取消订单后无法找回,确认取消吗?', + success : modalRes => { + if(modalRes.confirm){ + wx.showLoading({ + title: '加载中...', + mask : true + }) + wx.$api.empower.orderCancel(id).then(res => { + wx.showToast({ + title: '订单已取消', + icon : 'none' + }) + this.getList() + }).catch(err => {}) + } + } + }) + }, + + /** + * 支付 + */ + onPay(e){ + let data = e.currentTarget.dataset.item + wx.redirectTo({ + url: '/pages/pay/index?params=' + encodeURIComponent(JSON.stringify(data)) + }) + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + // 获取订单列表 + this.getList() + }, + + /** + * 上拉加载 + */ + onReachBottom(){ + this.setData({ + lodingStats: true + }) + let pageNumber = this.data.page.current + if(this.data.page.has_more){ + pageNumber++ + // 获取订单列表 + this.getList(pageNumber) + } + }, +}) \ No newline at end of file diff --git a/pages/empower/empowerOrder/empowerOrder.json b/pages/empower/empowerOrder/empowerOrder.json new file mode 100644 index 0000000..3928faa --- /dev/null +++ b/pages/empower/empowerOrder/empowerOrder.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/empower/empowerOrder/empowerOrder.wxml b/pages/empower/empowerOrder/empowerOrder.wxml new file mode 100644 index 0000000..219b318 --- /dev/null +++ b/pages/empower/empowerOrder/empowerOrder.wxml @@ -0,0 +1,98 @@ + + + + + + + {{ statusArr[statusIndex].title }} + + + + + + + {{ empowerArr[empowerIndex].title }} + + + + + + + + + + 客户 + 个人 + {{item.order_no}} + + {{item.status_text}} + + + + + {{item.empower.title}} + + + + + ×{{item.items.count}} + + + + + {{citem.semester.subtitle}}({{citem.name}}) + ¥{{citem.price}} + + + + + ¥{{item.price}} + + + + {{item.created_at}} + + + + {{item.paid_at}} + + + + + 取消 + 支付 + 报名信息 + + + + + + + 加载中... + + + 没有更多了~ + + + + + + + 暂无数据 + + + + + + 报名信息 + + + {{item.name}} + {{item.mobile}} + {{item.semester.subtitle}} + {{item.status_text}} + {{item.semester.address}} + + + + \ No newline at end of file diff --git a/pages/empower/empowerOrder/empowerOrder.wxss b/pages/empower/empowerOrder/empowerOrder.wxss new file mode 100644 index 0000000..d3f46ab --- /dev/null +++ b/pages/empower/empowerOrder/empowerOrder.wxss @@ -0,0 +1,271 @@ +.content { + background: #f7f8f9; + min-height: calc(100vh - 44px); +} + +/* 订单弹出层 */ +.users-back { + position: fixed; + height: 100vh; + width: 100%; + left: 0; + bottom: 0; + z-index: 100; + background-color: rgba(0, 0, 0, .4); + display: none; +} + +.users-back.active { + display: block; +} + +.users-content { + position: fixed; + height: 80vh; + width: 100%; + left: 0; + bottom: 0; + z-index: 101; + background-color: white; + display: none; +} + +.users-content.active { + display: block; +} + +.users-title { + text-align: center; + font-weight: bold; + font-size: 40rpx; + color: #333; + height: 70rpx; + line-height: 70rpx; + padding: 30rpx; + position: relative; +} + +.users-content-icon { + position: absolute; + right: 30rpx; + top: 44rpx; + width: 40rpx; + height: 40rpx; +} + +.users-lists { + padding: 0 30rpx 50rpx; + max-height: 70vh; + overflow-y: scroll; +} + +.users-lists-item { + background: #f7f8f9; + padding: 30rpx; + border-radius: 20rpx; + font-size: 30rpx; + margin-bottom: 30rpx; +} + +.users-item { + position: relative; + line-height: 45rpx; + min-height: 45rpx; + padding-left: 160rpx; + margin: 5rpx 0; + text-align: right; +} + +.users-item label { + position: absolute; + left: 0; + top: 0; + color: gray; +} + +.users-item .bold { + font-weight: bold; + color: #da2b56; +} + +/* 订单筛选 */ +.screen-flex { + display: flex; + flex-wrap: wrap; + position: fixed; + width: 100%; + left: 0; + top: 0; + height: 90rpx; + background-color: white; + z-index: 99; +} + +.screen-picker { + width: 50%; + text-align: center; +} + +.screen-text { + line-height: 90rpx; + height: 90rpx; + display: inline-block; + font-size: 30rpx; +} + +.screen-icon { + margin-left: 5rpx; + width: 34rpx; + height: 34rpx; + vertical-align: -6rpx; +} + +/* 订单为空 */ +.order-null { + height: 80vh; + display: flex; + justify-content: center; + align-items: center; +} + +/* 订单列表 */ +.orders { + padding: 30rpx 0 10rpx; + margin-top: 90rpx; +} + +.orders-item { + margin: 0 30rpx 20rpx; + background-color: white; + border-radius: 20rpx; +} + +.orders-content { + padding: 20rpx 30rpx; +} + +.orders-content-item { + line-height: 70rpx; + display: flex; + justify-content: space-between; + font-size: 30rpx; + color: #111111; +} + +.orders-content-item label { + color: #999999; +} + +.orders-content .orders-content-bottom { + padding-right: 30rpx; + position: relative; +} + +.orders-content-type { + display: flex; +} + +.orders-content-icon { + width: 20rpx; + height: 20rpx; + margin-top: 26rpx; + transition: .3s; +} + +.orders-content-icon.active { + transform: rotate(90deg); +} + +.orders-content-icon { + position: absolute; + right: 0; + top: 0; +} + +.orders-content-block { + background: rgba(68, 110, 254, .03); + padding: 20rpx; + font-size: 28rpx; + border-radius: 10rpx; + margin: 10rpx 0; +} + +.item-flex { + display: flex; + justify-content: space-between; + line-height: 50rpx; +} + +.orders-flex { + border-bottom: solid 1rpx #F6F6F6; + display: flex; + justify-content: space-between; + align-items: center; + padding: 20rpx 30rpx; +} + +.orders-flex:last-child { + border-top: solid 1rpx #F6F6F6; + border-bottom: none; +} + +.orders-tag { + display: inline-block; + background: #da2b56; + font-size: 26rpx; + color: white; + border-radius: 10rpx; + padding: 0 10rpx; + height: 40rpx; + line-height: 40rpx; + margin-right: 10rpx; +} + +.orders-tag.order-tag-my { + background: #da2b56; +} + +.no { + font-size: 30rpx; + color: #111; + line-height: 60rpx; + width: calc(100% - 150rpx); +} + +.state { + color: #da2b56; + font-weight: bold; + font-size: 30rpx; + line-height: 60rpx; + width: 150rpx; + text-align: right; +} + +.btns { + text-align: right; + width: 100%; +} + +.btns-item { + display: inline-block; + height: 70rpx; + line-height: 70rpx; + background: #da2b56; + color: white; + border-radius: 35rpx; + padding: 0 30rpx; + font-size: 30rpx; +} + +.btns-item.btns-border { + line-height: 68rpx; + box-sizing: border-box; + border: solid 1rpx #da2b56; + background: white; + color: #da2b56; + margin-right: 20rpx; +} + +.pack-center { + z-index: 0; +} \ No newline at end of file diff --git a/pages/empower/index.js b/pages/empower/index.js new file mode 100644 index 0000000..735cf93 --- /dev/null +++ b/pages/empower/index.js @@ -0,0 +1,66 @@ +// pages/empower/index.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + } +}) \ No newline at end of file diff --git a/pages/empower/index.json b/pages/empower/index.json new file mode 100644 index 0000000..3928faa --- /dev/null +++ b/pages/empower/index.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/empower/index.wxml b/pages/empower/index.wxml new file mode 100644 index 0000000..ac5d2c6 --- /dev/null +++ b/pages/empower/index.wxml @@ -0,0 +1,2 @@ + +pages/empower/index.wxml diff --git a/pages/empower/index.wxss b/pages/empower/index.wxss new file mode 100644 index 0000000..c129eeb --- /dev/null +++ b/pages/empower/index.wxss @@ -0,0 +1 @@ +/* pages/empower/index.wxss */ \ No newline at end of file diff --git a/pages/empower/writeOff/writeOff.js b/pages/empower/writeOff/writeOff.js new file mode 100644 index 0000000..c1db17d --- /dev/null +++ b/pages/empower/writeOff/writeOff.js @@ -0,0 +1,76 @@ +/* + * 手太欠 + * 愿这世界都如故事里一样 美好而动人~ +*/ + +Page({ + + /** + * 页面的初始数据 + */ + data: { + popupShow : false, + code : '', + vouchers : [], + layIndex : 0 + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + this.setData({ + code: options.scene + }) + this.codesInfo(); + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() {}, + + /** + * 核销列表 + */ + codesInfo() { + wx.$api.empower.codes({ + code: this.data.code + }).then(res => { + this.setData({ + vouchers: res.data + }) + }).catch(err => {}) + }, + + /** + * 报名信息弹出关闭 + */ + usersHide() { + this.setData({ + popupShow: false + }) + }, + + // 显示确认弹出层 + onShowLay(e){ + let index = e.currentTarget.dataset.index + this.setData({ + layIndex : index, + popupShow: true + }) + }, + + // 签到 + onSign(e){ + let id = e.currentTarget.dataset.id + wx.$api.empower.sign({ + item_id: id + }).then(res => { + this.setData({ + popupShow: false + }) + this.codesInfo(); + }).catch(err => { }) + } +}) \ No newline at end of file diff --git a/pages/empower/writeOff/writeOff.json b/pages/empower/writeOff/writeOff.json new file mode 100644 index 0000000..3928faa --- /dev/null +++ b/pages/empower/writeOff/writeOff.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/empower/writeOff/writeOff.wxml b/pages/empower/writeOff/writeOff.wxml new file mode 100644 index 0000000..3008a30 --- /dev/null +++ b/pages/empower/writeOff/writeOff.wxml @@ -0,0 +1,72 @@ + + + + + + + {{item.empower.title}}(第{{item.semester.no}}期) + 报名人:{{item.name}} + 有效期:{{item.semester.end}} + + + {{item.can_sign ? '立即使用': '查看凭证'}} + + + + + + 暂无数据 + + + + + + + 报名信息 + + + + {{vouchers[layIndex].empower.title}} + + + + {{vouchers[layIndex].empower.subtitle}} + + + + {{vouchers[layIndex].name}} + + + + {{vouchers[layIndex].mobile}} + + + + {{vouchers[layIndex].semester.start}} + + + + {{vouchers[layIndex].semester.end}} + + + + {{vouchers[layIndex].semester.address}} + + + + + + + {{vouchers[layIndex].can_sign ? '未签到': '已签到'}} + + + + {{vouchers[layIndex].sign_at}} + + + + + + + + \ No newline at end of file diff --git a/pages/empower/writeOff/writeOff.wxss b/pages/empower/writeOff/writeOff.wxss new file mode 100644 index 0000000..7d4cc7e --- /dev/null +++ b/pages/empower/writeOff/writeOff.wxss @@ -0,0 +1,194 @@ +page { + background-color: #f7f7f7; + padding: 30rpx; + box-sizing: border-box; +} + +/* 票券 */ +.vouchers { + background: white; + border-radius: 20rpx; + margin-bottom: 30rpx; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + position: relative; +} + +.vouchers-icon { + position: absolute; + width: 100rpx; + height: 100rpx; + z-index: 1; + top: 15%; + left: 53%; + opacity: .5; +} + +.vouchers-info { + position: relative; + padding: 20rpx 30rpx; + font-size: 28rpx; + border-right: dashed 2rpx #ddd; + width: calc(100% - 200rpx); + box-sizing: border-box; +} + +.vouchers-info::after, +.vouchers-info::before { + content: " "; + height: 22rpx; + width: 22rpx; + background: #f7f7f7; + position: absolute; + right: -11rpx; + border-radius: 50%; +} + +.vouchers-info::after { + top: -11rpx; +} + +.vouchers-info::before { + bottom: -11rpx; +} + +.vouchers-info-item { + line-height: 40rpx; + font-size: 26rpx; + color: gray; +} + +.vouchers-info-item.bold { + font-weight: bold; +} + +.vouchers-info-item.title { + font-size: 30rpx; + margin-bottom: 10rpx; + font-weight: bold; + color: #333; +} + +.vouchers-btns { + width: 200rpx; + text-align: center; +} + +.vouchers-btn { + background: #da2b56; + color: white; + line-height: 60rpx; + border-radius: 30rpx; + width: 150rpx; + font-size: 26rpx; + display: inline-block; +} + +/* 核销凭证弹出层 */ +.lay-back { + top: 0; + left: 0; + position: fixed; + width: 100vw; + height: 100vh; + z-index: 998; + background-color: rgba(0, 0, 0, .5); + display: none; +} + +.lay-back.active { + display: block; +} + +.lay-info { + width: 100vw; + box-sizing: border-box; + padding-bottom: 50rpx; + position: fixed; + left: 0; + bottom: 0; + z-index: 999; + background-color: #ffffff; + display: none; + transition: .2s; + height: 65vh; + overflow-y: scroll; +} + +.lay-info.active { + display: block; +} + +.lay-title { + font-size: 40rpx; + font-weight: bold; + text-align: center; + color: #333; + line-height: 60rpx; + padding: 50rpx; + position: relative; +} + +.lay-title-icon { + position: absolute; + right: 30rpx; + top: 44rpx; + width: 40rpx; + height: 40rpx; +} + +.lay-content { + padding: 0 40rpx; +} + +.lay-item { + display: flex; + justify-content: space-between; + font-size: 30rpx; + padding: 10rpx 0; + line-height: 40rpx; +} + +.lay-item label { + color: gray; + width: 160rpx; +} + +.lay-item-val { + width: calc(100% - 160rpx); +} + +.lay-item-val.bold { + color: #da2b56; + font-weight: bold; +} + +.lay-border { + border-bottom: dashed 2rpx #ddd; + margin: 40rpx 0; +} + +.lay-btns { + padding: 40rpx; +} + +button.lay-btn { + width: 100%; + margin: 0; + background: #da2b56; + color: white; + height: 90rpx; + line-height: 90rpx; + padding: 0; + border-radius: 45rpx; +} + +button.lay-btn ::after { + display: none; +} + +button.lay-btn [disabled] { + opacity: .7; +} \ No newline at end of file diff --git a/pages/mall/details/details.js b/pages/mall/details/details.js index 2abd78f..fc70dfc 100644 --- a/pages/mall/details/details.js +++ b/pages/mall/details/details.js @@ -88,8 +88,8 @@ Page({ mask : true }) wx.request({ - // url : 'https://api.xhtest.douhuofalv.com/api/mall/goods/' + this.data.goodsId, - url : 'https://api.xuanhuojk.com/api/mall/goods/' + this.data.goodsId, + url : 'https://api.xhtest.douhuofalv.com/api/mall/goods/' + this.data.goodsId, + // url : 'https://api.xuanhuojk.com/api/mall/goods/' + this.data.goodsId, header : { "Accept" : "application/json", "channel" : "client", @@ -138,9 +138,12 @@ Page({ this.setData({ [temp1]: valueid }) + let newlist = [] let str = '' for (var i in this.data.specselect) { + console.log(this.data.specselect) + if (i == index) { newlist.push(valueid); if (i == 0) { @@ -164,6 +167,8 @@ Page({ }) break; } + + console.log(this.data.selectSkusValues) } this.setData({ specselect: newlist diff --git a/pages/mall/index.js b/pages/mall/index.js index 09c4da2..fdead08 100644 --- a/pages/mall/index.js +++ b/pages/mall/index.js @@ -19,6 +19,8 @@ Page({ buy_sku_id : false,// 身份包产品 can_buy : false,// 是否可购买 certification : false,// 是否已认证 + + empowerArr : [] // 增收赋能 }, /** @@ -55,6 +57,20 @@ Page({ // 获取身份包产品 this.getidpackage() + + // 增收赋能接口 + this.getEmpower() + }, + + /** + * 增收赋能接口 + */ + getEmpower(){ + wx.$api.empower.lists().then(res => { + this.setData({ + empowerArr: res.data + }) + }) }, /** @@ -188,6 +204,21 @@ Page({ url: "/pages/login/index" }) }, + + /** + * 查看增收赋能详情 + */ + onEmpower(e){ + if(wx.getStorageSync("token") != ''){ + wx.navigateTo({ + url: '/pages/empower/empowerInfo/empowerInfo?id=' + e.currentTarget.dataset.id + }) + return + } + wx.navigateTo({ + url: "/pages/login/index" + }) + }, /** * 页面相关事件处理函数--监听用户下拉动作 diff --git a/pages/mall/index.wxml b/pages/mall/index.wxml index 7e00be3..a95990c 100644 --- a/pages/mall/index.wxml +++ b/pages/mall/index.wxml @@ -117,6 +117,7 @@ + @@ -137,7 +138,7 @@ 加载中... - 没有更多了~ + @@ -145,4 +146,21 @@ 暂无商品 + + + + + + 增收赋能类 + + + + + + {{item.title}} + {{item.sub_title}} + ¥{{item.price}}/年 + + + \ No newline at end of file diff --git a/pages/mall/index.wxss b/pages/mall/index.wxss index fa5a443..cfdf4d1 100644 --- a/pages/mall/index.wxss +++ b/pages/mall/index.wxss @@ -266,6 +266,7 @@ page { .goodsList { flex-wrap: wrap; justify-content: flex-start; + margin: 0 -10rpx; } .goodsItem { @@ -330,4 +331,55 @@ page { border-radius: 20rpx; padding: 30rpx 30rpx 60rpx; box-sizing: border-box; +} + +/* 增收赋能 */ +.module { + padding: 30rpx; + box-sizing: border-box; +} + +.module-title { + margin-bottom: 20rpx; + color: #000000; + font-size: 32rpx; + font-weight: 600; +} + +.enable-label { + background-color: #ffffff; + padding: 20rpx; + box-sizing: border-box; + border-radius: 20rpx; + position: relative; + margin-bottom: 30rpx; +} + +.enable-img { + width: 200rpx; + border-radius: 20rpx; +} + +.enable-cont { + position: absolute; + left: 0; + top: 0; + padding: 20rpx 20rpx 20rpx 240rpx; + box-sizing: border-box; +} + +.enable-title { + font-size: 34rpx; + margin: 10rpx 0 15rpx; +} + +.enable-price { + font-size: 36rpx; + color: #f0115c; + font-weight: 600; +} + +.enable-text { + color: #999999; + margin: 10rpx 0 40rpx; } \ No newline at end of file diff --git a/pages/pay/index.js b/pages/pay/index.js index 7c37f6f..4b975a2 100644 --- a/pages/pay/index.js +++ b/pages/pay/index.js @@ -75,6 +75,14 @@ Page({ loding: false }) break; + default: + wx.showToast({ + title: '请选择支付', + icon : 'none' + }) + this.setData({ + loding: false + }) } }, /** diff --git a/pages/sign/sign.js b/pages/sign/sign.js index 23f2024..370adb4 100644 --- a/pages/sign/sign.js +++ b/pages/sign/sign.js @@ -1,66 +1,65 @@ -// pages/sign/sign.js Page({ - /** - * 页面的初始数据 - */ - data: { + /** + * 页面的初始数据 + */ + data: { + + }, - }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + + }, - /** - * 生命周期函数--监听页面加载 - */ - onLoad(options) { + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, - }, + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, - /** - * 生命周期函数--监听页面初次渲染完成 - */ - onReady() { + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, - }, + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, - /** - * 生命周期函数--监听页面显示 - */ - onShow() { + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, - }, + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, - /** - * 生命周期函数--监听页面隐藏 - */ - onHide() { - - }, - - /** - * 生命周期函数--监听页面卸载 - */ - onUnload() { - - }, - - /** - * 页面相关事件处理函数--监听用户下拉动作 - */ - onPullDownRefresh() { - - }, - - /** - * 页面上拉触底事件的处理函数 - */ - onReachBottom() { - - }, - - /** - * 用户点击右上角分享 - */ - onShareAppMessage() { - - } + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } }) \ No newline at end of file diff --git a/pages/sign/sign.wxml b/pages/sign/sign.wxml index 60eb05e..8dcff42 100644 --- a/pages/sign/sign.wxml +++ b/pages/sign/sign.wxml @@ -1,2 +1 @@ - -pages/sign/sign.wxml + \ No newline at end of file diff --git a/pages/sign/sign.wxss b/pages/sign/sign.wxss index 5b1ccef..e69de29 100644 --- a/pages/sign/sign.wxss +++ b/pages/sign/sign.wxss @@ -1 +0,0 @@ -/* pages/sign/sign.wxss */ \ No newline at end of file diff --git a/pages/user/index.wxml b/pages/user/index.wxml index 7173c5f..b8cc959 100644 --- a/pages/user/index.wxml +++ b/pages/user/index.wxml @@ -89,6 +89,13 @@ + + + 增收赋能类 + + {{userData.empower.count}} + + 我的账户 diff --git a/pages/user/index.wxss b/pages/user/index.wxss index 9778411..ccd9b43 100644 --- a/pages/user/index.wxss +++ b/pages/user/index.wxss @@ -130,6 +130,12 @@ page { border: 4rpx solid #ffffff; } +.tool--number { + border-radius: 30rpx; + padding: 0 8rpx; + right: 30rpx; +} + .parent-user { display: flex; padding: 30rpx; diff --git a/project.private.config.json b/project.private.config.json index 9cb3045..0bffeb5 100644 --- a/project.private.config.json +++ b/project.private.config.json @@ -10,15 +10,15 @@ "list": [ { "name": "购物车", - "pathName": "pages/bag/bag", + "pathName": "pages/empower/writeOff/writeOff", "query": "", "launchMode": "default", "scene": null }, { - "name": "朋友圈进入详情", - "pathName": "pages/mall/details/details", - "query": "id=3&invite=null", + "name": "提现", + "pathName": "pages/empower/writeOff/writeOff", + "query": "", "launchMode": "default", "scene": 1084 }, diff --git a/static/icons/empowerArrow.png b/static/icons/empowerArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..8cff5d12de7019becc5761cbaf49bf69b7485156 GIT binary patch literal 1267 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 literal 0 HcmV?d00001 diff --git a/static/imgs/tool_00.png b/static/imgs/tool_00.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd287c343032673daf866404007eee7a4d5b2a2 GIT binary patch literal 2087 zcmaJ?dsGv577iekhae~~Syw{Xwtyy?$qObD*gPR3;gtm{s7#Ux2_c!73{7Cg6(}wO zw&21dQmI8yTDQDPYh4rsL@3yTr&xvB7Nx6YQLu`D)JG=@?*8HFoHO%#-S4~i_uYHX z9Eg=fI6L|{5(ormaiky~A6b^y-VXnk3NyaPhxM2+8B0KwmmgcsP&i{)e$X>unf(@I3zsM7gx~gqoZFE>x|1n;gV6!u$~H10IF7Nxz}@RBNmVR zFN{}O8>QKLgc^?+(JX@;&xg`~1&nL=`;IJzcr@%7gBni?oGC!%Sz1Jgi3J=IenL^G z6>Nr_0kaSQAj^PYhzx=Zm<%gHTw6K=Mrf>Hx{SqG;dvDvV)28Sd;u?*MyG?IP#7Yl zfqX!~2o?#MLMHeUE7ln?SSLqTe5-Na%UJI3V%dBH0%NE_ilUh-RS>H}G1RC+^+Z13 zl65A9NeoC*>lCQT7-&hQ_Xelqo=_90ACXTq!3rU?!am z!7>_Ij?i%>LKI9E2$7cYidQHo1R)w%05a$dA!Jd27t8`60T?3W3q-*pdI*V%2Sl}$ z%Kw$l$`)Ramg&nzz!xuD3DM#GW563_Hr5*N)m37#fGahR-#Ma*lycqsO}WwvaiJ&Y zXYT7l8CtZpxAAe=m-9Wv8`HSLT{&^N4kgYGb#1hPVnOlG@cz~c-=Oj^h4hU;P7#Tj za~wt*rghJ3(ly>QIkQ(fIujXhi5hJwAWO<#y4$(HhVkduPxJBYr5_A>@9I3^|8S>U<*eXsiL3C|eNU{&*QxZi+ug>Q zYO6i(-S-iXnpz@-?oj!!6ZT)gjU5sHnX6pmFkCjJCA3!z-1HifC_;wC)TtlsNn2hJM3d;iW!g+Q2yDr`b*kKyg z$rPWV{d38AbCm-gG5mrckHJF`DZGX5u-dfBixVIa(;qN$_eQ(@I*#wbY6sVbTMq|* znlIR$Mvt-C`E-1`JCS}Td&E0?wJuNWdZqsO)0hc&@1D3-pL|-pt@XB*pF|tIc;J)h`PFaQYJfU?eCuz{VvyZr5cHk59nNHj57as*VKa5Wm z``!rtAbofJuEBm*XO&%CpI>#q8L9cYzjXtYD*fo2zF%Ov_XS^lYx_ab!n>3FTw$$4 z-b|WPNqNqg?VLKxcg)zbSbeOf?uYh2 zZm^}V;(o-Nh)Pi{EFMnH^|;h>IjB5hEtQ?J{&f52_jjO^ZLCdm*F0LJJ|%U5sLd8Z zLZM9{w;8F~k^FJ~>w;gQdFVK{Y3^{r)wEyo9p>$N7Z;DV7=@%~`+5^yMKve?(V#hV z_Ah^)+T7ffJI#q|?q6DjK7Y)kzi~cst$TuW>t{XhC;maw6EJdasQ=)NKb78UT^dkI zir)F`onuGIc|c!4VCW#vel$~B!hGtrNz&gY{uCHLg|<9-7Fbj}<;B~i0WP?^tsi|5 zChBn5FWGXs4`_}Izj>KjTz#zS6Q{1d7=0}Jy$gNXxW5taUmYs~jP+gCs|nynrgGZx RNT=o3Efz`yO}w=H-vH6IHZlMJ literal 0 HcmV?d00001