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

View File

@@ -40,14 +40,10 @@ const shopsDetail = (shopId) => {
} }
// 店铺商品 // 店铺商品
const shopsGoods = (shopId, categoryId,page) => { const shopsGoods = (data) => {
return request({ return request({
url: 'mall/goods', url: 'mall/goods',
data: { data: data
shop_id:shopId,
category_id:categoryId,
page:page,
}
}) })
} }
@@ -66,6 +62,21 @@ const buy = data => {
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 => { 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 { export {
mall, mall,
goods, goods,
@@ -91,6 +117,10 @@ export {
shopsGoods, shopsGoods,
lists, lists,
buy, buy,
buyPin,
verify, 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 { export {
info, info,
chainSeed, chainSeed,
invitationCode, invitationCode,
relationsBind, relationsBind,
relationsVerify relationsVerify,
myCard
} }

View File

@@ -22,7 +22,7 @@ const vipPay = () => {
}) })
} }
// 获取支付信息 // 获取支付信息
const payInfo = (orderId) => { const payInfo = (orderId) => {
return request({ return request({
url: 'user/identities/pay/' + orderId + '/wechat' 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 { export {
@@ -43,4 +65,7 @@ export {
vipPay, vipPay,
payInfo, payInfo,
agreement, agreement,
shopVipInfo,
shopVipCreate,
shopVipWeChat
} }

View File

@@ -1,20 +1,16 @@
<template> <template>
<view class="goods-item"> <view class="goods-item">
<image <image :src="item.cover" mode="aspectFill" class="goods-cover" />
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" />
<view class="goods-info"> <view class="goods-info">
<view class="_title">北欧抱枕靠垫沙发垫办公室腰靠等功能弃权</view> <view class="_title">{{item.name}}</view>
<view class="_des">金凯来京东店 </view> <view class="_des">{{item.shop.name}} </view>
<view class="_pin"> <view class="_pin">
<view class="_has"> <view class="_has" v-if="item.sales>0"> <image src="/static/book/fire.png" mode="widthFix" class="fire" /> 已拼 {{item.sales}} </view>
<image src="/static/book/fire.png" mode="widthFix" class="fire" /> 已拼1件 <view class="tuan">{{item.active.number}}人团</view>
</view>
<view class="tuan">2人团</view>
</view> </view>
<view class="price"> <view class="price">
<view class="money"> 160.00 </view> <view class="money">{{item.active.price}} <span>DT积分</span> </view>
<view class="now-pin" @click="goPin(90)">马上拼团</view> <view class="now-pin" @click="goPin(item.goods_id)">马上拼团</view>
</view> </view>
</view> </view>
</view> </view>
@@ -91,7 +87,8 @@
color: #d81e06; color: #d81e06;
background-color: rgba($color: $text-price, $alpha: 0.1); background-color: rgba($color: $text-price, $alpha: 0.1);
padding: 4rpx 10rpx; padding: 4rpx 10rpx;
border-radius: 30rpx; border-radius: 30rpx;
margin-right: $margin;
image { image {
width: 24rpx; width: 24rpx;
@@ -100,9 +97,6 @@
} }
} }
.tuan {
margin-left: $margin;
}
} }
.price { .price {
@@ -116,7 +110,12 @@
.money { .money {
font-size: 34rpx; font-size: 34rpx;
font-weight: 600; font-weight: 600;
color: #d81e06; color: #d81e06;
span{
font-size: 24rpx;
margin-left: 10rpx;
font-weight: normal;
}
} }
.now-pin { .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_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>", "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>", "<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_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>", "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>", "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",

View File

@@ -154,9 +154,21 @@
"path": "pages/store/list", "path": "pages/store/list",
"name": "StoreList", "name": "StoreList",
"style": { "style": {
"navigationBarTitleText": "商品", "navigationBarTitleText": "更多商品",
"navigationBarBackgroundColor": "#FFFFFF", "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", "color": "#696969",
"type": "none", "type": "none",
"fontSrc": "/static/fonts/iconfont1.ttf", "fontSrc": "/static/fonts/iconfont1.ttf",
"text": "\ue608" //小相机 "text": "\ue608"
}] }]
} }
} }
@@ -520,16 +532,16 @@
"style": { "style": {
"navigationBarTitleText": "公告详情", "navigationBarTitleText": "公告详情",
"enablePullDownRefresh": false, "enablePullDownRefresh": false,
"navigationBarBackgroundColor": "#FFFFFF", "navigationBarBackgroundColor": "#FFFFFF",
"app-plus": { "app-plus": {
"titleNView": { "titleNView": {
"buttons": [{ "buttons": [{
"text": "分享", "text": "分享",
"fontSize": "14", "fontSize": "14",
"width": "60px", "width": "60px",
"color": "#333" "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": { "tabBar": {
"borderStyle": "white", "borderStyle": "white",
@@ -580,14 +629,14 @@
"easycom": { "easycom": {
"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue" "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
}, },
"condition" : { //模式配置,仅开发期间生效 "condition" : {
"current": 0, //当前激活的模式(list 的索引项) "current": 0,
"list": [ "list": [
{ {
"name": "", //模式名称 "name": "",
"path": "", //启动页面,必选 "path": "",
"query": "" //启动参数在页面的onLoad函数里面得到 "query": ""
} }
] ]
} }
} }

View File

@@ -16,7 +16,7 @@
<u-empty <u-empty
icon="http://cdn.uviewui.com/uview/empty/list.png" icon="http://cdn.uviewui.com/uview/empty/list.png"
textColor="#999" textColor="#999"
text="暂无任何拼单商品~" text="暂无拼单商品~"
/> />
</view> </view>
</scroll-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> </view>
</template> </template>
<script> <script>
import payKeyboard from '@/components/mi-payKeyboard/mi-payKeyboard.vue' import payKeyboard from '@/components/mi-payKeyboard/mi-payKeyboard.vue'
import eventBus from '../../utils/eventBus.js'; import eventBus from '../../utils/eventBus.js';
import { import {
wxPAY, wxPAY,
alPAY, alPAY,
dtPAY, dtPAY,
collagePAY,
payIndex payIndex
} from '@/apis/interfaces/pay' } from '@/apis/interfaces/pay'
export default { export default {
components: { payKeyboard }, components: {
payKeyboard
},
data() { data() {
return { return {
payNo: "", payNo: "",
@@ -26,8 +29,9 @@
oepnType: '', oepnType: '',
canpay: true, canpay: true,
has_transfer_password: true, has_transfer_password: true,
password: '', password: '',
showKeyBoard: false, showKeyBoard: false,
type: '',
} }
}, },
mounted() { mounted() {
@@ -36,7 +40,9 @@
if (this.$Route.query.oepnType === 'order') { if (this.$Route.query.oepnType === 'order') {
this.oepnType = this.$Route.query.oepnType this.oepnType = this.$Route.query.oepnType
} }
if (this.$Route.query.type) {
this.type = this.$Route.query.type
}
}, },
onShow() { onShow() {
this.payIndex(); this.payIndex();
@@ -109,23 +115,27 @@
} }
}, },
// 输入正确的回调 // 输入正确的回调
enterSuccess(password) { enterSuccess(password) {
this.password = password this.password = password
this.showKeyBoard = false this.showKeyBoard = false
this.getDTPAY(); this.getDTPAY();
}, },
// 点击[取消] 关闭输入框 的回调 // 点击[取消] 关闭输入框 的回调
close(){ close() {
this.showKeyBoard = false; this.showKeyBoard = false;
this.canpay = true; this.canpay = true;
}, },
// 调用 dt 支付 // 调用 dt 支付
getDTPAY() { getDTPAY() {
if (this.canpay) { if (this.canpay) {
this.canpay = false this.canpay = false
dtPAY(this.payNo, this.password).then(res => { let requestUrl = dtPAY
if (this.type === 'pin') {
requestUrl = collagePAY
}
requestUrl(this.payNo, this.password).then(res => {
if (res.state === 'warning') { if (res.state === 'warning') {
uni.showModal({ uni.showModal({
title: '当前DT积分不足', title: '当前DT积分不足',
@@ -162,27 +172,64 @@
} }
}) })
} else { } else {
uni.showModal({ if (this.type === 'pin') {
title: '支付成功', console.log('pin........', res)
content: '该订单已支付成功', this.canpay = true
confirmText: '我的订单', if (res.detailId) {
confirmColor: "#34CE98", uni.showLoading({
cancelText: '再逛逛', title:'跳转中',
cancelColor: "#666666", mask:true,
success: (res) => { })
if (res.confirm) { setTimeout(() => {
this.$Router.push({ uni.hideLoading()
name: "Order", uni.navigateTo({
params: { url: '/pages/group-book/success/success?id=' + res.detailId
index: 0 })
}, }, 2000)
})
} else { } else {
uni.navigateBack(); uni.showModal({
} title: '温馨提示',
this.canpay = true 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> <template>
<view class="rank"> <view class="rank">
<view class="rank_top"> <view class="rank_top">
<view class="rank_top_left"> <view class="rank_top_left">
<image class="rank_title" src="../../static/rank/rank_txt.png" mode="widthFix" /> <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 class="rank_sub_title" @click="toHelp"> 共力家族 周会员邀请 <image src="/static/rank/help.png" mode="widthFix" /> </view>
</view> </view>
<image class="rank_top_right" src="../../static/rank/rank.png" mode="widthFix" /> <image class="rank_top_right" src="../../static/rank/rank.png" mode="widthFix" />
</view> </view>
<!-- @click="click" --> <!-- @click="click" -->
<u-sticky bgColor="#34CE98"> <u-sticky bgColor="#34CE98">
<u-tabs <u-tabs
:list="tabs" :list="tabs"
lineColor="white" lineColor="white"
:activeStyle="{color: 'white', fontWeight: 'bold', fontSize: '14px'}" :activeStyle="{color: 'white', fontWeight: 'bold', fontSize: '15px'}"
:inactiveStyle="{color: 'rgba(255,255,255,.6)', fontSize: '14px'}" :inactiveStyle="{color: 'rgba(255,255,255,.6)', fontSize: '15px'}"
:itemStyle="{'height': '50px'}" :itemStyle="{'height': '50px'}"
@click="onTabs" @click="onTabs"
></u-tabs> />
</u-sticky> </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 <u-count-down
ref="countDown" ref="countDown"
format="DD:HH:mm:ss" format="DD:HH:mm:ss"
:time="end_timestamp" :time="end_timestamp"
:autoStart="false" :autoStart="false"
@change="downTime" @change="downTime"
> >
<view class="time"> <view class="time">
<view class="time__item"> <view class="time__item">
<text class="time__item_no">{{ timeData.days > 9 ? timeData.days: '0' + timeData.days }} </text> <text class="time__item_no">{{ timeData.days > 9 ? timeData.days: '0' + timeData.days }} </text>
</view> </view>
<view class="time__item"> <view class="time__item">
<text class="time__item_no">{{ timeData.hours > 9 ? timeData.hours : '0' + timeData.hours}}</text> <text class="time__item_no">{{ timeData.hours > 9 ? timeData.hours : '0' + timeData.hours}}</text>
</view> </view>
<view class="time__item"> <view class="time__item">
<text class="time__item_no">{{ timeData.minutes > 9 ? timeData.minutes : '0' + timeData.minutes}}</text> <text class="time__item_no">{{ timeData.minutes > 9 ? timeData.minutes : '0' + timeData.minutes}}</text>
</view> </view>
<view class="time__item"> <view class="time__item">
<text class="time__item_no">{{ timeData.seconds > 9 ? timeData.seconds : '0' + timeData.seconds}}</text> <text class="time__item_no">{{ timeData.seconds > 9 ? timeData.seconds : '0' + timeData.seconds}}</text>
</view> </view>
</view> </view>
</u-count-down> </u-count-down>
</view> </view>
<view class="list"> <view class="list">
<block v-if="lists.length>0"> <block v-if="lists.length>0">
<view class="list_item" v-for="(item,index) in lists" :keys='index'> <view class="list_item" v-for="(item,index) in lists" :keys='index'>
<view class="no"> <view class="no">
<image v-if="index < 3" class="image" :src="'/static/rank/rank-'+(index+1)+'.png'" <image v-if="index < 3" class="image" :src="'/static/rank/rank-'+(index+1)+'.png'"
mode="widthFix" /> mode="widthFix" />
<view v-else class="txt"> {{index + 1}} </view> <view v-else class="txt"> {{index + 1}} </view>
</view> </view>
<view class="user_info"> <view class="user_info">
<view class="user"> <view class="user">
<image class="avatar" :src="item.avatar" mode="aspectFill" /> <image class="avatar" :src="item.avatar" mode="aspectFill" />
<view class="nickname"> {{item.nickname}} </view> <view class="nickname"> {{item.nickname}} </view>
<view class="wight" v-if="type === '1'">+{{item.rate}}%</view> <view class="wight" v-if="type === '1'">+{{item.rate}}%</view>
</view> </view>
<view class="tuijian"> <view class="tuijian">
<view class="num"> {{item.number}}</view> <view class="num"> {{item.number}}</view>
<view class="title">{{type === '4'?'邀请用户':'邀请会员'}}</view> <view class="title">{{type === '4'?'邀请用户':'邀请会员'}}</view>
</view> </view>
</view> </view>
</view> </view>
</block> </block>
<block v-else> <block v-else>
<view class="vertical pages-empty"> <view class="vertical pages-empty">
<u-empty <u-empty
icon="http://cdn.uviewui.com/uview/empty/list.png" icon="http://cdn.uviewui.com/uview/empty/list.png"
textColor="#999" textColor="#999"
:text="type === '1'?'上周无加成数据':'当前暂无邀请数据'"> :text="type === '1'?'上周无加成数据':'当前暂无邀请数据'">
</u-empty> </u-empty>
</view> </view>
</block> </block>
</view> </view>
</view>
</view> </template>
</template> <script>
import {
<script> week,
import { week_mul,
week, total,
week_mul, totaluser
total, } from '@/apis/interfaces/rank.js'
totaluser export default {
} from '@/apis/interfaces/rank.js' data() {
export default { return {
data() { end_timestamp: 0,
return { lists : [],
end_timestamp: 0,
lists : [],
timeData : { timeData : {
days : 0, days : 0,
hours : 0, hours : 0,
minutes : 0, minutes : 0,
seconds : 0 seconds : 0
}, },
type : '1', // 1加成榜 2邀请榜 3会员邀请 4用户邀请 type : '1', // 1加成榜 2邀请榜 3会员邀请 4用户邀请
page_id : '', page_id : '',
tabs : [ tabs : [
{name: '上周加成榜', type: '1'}, {name: '上周加成榜', type: '1'},
{name: '本周邀请榜', type: '2'}, {name: '本周邀请榜', type: '2'},
{name: '会员邀请榜', type: '3'}, {name: '会员邀请榜', type: '3'},
{name: '用户邀请榜', type: '4'}, {name: '用户邀请榜', type: '4'},
], ],
} }
}, },
onShow() { onShow() {
this.getList(); this.getList();
}, },
methods: { methods: {
onTabs(e){ onTabs(e){
if(this.type == e.type){ if(this.type == e.type){
@@ -125,26 +124,26 @@
this.getList() this.getList()
}, },
downTime(e) { downTime(e) {
this.timeData = e this.timeData = e
}, },
toHelp() { toHelp() {
uni.navigateTo({ uni.navigateTo({
url: 'pages/vip/agreement?id=' + this.page_id url: 'pages/vip/agreement?id=' + this.page_id
}) })
}, },
getList() { getList() {
let urlRequest = '' let urlRequest = ''
if (this.type === '1') { if (this.type === '1') {
urlRequest = week_mul urlRequest = week_mul
} else if (this.type === '2') { } else if (this.type === '2') {
urlRequest = week urlRequest = week
} else if (this.type === '4') { } else if (this.type === '4') {
urlRequest = totaluser urlRequest = totaluser
} else { } else {
urlRequest = total urlRequest = total
} }
urlRequest().then(res => { urlRequest().then(res => {
this.lists = res.rand; this.lists = res.rand;
this.page_id = res.page_id; this.page_id = res.page_id;
this.end_timestamp = res.end_timestamp * 1000; this.end_timestamp = res.end_timestamp * 1000;
this.$nextTick(() => { this.$nextTick(() => {
@@ -152,15 +151,15 @@
this.$refs.countDown.start() this.$refs.countDown.start()
} }
}) })
uni.hideLoading() uni.hideLoading()
}).catch(err => { }).catch(err => {
uni.showToast({ uni.showToast({
title: err.message, title: err.message,
icon: 'none', icon: 'none',
mask: true mask: true
}) })
}) })
} }
}, },
onHide() { onHide() {
try { try {
@@ -173,70 +172,69 @@
icon: 'none' icon: 'none'
}) })
} }
} }
} }
</script> </script>
<style lang="scss">
<style lang="scss"> .rank {
.rank { .rank_top {
.rank_top { display: flex;
display: flex; flex-direction: row;
flex-direction: row; align-items: center;
align-items: center; justify-content: space-between;
justify-content: space-between; box-sizing: border-box;
box-sizing: border-box; background-color: #34CE98;
background-color: #34CE98; padding: 50rpx 30rpx 40rpx 30rpx;
padding: 50rpx 30rpx 40rpx 30rpx; border-bottom: solid 1rpx rgba($color: #fff, $alpha: 0.6);
border-bottom: solid 1rpx rgba($color: #fff, $alpha: 0.6); .rank_top_left {
.rank_top_left { display: flex;
display: flex; flex-direction: column;
flex-direction: column; align-items: flex-start;
align-items: flex-start; justify-content: flex-start;
justify-content: flex-start; box-sizing: border-box;
box-sizing: border-box;
.rank_title {
.rank_title { width: 360rpx;
width: 360rpx; }
}
.rank_sub_title {
.rank_sub_title { font-size: 28rpx;
font-size: 28rpx; font-weight: 500;
font-weight: 500; color: white;
color: white; padding-left: 20rpx;
padding-left: 20rpx; display: flex;
display: flex; flex-direction: row;
flex-direction: row; align-items: center;
align-items: center; justify-content: center;
justify-content: center; box-sizing: border-box;
box-sizing: border-box; margin-top: 10rpx;
margin-top: 10rpx;
image {
image { width: 32rpx;
width: 32rpx; margin-left: 6rpx;
margin-left: 6rpx; }
} }
} }
}
.rank_top_right {
.rank_top_right { width: 280rpx;
width: 280rpx; }
}
} }
.rank_update_time { .rank_update_time {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
box-sizing: border-box; box-sizing: border-box;
padding: 50rpx 30rpx; padding: 50rpx 30rpx;
width: 100%; width: 100%;
border-bottom: 20rpx solid $window-color; border-bottom: 20rpx solid $window-color;
.title { .title {
font-size: 28rpx; font-size: 28rpx;
font-weight: normal; font-weight: normal;
color: #34CE98; color: #34CE98;
padding-right: 10rpx; padding-right: 10rpx;
} }
.time{ .time{
display: flex; display: flex;
@@ -253,109 +251,109 @@
text-align: center; text-align: center;
margin: 0 10rpx; margin: 0 10rpx;
} }
} }
} }
.list { .list {
padding: 30rpx; padding: 30rpx;
.list_item { .list_item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
box-sizing: border-box; box-sizing: border-box;
.no { .no {
width: 80rpx; width: 80rpx;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
box-sizing: border-box; box-sizing: border-box;
.image { .image {
width: 54rpx; width: 54rpx;
} }
.txt { .txt {
font-weight: 600; font-weight: 600;
font-size: 34rpx; font-size: 34rpx;
color: #333; color: #333;
} }
} }
.user_info { .user_info {
flex: 1; flex: 1;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
box-sizing: border-box; box-sizing: border-box;
border-bottom: solid 1rpx #f9f9f9; border-bottom: solid 1rpx #f9f9f9;
padding: 30rpx 20rpx 30rpx 0; padding: 30rpx 20rpx 30rpx 0;
margin-left: 30rpx; margin-left: 30rpx;
.user { .user {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
justify-content: flex-start; justify-content: flex-start;
box-sizing: border-box; box-sizing: border-box;
.avatar { .avatar {
width: 90rpx; width: 90rpx;
height: 90rpx; height: 90rpx;
border-radius: 50%; border-radius: 50%;
margin-right: 30rpx; margin-right: 30rpx;
} }
.nickname { .nickname {
font-size: 30rpx; font-size: 30rpx;
color: #333; color: #333;
max-width: 200rpx; max-width: 200rpx;
font-weight: bold; font-weight: bold;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
justify-content: flex-start; justify-content: flex-start;
box-sizing: border-box; box-sizing: border-box;
} }
.wight { .wight {
font-size: 26rpx; font-size: 26rpx;
font-weight: normal; font-weight: normal;
margin-left: 20rpx; margin-left: 20rpx;
background-color: #bdc6d7; background-color: #bdc6d7;
color: #fff; color: #fff;
border-radius: 30rpx; border-radius: 30rpx;
padding: 0 10rpx; padding: 0 10rpx;
} }
} }
} }
.tuijian { .tuijian {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
box-sizing: border-box; box-sizing: border-box;
.num { .num {
color: #999; color: #999;
font-size: 30rpx; font-size: 30rpx;
} }
.title { .title {
font-size: 22rpx; font-size: 22rpx;
color: #999; color: #999;
} }
} }
} }
} }
} }
</style> </style>

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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