This commit is contained in:
唐明明
2022-08-18 10:23:49 +08:00
37 changed files with 22345 additions and 9469 deletions

View File

@@ -1,169 +1,168 @@
/**
* Web唐明明
* 匆匆数载恍如梦,岁月迢迢华发增
* 碌碌无为枉半生,一朝惊醒万事空。
*/
import store from '@/store'
import router from '../router'
// 基础配置
const config = {
apiUrl : 'https://api.gongli.vip/api/', // 正式环境
// apiUrl : 'http://api.gl.shangkelian.cn/api/', // 测试
timeout : 60000
}
let loginHintState = false
// 网络请求
const request = (parameter, hideLoding = true) => {
// 检查url配置
if(parameter.url === 'undefined' || parameter.url === ''){
uni.showToast({
title: '请求地址不能为空',
icon : 'none'
})
return
}
// 注入header
config.header = {
'Accept': 'application/json',
'Authorization': store.getters.getToken || uni.getStorageSync('token')
}
// 加载提示
if(!hideLoding) uni.showLoading({
title: '加载中',
mask : true
});
// 请求实例
return new Promise((resolve, reject) => {
uni.request({
url : config.apiUrl + parameter.url,
timeout : config.timeout,
header : config.header || {},
data : parameter.data || {},
method : parameter.method || 'GET',
success : res => {
if (res.header.Authorization){
updateToken('token', res.header.Authorization)
}
if(res.statusCode === 200){
uni.hideLoading()
const resolveData = res.data
if(resolveData.status_code === 200) {
resolve(resolveData.data)
return
}
if(resolveData.status_code === 401) {
loginHint()
return
}
reject(resolveData)
return
}
errToast(res.statusCode)
},
fail(err) {
uni.showToast({
title: '网络错误,请检查您设备网络状态',
icon : 'none'
})
}
})
})
}
// 文件上传
const uploading = (paths) => {
uni.showLoading({
title: '上传中',
mask : true
});
// 注入header
config.header = {
'Accept': 'application/json',
'Authorization': store.getters.getToken || ''
}
// 上传图片
return new Promise((resolve, reject) => {
uni.uploadFile({
url : config.apiUrl + 'storage/uploads',
files : paths,
header : config.header || {},
success : res=>{
if(res.statusCode === 200){
uni.hideLoading()
let updData = JSON.parse(res.data)
if(updData.status_code === 200){
resolve(updData.data)
return
}
reject(updData)
return
}
errToast(res.statusCode)
}
})
})
}
// 处理一些http请求错误提示
const errToast = (code) => {
switch (code){
case 404:
uni.showToast({
title: code + '接口不存在,请联系系统管理员',
icon : 'none'
})
break;
case 405:
uni.showToast({
title: code + '请检查接口请求方式错误',
icon : 'none'
})
break;
case 500:
uni.showToast({
title: code + '服务端错误,请检查服务器信息',
icon : 'none'
})
break;
}
}
// 更新token
const updateToken = (token) => {
store.commit('setToken', token)
// 清除退出登录标识
uni.removeStorageSync('isnew')
}
// 处理登录提示
const loginHint = () => {
if( loginHintState ) return
if(!loginHintState) loginHintState = true
updateToken('')
uni.showModal({
title: '登录提示',
content: '您的登录信息已过期,请重新登录',
confirmColor: '#8b64fd',
showCancel:false,
success: res=> {
loginHintState = false
if (res.confirm) {
uni.reLaunch({
url:'/pages/auth/auth'
})
}
}
})
}
export {
request,
uploading,
config
/**
* Web唐明明
* 匆匆数载恍如梦,岁月迢迢华发增。
* 碌碌无为枉半生,一朝惊醒万事空
*/
import store from '@/store'
import router from '../router'
// 基础配置
const config = {
apiUrl : 'https://api.gongli.vip/api/', // 正式环境
// apiUrl: 'http://api.gl.shangkelian.cn/api/', // 测试
timeout: 60000
}
let loginHintState = false
// 网络请求
const request = (parameter, hideLoding = true) => {
// 检查url配置
if (parameter.url === 'undefined' || parameter.url === '') {
uni.showToast({
title: '请求地址不能为空',
icon: 'none'
})
return
}
// 注入header
config.header = {
'Accept': 'application/json',
'Authorization': store.getters.getToken || uni.getStorageSync('token')
}
// 加载提示
if (!hideLoding) uni.showLoading({
title: '加载中',
mask: true
});
// 请求实例
return new Promise((resolve, reject) => {
uni.request({
url: config.apiUrl + parameter.url,
timeout: config.timeout,
header: config.header || {},
data: parameter.data || {},
method: parameter.method || 'GET',
success: res => {
if (res.header.Authorization) {
updateToken('token', res.header.Authorization)
}
if (res.statusCode === 200) {
uni.hideLoading()
const resolveData = res.data
if (resolveData.status_code === 200) {
resolve(resolveData.data)
return
}
if (resolveData.status_code === 401) {
loginHint()
return
}
reject(resolveData)
return
}
errToast(res.statusCode)
},
fail(err) {
uni.showToast({
title: '网络错误,请检查您设备网络状态',
icon: 'none'
})
}
})
})
}
// 文件上传
const uploading = (paths) => {
uni.showLoading({
title: '上传中',
mask: true
});
// 注入header
config.header = {
'Accept': 'application/json',
'Authorization': store.getters.getToken || ''
}
// 上传图片
return new Promise((resolve, reject) => {
uni.uploadFile({
url: config.apiUrl + 'storage/uploads',
files: paths,
header: config.header || {},
success: res => {
if (res.statusCode === 200) {
uni.hideLoading()
let updData = JSON.parse(res.data)
if (updData.status_code === 200) {
resolve(updData.data)
return
}
reject(updData)
return
}
errToast(res.statusCode)
}
})
})
}
// 处理一些http请求错误提示
const errToast = (code) => {
switch (code) {
case 404:
uni.showToast({
title: code + '接口不存在,请联系系统管理员',
icon: 'none'
})
break;
case 405:
uni.showToast({
title: code + '请检查接口请求方式错误',
icon: 'none'
})
break;
case 500:
uni.showToast({
title: code + '服务端错误,请检查服务器信息',
icon: 'none'
})
break;
}
}
// 更新token
const updateToken = (token) => {
store.commit('setToken', token)
// 清除退出登录标识
uni.removeStorageSync('isnew')
}
// 处理登录提示
const loginHint = () => {
if (loginHintState) return
if (!loginHintState) loginHintState = true
updateToken('')
uni.showModal({
title: '登录提示',
content: '您的登录信息已过期,请重新登录',
confirmColor: '#8b64fd',
showCancel: false,
success: res => {
loginHintState = false
if (res.confirm) {
uni.reLaunch({
url: '/pages/auth/auth'
})
}
}
})
}
export {
request,
uploading,
config
}

View File

@@ -44,9 +44,23 @@ const dtPAY = (orderNo,password) => {
}
const collagePAY = (orderNo,password) => {
return request({
url: 'mall/pay/' + orderNo + '/collage/account',
method:'post',
data: {
type: 'app',
transfer_password:password
}
})
}
export {
wxPAY,
alPAY,
dtPAY,
payIndex,
collagePAY,
}

View File

@@ -40,14 +40,10 @@ const shopsDetail = (shopId) => {
}
// 店铺商品
const shopsGoods = (shopId, categoryId,page) => {
const shopsGoods = (data) => {
return request({
url: 'mall/goods',
data: {
shop_id:shopId,
category_id:categoryId,
page:page,
}
data: data
})
}
@@ -66,6 +62,21 @@ const buy = data => {
data
})
}
// 拼团商品确认页面
const buyPin = data => {
return request({
url: 'mall/buy/collages',
data
})
}
// 拼团商品确认下单
const collages = data => {
return request({
url: 'mall/buy/collages',
method: 'POST',
data
})
}
// 商品下单
const verify = data => {
@@ -83,6 +94,21 @@ const classify = id => {
})
}
// 拼团成功后展示页面
const repages = id => {
return request({
url: 'mall/collages/' + id + '/repages'
})
}
// 商城所有分类
const categories = id => {
return request({
url: 'mall/categories/lists'
})
}
export {
mall,
goods,
@@ -91,6 +117,10 @@ export {
shopsGoods,
lists,
buy,
buyPin,
verify,
classify
collages,
repages,
classify,
categories
}

View File

@@ -51,10 +51,21 @@ const relationsVerify = (invite) => {
})
}
// 我的卡券
const myCard = (data) => {
data.receive = 'desc'
return request({
url: 'mall/shops/users',
data:data
})
}
export {
info,
chainSeed,
invitationCode,
relationsBind,
relationsVerify
relationsVerify,
myCard
}

View File

@@ -22,7 +22,7 @@ const vipPay = () => {
})
}
// 获取支付信息
// 获取支付信息
const payInfo = (orderId) => {
return request({
url: 'user/identities/pay/' + orderId + '/wechat'
@@ -36,6 +36,28 @@ const agreement = (id) => {
})
}
// 店铺会员
const shopVipInfo = (id) => {
return request({
url: 'mall/shops/'+id+'/identities'
})
}
//开通店铺会员
const shopVipCreate = (id,identity) => {
return request({
url: 'mall/shops/'+id+'/identities/'+identity,
method:'POST'
})
}
// 开通店铺会员微信支付
const shopVipWeChat = (id) => {
return request({
url: 'mall/shops/identities/wechat/'+id,
method:'POST'
})
}
export {
@@ -43,4 +65,7 @@ export {
vipPay,
payInfo,
agreement,
shopVipInfo,
shopVipCreate,
shopVipWeChat
}

View File

@@ -1,20 +1,16 @@
<template>
<view class="goods-item">
<image
src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fitem%2F202003%2F18%2F20200318231340_shbab.thumb.1000_0.jpg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662167784&t=893e1b78d1563aa0a9a65f4d14f21643"
mode="aspectFill" class="goods-cover" />
<image :src="item.cover" mode="aspectFill" class="goods-cover" />
<view class="goods-info">
<view class="_title">北欧抱枕靠垫沙发垫办公室腰靠等功能弃权</view>
<view class="_des">金凯来京东店 </view>
<view class="_title">{{item.name}}</view>
<view class="_des">{{item.shop.name}} </view>
<view class="_pin">
<view class="_has">
<image src="/static/book/fire.png" mode="widthFix" class="fire" /> 已拼1件
</view>
<view class="tuan">2人团</view>
<view class="_has" v-if="item.sales>0"> <image src="/static/book/fire.png" mode="widthFix" class="fire" /> 已拼 {{item.sales}} </view>
<view class="tuan">{{item.active.number}}人团</view>
</view>
<view class="price">
<view class="money"> 160.00 </view>
<view class="now-pin" @click="goPin(90)">马上拼团</view>
<view class="money">{{item.active.price}} <span>DT积分</span> </view>
<view class="now-pin" @click="goPin(item.goods_id)">马上拼团</view>
</view>
</view>
</view>
@@ -91,7 +87,8 @@
color: #d81e06;
background-color: rgba($color: $text-price, $alpha: 0.1);
padding: 4rpx 10rpx;
border-radius: 30rpx;
border-radius: 30rpx;
margin-right: $margin;
image {
width: 24rpx;
@@ -100,9 +97,6 @@
}
}
.tuan {
margin-left: $margin;
}
}
.price {
@@ -116,7 +110,12 @@
.money {
font-size: 34rpx;
font-weight: 600;
color: #d81e06;
color: #d81e06;
span{
font-size: 24rpx;
margin-left: 10rpx;
font-weight: normal;
}
}
.now-pin {

View File

@@ -1,75 +0,0 @@
# 使用方法
```
<x-pay-pwd
ref="xPayPwd"
:type="1"
:maskClick="true"
top="unset"
bottom="0rpx"
:showClose="false"
@change="change"
:showHead="true"
headText="请输入支付密码"
>
<template #center>
<button @click="clear">插槽</button>
</template>
</x-pay-pwd>
```
```
export default {
methods: {
// 监听输入框内容变化
change({password}){
console.log(password)
},
// 清空输入框内容,一般用于密码输错手动清空
clear(){
this.$refs.xPayPwd._clearKey();
}
}
}
```
# 属性
| 字段 | 类型 | 默认 | 描述 |
| --------- | ------- | -------------- | ---------------------------------------- |
| type | Number | 1 | 0原生键盘 1自定义键盘 |
| maskClick | Boolean | true | 是否允许点击蒙版 |
| top | String | 20vh | 中间内容的top值为absolute的top值 |
| bottom | String | 0rpx | 中间内容的bottom值为absolute的bottom值 |
| showClose | Boolean | true | 是否显示关闭按钮 |
| showHead | Boolean | true | 是否显示标题 |
| headText | String | 请输入支付密码 | 标题文本 |
# 事件
| 事件名 | 默认参数 | 描述 |
| ------ | ---------- | -------------------------------- |
| change | {password} | 监听内容输入,参数返回输入的内容 |
# 组件方法
| 方法名 | 描述 |
| ------ | -------------------------------- |
| _open | 打开弹窗 |
| _close | 关闭弹窗 |
| _clearnKey | 请空输入内容 |
# 注意
```
ios下输入框不会自动获取焦点需要手动点击输入区域
```
# 参与贡献
+ xueshuai(xueshuai_12@163.com)
+ Emailxueshuai_12@163.com
+ GitHubGitHub地址
+ QQ交流群1063233592
+ 个人博客:(薛小帅)[http://blog.xueshuai.top]
+ 个人公众号叮当Ding
![叮当Ding](https://img-blog.csdnimg.cn/20210202143040150.png)

View File

@@ -0,0 +1,184 @@
<template>
<view class="goods-item">
<view class="bg"> {{item.shop_vip.message}} </view>
<image :src="item.cover" mode="aspectFill" class="goods-cover" />
<view class="tags"> VIP </view>
<view class="goods-info">
<view class="_title">{{item.name}}</view>
<view class="_des"> {{item.shop.name}} </view>
<view class="_pin" v-if="item.sales>0">
<view class="_has">
<image src="/static/book/fire.png" mode="widthFix" class="fire" /> 已换购 {{item.sales}}
</view>
</view>
<view class="price">
<view class="money">
{{item.price.price_min}} <span>DT积分</span>
<span class='del'>{{item.original_price}} DT积分</span>
</view>
<view class="now-pin" @click="goPin(item.goods_id)">立即领取</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {};
},
props: {
item: {
type: Object,
default: {},
}
},
methods: {
goPin(id) {
this.$emit('goPin', id)
}
},
};
</script>
<style lang="scss" scoped>
.goods-item {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
background-color: white;
border-radius: 10rpx;
padding: $padding;
margin-bottom: 20rpx;
position: relative;
z-index: 0;
overflow: hidden;
.bg {
position: absolute;
top: -40rpx;
right: -10rpx;
opacity: 0.05;
font-size: 130rpx;
color: #999;
z-index: 1;
font-weight: bold;
}
.tags {
position: absolute;
top: 6rpx;
left: -54rpx;
background: #d81e06;
color: #fff;
width: 150rpx;
font-size: 24rpx;
padding: 4rpx 0;
text-align: center;
transform: rotate(-45deg);
font-weight: bold;
letter-spacing: 2rpx;
}
.goods-cover {
width: 160rpx;
height: 160rpx;
border-radius: 10rpx;
}
.goods-info {
width: calc(100% - 160rpx - 30rpx);
padding-left: $padding;
._title {
overflow: hidden;
font-size: 30rpx;
font-weight: 600;
white-space: nowrap;
text-overflow: ellipsis;
}
._des {
font-size: 26rpx;
padding: 10rpx 0;
margin-bottom: 4rpx;
color: #4f300a;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
}
._pin {
font-size: 26rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
color: $text-gray;
._has {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
color: #d81e06;
background-color: rgba($color: $text-price, $alpha: 0.1);
padding: 4rpx 10rpx;
border-radius: 30rpx;
image {
width: 24rpx;
height: 24rpx;
margin-right: 10rpx;
}
}
.tuan {
margin-left: $margin;
}
}
.price {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding-top: 20rpx;
.money {
font-size: 34rpx;
font-weight: 600;
color: #d81e06;
span {
font-size: 24rpx;
margin-left: 10rpx;
font-weight: normal;
}
.del {
text-decoration: line-through;
margin-left: 10rpx;
font-size: 24rpx;
color: #999;
font-weight: normal;
}
}
.now-pin {
background-color: #d81e06;
font-size: 28rpx;
font-weight: bold;
padding: 6rpx 20rpx;
border-radius: 20rpx;
color: #fff;
}
}
}
}
</style>

View File

@@ -47,6 +47,9 @@
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
"<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
"<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",

View File

@@ -154,9 +154,21 @@
"path": "pages/store/list",
"name": "StoreList",
"style": {
"navigationBarTitleText": "商品",
"navigationBarTitleText": "更多商品",
"navigationBarBackgroundColor": "#FFFFFF",
"enablePullDownRefresh": true
"enablePullDownRefresh": true,
"app-plus": {
"titleNView": {
"backgroundColor": "#fff",
"buttons": [{
"float": "right",
"text": "\ue603",
"fontSrc": "/static/iconfont.ttf",
"color": "#000",
"fontSize": "20px"
}]
}
}
}
},
{
@@ -447,7 +459,7 @@
"color": "#696969",
"type": "none",
"fontSrc": "/static/fonts/iconfont1.ttf",
"text": "\ue608" //小相机
"text": "\ue608"
}]
}
}
@@ -520,16 +532,16 @@
"style": {
"navigationBarTitleText": "公告详情",
"enablePullDownRefresh": false,
"navigationBarBackgroundColor": "#FFFFFF",
"app-plus": {
"titleNView": {
"buttons": [{
"text": "分享",
"fontSize": "14",
"width": "60px",
"color": "#333"
}]
}
"navigationBarBackgroundColor": "#FFFFFF",
"app-plus": {
"titleNView": {
"buttons": [{
"text": "分享",
"fontSize": "14",
"width": "60px",
"color": "#333"
}]
}
}
}
}, {
@@ -541,6 +553,43 @@
}
}
,{
"path" : "pages/store/vip/index/index",
"style" :
{
"navigationBarTitleText": "***店铺会员",
"enablePullDownRefresh": false
}
}
,{
"path" : "pages/user/my-card/my-card",
"name": "MyCard",
"style" :
{
"navigationBarTitleText": "我的卡券",
"enablePullDownRefresh": false
}
}
,{
"path" : "pages/group-book/success/success",
"style" :
{
"navigationBarTitleText": "拼单更多",
"enablePullDownRefresh": false
}
}
,{
"path" : "pages/store/vip-list/vip-list",
"name": "VipList",
"style" :
{
"navigationBarTitleText": "VIP换购中心",
"enablePullDownRefresh": false
}
}
],
"tabBar": {
"borderStyle": "white",
@@ -580,14 +629,14 @@
"easycom": {
"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
},
"condition" : { //模式配置,仅开发期间生效
"current": 0, //当前激活的模式(list 的索引项)
"condition" : {
"current": 0,
"list": [
{
"name": "", //模式名称
"path": "", //启动页面,必选
"query": "" //启动参数在页面的onLoad函数里面得到
"name": "",
"path": "",
"query": ""
}
]
}
}
}

View File

@@ -16,7 +16,7 @@
<u-empty
icon="http://cdn.uviewui.com/uview/empty/list.png"
textColor="#999"
text="暂无任何拼单商品~"
text="暂无拼单商品~"
/>
</view>
</scroll-view>

View File

@@ -0,0 +1,235 @@
<template>
<view class="pinSuccess">
<view class="count-down">
<u-count-down ref="countDown" :time="downTime" format="HH:mm:ss" :autoStart="true" millisecond/>
</view>
<view class="title"> 还差 <span>{{surplus}}</span> 赶紧邀请好友来拼单吧 </view>
<view class="btn invite"> 邀请好友拼单 </view>
<view class="btn index" @click="goIndex"> 去首页逛逛</view>
<view class="goodInfo">
<view class="avatars">
<block v-for="(item,index) in details" :key='index'>
<image class="avatar pin" :src="item.cover" mode="aspectFill" />
</block>
<image class="wen" src="/static/book/wen.png" mode="aspectFill" />
</view>
<block>
<view class="orderInfo">
<view class="left"> 订单详情 </view>
<view class="right" @click="goDetail">
<view class="right-title"> {{goodName}} </view>
<u-icon name="arrow-right" />
</view>
</view>
<view class="orderInfo">
<view class="left"> 拼单规则 </view>
<view class="right">
<view class="right-title">人满发货 · 人不满退款 · 只能拼一次 </view>
</view>
</view>
</block>
</view>
</view>
</template>
<script>
import {
repages
} from '@/apis/interfaces/store.js'
export default {
data() {
return {
goodName: '',
details: [],
downTime: 0,
surplus: 1,
order: {}, // order 是{} 标识不是我的订单,否则就是我的订单可以跳转订单详情
};
},
onLoad() {
repages(this.$Route.query.id).then(res => {
this.order = res.order
this.goodName = res.order.goods.name
this.downTime = res.share.down * 1000
this.surplus = res.share.surplus
this.details = res.share.details
}).catch(err => {
uni.showToast({
title: err.message,
icon: "none",
mask: true,
duration: 3000
})
})
},
onHide() {
try {
if(this.$refs.countDown){
this.$refs.countDown.pause()
}
} catch (err) {
uni.showToast({
title: err,
icon: 'none'
})
}
},
methods: {
goIndex() {
uni.reLaunch({
url: '/pages/store/index'
})
},
goDetail(){
if(!this.order.order_no){
console.log('不是我的跳商品详情')
uni.navigateTo({
url:'/pages/store/goods?id='+this.order.goods.goods_id
})
}else{
console.log('是我的跳转订单详情')
}
}
}
}
</script>
<style lang="scss">
.pinSuccess {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
box-sizing: border-box;
.count-down {
background-color: #f9f9f9;
border-radius: 4rpx;
padding: 10rpx $padding;
margin-top: $margin;
}
.title {
font-size: 38rpx;
font-weight: bold;
margin-top: $margin * 2;
span {
color: $main-color;
font-size: 42rpx;
padding: 0 10rpx;
}
}
.btn {
width: 80%;
background-color: $main-color;
color: #fff;
text-align: center;
padding: $padding - 4;
font-size: 34rpx;
border-radius: 10rpx;
margin-top: $margin;
border: solid $main-color 3rpx;
}
.invite {
margin-top: $margin + 20;
}
.index {
background-color: rgba($color: #fff, $alpha: 1.0);
color: $main-color;
}
.goodInfo {
border-top: solid 20rpx #f9f9f9;
width: 100%;
margin-top: $margin + 20;
padding: $padding + 10;
box-sizing: border-box;
.avatars {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
position: relative;
border-bottom: solid 1rpx #f9f9f9;
padding-bottom: $padding;
image {
width: 90rpx;
height: 90rpx;
border-radius: 50%;
margin: 10rpx 20rpx;
border: solid 2rpx #f9f9f9;
}
.me {
position: relative;
&::after {
position: absolute;
top: 0;
left: 0;
content: '我';
border-radius: 20rpx;
background: $main-color;
padding: 4rpx 34rpx;
text-align: center;
font-size: 24rpx;
color: #fff;
}
}
.pin {
position: relative;
&::after {
position: absolute;
top: 0;
left: 0;
content: '拼主';
// border-radius: 20rpx;
background: orange;
padding: 4rpx 0;
font-size: 20rpx;
width: 100%;
text-align: center;
color: #fff;
}
}
}
.orderInfo {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding: 30rpx 0;
font-size: 26rpx;
color: #666;
border-bottom: solid 1rpx #f9f9f9;
.right {
flex: 1;
margin-left: $margin;
text-align: right;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-end;
box-sizing: border-box;
.right-title {
margin-right: 10rpx;
color: #999;
}
}
}
}
}
</style>

View File

@@ -6,17 +6,20 @@
</view>
</template>
<script>
<script>
import payKeyboard from '@/components/mi-payKeyboard/mi-payKeyboard.vue'
import eventBus from '../../utils/eventBus.js';
import {
wxPAY,
alPAY,
dtPAY,
collagePAY,
payIndex
} from '@/apis/interfaces/pay'
export default {
components: { payKeyboard },
export default {
components: {
payKeyboard
},
data() {
return {
payNo: "",
@@ -26,8 +29,9 @@
oepnType: '',
canpay: true,
has_transfer_password: true,
password: '',
password: '',
showKeyBoard: false,
type: '',
}
},
mounted() {
@@ -36,7 +40,9 @@
if (this.$Route.query.oepnType === 'order') {
this.oepnType = this.$Route.query.oepnType
}
if (this.$Route.query.type) {
this.type = this.$Route.query.type
}
},
onShow() {
this.payIndex();
@@ -109,23 +115,27 @@
}
},
// 输入正确的回调
enterSuccess(password) {
this.password = password
this.showKeyBoard = false
this.getDTPAY();
},
// 点击[取消] 关闭输入框 的回调
close(){
this.showKeyBoard = false;
this.canpay = true;
// 输入正确的回调
enterSuccess(password) {
this.password = password
this.showKeyBoard = false
this.getDTPAY();
},
// 点击[取消] 关闭输入框 的回调
close() {
this.showKeyBoard = false;
this.canpay = true;
},
// 调用 dt 支付
getDTPAY() {
if (this.canpay) {
this.canpay = false
dtPAY(this.payNo, this.password).then(res => {
this.canpay = false
let requestUrl = dtPAY
if (this.type === 'pin') {
requestUrl = collagePAY
}
requestUrl(this.payNo, this.password).then(res => {
if (res.state === 'warning') {
uni.showModal({
title: '当前DT积分不足',
@@ -162,27 +172,64 @@
}
})
} else {
uni.showModal({
title: '支付成功',
content: '该订单已支付成功',
confirmText: '我的订单',
confirmColor: "#34CE98",
cancelText: '再逛逛',
cancelColor: "#666666",
success: (res) => {
if (res.confirm) {
this.$Router.push({
name: "Order",
params: {
index: 0
},
})
} else {
uni.navigateBack();
}
this.canpay = true
if (this.type === 'pin') {
console.log('pin........', res)
this.canpay = true
if (res.detailId) {
uni.showLoading({
title:'跳转中',
mask:true,
})
setTimeout(() => {
uni.hideLoading()
uni.navigateTo({
url: '/pages/group-book/success/success?id=' + res.detailId
})
}, 2000)
} else {
uni.showModal({
title: '温馨提示',
content: '该订单拼团成功',
confirmText: '查看订单',
confirmColor: "#34CE98",
cancelText: '再逛逛',
cancelColor: "#666666",
success: (res) => {
if(res.confirm){
console.log('挑战到我的拼单列表')
} if(res.cancel){
uni.navigateTo({
url:'/pages/store/index'
})
}
}
})
}
})
} else {
uni.showModal({
title: '支付成功',
content: '该订单已支付成功',
confirmText: '我的订单',
confirmColor: "#34CE98",
cancelText: '再逛逛',
cancelColor: "#666666",
success: (res) => {
if (res.confirm) {
this.$Router.push({
name: "Order",
params: {
index: 0
},
})
} else {
uni.navigateBack();
}
this.canpay = true
}
})
}
}
}

View File

@@ -1,114 +1,113 @@
<template>
<view class="rank">
<view class="rank_top">
<view class="rank_top_left">
<image class="rank_title" src="../../static/rank/rank_txt.png" mode="widthFix" />
<view class="rank_sub_title" @click="toHelp"> 共力家族 周会员邀请 <image src="/static/rank/help.png" mode="widthFix" /> </view>
</view>
<image class="rank_top_right" src="../../static/rank/rank.png" mode="widthFix" />
<template>
<view class="rank">
<view class="rank_top">
<view class="rank_top_left">
<image class="rank_title" src="../../static/rank/rank_txt.png" mode="widthFix" />
<view class="rank_sub_title" @click="toHelp"> 共力家族 周会员邀请 <image src="/static/rank/help.png" mode="widthFix" /> </view>
</view>
<image class="rank_top_right" src="../../static/rank/rank.png" mode="widthFix" />
</view>
<!-- @click="click" -->
<u-sticky bgColor="#34CE98">
<u-tabs
:list="tabs"
lineColor="white"
:activeStyle="{color: 'white', fontWeight: 'bold', fontSize: '14px'}"
:inactiveStyle="{color: 'rgba(255,255,255,.6)', fontSize: '14px'}"
:itemStyle="{'height': '50px'}"
@click="onTabs"
></u-tabs>
<u-tabs
:list="tabs"
lineColor="white"
:activeStyle="{color: 'white', fontWeight: 'bold', fontSize: '15px'}"
:inactiveStyle="{color: 'rgba(255,255,255,.6)', fontSize: '15px'}"
:itemStyle="{'height': '50px'}"
@click="onTabs"
/>
</u-sticky>
<view class="rank_update_time" v-if="type != '3'&& type != '4'">
<view class="title"> 加成{{type === '1'?'结束':'生效'}}倒计时:</view>
<view class="rank_update_time" v-if="type != '3' && type != '4' && end_timestamp">
<view class="title"> 加成{{type === '1'?'结束':'生效'}}倒计时:</view>
<u-count-down
ref="countDown"
format="DD:HH:mm:ss"
:time="end_timestamp"
:autoStart="false"
@change="downTime"
>
<view class="time">
<view class="time__item">
<text class="time__item_no">{{ timeData.days > 9 ? timeData.days: '0' + timeData.days }} </text>
</view>
<view class="time__item">
<text class="time__item_no">{{ timeData.hours > 9 ? timeData.hours : '0' + timeData.hours}}</text>
</view>
<view class="time__item">
<text class="time__item_no">{{ timeData.minutes > 9 ? timeData.minutes : '0' + timeData.minutes}}</text>
</view>
<view class="time__item">
<text class="time__item_no">{{ timeData.seconds > 9 ? timeData.seconds : '0' + timeData.seconds}}</text>
</view>
</view>
</u-count-down>
</view>
<view class="list">
<block v-if="lists.length>0">
<view class="list_item" v-for="(item,index) in lists" :keys='index'>
<view class="no">
<image v-if="index < 3" class="image" :src="'/static/rank/rank-'+(index+1)+'.png'"
mode="widthFix" />
<view v-else class="txt"> {{index + 1}} </view>
</view>
<view class="user_info">
<view class="user">
<image class="avatar" :src="item.avatar" mode="aspectFill" />
<view class="nickname"> {{item.nickname}} </view>
<view class="wight" v-if="type === '1'">+{{item.rate}}%</view>
</view>
<view class="tuijian">
<view class="num"> {{item.number}}</view>
<view class="title">{{type === '4'?'邀请用户':'邀请会员'}}</view>
</view>
</view>
</view>
</block>
<block v-else>
<view class="vertical pages-empty">
>
<view class="time">
<view class="time__item">
<text class="time__item_no">{{ timeData.days > 9 ? timeData.days: '0' + timeData.days }} </text>
</view>
<view class="time__item">
<text class="time__item_no">{{ timeData.hours > 9 ? timeData.hours : '0' + timeData.hours}}</text>
</view>
<view class="time__item">
<text class="time__item_no">{{ timeData.minutes > 9 ? timeData.minutes : '0' + timeData.minutes}}</text>
</view>
<view class="time__item">
<text class="time__item_no">{{ timeData.seconds > 9 ? timeData.seconds : '0' + timeData.seconds}}</text>
</view>
</view>
</u-count-down>
</view>
<view class="list">
<block v-if="lists.length>0">
<view class="list_item" v-for="(item,index) in lists" :keys='index'>
<view class="no">
<image v-if="index < 3" class="image" :src="'/static/rank/rank-'+(index+1)+'.png'"
mode="widthFix" />
<view v-else class="txt"> {{index + 1}} </view>
</view>
<view class="user_info">
<view class="user">
<image class="avatar" :src="item.avatar" mode="aspectFill" />
<view class="nickname"> {{item.nickname}} </view>
<view class="wight" v-if="type === '1'">+{{item.rate}}%</view>
</view>
<view class="tuijian">
<view class="num"> {{item.number}}</view>
<view class="title">{{type === '4'?'邀请用户':'邀请会员'}}</view>
</view>
</view>
</view>
</block>
<block v-else>
<view class="vertical pages-empty">
<u-empty
icon="http://cdn.uviewui.com/uview/empty/list.png"
textColor="#999"
:text="type === '1'?'上周无加成数据':'当前暂无邀请数据'">
</u-empty>
</view>
</block>
</view>
</view>
</template>
<script>
import {
week,
week_mul,
total,
totaluser
} from '@/apis/interfaces/rank.js'
export default {
data() {
return {
end_timestamp: 0,
lists : [],
textColor="#999"
:text="type === '1'?'上周无加成数据':'当前暂无邀请数据'">
</u-empty>
</view>
</block>
</view>
</view>
</template>
<script>
import {
week,
week_mul,
total,
totaluser
} from '@/apis/interfaces/rank.js'
export default {
data() {
return {
end_timestamp: 0,
lists : [],
timeData : {
days : 0,
hours : 0,
minutes : 0,
seconds : 0
},
type : '1', // 1加成榜 2邀请榜 3会员邀请 4用户邀请
},
type : '1', // 1加成榜 2邀请榜 3会员邀请 4用户邀请
page_id : '',
tabs : [
{name: '上周加成榜', type: '1'},
{name: '本周邀请榜', type: '2'},
{name: '会员邀请榜', type: '3'},
{name: '用户邀请榜', type: '4'},
],
}
},
onShow() {
this.getList();
},
],
}
},
onShow() {
this.getList();
},
methods: {
onTabs(e){
if(this.type == e.type){
@@ -125,26 +124,26 @@
this.getList()
},
downTime(e) {
this.timeData = e
this.timeData = e
},
toHelp() {
uni.navigateTo({
url: 'pages/vip/agreement?id=' + this.page_id
})
},
getList() {
let urlRequest = ''
if (this.type === '1') {
urlRequest = week_mul
} else if (this.type === '2') {
urlRequest = week
} else if (this.type === '4') {
urlRequest = totaluser
} else {
urlRequest = total
}
urlRequest().then(res => {
this.lists = res.rand;
toHelp() {
uni.navigateTo({
url: 'pages/vip/agreement?id=' + this.page_id
})
},
getList() {
let urlRequest = ''
if (this.type === '1') {
urlRequest = week_mul
} else if (this.type === '2') {
urlRequest = week
} else if (this.type === '4') {
urlRequest = totaluser
} else {
urlRequest = total
}
urlRequest().then(res => {
this.lists = res.rand;
this.page_id = res.page_id;
this.end_timestamp = res.end_timestamp * 1000;
this.$nextTick(() => {
@@ -152,15 +151,15 @@
this.$refs.countDown.start()
}
})
uni.hideLoading()
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none',
mask: true
})
})
}
uni.hideLoading()
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none',
mask: true
})
})
}
},
onHide() {
try {
@@ -173,70 +172,69 @@
icon: 'none'
})
}
}
}
</script>
<style lang="scss">
.rank {
.rank_top {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
background-color: #34CE98;
padding: 50rpx 30rpx 40rpx 30rpx;
border-bottom: solid 1rpx rgba($color: #fff, $alpha: 0.6);
.rank_top_left {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
box-sizing: border-box;
.rank_title {
width: 360rpx;
}
.rank_sub_title {
font-size: 28rpx;
font-weight: 500;
color: white;
padding-left: 20rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
margin-top: 10rpx;
image {
width: 32rpx;
margin-left: 6rpx;
}
}
}
.rank_top_right {
width: 280rpx;
}
}
}
</script>
<style lang="scss">
.rank {
.rank_top {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
background-color: #34CE98;
padding: 50rpx 30rpx 40rpx 30rpx;
border-bottom: solid 1rpx rgba($color: #fff, $alpha: 0.6);
.rank_top_left {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
box-sizing: border-box;
.rank_title {
width: 360rpx;
}
.rank_sub_title {
font-size: 28rpx;
font-weight: 500;
color: white;
padding-left: 20rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
margin-top: 10rpx;
image {
width: 32rpx;
margin-left: 6rpx;
}
}
}
.rank_top_right {
width: 280rpx;
}
}
.rank_update_time {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
padding: 50rpx 30rpx;
.rank_update_time {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
padding: 50rpx 30rpx;
width: 100%;
border-bottom: 20rpx solid $window-color;
.title {
font-size: 28rpx;
font-weight: normal;
border-bottom: 20rpx solid $window-color;
.title {
font-size: 28rpx;
font-weight: normal;
color: #34CE98;
padding-right: 10rpx;
padding-right: 10rpx;
}
.time{
display: flex;
@@ -253,109 +251,109 @@
text-align: center;
margin: 0 10rpx;
}
}
}
}
.list {
padding: 30rpx;
.list_item {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
.no {
width: 80rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
.image {
width: 54rpx;
}
.txt {
font-weight: 600;
font-size: 34rpx;
color: #333;
}
}
.user_info {
flex: 1;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
border-bottom: solid 1rpx #f9f9f9;
padding: 30rpx 20rpx 30rpx 0;
margin-left: 30rpx;
.user {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
.avatar {
width: 90rpx;
height: 90rpx;
border-radius: 50%;
margin-right: 30rpx;
}
.nickname {
font-size: 30rpx;
color: #333;
max-width: 200rpx;
font-weight: bold;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
}
.wight {
font-size: 26rpx;
font-weight: normal;
margin-left: 20rpx;
background-color: #bdc6d7;
color: #fff;
border-radius: 30rpx;
padding: 0 10rpx;
}
}
}
.tuijian {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
box-sizing: border-box;
.num {
color: #999;
font-size: 30rpx;
}
.title {
font-size: 22rpx;
color: #999;
}
}
}
}
}
.list {
padding: 30rpx;
.list_item {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
.no {
width: 80rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
.image {
width: 54rpx;
}
.txt {
font-weight: 600;
font-size: 34rpx;
color: #333;
}
}
.user_info {
flex: 1;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
border-bottom: solid 1rpx #f9f9f9;
padding: 30rpx 20rpx 30rpx 0;
margin-left: 30rpx;
.user {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
.avatar {
width: 90rpx;
height: 90rpx;
border-radius: 50%;
margin-right: 30rpx;
}
.nickname {
font-size: 30rpx;
color: #333;
max-width: 200rpx;
font-weight: bold;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
}
.wight {
font-size: 26rpx;
font-weight: normal;
margin-left: 20rpx;
background-color: #bdc6d7;
color: #fff;
border-radius: 30rpx;
padding: 0 10rpx;
}
}
}
.tuijian {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
box-sizing: border-box;
.num {
color: #999;
font-size: 30rpx;
}
.title {
font-size: 22rpx;
color: #999;
}
}
}
}
}
</style>

View File

@@ -1,338 +1,476 @@
<template>
<view class="content">
<!-- address -->
<block v-if="address != ''">
<view class="block address" @click="$Router.push({name: 'Address'})">
<uni-icons class="address-icon location" type="location-filled" size="24" color="#34CE98"></uni-icons>
<uni-icons class="address-icon arrows" type="right" size="20" color="#999"></uni-icons>
<view class="user"><text>{{address.name}}</text>{{address.mobile}}</view>
<view class="city">{{address.full_address}}</view>
</view>
</block>
<block v-else>
<view class="block address-new" @click="$Router.push({name: 'Address'})">
<uni-icons class="icon" type="plus" size="26" color="#34CE98"></uni-icons>添加收货地址
</view>
</block>
<!-- 订单产品 -->
<view class="block goods-box">
<block v-for="(item, index) in goodsInfo" :key="index">
<view class="goods-item">
<image class="order-cover" :src="item.items[0].cover" mode="aspectFill"></image>
<view class="order-title">
<view class="title"> {{item.items[0].title}}</view>
<view class="subtitle" v-if="item.items[0] && item.items[0].value"> {{item.items[0].value}} </view>
</view>
<view class="order-count">
<view class="order-price">{{item.items[0].price}}<text class="type">DT积分</text></view>
</view>
</view>
</block>
</view>
<!-- 订单信息 -->
<view class="block info-box">
<view class="info-item">
<view class="label">购买数量</view>
<uni-number-box class="info-number" :value="qty" :min="1" :max="999" @change="numberChange" />
</view>
<view class="info-item">
<view class="label">配送方式</view>
<view class="nowrap">快递</view>
</view>
<view class="info-item">
<view class="label">配送费用</view>
<view class="nowrap">{{freight == 0 ? '免费': freight}}</view>
</view>
</view>
<view class="block info-box">
<view class="info-item">
<view class="label">订单备注</view>
<textarea class="info-textarea" v-model="remark" placeholder="请输入备注"></textarea>
</view>
</view>
<!-- footer -->
<view class="order-footer">
<view class="total">总计<text>{{total}} <text class="type">DT积分</text></text></view>
<button class="btn" @click="subOrder">确认订单</button>
</view>
</view>
</template>
<script>
import { buy, verify } from '@/apis/interfaces/store'
export default {
data() {
return {
qty : 0,
goodsInfo : [],
total : 0,
freight : 0,
address : "",
remark : "",
canApply :true
};
},
onShow(){
if(JSON.stringify(this.$store.getters.getAddress) !== '{}') this.address = this.$store.getters.getAddress
this.qty= this.$Route.query.qty;
},
mounted() {
this.getBuy()
},
methods:{
getBuy(){
buy({
goods_sku_id: this.$Route.query.skuId,
qty: this.qty
}).then(res => {
this.address = res.address
this.freight = res.freight
this.total = res.total
this.goodsInfo = res.detail
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
numberChange(e){
this.qty = e
this.getBuy()
},
// 确认订单
subOrder(){
if(this.address === ""){
uni.showModal({
title : '提示',
content : '暂未添加收货地址,无法下单',
showCancel : true,
confirmText : '添加',
success : res => {
if(res.confirm){
this.$Router.push({name: 'Address'})
}
}
})
return
}
if(this.canApply){
<template>
<view class="content">
<!-- address -->
<block v-if="address != ''">
<view class="block address" @click="$Router.push({name: 'Address'})">
<uni-icons class="address-icon location" type="location-filled" size="24" color="#34CE98"></uni-icons>
<uni-icons class="address-icon arrows" type="right" size="20" color="#999"></uni-icons>
<view class="user"><text>{{address.name}}</text>{{address.mobile}}</view>
<view class="city">{{address.full_address}}</view>
</view>
</block>
<block v-else>
<view class="block address-new" @click="$Router.push({name: 'Address'})">
<uni-icons class="icon" type="plus" size="26" color="#34CE98"></uni-icons>添加收货地址
</view>
</block>
<!-- 订单产品 -->
<view class="block goods-box">
<block v-for="(item, index) in goodsInfo" :key="index">
<view class="goods-item">
<image class="order-cover" :src="item.items[0].cover" mode="aspectFill"></image>
<view class="order-title">
<view class="title"> {{item.items[0].title}}</view>
<view class="subtitle" v-if="item.items[0] && item.items[0].value"> {{item.items[0].value}}
</view>
</view>
<view class="order-count">
<view class="order-price">{{item.items[0].price}}<text class="type">DT积分</text></view>
</view>
</view>
</block>
</view>
<!-- 订单信息 -->
<view class="block info-box">
<view class="info-item">
<view class="label">购买数量</view>
<uni-number-box class="info-number" :value="qty" :min="1" :max="limit" @change="numberChange" />
</view>
<view class="info-item">
<view class="label">配送方式</view>
<view class="nowrap">快递</view>
</view>
<view class="info-item">
<view class="label">配送费用</view>
<view class="nowrap">{{freight == 0 ? '免费': freight}}</view>
</view>
</view>
<view class="block info-box">
<view class="info-item">
<view class="label">订单备注</view>
<textarea class="info-textarea" v-model="remark" placeholder="请输入备注"></textarea>
</view>
</view>
<!-- footer -->
<view class="order-footer">
<view class="total">总计<text>{{total}} <text class="type">DT积分</text></text></view>
<button class="btn" @click="subOrder">确认订单</button>
</view>
</view>
</template>
<script>
import {
buy,
buyPin,
verify,
collages,
} from '@/apis/interfaces/store'
export default {
data() {
return {
qty: 0,
goodsInfo: [],
total: 0,
freight: 0,
address: "",
remark: "",
canApply: true,
limit:0,
type: '', // 是否为空
};
},
onShow() {
if (JSON.stringify(this.$store.getters.getAddress) !== '{}') this.address = this.$store.getters.getAddress
this.qty = this.$Route.query.qty;
},
onLoad() {
if (this.$Route.query.type === 'pin') {
this.type = 'pin'
}
this.getBuy()
},
methods: {
getBuy() {
console.log(this.type === 'pin')
if (this.type == 'pin') {
let data = {
goods_sku_id: this.$Route.query.skuId,
collage_id:this.$Route.query.collageid || '',
}
console.log(data);
buyPin(data).then(res => {
this.address = res.address
this.freight = res.freight
this.total = res.total
this.goodsInfo = res.detail
this.limit = res.limit
}).catch(err => {
uni.showModal({
title: '温馨提示',
content: err.message,
showCancel: false,
confirmColor: '#34CE98',
cancelText: '知道了',
success: (res) => {
uni.navigateBack({})
}
})
})
} else {
buy({
goods_sku_id: this.$Route.query.skuId,
qty: this.qty
}).then(res => {
this.address = res.address
this.freight = res.freight
this.total = res.total
this.goodsInfo = res.detail
this.limit = res.limit
}).catch(err => {
uni.showModal({
title: '温馨提示',
content: err.message,
showCancel: false,
confirmColor: '#34CE98',
cancelText: '知道了',
success: (res) => {
uni.navigateBack({})
}
})
})
}
},
numberChange(e) {
this.qty = e
this.getBuy()
},
// 确认订单
subOrder() {
if (this.address === "") {
uni.showModal({
title: '提示',
content: '暂未添加收货地址,无法下单',
showCancel: true,
confirmText: '添加',
success: res => {
if (res.confirm) {
this.$Router.push({
name: 'Address'
})
}
}
})
return
}
if (this.canApply) {
this.canApply = false;
verify({
goods_sku_id: this.$Route.query.skuId,
qty : this.qty,
address_id : this.address.address_id,
remark : this.remark || ''
}).then(res => {
this.$store.commit('setAddress', {})
this.$Router.replace({
name: 'Pay',
params: {
orderNo: res.order_no,
price : res.total,
coins : res.coins,
}
})
this.canApply = true
}).catch(err=>{
this.canApply = true
})
}else{
this.canApply = true
}
}
}
}
</script>
<style lang="scss" scoped>
.content{
background: $window-color;
min-height: 100vh;
overflow: hidden;
padding-bottom: $padding + 80;
box-sizing: border-box;
}
.block{
background: white;
margin: $margin;
border-radius: $radius;
}
// 地址管理
.address{
position: relative;
padding: $padding 80rpx $padding 90rpx;
font-size: $title-size-lg;
.user{
font-size: $title-size;
line-height: 40rpx;
color: $text-gray;
text{
color: black;
max-width: 200rpx;
display: inline-block;
margin-right: $margin/2;
}
}
.city{
padding-top: $padding/2;
font-size: $title-size-sm;
color: $text-gray;
line-height: 36rpx;
}
.address-icon{
position: absolute;
top: 50%;
&.location{
margin-top: -26rpx;
left: $margin - 10;
}
&.arrows{
margin-top: -20rpx;
right: $margin - 10;
}
}
}
.address-new{
padding: $padding;
text-align: center;
height: 90rpx;
line-height: 90rpx;
color: $main-color;
.icon{
vertical-align: middle;
margin-bottom: 8rpx;
margin-right: 10rpx;
}
}
// 订单列表
.goods-item{
display: flex;
align-items: center;
padding: $padding;
.order-cover{
vertical-align: top;
width: 128rpx;
height: 128rpx;
}
.order-title{
flex: 1;
padding-left: $margin;
// line-height: 40rpx;
.title{
font-size: 28rpx;
@extend .ellipsis;
text-align: left;
}
.subtitle{
font-size: 26rpx;
color: #666;
padding-top: 10rpx;
}
}
.order-count{
text-align: right;
padding-left: $margin;
line-height: 40rpx;
.order-price{
font-size: 32rpx;
font-weight: bold;
color: $text-price;
&>text{
font-size: 24rpx;
}
}
.type{
font-size: 22rpx;
padding-left: 6rpx;
}
.order-sum{
font-size: $title-size-sm;
color: $text-gray;
}
}
}
// 订单信息
.info-box{
.info-item{
position: relative;
padding: $padding $padding $padding 200rpx;
font-size: $title-size-m;
min-height: 40rpx;
text-align: right;
.label{
position: absolute;
left: $margin;
top: $margin;
color: $text-gray;
}
.info-textarea{
height: 120rpx;
width: 100%;
text-align: left;
font-size: $title-size-m;
}
&::after{
position: absolute;
left: $margin;
right: $margin;
content: " ";
height: 1rpx;
bottom: 0;
background: $border-color;
}
&:last-child::after{
display: none;
}
}
}
// footer
.order-footer{
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: $padding;
background: white;
border-radius: $radius $radius 0 0;
box-shadow: 0 0 10rpx 10rpx rgba($color: #000000, $alpha: .02);
z-index: 99;
display: flex;
.total{
line-height: 80rpx;
font-size: $title-size-lg;
font-weight: bold;
width: calc(100% - 300rpx - #{$margin});
color: $text-gray;
font-weight: normal;
@extend .nowrap;
text{
color: $text-price;
font-size: $title-size-lg;
font-weight: bold;
}
.type{
font-size: 22rpx;
padding-left: 6rpx;
}
}
.btn{
margin-left: $margin;
width: 300rpx;
height: 80rpx;
padding: 0;
line-height: 80rpx;
font-size: $title-size-lg;
border-radius: 40rpx;
background: $main-color;
color: white;
font-weight: bold;
&::after{
display: none;
}
}
}
if (this.type == 'pin'){
collages({
goods_sku_id: this.$Route.query.skuId,
collage_id:this.$Route.query.collageid || '',
address_id: this.address.address_id,
remark: this.remark || ''
}).then(res => {
console.log(res)
this.$store.commit('setAddress', {})
this.$Router.replace({
name: 'Pay',
params: {
orderNo: res.order_no,
price: res.total,
coins: res.coins,
type:'pin'
}
})
this.canApply = true
}).catch(err => {
this.canApply = true
uni.showToast({
title: err.message,
icon: "none",
mask: true,
duration: 2000
})
})
}else{
verify({
goods_sku_id: this.$Route.query.skuId,
qty: this.qty,
address_id: this.address.address_id,
remark: this.remark || ''
}).then(res => {
console.log(res)
if (res.order_no === '') {
uni.showModal({
title: ' 温馨提示',
content: '领取商品成功',
confirmColor: '#34CE98',
confirmText: ' 查看订单',
cancelColor: '#999',
cancelText: '返回首页',
success: (res) => {
if (res.confirm) {
uni.navigateTo({
url: '/pages/order/index?index=0'
})
}
if (res.cancel) {
uni.reLaunch({
url: '/pages/store/index'
})
}
}
})
} else {
this.$store.commit('setAddress', {})
this.$Router.replace({
name: 'Pay',
params: {
orderNo: res.order_no,
price: res.total,
coins: res.coins,
}
})
}
this.canApply = true
}).catch(err => {
this.canApply = true
uni.showToast({
title: err.message,
icon: "none",
mask: true,
duration: 2000
})
})
}
} else {
this.canApply = true
}
}
}
}
</script>
<style lang="scss" scoped>
.content {
background: $window-color;
min-height: 100vh;
overflow: hidden;
padding-bottom: $padding + 80;
box-sizing: border-box;
}
.block {
background: white;
margin: $margin;
border-radius: $radius;
}
// 地址管理
.address {
position: relative;
padding: $padding 80rpx $padding 90rpx;
font-size: $title-size-lg;
.user {
font-size: $title-size;
line-height: 40rpx;
color: $text-gray;
text {
color: black;
max-width: 200rpx;
display: inline-block;
margin-right: $margin/2;
}
}
.city {
padding-top: $padding/2;
font-size: $title-size-sm;
color: $text-gray;
line-height: 36rpx;
}
.address-icon {
position: absolute;
top: 50%;
&.location {
margin-top: -26rpx;
left: $margin - 10;
}
&.arrows {
margin-top: -20rpx;
right: $margin - 10;
}
}
}
.address-new {
padding: $padding;
text-align: center;
height: 90rpx;
line-height: 90rpx;
color: $main-color;
.icon {
vertical-align: middle;
margin-bottom: 8rpx;
margin-right: 10rpx;
}
}
// 订单列表
.goods-item {
display: flex;
align-items: center;
padding: $padding;
.order-cover {
vertical-align: top;
width: 128rpx;
height: 128rpx;
}
.order-title {
flex: 1;
padding-left: $margin;
// line-height: 40rpx;
.title {
font-size: 28rpx;
@extend .ellipsis;
text-align: left;
}
.subtitle {
font-size: 26rpx;
color: #666;
padding-top: 10rpx;
}
}
.order-count {
text-align: right;
padding-left: $margin;
line-height: 40rpx;
.order-price {
font-size: 32rpx;
font-weight: bold;
color: $text-price;
&>text {
font-size: 24rpx;
}
}
.type {
font-size: 22rpx;
padding-left: 6rpx;
}
.order-sum {
font-size: $title-size-sm;
color: $text-gray;
}
}
}
// 订单信息
.info-box {
.info-item {
position: relative;
padding: $padding $padding $padding 200rpx;
font-size: $title-size-m;
min-height: 40rpx;
text-align: right;
.label {
position: absolute;
left: $margin;
top: $margin;
color: $text-gray;
}
.info-textarea {
height: 120rpx;
width: 100%;
text-align: left;
font-size: $title-size-m;
}
&::after {
position: absolute;
left: $margin;
right: $margin;
content: " ";
height: 1rpx;
bottom: 0;
background: $border-color;
}
&:last-child::after {
display: none;
}
}
}
// footer
.order-footer {
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: $padding;
background: white;
border-radius: $radius $radius 0 0;
box-shadow: 0 0 10rpx 10rpx rgba($color: #000000, $alpha: .02);
z-index: 99;
display: flex;
.total {
line-height: 80rpx;
font-size: $title-size-lg;
font-weight: bold;
width: calc(100% - 300rpx - #{$margin});
color: $text-gray;
font-weight: normal;
@extend .nowrap;
text {
color: $text-price;
font-size: $title-size-lg;
font-weight: bold;
}
.type {
font-size: 22rpx;
padding-left: 6rpx;
}
}
.btn {
margin-left: $margin;
width: 300rpx;
height: 80rpx;
padding: 0;
line-height: 80rpx;
font-size: $title-size-lg;
border-radius: 40rpx;
background: $main-color;
color: white;
font-weight: bold;
&::after {
display: none;
}
}
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -1,395 +1,547 @@
<template>
<view class="content">
<!-- swiper -->
<view class="swiper">
<view class="swiper-box">
<swiper autoplay @change="swiperCount = $event.detail.current">
<swiper-item v-for="(item, index) in banners" :key="index" @click="goBook(item)">
<image :src="item.cover" mode="aspectFill"></image>
</swiper-item>
</swiper>
<view class="swiper-pages">
<block v-for="(item, index) in banners" :key="index">
<text class="pages-item" :class="{'show':swiperCount === index}"></text>
</block>
</view>
</view>
</view>
<!-- 健康产品分类 -->
<u-scroll-list class="classify-box" indicatorColor="#ddd" indicatorActiveColor="#34CE98">
<view v-for="(item, index) in goodTabs" :key="index" class="classify-item" @click="$Router.push({name: 'StoreList', params: {id: item.category_id, title: item.name}})">
<view class="classify-item-nav">
<image class="classify-item-cover" :src="item.cover"></image>
<view class="classify-item-title">{{item.name}}</view>
</view>
</view>
</u-scroll-list>
<!-- 每日上新 -->
<view class="new-box">
<view class="title">上新精选<text class="title-des"> | 精品上新新品推荐</text></view>
<view class="news">
<view class="news-item" v-for="(item, index) in newGood" :key="index" @click="$Router.push({ name: 'StoreGoods', params: {id: item.goods_id}})">
<view class="news-cover">
<image :src="item.cover" mode="aspectFill"></image>
</view>
<view class="news-title nowrap">{{item.name}}</view>
<view class="news-price nowrap">{{item.price.price_min}} <text>DT积分</text></view>
</view>
</view>
</view>
<!-- 线下商家 -->
<view class="offline-box">
<view class="title">推荐店铺 <view class="more"><text class="title-des"> | 您身边的优质体验店</text> <text class="more-txt" @click="$Router.push({name: 'ShopList'})">更多></text></view></view>
<view class="card-box">
<block v-for="(item, index) in shops" :key="index">
<view class="card-box-item" style="{'backgrond': #FFF}" v-if="index < 4" @click="$Router.push({name: 'ShopDetail', params: {ShopId: item.shop_id}})">
<view class="card-title">{{item.name}}</view>
<view class="card-subtitle"> 优质店铺 </view>
<view class="card-btn">前往体验</view>
<image class="card-cover" :src="item.cover" mode="aspectFill" />
</view>
</block>
</view>
</view>
<!-- 推荐品类 -->
<!-- <view class="card-box">
<block v-for="(item, index) in meals" :key="index">
<view class="card-box-item" :style="{'backgrond': item.color}" @click="$Router.push({name: 'StoreMeals', params: {id: item.meal_id}})">
<view class="card-title">{{item.title}}</view>
<view class="card-subtitle">{{item.subtitle}}</view>
<image class="card-cover" :src="item.cover" mode="aspectFill"></image>
</view>
</block>
</view> -->
<!-- goods -->
<view class="goods-box">
<oct-goods
:lists="goodsArr"
priceType="DT"
color="#e6576b"
@onGoods="$Router.push({ name: 'StoreGoods', params: {id: $event.goods_id}})"
/>
<!-- <u-loadmore status="loading" /> -->
</view>
</view>
</template>
<script>
import { mall } from "@/apis/interfaces/store"
export default {
data() {
return {
swiperCount : 0,
banners : [],
goodTabs : [],
newGood : [],
goodsArr : [],
meals : [],
shops : [],
};
},
mounted(){
this.getMall()
},
methods:{
getMall(){
mall().then(res => {
this.banners = res.banners
this.goodsArr = res.goods
this.newGood = res.news
this.goodTabs = res.categories
this.meals = res.meals
this.shops = res.shops
uni.stopPullDownRefresh()
})
},
goBook(item){
if(item.url){
if(item.url.openType === 'navigateTo'){
let url = item.url.path
if(item.url.params != ''){
url = url + '?' + item.url.params
}
uni.navigateTo({
url
})
}
}
}
},
onPullDownRefresh() {
this.getMall()
},
onNavigationBarButtonTap() {
this.$Router.push({name: 'StoreSearch'})
}
}
</script>
<style lang="scss">
.content{
background: $window-color;
}
// 商城列表
.goods-box{
padding-bottom: $padding;
&>.title{
padding: $padding $padding 0;
font-size: $title-size-lg;
color: $text-color;
font-weight: bold;
margin-bottom: -$margin/2;
}
}
// 商城分类
.classify-box{
.classify-item{
padding: 0 10rpx;
&:last-child{
padding-right: $padding;
}
&:first-child{
padding-left: $padding;
}
&-nav{
text-align: center;
width: 138rpx;
}
&-cover{
width: 86rpx;
height: 86rpx;
border-radius: 50%;
vertical-align: top;
margin-bottom: $margin/2;
}
&-title{
line-height: 40rpx;
font-size: $title-size-sm;
color: $text-color;
}
}
}
// 卡片推荐
.card-box{
padding: $padding $padding - 10;
padding-bottom: 0;
display: flex;
flex-wrap: wrap;
&-item{
margin: 0 10rpx;
width: calc(50% - 20rpx);
padding: $padding;
border-radius: $radius;
box-sizing: border-box;
position: relative;
.card-title{
font-size: $title-size-lg;
font-weight: bold;
color: $text-color;
line-height: 40rpx;
width: calc(100% - 80rpx);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.card-subtitle{
font-size: 22rpx;
color: $text-gray;
// line-height: 40rpx;
min-height: 20rpx;
@extend .nowrap;
}
.card-cover{
width: 80rpx;
height: 80rpx;
position: absolute;
border-radius: 50%;
right: $margin;
top: $margin;
}
}
&-item:nth-child(1){
background: #fef2ae;
}
&-item:nth-child(2){
background: #c9ead9;
}
}
// 上新精选
.new-box{
padding: 0 $margin;
border-radius: $radius;
// padding: $padding - 10;
.title{
font-size: $title-size-lg;
color: $text-color;
font-weight: bold;
padding-bottom: 10rpx;
.title-des{
font-size: 24rpx !important;
padding-left: 10rpx;
color: $text-gray-m;
font-weight: normal;
}
}
.news{
margin: $margin/2 -10rpx 0;
display: flex;
.news-item{
margin: 0 10rpx;
width: calc(25% - 20rpx);
.news-cover{
position: relative;
width: 100%;
padding-top: 100%;
background-color: white;
border-radius: $radius-lg;
overflow: hidden;
image{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
}
.news-title{
margin-top: $margin/2;
font-size: $title-size-sm;
text-align: center;
color: $text-color;
line-height: 40rpx;
}
.news-price{
text-align: center;
font-size: $title-size-sm;
font-weight: bold;
color: $text-price;
line-height: 40rpx;
text{
margin-left: 6rpx;
font-size: 70%;
}
}
}
}
}
.offline-box{
.title{
font-size: $title-size-lg;
color: $text-color;
font-weight: bold;
margin-top: $margin;
margin-left: $margin;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
.more{
flex: 1;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding-right: $padding;
.more-txt{
font-size: 24rpx;
color: $text-gray;
font-weight: normal;
}
}
}
.card-btn{
font-size: 22rpx;
color: #fff;
padding: 4rpx 20rpx;
border-radius: 20rpx;
background-color: $text-price;
display: inline-block;
}
.card-box {
// &-item{
// background: #fff !important;
// }
&-item:nth-child(1){
background: #fef2ae;
background: rgba($color: #fef2ae, $alpha:.5);
}
&-item:nth-child(2){
background: #c9ead9;
background: rgba($color: #c9ead9, $alpha:.5);
}
&-item:nth-child(3){
margin-top: $padding - 8;
background: #bde0ff;
background: rgba($color: #bde0ff, $alpha:.5);
}
&-item:nth-child(4){
margin-top: $padding - 8;
background: rgba($color: #ffd9e1, $alpha:.5);
}
}
.card-cover{
width: 100rpx;
height: 100rpx;
position: absolute;
right: $margin;
top: $margin;
}
.title-des{
font-size: 24rpx;
padding-left: 10rpx;
color: $text-gray-m;
font-weight: normal;
}
}
// swiper
.swiper{
background: linear-gradient(#FFF, #F3F6FB);
padding: $padding;
.swiper-box{
position: relative;
padding-top: 40%;
swiper,
image{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
image{
border-radius: $radius;
}
}
.swiper-pages{
position: absolute;
z-index: 9;
left: 0;
right: 0;
bottom: $margin - 10;
height: 7rpx;
text-align: center;
.pages-item{
vertical-align: top;
display: inline-block;
height: 7rpx;
width: 25rpx;
margin: 0 5rpx;
background: rgba($color: #fff, $alpha: .5);
&.show{
background: white;
}
}
}
}
</style>
<template>
<view class="content">
<!-- swiper -->
<view class="swiper">
<view class="swiper-box">
<swiper autoplay @change="swiperCount = $event.detail.current">
<swiper-item v-for="(item, index) in banners" :key="index" @click="goBook(item)">
<image :src="item.cover" mode="aspectFill"></image>
</swiper-item>
</swiper>
<view class="swiper-pages">
<block v-for="(item, index) in banners" :key="index">
<text class="pages-item" :class="{'show':swiperCount === index}"></text>
</block>
</view>
</view>
</view>
<!-- 健康产品分类 -->
<u-scroll-list class="classify-box" indicatorColor="#ddd" indicatorActiveColor="#34CE98">
<view v-for="(item, index) in goodTabs" :key="index" class="classify-item"
@click="$Router.push({name: 'StoreList', params: {id: item.category_id, title: item.name}})">
<view class="classify-item-nav">
<image class="classify-item-cover" :src="item.cover"></image>
<view class="classify-item-title">{{item.name}}</view>
</view>
</view>
</u-scroll-list>
<!-- 每日上新 -->
<view class="new-box">
<view class="title">上新精选<text class="title-des"> | 精品上新新品推荐</text></view>
<view class="news">
<view class="news-item" v-for="(item, index) in newGood" :key="index"
@click="$Router.push({ name: 'StoreGoods', params: {id: item.goods_id}})">
<view class="news-cover">
<image :src="item.cover" mode="aspectFill"></image>
</view>
<view class="news-title nowrap">{{item.name}}</view>
<view class="news-price nowrap">{{item.price.price_min}} <text>DT积分</text></view>
</view>
</view>
</view>
<!-- VIP换购 -->
<view class="new-box" style="margin-top: 30rpx;" v-if="vips.length>0">
<view class="title">VIP换购 <view class="more"><text class="title-des"> | 千款商品任意换购</text> <text
class="more-txt" @click="$Router.push({name: 'VipList'})">更多 ></text></view>
</view>
<view class="news">
<view class="news-item" v-for="(item, index) in vips" :key="index"
@click="$Router.push({ name: 'StoreGoods', params: {id: item.goods_id}})">
<view class="news-cover">
<image :src="item.cover" mode="aspectFill"></image>
<view class="tags"> VIP </view>
</view>
<view class="news-title nowrap">{{item.name}}</view>
<view class="news-price nowrap">{{item.price.price_min}} <text>DT积分</text></view>
<!-- <view class="news-price nowrap through">{{item.original_price}} <text>DT积分</text></view> -->
</view>
</view>
</view>
<!-- 线下商家 -->
<view class="offline-box">
<view class="title">推荐店铺 <view class="more"><text class="title-des"> | 您身边的优质体验店</text> <text
class="more-txt" @click="$Router.push({name: 'ShopList'})">更多 ></text></view>
</view>
<view class="card-box">
<block v-for="(item, index) in shops" :key="index">
<view class="card-box-item" style="{'backgrond': #FFF}" v-if="index < 4"
@click="$Router.push({name: 'ShopDetail', params: {ShopId: item.shop_id}})">
<view class="card-title">{{item.name}}</view>
<view class="card-subtitle"> {{item.type.code == 2 ? 'VIP优质店铺' : '优质店铺'}} </view>
<view class="card-btn">前往体验</view>
<image class="card-cover" :src="item.cover" mode="aspectFill" />
</view>
</block>
</view>
</view>
<!-- 推荐品类 -->
<!-- <view class="card-box">
<block v-for="(item, index) in meals" :key="index">
<view class="card-box-item" :style="{'backgrond': item.color}" @click="$Router.push({name: 'StoreMeals', params: {id: item.meal_id}})">
<view class="card-title">{{item.title}}</view>
<view class="card-subtitle">{{item.subtitle}}</view>
<image class="card-cover" :src="item.cover" mode="aspectFill"></image>
</view>
</block>
</view> -->
<!-- goods -->
<view class="goods-box">
<view class="title2">
猜你喜欢 <view class="more"><text class="title-des"> | 您身边的快捷推荐</text> <text class="more-txt" @click="$Router.push({name: 'StoreList'})">更多 ></text></view>
</view>
<oct-goods :lists="goodsArr" priceType="DT" color="#e6576b"
@onGoods="$Router.push({ name: 'StoreGoods', params: {id: $event.goods_id}})" />
<!-- <u-loadmore status="loading" /> -->
</view>
</view>
</template>
<script>
import {
mall
} from "@/apis/interfaces/store"
export default {
data() {
return {
swiperCount: 0,
banners: [],
goodTabs: [],
newGood: [],
goodsArr: [],
meals: [],
shops: [],
vips:[]
};
},
mounted() {
this.getMall()
},
methods: {
getMall() {
mall().then(res => {
this.banners = res.banners
this.goodsArr = res.goods
this.newGood = res.news
this.goodTabs = res.categories
this.meals = res.meals
this.shops = res.shops
this.vips = res.vips
uni.stopPullDownRefresh()
})
},
goBook(item) {
console.log(item)
if (item.url) {
if (item.url.openType === 'navigateTo') {
if (item.url.params != '') {
uni.navigateTo({
url: item.url.path + '?' + item.url.params,
})
} else {
uni.navigateTo({
url: item.url.path,
})
}
}
}
}
},
onPullDownRefresh() {
this.getMall()
},
onNavigationBarButtonTap() {
this.$Router.push({
name: 'StoreSearch'
})
}
}
</script>
<style lang="scss">
.content {
background: $window-color;
}
// 商城列表
.goods-box {
padding: $padding 0;
&>.title {
padding: $padding $padding 0;
font-size: $title-size-lg;
color: $text-color;
font-weight: bold;
margin-bottom: -$margin/2;
}
.title2 {
font-size: $title-size-lg;
color: $text-color;
font-weight: bold;
padding: 0 30rpx 10rpx 30rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
.title-des {
font-size: 24rpx !important;
padding-left: 10rpx;
color: $text-gray-m;
font-weight: normal;
}
.more {
flex: 1;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding-right: $padding;
.more-txt {
font-size: 24rpx;
color: $text-gray;
font-weight: normal;
}
}
}
}
// 商城分类
.classify-box {
.classify-item {
padding: 0 10rpx;
&:last-child {
padding-right: $padding;
}
&:first-child {
padding-left: $padding;
}
&-nav {
text-align: center;
width: 138rpx;
}
&-cover {
width: 86rpx;
height: 86rpx;
border-radius: 50%;
vertical-align: top;
margin-bottom: $margin/2;
}
&-title {
line-height: 40rpx;
font-size: $title-size-sm;
color: $text-color;
}
}
}
// 卡片推荐
.card-box {
padding: $padding $padding - 10;
padding-bottom: 0;
display: flex;
flex-wrap: wrap;
&-item {
margin: 0 10rpx;
width: calc(50% - 20rpx);
padding: $padding;
border-radius: $radius;
box-sizing: border-box;
position: relative;
.card-title {
font-size: $title-size-lg;
font-weight: bold;
color: $text-color;
line-height: 40rpx;
width: calc(100% - 80rpx);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.card-subtitle {
font-size: 22rpx;
color: $text-gray;
// line-height: 40rpx;
min-height: 20rpx;
@extend .nowrap;
}
.card-cover {
width: 80rpx;
height: 80rpx;
position: absolute;
border-radius: 50%;
right: $margin;
top: $margin;
}
}
&-item:nth-child(1) {
background: #fef2ae;
}
&-item:nth-child(2) {
background: #c9ead9;
}
}
// 上新精选
.new-box {
padding: 0 $margin;
border-radius: $radius;
// padding: $padding - 10;
.title {
font-size: $title-size-lg;
color: $text-color;
font-weight: bold;
padding-bottom: 10rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
.title-des {
font-size: 24rpx !important;
padding-left: 10rpx;
color: $text-gray-m;
font-weight: normal;
}
.more {
flex: 1;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding-right: $padding;
.more-txt {
font-size: 24rpx;
color: $text-gray;
font-weight: normal;
}
}
}
.news {
margin: $margin/2 -10rpx 0;
display: flex;
.news-item {
margin: 0 10rpx;
width: calc(25% - 20rpx);
.news-cover {
position: relative;
width: 100%;
padding-top: 100%;
background-color: white;
border-radius: $radius-lg;
overflow: hidden;
image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.tags {
position: absolute;
top: 6rpx;
left: -54rpx;
background: #d81e06;
color: #fff;
width: 100%;
font-size: 24rpx;
padding: 4rpx 0;
text-align: center;
transform: rotate(-45deg);
font-weight: bold;
letter-spacing:2rpx;
}
}
.news-title {
margin-top: $margin/2;
font-size: $title-size-sm;
text-align: center;
color: $text-color;
line-height: 40rpx;
}
.news-price {
text-align: center;
font-size: $title-size-sm;
font-weight: bold;
color: $text-price;
line-height: 40rpx;
text {
margin-left: 6rpx;
font-size: 70%;
}
}
.through{
text-decoration: line-through !important;
}
}
}
}
.offline-box {
.title {
font-size: $title-size-lg;
color: $text-color;
font-weight: bold;
margin-top: $margin;
margin-left: $margin;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
.more {
flex: 1;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding-right: $padding;
.more-txt {
font-size: 24rpx;
color: $text-gray;
font-weight: normal;
}
}
}
.card-btn {
font-size: 22rpx;
color: #fff;
padding: 4rpx 20rpx;
border-radius: 20rpx;
background-color: $text-price;
display: inline-block;
}
.card-box {
// &-item{
// background: #fff !important;
// }
&-item:nth-child(1) {
background: #fef2ae;
background: rgba($color: #fef2ae, $alpha:.5);
}
&-item:nth-child(2) {
background: #c9ead9;
background: rgba($color: #c9ead9, $alpha:.5);
}
&-item:nth-child(3) {
margin-top: $padding - 8;
background: #bde0ff;
background: rgba($color: #bde0ff, $alpha:.5);
}
&-item:nth-child(4) {
margin-top: $padding - 8;
background: rgba($color: #ffd9e1, $alpha:.5);
}
}
.card-cover {
width: 100rpx;
height: 100rpx;
position: absolute;
right: $margin;
top: $margin;
}
.title-des {
font-size: 24rpx;
padding-left: 10rpx;
color: $text-gray-m;
font-weight: normal;
}
}
// swiper
.swiper {
background: linear-gradient(#FFF, #F3F6FB);
padding: $padding;
.swiper-box {
position: relative;
padding-top: 40%;
swiper,
image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
image {
border-radius: $radius;
}
}
.swiper-pages {
position: absolute;
z-index: 9;
left: 0;
right: 0;
bottom: $margin - 10;
height: 7rpx;
text-align: center;
.pages-item {
vertical-align: top;
display: inline-block;
height: 7rpx;
width: 25rpx;
margin: 0 5rpx;
background: rgba($color: #fff, $alpha: .5);
&.show {
background: white;
}
}
}
}
</style>

View File

@@ -30,7 +30,7 @@
</template>
<script>
import { lists, classify } from "@/apis/interfaces/store"
import { lists, categories } from "@/apis/interfaces/store"
export default {
data() {
return {
@@ -46,17 +46,21 @@
uni.setNavigationBarTitle({
title: this.$Route.query.title
})
if (this.$Route.query.id) {
this.cid = this.$Route.query.id
} else {
this.getClassify();
}
this.getLists()
this.getClassify()
},
methods:{
// 商品列表
getLists() {
lists({
category_id : this.$Route.query.id,
category_cid: this.cid,
let data = {
category_id : this.cid,
page : this.page
}).then(res => {
};
lists(data).then(res => {
if(res.page.current === 1){
this.goodsArr = []
}
@@ -67,14 +71,15 @@
},
// 获取二级分类
getClassify(){
classify(this.$Route.query.id).then(res => {
categories().then(res => {
this.classify = this.classify.concat(res)
})
},
// 二级分类筛选
onTabs(e){
this.goodsArr = []
this.cid = e.category_id
this.page = 1;
this.goodsArr = [];
this.cid = e.category_id;
this.getLists()
},

View File

@@ -1,401 +1,432 @@
<template>
<view class="shopDetail">
<view class="top">
<view class="search" @click="search">
<uni-icons type="left" class="back" size="30" @click="$Router.back();" />
<view class="input">
<uni-icons type="search" class="search-icon" color="grey" size="20" /> 请输入要搜索商品的关键词
</view>
</view>
<view class="shopInfo">
<view class="shopInfo-title-left">
<image class="shop-logo" :src="logo" mode="aspectFill" />
<view class="shop-title">
<view class="shop-titl">{{name}}</view>
<view>店铺评分:<span class='no'>5.0</span> 服务态度 :<span class='no'>5.0</span></view>
</view>
</view>
<!-- <view class="shopInfo-title-right"> +关注 </view> -->
</view>
</view>
<view class="content">
<view class="left">
<scroll-view scroll-y="true" class="scroll-view-left">
<view :class="['classify-item', item.category_id === category_id?'active_classify_item':'']"
v-for="(item,index) in classify" :key="index" @click="selectClassify(item.category_id)">
{{item.name}}
</view>
</scroll-view>
</view>
<view class="right">
<scroll-view scroll-y="true" class="scroll-view-right" @scrolltolower='lower'>
<block v-if="goods.length > 0">
<view class="goods-item" v-for="(item,index) in goods" :key="index"
@click="onGoods(item.goods_id)">
<image :src="item.cover" mode="aspectFill" class="good-img" />
<view class="item--content">
<view class="title">{{item.name}}</view>
<view class="sub_title">{{item.shop.name}}</view>
<view class="price">{{item.price.price_min || '0'}}
<view class="price-type">
<text> DT积分</text>
<text class="kucun"> 库存量:{{item.stock}}</text>
</view>
</view>
</view>
</view>
</block>
<block v-else>
<view class="vertical pages-empty">
<u-empty icon="http://cdn.uviewui.com/uview/empty/list.png" textColor="#999" text="暂无相关商品">
</u-empty>
</view>
</block>
</scroll-view>
</view>
</view>
</view>
<view class="shopDetail">
<view class="top">
<view class="search" @click="search">
<uni-icons type="left" class="back" size="30" @click="$Router.back();" />
<view class="input">
<uni-icons type="search" class="search-icon" color="grey" size="20" /> 请输入要搜索商品的关键词
</view>
</view>
<view class="shopInfo">
<view class="shopInfo-title-left">
<image class="shop-logo" :src="logo" mode="aspectFill" />
<view class="shop-title">
<view class="shop-titl">{{name}}</view>
<view>店铺评分:<span class='no'>5.0</span> 服务态度 :<span class='no'>5.0</span></view>
</view>
</view>
<view class="shopInfo-title-right" v-if="shopType === 2" @click="goVip"> {{!vip.status?'开通会员':vip.name}}
</view>
</view>
</view>
<view class="content">
<view class="left">
<scroll-view scroll-y="true" class="scroll-view-left">
<view :class="['classify-item', item.category_id === category_id?'active_classify_item':'']"
v-for="(item,index) in classify" :key="index" @click="selectClassify(item.category_id)">
{{item.name}}
</view>
</scroll-view>
</view>
<view class="right">
<scroll-view scroll-y="true" class="scroll-view-right" @scrolltolower='lower'>
<block v-if="goods.length > 0">
<view class="goods-item" v-for="(item,index) in goods" :key="index"
@click="onGoods(item.goods_id)">
<image :src="item.cover" mode="aspectFill" class="good-img" />
<view class="item--content">
<view class="title">{{item.name}}</view>
<view class="sub_title">{{item.shop.name}}</view>
<view class="price">{{item.price.price_min || '0'}}
<view class="price-type">
<text> DT积分</text>
<text class="kucun"> 库存量:{{item.stock}}</text>
</view>
</view>
</view>
</view>
</block>
<block v-else>
<view class="vertical pages-empty">
<u-empty icon="http://cdn.uviewui.com/uview/empty/list.png" textColor="#999" text="暂无相关商品">
</u-empty>
</view>
</block>
</scroll-view>
</view>
</view>
</view>
</template>
<script>
import {
shopsDetail,
shopsGoods
} from "@/apis/interfaces/store"
export default {
data() {
return {
name : '',
logo : '',
category_id : '',
classify : [],
goods : [],
has_more:true,
page:1,
ShopId:'',
}
},
onLoad(e) {
this.ShopId = this.$Route.query.ShopId
shopsDetail(this.ShopId).then(res => {
this.classify = [{
category_id: '',
name: '全部商品',
}, ...res.categories]
this.name = res.name
this.logo = res.cover
this.getGoods()
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none'
})
})
},
onPullDownRefresh() {
this.has_more = true;
this.page = 1;
this.goods = [];
this.getGoods()
import {
shopsDetail,
shopsGoods
} from "@/apis/interfaces/store"
export default {
data() {
return {
name: '',
logo: '',
category_id: '',
classify: [],
goods: [],
has_more: true,
page: 1,
ShopId: '',
shopType: '', // 1。普通商品 2.会员制商品
vip: {},
}
},
methods: {
getGoods() {
uni.showLoading({
title:'请求中~',
mask:true,
onLoad(e) {
this.ShopId = this.$Route.query.ShopId
shopsDetail(this.ShopId).then(res => {
// vip 制 商品
if (res.type.code == 2) {
this.classify = [{
category_id: '',
name: '全部活动',
}, ...res.identities]
} else {
// 普通商品
this.classify = [{
category_id: '',
name: '全部商品',
}, ...res.categories]
}
this.name = res.name
this.logo = res.cover
this.vip = res.vip
this.shopType = res.type.code
this.getGoods()
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none'
})
})
},
onPullDownRefresh() {
this.has_more = true;
this.page = 1;
this.goods = [];
this.getGoods()
},
methods: {
getGoods() {
uni.showLoading({
title: '请求中~',
mask: true,
})
let data = {
shop_id: this.ShopId,
page: this.page,
}
if (this.shopType == 2) {
data.identity_id = this.category_id
data.is_user = 1
} else {
data.category_id = this.category_id
}
shopsGoods(data).then(res => {
this.goods = this.goods.concat(res.data);
this.has_more = res.page.has_more;
uni.hideLoading();
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none'
})
})
shopsGoods(this.ShopId, this.category_id,this.page).then(res => {
this.goods = this.goods.concat(res.data);
this.has_more = res.page.has_more;
uni.hideLoading();
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none'
})
})
},
lower(){
if(this.has_more){
this.page = this.page + 1
this.getGoods();
}else{
uni.showToast({
title:'没有更多~',
icon:"none",
mask:true,
})
}
},
selectClassify(id) {
if (id === this.category_id) return;
this.category_id = id;
this.page = 1;
this.goods =[];
this.has_more = true;
this.getGoods()
},
search() {
this.$Router.push({
name: 'StoreSearch'
});
},
onGoods(id) {
this.$Router.push({
name: 'StoreGoods',
params: {
id: id
}
})
}
}
}
lower() {
if (this.has_more) {
this.page = this.page + 1
this.getGoods();
} else {
uni.showToast({
title: '没有更多~',
icon: "none",
mask: true,
})
}
},
selectClassify(id) {
if (id === this.category_id) return;
this.category_id = id;
this.page = 1;
this.goods = [];
this.has_more = true;
this.getGoods()
},
search() {
this.$Router.push({
name: 'StoreSearch'
});
},
goVip() {
uni.navigateTo({
url: '/pages/store/vip/index/index?id=' + this.ShopId
})
},
onGoods(id) {
this.$Router.push({
name: 'StoreGoods',
params: {
id: id
}
})
}
}
}
</script>
<style lang="scss">
.pages-empty {
height: 70vh;
}
.pages-empty {
height: 70vh;
}
.shopDetail {
width: 100%;
height: 100vh;
.shopDetail {
width: 100%;
height: 100vh;
.top {
height: 320rpx;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-end;
box-sizing: border-box;
padding-top: 44px;
width: 100%;
.top {
height: 320rpx;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-end;
box-sizing: border-box;
padding-top: 44px;
width: 100%;
.search {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
width: 100%;
padding-right: $padding;
.search {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
width: 100%;
padding-right: $padding;
.back {
padding: 0 $padding;
}
.back {
padding: 0 $padding;
}
.input {
flex: 1;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
background-color: #f9f9f9;
color: gray;
font-size: 26rpx;
border-radius: 30rpx;
padding: 10rpx $padding;
.input {
flex: 1;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
background-color: #f9f9f9;
color: gray;
font-size: 26rpx;
border-radius: 30rpx;
padding: 10rpx $padding;
.search-icon {
margin-right: $margin;
}
}
}
.search-icon {
margin-right: $margin;
}
}
}
.shopInfo {
border-top: solid 1 #f9f9f9;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
width: 100%;
padding: $padding - 10;
background-color: #fff;
.shopInfo {
border-top: solid 1 #f9f9f9;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
width: 100%;
padding: $padding - 10;
background-color: #fff;
.shopInfo-title-left {
width: 500rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
.shopInfo-title-left {
width: 500rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
.shop-logo {
width: 100rpx;
height: 100rpx;
border-radius: 10rpx;
border: solid 1rpx #f9f9f9;
}
.shop-logo {
width: 100rpx;
height: 100rpx;
border-radius: 10rpx;
border: solid 1rpx #f9f9f9;
}
.shop-title {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
box-sizing: border-box;
font-size: 26rpx;
margin-left: $margin;
color: #999;
width: 370rpx;
.shop-title {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
box-sizing: border-box;
font-size: 26rpx;
margin-left: $margin;
color: #999;
width: 370rpx;
.no {
color: $text-price;
padding-left: 4rpx;
.no {
color: $text-price;
padding-left: 4rpx;
padding-right: 10rpx;
}
}
.shop-titl {
font-size: 34rpx;
color: #333;
font-weight: bold;
margin-bottom: 6rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
width: 100%;
}
}
}
.shop-titl {
font-size: 34rpx;
color: #333;
font-weight: bold;
margin-bottom: 6rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
max-width: 100%;
}
}
}
.shopInfo-title-right {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
font-size: 28rpx;
color: #222;
background-color: $main-color;
padding: 6rpx $padding;
color: #FFF;
}
.shopInfo-title-right {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
font-size: 28rpx;
color: #222;
background-color: $main-color;
padding: 6rpx $padding;
color: #FFF;
}
}
}
}
}
.content {
height: calc(100vh - 320rpx);
background-color: #eee;
display: flex;
flex-direction: row;
align-items: center;
padding-top: 20rpx;
box-sizing: border-box;
.content {
height: calc(100vh - 320rpx);
background-color: #eee;
display: flex;
flex-direction: row;
align-items: center;
padding-top: 20rpx;
box-sizing: border-box;
.left {
width: 180rpx;
height: 100%;
.left {
width: 180rpx;
height: 100%;
.scroll-view-left {
height: 100%;
width: 100%;
}
.scroll-view-left {
height: 100%;
width: 100%;
}
.classify-item {
width: 100%;
padding: $padding 0;
font-size: 26rpx;
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: #222;
display: inline-block;
}
.classify-item {
width: 100%;
padding: $padding 0;
font-size: 26rpx;
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: #222;
display: inline-block;
}
.active_classify_item {
background-color: #FFFFFF;
}
}
.active_classify_item {
background-color: #FFFFFF;
}
}
.right {
width: calc(100% - 180rpx);
height: 100%;
background-color: #fff;
.right {
width: calc(100% - 180rpx);
height: 100%;
background-color: #fff;
.scroll-view-right {
width: 100%;
height: 100%;
.scroll-view-right {
width: 100%;
height: 100%;
.goods-item {
width: 100%;
display: inline-block;
border-bottom: solid 1rpx #eee;
// padding: $padding;
padding-left: $padding;
padding-top: $padding;
padding-bottom: $padding;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
.goods-item {
width: 100%;
display: inline-block;
border-bottom: solid 1rpx #eee;
// padding: $padding;
padding-left: $padding;
padding-top: $padding;
padding-bottom: $padding;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
.good-img {
width: 160rpx;
height: 160rpx;
border-radius: 10rpx;
}
.good-img {
width: 160rpx;
height: 160rpx;
border-radius: 10rpx;
}
.item--content {
flex: 1;
padding: $padding - 10;
.item--content {
flex: 1;
padding: $padding - 10;
&>.title {
font-size: 28rpx;
color: #333;
// @extend .ellipsis-1;
}
&>.title {
font-size: 28rpx;
color: #333;
// @extend .ellipsis-1;
}
&>.sub_title {
color: #a05f0c;
font-size: 24rpx;
padding-top: 4rpx;
// @extend .ellipsis-1;
}
&>.sub_title {
color: #a05f0c;
font-size: 24rpx;
padding-top: 4rpx;
// @extend .ellipsis-1;
}
&>.price {
padding-top: $padding/2;
display: flex;
flex-direction: row;
align-items: flex-end;
justify-content: flex-start;
box-sizing: border-box;
line-height: 40rpx;
font-weight: bold;
font-size: 32rpx;
color: $text-price;
&>.price {
padding-top: $padding/2;
display: flex;
flex-direction: row;
align-items: flex-end;
justify-content: flex-start;
box-sizing: border-box;
line-height: 40rpx;
font-weight: bold;
font-size: 32rpx;
color: $text-price;
// @extend .ellipsis-1;
.price-type {
display: flex;
flex-direction: row;
align-items: flex-end;
justify-content: space-between;
box-sizing: border-box;
flex: 1;
// @extend .ellipsis-1;
.price-type {
display: flex;
flex-direction: row;
align-items: flex-end;
justify-content: space-between;
box-sizing: border-box;
flex: 1;
position: relative;
top: 5rpx;
text {
margin-right: $margin/2;
padding-left: 6rpx;
font-size: 70%;
}
text {
margin-right: $margin/2;
padding-left: 6rpx;
font-size: 70%;
}
.kucun {
color: $text-gray;
font-weight: normal;
}
}
.kucun {
color: $text-gray;
font-weight: normal;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
</style>

View File

@@ -0,0 +1,126 @@
<template>
<view class="groupBook">
<view class="top">
<view class="title">VIP换购</view>
<view>百款商品任意换购</view>
</view>
<!-- 有数据 -->
<scroll-view scroll-y="true" class="scroll" @scrolltolower='scrolltolower' v-if="lists.length>0">
<block v-for="(item,index) in lists" :key="index">
<vipGoodsItem :item="item" @goPin="goPin" />
</block>
</scroll-view>
<!-- 没数据 -->
<scroll-view scroll-y="true" class="scroll" v-else>
<view class="vertical pages-empty" style="padding-top: 200rpx;">
<u-empty
icon="http://cdn.uviewui.com/uview/empty/list.png"
textColor="#999"
text="暂无VIP商品~"
/>
</view>
</scroll-view>
</view>
</template>
<script>
import vipGoodsItem from '@/components/vip-goods-item/index.vue'
import {
lists
} from '@/apis/interfaces/store.js'
export default {
components: {
vipGoodsItem
},
data() {
return {
lists: [],
page: 1,
has_more: true,
};
},
onLoad() {
this.getList()
},
methods: {
getList() {
lists({
is_user:'1',
page: this.page
}).then(res => {
this.lists = this.lists.concat(res.data)
this.has_more = res.page.has_more
}).catch(err => {
uni.showToast({
title: err.message,
icon: "none",
mask: true
})
})
},
// 触底获取更多~
scrolltolower() {
if (this.has_more) {
this.page = this.page + 1
this.getList()
}else{
uni.showToast({
title:'没有更多~',
icon:'none'
})
}
},
// 马上拼团
goPin(id) {
console.log('fule gopin....')
uni.navigateTo({
url:'/pages/store/goods?id='+id
})
}
}
}
</script>
<style lang="scss">
.groupBook {
width: 100%;
min-height: 100vh;
position: relative;
background: $window-color;
box-sizing: border-box;
position: relative;
.top {
position: absolute;
top: 0;
left: 0;
font-size: $title-size - 2;
color: #fff;
width: 100%;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding: $padding;
box-sizing: border-box;
background: linear-gradient(to bottom, #d81e06, rgba(255, 255, 255, 0));
padding-bottom: 40vh;
z-index: 1;
.title {
font-size: 40rpx;
font-weight: bold;
}
}
.scroll {
height: 100vh;
position: relative;
padding: $padding * 4 $padding $padding $padding;
box-sizing: border-box;
z-index: 2;
}
}
</style>

View File

@@ -0,0 +1,344 @@
<template>
<view class="store-vip">
<image class="vip-bg" src="/static/store/store-vip-bg.png" mode="widthFix"/>
<swiper class="swiper" circular>
<swiper-item class="swiper-item" v-for="item in vip" :key="item.identity_id">
<view class="top">
<view class="left" v-if="vip.length > 1">
<image class="left-img" src="/static/store/get-more.gif" mode="widthFix" /> 滑动获取更多
</view>
<view class="content">
<!-- 四个角标 -->
<block> <image class="jiao" src="/static/store/vip-left-top.png" mode="widthFix" /> <image class="jiao" src="/static/store/vip-right-top.png" mode="widthFix" /> <image class="jiao" src="/static/store/vip-left-bottom.png" mode="widthFix" /> <image class="jiao" src="/static/store/vip-right-bottom.png" mode="widthFix" /> </block>
<view class="title1"> {{item.shop.name}} </view>
<image class="title2" :src="item.title_cover" mode="widthFix" />
<view class="title3"> {{item.description}} </view> <!-- 分类 -->
<view class="type">
<view class="type-item" v-for="it in item.rules" :key="it.order">
<image :src="it.cover" mode="aspectFill" />
<view class="title">{{it.name}}</view>
</view>
</view>
<view class="title4">详情咨询可添加产品页下方客服二维码</view>
</view>
<view class="right" v-if="vip.length > 1"> 滑动获取更多 <image class="right-img" src="/static/store/get-more.gif" mode="widthFix" /> </view>
</view>
<view class="bottom">
<view class="left">
<view class="title-1">立享尊贵特权 >> </view>
<view class="title-2" v-if="item.vip_info.ended_at"> 到期时间{{item.vip_info.ended_at}} </view>
<view class="title-2" v-if="item.margins.days>0"> 距离{{item.margins.days}}天只需要补{{item.margins.price}}元升级 </view>
</view>
<view class="right" @click="onOpenVip(item.identity_id)">
{{item.is_vip ?'立即续费':item.margins.days>0 ? '立即升级':'立即开通'}}
</view>
</view>
</swiper-item>
</swiper>
</view>
</template>
<script>
import {
shopVipInfo,
shopVipCreate,
shopVipWeChat
} from '@/apis/interfaces/vip.js'
export default {
data() {
return {
vip: [],
};
},
onLoad(e) {
this.id = e.id;
this.getInfo()
},
methods: {
getInfo() {
shopVipInfo(this.id).then(res => {
uni.setNavigationBarTitle({
title: res[0].shop.name + '会员'
});
this.vip = res;
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none',
mask: true,
})
})
},
// 创建店铺vip会员
onOpenVip(identity) {
// 获取订单
uni.showLoading({
title: 'VIP会员开通中'
})
shopVipCreate(this.id,identity).then(res => {
// 支付参数
if (res.id) {
uni.showLoading({
title: '获取支付信息'
})
this.wxPay(res.id)
}
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none'
})
})
},
// 微信支付
wxPay(orderId) {
shopVipWeChat(orderId).then(orderInfo => {
uni.requestPayment({
provider: "wxpay",
orderInfo: JSON.parse(orderInfo),
success: res => {
uni.showModal({
title: '提示',
content: '开通成功',
showCancel: false,
success: () => {
uni.navigateBack({})
}
})
},
fail(err) {
let showToast = err.message
if (err.errMsg === 'requestPayment:fail [payment微信:-2]User canceled') {
showToast = '支付被取消'
}
uni.showToast({
title: showToast,
icon: 'none'
})
}
})
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none',
mask:true,
})
})
}
}
}
</script>
<style lang="scss">
.store-vip {
height: 100vh;
width: 100vw;
background-color: #f6f1eb;
position: relative;
z-index: 0;
overflow: hidden;
.vip-bg {
width: 100%;
// height: 100%;
position: absolute;
z-index: 1;
top: -50rpx;
left: -50rpx;
}
.swiper {
width: 100%;
height: 100%;
position: relative;
z-index: 2;
.swiper-item {
.top {
height: calc(100vh - 160rpx);
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-around;
box-sizing: border-box;
.right {
font-size: 30rpx;
color: #999;
text-align: right;
width: 100%;
padding-bottom: 6%;
display: flex;
flex-direction: row;
align-items: center;
box-sizing: border-box;
justify-content: flex-end;
margin-right: 20%;
box-sizing: border-box;
.right-img{
width: 50rpx;
margin-left: 10rpx;
opacity: 0.6;
}
}
.left {
font-size: 30rpx;
color: #999;
text-align: left;
width: 100%;
padding-top: 6%;
display: flex;
flex-direction: row;
align-items: center;
box-sizing: border-box;
justify-content: flex-start;
margin-left: 20%;
box-sizing: border-box;
.left-img{
width: 50rpx;
transform: rotate(180deg);
margin-right: 10rpx;
opacity: 0.6;
}
}
.content {
padding: $padding * 2;
background-color: #fff;
border-radius: 10rpx;
width: 80%;
min-height: 70%;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
box-sizing: border-box;
.title1 {
font-size: 34rpx;
color: #e5c175;
font-weight: bold;
}
.title2 {
padding-top: $padding - 0;
width: 100%;
height: 0;
padding-bottom: $padding - 10;
}
.title3 {
font-size: 28rpx;
color: #2f3245;
}
.title4 {
font-size: 28rpx;
color: #e5c175;
padding-top: 30rpx;
}
.type {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
flex-wrap: wrap;
margin-top: $padding * 2;
width: 100%;
.type-item {
width: 33.33%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
box-sizing: border-box;
font-size: 28rpx;
color: #2f3245;
margin-bottom: 30rpx;
image {
width: 90rpx;
height: 90rpx;
border-radius: 50%;
margin-bottom: 20rpx;
}
}
}
.jiao {
width: 50rpx;
position: absolute;
}
.jiao:nth-child(1) {
left: 0;
top: 0;
}
.jiao:nth-child(2) {
right: 0;
top: 0;
}
.jiao:nth-child(3) {
left: 0;
bottom: 0;
}
.jiao:nth-child(4) {
right: 0;
bottom: 0;
}
}
}
.bottom {
height: 160rpx;
background-color: #2f3245;
color: #e5c175;
width: 100%;
display: flex;
flex-direction: row;
.left {
color: #e5c175;
width: 70%;
height: 100%;
font-weight: bold;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
box-sizing: border-box;
.title-1 {
font-size: 36rpx;
}
.title-2{
font-size: 28rpx;
font-weight: normal;
}
}
.right {
background-color: #e5c175;
width: 30%;
height: 100%;
color: #2f3245;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
font-size: 36rpx;
font-weight: bold;
}
}
}
}
}
</style>

View File

@@ -114,32 +114,29 @@
</block>
</view>
<view class="btns-box">
<view class="btns-box-item" @click="onBtn('MyCard', {})">
<image class="icon" src="@/static/user/userIcon_00.png" mode="widthFix" />
我的卡券 <uni-icons class="forward" type="forward" color="#999" />
</view>
<view class="btns-box-item" @click="onBtn('Address', { type: 'edit' })">
<image class="icon" src="@/static/user/userIcon_03.png" mode="widthFix" />
地址管理
<uni-icons class="forward" type="forward" color="#999" />
地址管理 <uni-icons class="forward" type="forward" color="#999" />
</view>
<view class="btns-box-item" @click="onBtn('Invitation', {})">
<image class="icon" src="@/static/user/userIcon_07.png" mode="widthFix" />
分享邀请
<uni-icons class="forward" type="forward" color="#999" />
分享邀请 <uni-icons class="forward" type="forward" color="#999" />
</view>
<view class="btns-box-item" @click="onBtn('Supplier', {})">
<image class="icon" src="@/static/user/userIcon_09.png" mode="widthFix" />
供应商入驻
<uni-icons class="forward" type="forward" color="#999" />
供应商入驻 <uni-icons class="forward" type="forward" color="#999" />
</view>
</view>
<view class="btns-box">
<view class="btns-box-item" @click="onShare">
<image class="icon" src="@/static/user/userIcon_14.png" mode="widthFix" />
绑定分享关系
<block v-if="share == null">
<uni-icons class="forward" type="forward" color="#999" />
</block>
<block v-else>
<text class="forward" style="color: gray;">{{share.nickname}}</text>
</block>
<block v-if="share == null"> <uni-icons class="forward" type="forward" color="#999" /> </block>
<block v-else> <text class="forward" style="color: gray;">{{share.nickname}}</text> </block>
</view>
</view>
<view class="btns-box">

View File

@@ -0,0 +1,179 @@
<template>
<view class="my-card">
<view class="select">
{{listShowText}} <u-icon class='down' name="arrow-down-fill" size='11' color="#666" />
</view>
<block v-if="lists.length > 0">
<view class="card-item" v-for="item in lists" :key='item.card_id' @click="goShop(item.shop.shop_id)">
<image class="card-item-bg" :src="item.message.card_cover" mode="aspectFill" />
<view class="card-item-top">
<image class="avatar" :src="item.message.cover" mode="aspectFill" />
<view class="info">
<view class="title"> {{item.shop.name}}</view>
<view class="des"> NO.{{item.number}} | {{item.ended_at}} 到期</view>
</view>
</view>
<view class="tags">{{item.message.title}}</view>
</view>
</block>
<block v-else>
<view class="vertical pages-empty" style="padding-top: 180rpx;">
<u-empty icon="http://cdn.uviewui.com/uview/empty/list.png" textColor="#999" text="暂无卡包信息~" />
</view>
</block>
<!-- 筛选 -->
<!-- <u-action-sheet :actions="typeList" @select="selectClick" :show="show" cancelText='取消' @close='show = false' /> -->
</view>
</template>
<script>
import {
myCard
} from '@/apis/interfaces/user.js'
export default {
data() {
return {
page: 1,
has_more: true,
lists: [],
typeList: [{
name: '按照会员到期时间排序'
}],
show: false,
listShowText: '按照会员到期时间排序',
};
},
onLoad() {
this.getList();
},
onReachBottom() {
if (this.has_more) {
this.page = this.page + 1;
this.getList();
}else{
uni.showToast({
title:'没有更多~',
icon: "none",
mask: true
})
}
},
methods: {
goShop(id) {
uni.navigateTo({
url:'/pages/store/shop/shopDetail?ShopId=' + id
})
},
getList() {
if(this.page === 1){
this.lists = []
}
myCard({
page: this.page
}).then(res => {
this.lists = this.lists.concat(res.data);
this.has_more = res.page.has_more;
}).catch(err => {
uni.showToast({
title: err.message,
icon: "none",
mask: true
})
})
}
}
}
</script>
<style lang="scss">
.my-card{
padding-bottom: $padding;
}
.select {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
font-size: 28rpx;
color: #666;
padding: $padding;
.down {
padding-left: 10rpx;
}
}
.card-item {
height: 180rpx;
background-color: pink;
border-radius: 10rpx;
position: relative;
overflow: hidden;
box-sizing: border-box;
margin: 0 $margin;
margin-bottom: $margin - 10;
.tags {
position: absolute;
top: 22rpx;
color: #fff;
right: -46rpx;
background: rgba($color: #ffaa00, $alpha: 0.9);
font-size: 30rpx;
padding: 2rpx 50rpx;
text-align: center;
transform: rotate(45deg);
font-weight: bold;
letter-spacing:4rpx;
z-index: 10;
}
.card-item-bg {
position: absolute;
top: 1;
width: 100%;
z-index: 1;
}
.card-item-top {
background-color: rgba($color: #000000, $alpha:0.6);
width: 100%;
height: 180rpx;
position: absolute;
top: 0;
left: 0;
z-index: 2;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
padding: 0 $padding;
.avatar {
width: 100rpx;
height: 100rpx;
border-radius: 50%;
border: solid 4rpx rgba($color: #fff, $alpha: 0.8);
}
.info {
flex: 1;
padding-left: $padding;
.title {
font-size: 34rpx;
font-weight: bold;
color: rgba($color: #fff, $alpha: 0.9);
}
.des {
padding-top: 6rpx;
font-size: 28rpx;
color: rgba($color: #fff, $alpha: 0.8);
}
}
}
}
</style>

View File

@@ -12,12 +12,8 @@
<view>
<view class="vip-lv">{{identity.identity_text}}</view>
<block>
<view class="vip-progress">
<view class="vip-progress-loding" :style="'width:' + firstRule.rate + '%'"></view>
</view>
<view class="vip-loding">
<view>{{firstRule.current}}/{{firstRule.need}}{{firstRule.title}}</view>
</view>
<view class="vip-progress"> <view class="vip-progress-loding" :style="'width:' + firstRule.rate + '%'"></view> </view>
<view class="vip-loding"> <view>{{firstRule.current}}/{{firstRule.need}}{{firstRule.title}}</view> </view>
</block>
</view>
<navigator class="vip-more" url="/pages/vip/agreement?id=2" hover-class="none">成长体系<uni-icons size="14" type="forward" color="#9f5529"></uni-icons></navigator>

BIN
static/book/wen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
static/store/.DS_Store vendored Normal file

Binary file not shown.

BIN
static/store/get-more.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 B

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long