refactor: 移动端升级 Vue3 + uView Plus

将 lilishop-uniapp 从 Vue2/uView 1.6 迁移到 Vue3/uview-plus,优先支持 H5/微商城与微信小程序;移除 vendored uview-ui,改用 npm 依赖、Vuex4 与迁移脚本/补丁,并补充 VUE3_MIGRATION.md 回归清单。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
pikachu1995@126.com
2026-06-30 18:50:38 +08:00
parent c290c7a329
commit dc2bef455a
299 changed files with 5507 additions and 43811 deletions

15
.gitignore vendored
View File

@@ -1,14 +1,3 @@
# OSX
#
.DS_Store
node_modules/ node_modules/
unpackage/
#Intellij idea .DS_Store
.idea/
/idea/
.vscode/
/unpackage/
.hbuilderx/launch.json
.project.config.json
.project.private.config.json

View File

@@ -61,9 +61,6 @@ import {
return true; //阻止默认返回行为 return true; //阻止默认返回行为
} }
}, },
methods: {
...mapMutations(["login"]),
},
onLaunch: function(val) { onLaunch: function(val) {
if(val.query.inviter){ if(val.query.inviter){
storage.setInviter(val.query.inviter) storage.setInviter(val.query.inviter)
@@ -98,6 +95,7 @@ import {
// #endif // #endif
}, },
methods: { methods: {
...mapMutations(["login"]),
/** /**
* 微信小程序版本提交更新版本 解决缓存问题 * 微信小程序版本提交更新版本 解决缓存问题
*/ */
@@ -224,7 +222,7 @@ import {
</script> </script>
<style lang="scss"> <style lang="scss">
@import "uview-ui/index.scss"; @import "uview-plus/index.scss";
// -------适配底部安全区 苹果x系列刘海屏 // -------适配底部安全区 苹果x系列刘海屏

73
VUE3_MIGRATION.md Normal file
View File

@@ -0,0 +1,73 @@
# Vue 3 升级说明
本项目已从 Vue 2 + uView 1.6 升级到 **Vue 3 + uView Plus**
## 环境要求
- HBuilderX 3.8+
- Node.js 16+(用于安装 `uview-plus``vuex@4``sass`
## 安装依赖
```bash
npm install
```
## 主要变更
| 项 | 变更 |
|---|---|
| `manifest.json` | 增加 `"vueVersion": "3"` |
| `main.js` | 使用 `createSSRApp` + `export function createApp()` |
| UI 库 | `uview-ui``uview-plus`npm 依赖) |
| 状态管理 | Vuex 4 `createStore` |
| 全局 filter | 改为 `main.js` 全局 mixin methods |
| 小程序分享 | `utils/mpShare.js` |
| u-cell-item | 改为 `u-cell` |
| u-verification-code | 改为 `u-code` |
| u-swipe-action | 内层增加 `u-swipe-action-item` |
| u-upload | 关闭 `auto-upload`,使用 `@afterRead` + `utils/uploadHelper.js` |
| u-parse | `:html` 改为 `:content`,移除 `show-with-animation` / `use-cache` |
## 编译
请使用 HBuilderX 分别运行到 **H5**、**微信小程序**、**App** 进行验证。
## 回归测试清单
### 核心交易链路H5 / 小程序)
- [ ] 首页装修模块加载(轮播、商品、优惠券等)
- [ ] 分类 / 搜索 / 商品详情
- [ ] 加购 / 购物车 / 填写订单
- [ ] 支付H5 微信支付、小程序支付)
- [ ] 订单列表 / 订单详情 / 物流
- [ ] 售后申请 / 退款 / 评价
- [ ] 个人中心 / 地址 / 优惠券 / 积分
### 微商城专项H5
- [ ] 微信公众号内 JSSDK 分享
- [ ] 网页授权登录(`wechatH5Login`
- [ ] `js_sdk/lili-pay/wx-pay.js` 微信支付
- [ ] 粘贴板分享链接跳转(`h5-copy`
- [ ] H5 唤起 App 浮窗(`m-airbtn`
### 微信小程序专项
- [ ] 分包加载正常
- [ ] `onShareAppMessage` 分享
- [ ] 定位 / 相册权限
- [ ] 海报 / 二维码u-draw-poster、Sansnn-uQRCode
### App 端(后续阶段)
- [ ] 5+ 原生模块:支付 / 分享 / OAuth / 定位 / 地图 / 指纹
- [ ] 头像裁剪(`okingtz-cropper`
- [ ] 启动参数 / 唤起逻辑(`App.vue` `checkArguments`
## 第三方插件
- `Sansnn-uQRCode`:声明支持 Vue3
- `u-draw-poster`:声明支持 Vue2/3
- `okingtz-cropper`:需在 App 端实测头像裁剪

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="wrapper"> <div class="wrapper">
<u-popup class="popup" v-model="buyMask" :height="setup.height" closeable :mode="setup.mode" :border-radius="setup.radius" @close="closeMask()"> <u-popup class="popup" :show="buyMask" :height="setup.height" closeable :mode="setup.mode" :border-radius="setup.radius" @close="closeMask()">
<!-- 商品 --> <!-- 商品 -->
<view class="goods-box bottom"> <view class="goods-box bottom">
<view class="goods-header"> <view class="goods-header">
@@ -12,8 +12,8 @@
<view class="goods-price" v-if="goodsDetail.promotionPrice && ((isGroup && buyType === 'PINTUAN') || !isGroup)"> <view class="goods-price" v-if="goodsDetail.promotionPrice && ((isGroup && buyType === 'PINTUAN') || !isGroup)">
<span v-if="goodsDetail.promotionPrice && !pointDetail"> <span v-if="goodsDetail.promotionPrice && !pointDetail">
<span class="goods-price-promotionShow goods-price-bigshow">{{ $options.filters.goodsFormatPrice(goodsDetail.promotionPrice)[0] }}</span> <span class="goods-price-promotionShow goods-price-bigshow">{{ goodsFormatPrice(goodsDetail.promotionPrice)[0] }}</span>
.{{ $options.filters.goodsFormatPrice(goodsDetail.promotionPrice)[1] }} .{{ goodsFormatPrice(goodsDetail.promotionPrice)[1] }}
</span> </span>
<span v-if="pointDetail.points"> <span v-if="pointDetail.points">
<span class="goods-price-promotionShow goods-price-bigshow">{{ pointDetail.points }}</span> <span class="goods-price-promotionShow goods-price-bigshow">{{ pointDetail.points }}</span>
@@ -21,8 +21,8 @@
</span> </span>
<div class="promotion-box"> <div class="promotion-box">
<span class="goods-price-bigshow">{{ $options.filters.goodsFormatPrice(goodsDetail.price)[0] }}</span> <span class="goods-price-bigshow">{{ goodsFormatPrice(goodsDetail.price)[0] }}</span>
.{{ $options.filters.goodsFormatPrice(goodsDetail.price)[1] }} .{{ goodsFormatPrice(goodsDetail.price)[1] }}
</div> </div>
</view> </view>
<!-- 正常商品的价格 --> <!-- 正常商品的价格 -->
@@ -32,8 +32,8 @@
<div class="goods-price" v-for="(item, index) in wholesaleList" :key="index"> <div class="goods-price" v-for="(item, index) in wholesaleList" :key="index">
<span> <span>
<span class="goods-price-bigshow">{{ $options.filters.goodsFormatPrice(item.price)[0] }}</span> <span class="goods-price-bigshow">{{ goodsFormatPrice(item.price)[0] }}</span>
.{{ $options.filters.goodsFormatPrice(item.price)[1] }} .{{ goodsFormatPrice(item.price)[1] }}
</span> </span>
<span class="wholesale-item">{{ item.num }}{{ goodsDetail.goodsUnit }}</span> <span class="wholesale-item">{{ item.num }}{{ goodsDetail.goodsUnit }}</span>
</div> </div>
@@ -41,8 +41,8 @@
<div class="goods-price" v-else> <div class="goods-price" v-else>
<span> <span>
<span class="goods-price-bigshow">{{ $options.filters.goodsFormatPrice(goodsDetail.price)[0] }}</span> <span class="goods-price-bigshow">{{ goodsFormatPrice(goodsDetail.price)[0] }}</span>
.{{ $options.filters.goodsFormatPrice(goodsDetail.price)[1] }} .{{ goodsFormatPrice(goodsDetail.price)[1] }}
</span> </span>
</div> </div>
</view> </view>
@@ -81,16 +81,16 @@
</view> </view>
<!-- 拼团购买仅筛选出当前拼团类型商品 --> <!-- 拼团购买仅筛选出当前拼团类型商品 -->
<template v-for="(spec_val, spec_index) in spec.values" :key="spec_index">
<view <view
v-if="parentOrder && spec_val.skuId == goodsDetail.id" v-if="parentOrder && spec_val.skuId == goodsDetail.id"
:class="{ active: spec_val.value == currentSelected[specIndex] }" :class="{ active: spec_val.value == currentSelected[specIndex] }"
class="skus-view-item" class="skus-view-item"
v-for="(spec_val, spec_index) in spec.values"
:key="spec_index"
@click="handleClickSpec(spec, specIndex, spec_val)" @click="handleClickSpec(spec, specIndex, spec_val)"
> >
{{ spec_val.value }} {{ spec_val.value }}
</view> </view>
</template>
</view> </view>
</view> </view>
<div class="soldout" v-if="goodsDetail.quantity === 0"> <div class="soldout" v-if="goodsDetail.quantity === 0">
@@ -261,7 +261,7 @@ export default {
} }
}); });
if (selectedSkuId?.skuId) { if (selectedSkuId?.skuId) {
this.$set(this.currentSelected, index, specValue.value); this.currentSelected[index] = specValue.value;
this.selectSkuList = { this.selectSkuList = {
spec: { spec: {
specName: val.name, specName: val.name,
@@ -531,11 +531,6 @@ export default {
color: $price-color; color: $price-color;
line-height: 80rpx; line-height: 80rpx;
margin-right: 20rpx; margin-right: 20rpx;
> * {
color: $price-color;
line-height: 80rpx;
}
} }
.promotion-box { .promotion-box {
@@ -565,9 +560,6 @@ export default {
> .goods-check-skus-name { > .goods-check-skus-name {
margin-left: 4rpx; margin-left: 4rpx;
}
> span {
color: #333; color: #333;
} }
} }

View File

@@ -1,7 +1,7 @@
<template> <template>
<div class="index"> <div class="index">
<u-modal v-model="show" :show-title="false" :show-confirm-button="false" mask-close-able> <u-modal v-model:show="show" :show-title="false" :show-confirm-button="false" mask-close-able>
<view class="slot-content"> <view class="slot-content">
<image @click="downLoad()" class="img" :src="imgUrl" /> <image @click="downLoad()" class="img" :src="imgUrl" />
<div class="canvas-hide"> <div class="canvas-hide">

View File

@@ -208,7 +208,7 @@ export default {
this.tabCurrentIndex++; this.tabCurrentIndex++;
// 当前距离重新为最上面 // 当前距离重新为最上面
this.$set(this,'scrollTop',0) this['scrollTop'] = 0
} }
} catch (error) { } catch (error) {
uni.hideLoading(); uni.hideLoading();
@@ -391,12 +391,10 @@ export default {
flex-direction: column; flex-direction: column;
/* #endif */ /* #endif */
margin-right: 5px; margin-right: 5px;
margin-left: 40rpx;
vertical-align: middle; vertical-align: middle;
} }
.color { .color {
color: $light-color; color: $light-color;
} }
icon {
margin-left: 40rpx;
}
</style> </style>

View File

@@ -10,7 +10,7 @@
height="330rpx" height="330rpx"
mode="aspectFit" mode="aspectFit"
> >
<u-loading slot="loading"></u-loading> <template #loading><u-loading></u-loading></template>
</u-image> </u-image>
</view> </view>
<view class="goods-detail"> <view class="goods-detail">
@@ -23,9 +23,9 @@
<div class="price" v-if="item.price != undefined"> <div class="price" v-if="item.price != undefined">
¥<span ¥<span
>{{ >{{
$options.filters.goodsFormatPrice(item.price)[0] goodsFormatPrice(item.price)[0]
}} </span }} </span
>.{{ $options.filters.goodsFormatPrice(item.price)[1] }} >.{{ goodsFormatPrice(item.price)[1] }}
</div> </div>
</view> </view>
<div class="count-config" @click="navigateToDetailPage(item)"> <div class="count-config" @click="navigateToDetailPage(item)">
@@ -67,7 +67,7 @@
mode="aspectFit" mode="aspectFit"
:src="item.goodsImage || item.thumbnail" :src="item.goodsImage || item.thumbnail"
> >
<u-loading slot="loading"></u-loading> <template #loading><u-loading></u-loading></template>
</u-image> </u-image>
</div> </div>
<div class="goods-detail"> <div class="goods-detail">
@@ -77,8 +77,8 @@
<view class="price-box" @click="navigateToDetailPage(item)"> <view class="price-box" @click="navigateToDetailPage(item)">
<div class="price" v-if="item.price != undefined"> <div class="price" v-if="item.price != undefined">
¥<span ¥<span
>{{ $options.filters.goodsFormatPrice(item.price)[0] }} </span >{{ goodsFormatPrice(item.price)[0] }} </span
>.{{ $options.filters.goodsFormatPrice(item.price)[1] }} >.{{ goodsFormatPrice(item.price)[1] }}
</div> </div>
</view> </view>
<div class="promotion" @click="navigateToDetailPage(item)"> <div class="promotion" @click="navigateToDetailPage(item)">

View File

@@ -5,7 +5,7 @@
<view v-for="(item, index) in res" :key="index" class="goods-item"> <view v-for="(item, index) in res" :key="index" class="goods-item">
<view class="image-wrapper" @click="navigateToDetailPage(item)"> <view class="image-wrapper" @click="navigateToDetailPage(item)">
<u-image :src="item.thumbnail" width="100%" height='330rpx' mode="aspectFit"> <u-image :src="item.thumbnail" width="100%" height='330rpx' mode="aspectFit">
<u-loading slot="loading"></u-loading> <template #loading><u-loading></u-loading></template>
</u-image> </u-image>
</view> </view>
<view class="goods-detail"> <view class="goods-detail">
@@ -15,19 +15,19 @@
</div> </div>
<view class="price-box" @click="navigateToDetailPage(item)"> <view class="price-box" @click="navigateToDetailPage(item)">
<div class="price" v-if="item.price!=undefined"> <div class="price" v-if="item.price!=undefined">
¥<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{ ¥<span class="price-int">{{ goodsFormatPrice(item.price )[0] }} </span>.{{
$options.filters.goodsFormatPrice(item.price )[1] goodsFormatPrice(item.price )[1]
}} }}
</div> </div>
</view> </view>
<div class="promotion" @click="navigateToDetailPage(item)"> <div class="promotion" @click="navigateToDetailPage(item)">
<div v-if="item.salesModel == 'WHOLESALE'"> <div v-if="item.salesModel == 'WHOLESALE'">
<span></span> <span class="promotion-tag"></span>
</div> </div>
<div v-for="(promotionItem,promotionIndex) in getPromotion(item)" :key="promotionIndex"> <div v-for="(promotionItem,promotionIndex) in getPromotion(item)" :key="promotionIndex">
<span v-if="promotionItem.indexOf('COUPON') != -1"></span> <span class="promotion-tag" v-if="promotionItem.indexOf('COUPON') != -1"></span>
<span v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1">满减</span> <span class="promotion-tag" v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1">满减</span>
<span v-if="promotionItem.indexOf('SECKILL') != -1">秒杀</span> <span class="promotion-tag" v-if="promotionItem.indexOf('SECKILL') != -1">秒杀</span>
</div> </div>
</div> </div>
<div class="count-config" @click="navigateToDetailPage(item)"> <div class="count-config" @click="navigateToDetailPage(item)">
@@ -35,14 +35,12 @@
<span>{{ item.commentNum || "0" }}条评论</span> <span>{{ item.commentNum || "0" }}条评论</span>
</div> </div>
<div class="store-seller-name" v-if="storeName" @click="navigateToStoreDetailPage(item)"> <div class="store-seller-name" v-if="storeName" @click="navigateToStoreDetailPage(item)">
<div class="text-hidden"> <view class="store-name-row">
<u-tag style="margin-right: 10rpx" size="mini" mode="dark" v-if="item.selfOperated" <text class="self-tag" v-if="item.selfOperated">自营</text>
text="自营" type="error" /> <text class="store-name-text">{{ item.storeName || "暂无" }}</text>
<span>{{ item.storeName || "暂无" }}</span> <text class="to-store">进店</text>
</div> </view>
<span> <u-icon name="arrow-right" size="12" color="#c5c5c5"></u-icon>
<u-icon name="arrow-right"></u-icon>
</span>
</div> </div>
</view> </view>
</view> </view>
@@ -53,43 +51,39 @@
<div class="flex goods-col"> <div class="flex goods-col">
<div class="goods-img" @click="navigateToDetailPage(item)"> <div class="goods-img" @click="navigateToDetailPage(item)">
<u-image width="230rpx" mode="aspectFit" border-radius='16' height="230rpx" :src="item.thumbnail"> <u-image width="230rpx" mode="aspectFit" border-radius='16' height="230rpx" :src="item.thumbnail">
<u-loading slot="loading"></u-loading> <template #loading><u-loading></u-loading></template>
</u-image> </u-image>
</div> </div>
<div class="goods-detail"> <div class="goods-detail">
<div class="title clamp3" @click="navigateToDetailPage(item)">{{ item.goodsName }}</div> <div class="title clamp3" @click="navigateToDetailPage(item)">{{ item.goodsName }}</div>
<view class="price-box" @click="navigateToDetailPage(item)"> <view class="price-box" @click="navigateToDetailPage(item)">
<div class="price" v-if="item.price!=undefined"> <div class="price" v-if="item.price!=undefined">
¥<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{ ¥<span class="price-int">{{ goodsFormatPrice(item.price )[0] }} </span>.{{
$options.filters.goodsFormatPrice(item.price )[1] goodsFormatPrice(item.price )[1]
}} }}
</div> </div>
</view> </view>
<div class="promotion" @click="navigateToDetailPage(item)"> <div class="promotion" @click="navigateToDetailPage(item)">
<div v-if="item.salesModel == 'WHOLESALE'"> <div v-if="item.salesModel == 'WHOLESALE'">
<span></span> <span class="promotion-tag"></span>
</div> </div>
<div v-for="(promotionItem,promotionIndex) in getPromotion(item)" :key="promotionIndex"> <div v-for="(promotionItem,promotionIndex) in getPromotion(item)" :key="promotionIndex">
<span v-if="promotionItem.indexOf('COUPON') != -1"></span> <span class="promotion-tag" v-if="promotionItem.indexOf('COUPON') != -1"></span>
<span v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1">满减</span> <span class="promotion-tag" v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1">满减</span>
<span v-if="promotionItem.indexOf('SECKILL') != -1">秒杀</span> <span class="promotion-tag" v-if="promotionItem.indexOf('SECKILL') != -1">秒杀</span>
</div> </div>
</div> </div>
<div style="overflow: hidden" @click="navigateToDetailPage(item)" class="count-config"> <div style="overflow: hidden" @click="navigateToDetailPage(item)" class="count-config">
<span style="float: left; font-size: 22rpx">已售 {{ item.buyCount || '0' }}</span> <span style="float: left; font-size: 22rpx">已售 {{ item.buyCount || '0' }}</span>
<span style="float: right; font-size: 22rpx">{{ item.commentNum || '0' }}条评论</span> <span style="float: right; font-size: 22rpx">{{ item.commentNum || '0' }}条评论</span>
</div> </div>
<div style="overflow: hidden" @click="navigateToStoreDetailPage(item)" class="count-config"> <div class="store-seller-name" @click="navigateToStoreDetailPage(item)">
<div class="text-hidden" v-if="storeName"> <view class="store-name-row" v-if="storeName">
<u-tag style="margin-right: 10rpx" size="mini" mode="dark" v-if="item.selfOperated" <text class="self-tag" v-if="item.selfOperated">自营</text>
text="自营" type="error" /> <text class="store-name-text">{{ item.storeName }}</text>
<span class="line1-store-name">{{ item.storeName }}</span> <text class="to-store">进店</text>
<span class="to-store">进店<u-icon size="24" name="arrow-right" color="#666"></u-icon> </view>
</span> <u-icon name="arrow-right" size="12" color="#c5c5c5"></u-icon>
</div>
<span>
<u-icon name="arrow-right" color="#c5c5c5"></u-icon>
</span>
</div> </div>
</div> </div>
</div> </div>
@@ -245,14 +239,60 @@
font-size: $font-sm; font-size: $font-sm;
} }
.text-hidden { .store-seller-name {
color: #666;
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 4rpx;
font-size: 24rpx;
}
.store-name-row {
flex: 1;
min-width: 0;
display: flex;
align-items: center;
overflow: hidden;
}
.store-name-text {
flex: 1;
min-width: 0;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
font-size: 24rpx;
color: #999;
}
.to-store {
flex-shrink: 0;
font-size: 24rpx;
color: #333;
margin-left: 8rpx;
}
.self-tag {
flex-shrink: 0;
margin-right: 8rpx;
padding: 2rpx 10rpx;
border-radius: 8rpx;
background: $main-color;
color: #fff;
font-size: 20rpx;
line-height: 1.4;
}
.count-config {
padding: 5rpx 0;
color: #666;
display: flex;
font-size: 24rpx;
justify-content: space-between;
} }
} }
.goods-row { .goods-row {
background: #fff; background: #fff;
padding: 16rpx; padding: 16rpx;
@@ -290,22 +330,58 @@
margin-top: 4rpx; margin-top: 4rpx;
display: flex; display: flex;
div { .promotion-tag {
span { font-size: 24rpx;
font-size: 24rpx; color: $light-color;
color: $light-color; margin-right: 10rpx;
margin-right: 10rpx; padding: 0 4rpx;
padding: 0 4rpx; border-radius: 2rpx;
border-radius: 2rpx;
}
} }
} }
.store-seller-name { .store-seller-name {
color: #666; color: #666;
overflow: hidden;
display: flex; display: flex;
align-items: center;
justify-content: space-between; justify-content: space-between;
margin-top: 4rpx;
font-size: 24rpx;
}
.store-name-row {
flex: 1;
min-width: 0;
display: flex;
align-items: center;
overflow: hidden;
}
.store-name-text {
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 24rpx;
color: #999;
}
.to-store {
flex-shrink: 0;
font-size: 24rpx;
color: #333;
margin-left: 8rpx;
}
.self-tag {
flex-shrink: 0;
margin-right: 8rpx;
padding: 2rpx 10rpx;
border-radius: 8rpx;
background: $main-color;
color: #fff;
font-size: 20rpx;
line-height: 1.4;
} }
.count-config { .count-config {
@@ -331,7 +407,7 @@
color: $main-color; color: $main-color;
font-weight: bold; font-weight: bold;
::v-deep span:nth-of-type(1) { .price-int {
font-size: 38rpx; font-size: 38rpx;
} }
} }

View File

@@ -4,7 +4,7 @@
<div class="flex goods-col"> <div class="flex goods-col">
<div class="goods-img"> <div class="goods-img">
<u-image width="230rpx" mode="aspectFit" border-radius='16' height="230rpx" :src="item.goodsImage || item.thumbnail"> <u-image width="230rpx" mode="aspectFit" border-radius='16' height="230rpx" :src="item.goodsImage || item.thumbnail">
<u-loading slot="loading"></u-loading> <template #loading><u-loading></u-loading></template>
</u-image> </u-image>
</div> </div>
<div class="goods-detail"> <div class="goods-detail">
@@ -13,28 +13,28 @@
<view class="price-box"> <view class="price-box">
<!-- 秒杀 / 拼团 --> <!-- 秒杀 / 拼团 -->
<div class="price" v-if="!type && item.price!=undefined"> <div class="price" v-if="!type && item.price!=undefined">
¥<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{ ¥<span class="price-int">{{ goodsFormatPrice(item.price )[0] }} </span>.{{
$options.filters.goodsFormatPrice(item.price )[1] goodsFormatPrice(item.price )[1]
}} }}
</div> </div>
<!-- 砍价 --> <!-- 砍价 -->
<div class="price" v-if="type && item.purchasePrice!=undefined"> <div class="price" v-if="type && item.purchasePrice!=undefined">
最低 最低
¥<span>{{ $options.filters.goodsFormatPrice(item.purchasePrice )[0] }} </span>.{{ ¥<span class="price-int">{{ goodsFormatPrice(item.purchasePrice )[0] }} </span>.{{
$options.filters.goodsFormatPrice(item.purchasePrice )[1] goodsFormatPrice(item.purchasePrice )[1]
}} }}
</div> </div>
<!-- 兜底策略如果金额是0 --> <!-- 兜底策略如果金额是0 -->
<div class="price" v-if="!item.price && !type"> <div class="price" v-if="!item.price && !type">
¥<span>0 </span>.00 ¥<span class="price-int">0 </span>.00
</div> </div>
</view> </view>
<div> <div>
<image class='buy' :src="buy"></image> <image class="buy" src="/static/buy.png"></image>
</div> </div>
</div> </div>
<div class='count-config' v-if="!type"> <div class='count-config' v-if="!type">
<span>即将恢复{{ item.originalPrice}}</span> <text class="count-config-text">即将恢复{{ item.originalPrice}}</text>
</div> </div>
</div> </div>
</div> </div>
@@ -49,7 +49,6 @@
data() { data() {
return { return {
lightColor: this.$mainColor, lightColor: this.$mainColor,
buy: require('@/static/buy.png')
} }
}, },
mixins: [commonTpl], mixins: [commonTpl],
@@ -119,21 +118,6 @@
overflow: hidden; overflow: hidden;
} }
.promotion {
margin-top: 4rpx;
display: flex;
div {
span {
font-size: 24rpx;
color: $light-color;
margin-right: 10rpx;
padding: 0 4rpx;
border-radius: 2rpx;
}
}
}
.count-config { .count-config {
padding: 5rpx 0; padding: 5rpx 0;
color: #666; color: #666;
@@ -141,6 +125,10 @@
font-size: 24rpx; font-size: 24rpx;
letter-spacing:2rpx; letter-spacing:2rpx;
padding-left: 10rpx; padding-left: 10rpx;
.count-config-text {
font-size: 24rpx;
}
} }
@@ -162,7 +150,7 @@
color: $main-color; color: $main-color;
font-weight: bold; font-weight: bold;
::v-deep span:nth-of-type(1) { .price-int {
font-size: 48rpx; font-size: 48rpx;
} }
} }

View File

@@ -100,10 +100,6 @@ $w_94: 94%;
border-top-left-radius: 20rpx; border-top-left-radius: 20rpx;
border-top-right-radius: 20rpx; border-top-right-radius: 20rpx;
overflow: hidden; overflow: hidden;
> img {
width: 100%;
height: 100%;
}
} }
.goods-desc { .goods-desc {
border-bottom-left-radius: 20rpx; border-bottom-left-radius: 20rpx;

View File

@@ -1,7 +1,7 @@
<template> <template>
<view class="serach"> <view class="serach">
<view class="left-box" @tap="onClickLeft"> <view class="left-box" @tap="onClickLeft">
<u-icon name="arrow-left" size="40" color="#666"></u-icon> <u-icon name="arrow-left" size="28" color="#666"></u-icon>
</view> </view>
<view class="content" :style="{ 'border-radius': radius + 'px' }"> <view class="content" :style="{ 'border-radius': radius + 'px' }">
<!-- HM修改 增加进入输入状态的点击范围 --> <!-- HM修改 增加进入输入状态的点击范围 -->
@@ -21,8 +21,8 @@
</view> </view>
<view v-else class="button-item"> <view v-else class="button-item">
<u-icon name="grid-fill" size="50" @click="handelListClass()" v-if="!switchLayout"></u-icon> <u-icon name="grid-fill" size="32" @click="handelListClass()" v-if="!switchLayout"></u-icon>
<u-icon v-else @click="handelListClass()" name="list-dot" size="50"></u-icon> <u-icon v-else @click="handelListClass()" name="list-dot" size="32"></u-icon>
</view> </view>
</view> </view>
</view> </view>
@@ -162,7 +162,7 @@ export default {
.serach { .serach {
display: flex; display: flex;
width: 100%; width: 100%;
//border-bottom: 1px #f5f5f5 solid; //HM修改 去掉边框 align-items: center;
box-sizing: border-box; box-sizing: border-box;
font-size: 24rpx; font-size: 24rpx;
@@ -170,53 +170,41 @@ export default {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
width: 15%; flex-shrink: 0;
/* #ifndef APP-NVUE */ width: auto;
text-align: center; padding: 0 8rpx;
// display: flex;
// /* #endif */
} }
.content { .content {
display: flex; display: flex;
align-items: center; align-items: center;
width: 100%; flex: 1;
min-width: 0;
height: 70rpx; height: 70rpx;
color: #999; color: #999;
background: #eee; background: #eee;
overflow: hidden; overflow: hidden;
transition: all 0.2s linear; transition: all 0.2s linear;
border-radius: 1000rpx;
.content-box { .content-box {
width: 100%; width: 100%;
display: flex; display: flex;
align-items: center; align-items: center;
&.center { &.center {
justify-content: center; justify-content: flex-start;
}
.icon {
padding: 0 15rpx;
&.icon-serach:before {
content: "\e61c";
}
} }
.input { .input {
width: 100%; flex: 1;
max-width: 100%; min-width: 0;
width: auto;
line-height: 60rpx; line-height: 60rpx;
height: 60rpx; height: 60rpx;
transition: all 0.2s linear; transition: all 0.2s linear;
&.center { &.center {
width: 200rpx;
}
&.sub {
// position: absolute;
width: auto; width: auto;
color: grey;
} }
} }
} }
@@ -226,16 +214,16 @@ export default {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
position: relative;
flex-shrink: 0; flex-shrink: 0;
width: 0; width: 0;
overflow: hidden;
transition: all 0.2s linear; transition: all 0.2s linear;
white-space: nowrap; white-space: nowrap;
overflow: hidden;
&.active { &.active {
padding-left: 15rpx; padding-left: 12rpx;
width: 100rpx; width: auto;
min-width: 80rpx;
} }
} }
} }

View File

@@ -1,6 +1,6 @@
<template> <template>
<!-- 遮罩层 --> <!-- 遮罩层 -->
<u-popup @close="close" v-model="show" mode="bottom" border-radius="30" height="260rpx"> <u-popup @close="close" v-model:show="show" mode="bottom" border-radius="30" height="260rpx">
<view class="share-title"> <view class="share-title">
<span>分享至</span> <span>分享至</span>
@@ -15,14 +15,14 @@
<!-- #endif --> <!-- #endif -->
<!-- #ifdef APP-PLUS --> <!-- #ifdef APP-PLUS -->
<view class="share-item" @click="handleShare(item)" v-for="(item, index) in list" :key="index"> <view class="share-item" @click="handleShare(item)" v-for="(item, index) in list" :key="index">
<u-icon :color="item.color" size="80" :name="item.icon"></u-icon> <u-icon class="share-icon" :color="item.color" size="80" :name="item.icon"></u-icon>
<view>{{ item.title }}</view> <view class="share-label">{{ item.title }}</view>
</view> </view>
<!-- #endif --> <!-- #endif -->
<!-- #ifdef H5 --> <!-- #ifdef H5 -->
<view class="share-item" @click="copyLink()"> <view class="share-item" @click="copyLink()">
<u-icon color="#b4aee8" size="80" name="share-fill"></u-icon> <u-icon class="share-icon" color="#b4aee8" size="80" name="share-fill"></u-icon>
<view>{{ '复制链接' }}</view> <view class="share-label">{{ '复制链接' }}</view>
</view> </view>
<!-- #endif --> <!-- #endif -->
</view> </view>
@@ -31,7 +31,8 @@
<script> <script>
import { h5Copy } from "@/js_sdk/h5-copy/h5-copy.js"; import { h5Copy } from "@/js_sdk/h5-copy/h5-copy.js";
import configs from "@/config/config"; import configs from "@/config/config";
import mpShare from "uview-ui/libs/mixin/mpShare.js"; import mpShare from "@/utils/mpShare.js";
import { setClipboard } from "@/utils/filters.js";
export default { export default {
mixins: [mpShare], mixins: [mpShare],
@@ -83,7 +84,7 @@ export default {
this.configs.shareLink + this.configs.shareLink +
getCurrentPages()[getCurrentPages().length - 1].__page__.fullPath; getCurrentPages()[getCurrentPages().length - 1].__page__.fullPath;
} }
this.$options.filters.setClipboard(content) setClipboard(content)
}, },
// #endif // #endif
@@ -155,7 +156,7 @@ export default {
top: 30rpx; top: 30rpx;
} }
} }
button:after { .share-btn:after {
border: none; border: none;
} }
@@ -168,7 +169,8 @@ button:after {
width: 25%; width: 25%;
font-size: 24rpx; font-size: 24rpx;
color: #666; color: #666;
> * { > .share-icon,
> .share-label {
margin: 8rpx 0; margin: 8rpx 0;
} }
} }

View File

@@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<u-popup v-model="show" mode="bottom" height="800rpx" border-radius="14"> <u-popup v-model:show="show" mode="bottom" height="800rpx" border-radius="14">
<div class="wrapper"> <div class="wrapper">
<view class="down-goods-tips">该商品已下架</view> <view class="down-goods-tips">该商品已下架</view>
<scroll-view scroll-y="true" style="height: 670rpx"> <scroll-view scroll-y="true" style="height: 670rpx">

View File

@@ -0,0 +1,86 @@
<template>
<view class="u-time-line-item">
<view class="u-time-line-item__node" :style="nodeStyle">
<slot name="node">
<view class="u-time-line-item__dot" :style="{ backgroundColor: bgColor }"></view>
</slot>
</view>
<view class="u-time-line-item__content">
<slot name="content" />
</view>
</view>
</template>
<script>
export default {
name: 'UTimeLineItem',
props: {
nodeTop: {
type: [String, Number],
default: ''
},
bgColor: {
type: String,
default: '#ffffff'
}
},
computed: {
nodeStyle() {
if (this.nodeTop === '' || this.nodeTop === null || this.nodeTop === undefined) {
return {}
}
const top = typeof this.nodeTop === 'number' ? `${this.nodeTop}rpx` : this.nodeTop
return { top }
}
}
}
</script>
<style lang="scss" scoped>
.u-time-line-item {
display: flex;
flex-direction: row;
position: relative;
padding-bottom: 32rpx;
&:last-child {
padding-bottom: 0;
}
&__node {
position: relative;
width: 32rpx;
display: flex;
justify-content: center;
flex-shrink: 0;
z-index: 1;
}
&__dot {
width: 16rpx;
height: 16rpx;
border-radius: 50%;
background-color: #ddd;
}
&__content {
flex: 1;
padding-left: 12rpx;
}
&::before {
content: '';
position: absolute;
left: 15rpx;
top: 0;
bottom: 0;
width: 1px;
background-color: #ddd;
}
&:last-child::before {
bottom: auto;
height: 16rpx;
}
}
</style>

View File

@@ -0,0 +1,18 @@
<template>
<view class="u-time-line">
<slot />
</view>
</template>
<script>
export default {
name: 'UTimeLine'
}
</script>
<style lang="scss" scoped>
.u-time-line {
display: flex;
flex-direction: column;
}
</style>

View File

@@ -2,22 +2,22 @@
<view class="uni-load-more"> <view class="uni-load-more">
<view class="uni-load-more__img" v-show="status === 'loading' && showIcon"> <view class="uni-load-more__img" v-show="status === 'loading' && showIcon">
<view class="load1"> <view class="load1">
<view :style="{ background: color }"></view> <view class="load-item" :style="{ background: color }"></view>
<view :style="{ background: color }"></view> <view class="load-item" :style="{ background: color }"></view>
<view :style="{ background: color }"></view> <view class="load-item" :style="{ background: color }"></view>
<view :style="{ background: color }"></view> <view class="load-item" :style="{ background: color }"></view>
</view> </view>
<view class="load2"> <view class="load2">
<view :style="{ background: color }"></view> <view class="load-item" :style="{ background: color }"></view>
<view :style="{ background: color }"></view> <view class="load-item" :style="{ background: color }"></view>
<view :style="{ background: color }"></view> <view class="load-item" :style="{ background: color }"></view>
<view :style="{ background: color }"></view> <view class="load-item" :style="{ background: color }"></view>
</view> </view>
<view class="load3"> <view class="load3">
<view :style="{ background: color }"></view> <view class="load-item" :style="{ background: color }"></view>
<view :style="{ background: color }"></view> <view class="load-item" :style="{ background: color }"></view>
<view :style="{ background: color }"></view> <view class="load-item" :style="{ background: color }"></view>
<view :style="{ background: color }"></view> <view class="load-item" :style="{ background: color }"></view>
</view> </view>
</view> </view>
<text class="uni-load-more__text" :style="{ color: color }" v-if="showText"> <text class="uni-load-more__text" :style="{ color: color }" v-if="showText">
@@ -86,11 +86,13 @@ export default {
margin-right: 10px; margin-right: 10px;
} }
.uni-load-more__img > view { .load1,
.load2,
.load3 {
position: absolute; position: absolute;
} }
.uni-load-more__img > view view { .load-item {
width: 6px; width: 6px;
height: 2px; height: 2px;
border-top-left-radius: 1px; border-top-left-radius: 1px;
@@ -102,25 +104,25 @@ export default {
animation: load 1.56s ease infinite; animation: load 1.56s ease infinite;
} }
.uni-load-more__img > view view:nth-child(1) { .load-item:nth-child(1) {
transform: rotate(90deg); transform: rotate(90deg);
top: 2px; top: 2px;
left: 9px; left: 9px;
} }
.uni-load-more__img > view view:nth-child(2) { .load-item:nth-child(2) {
transform: rotate(180deg); transform: rotate(180deg);
top: 11px; top: 11px;
right: 0; right: 0;
} }
.uni-load-more__img > view view:nth-child(3) { .load-item:nth-child(3) {
transform: rotate(270deg); transform: rotate(270deg);
bottom: 2px; bottom: 2px;
left: 9px; left: 9px;
} }
.uni-load-more__img > view view:nth-child(4) { .load-item:nth-child(4) {
top: 11px; top: 11px;
left: 0; left: 0;
} }
@@ -140,51 +142,51 @@ export default {
transform: rotate(60deg); transform: rotate(60deg);
} }
.load1 view:nth-child(1) { .load1 .load-item:nth-child(1) {
animation-delay: 0s; animation-delay: 0s;
} }
.load2 view:nth-child(1) { .load2 .load-item:nth-child(1) {
animation-delay: 0.13s; animation-delay: 0.13s;
} }
.load3 view:nth-child(1) { .load3 .load-item:nth-child(1) {
animation-delay: 0.26s; animation-delay: 0.26s;
} }
.load1 view:nth-child(2) { .load1 .load-item:nth-child(2) {
animation-delay: 0.39s; animation-delay: 0.39s;
} }
.load2 view:nth-child(2) { .load2 .load-item:nth-child(2) {
animation-delay: 0.52s; animation-delay: 0.52s;
} }
.load3 view:nth-child(2) { .load3 .load-item:nth-child(2) {
animation-delay: 0.65s; animation-delay: 0.65s;
} }
.load1 view:nth-child(3) { .load1 .load-item:nth-child(3) {
animation-delay: 0.78s; animation-delay: 0.78s;
} }
.load2 view:nth-child(3) { .load2 .load-item:nth-child(3) {
animation-delay: 0.91s; animation-delay: 0.91s;
} }
.load3 view:nth-child(3) { .load3 .load-item:nth-child(3) {
animation-delay: 1.04s; animation-delay: 1.04s;
} }
.load1 view:nth-child(4) { .load1 .load-item:nth-child(4) {
animation-delay: 1.17s; animation-delay: 1.17s;
} }
.load2 view:nth-child(4) { .load2 .load-item:nth-child(4) {
animation-delay: 1.3s; animation-delay: 1.3s;
} }
.load3 view:nth-child(4) { .load3 .load-item:nth-child(4) {
animation-delay: 1.43s; animation-delay: 1.43s;
} }

View File

@@ -24,14 +24,13 @@
<!-- 输入框 - --> <!-- 输入框 - -->
<view id="xt__input-ground" class="xt__input-ground"> <view id="xt__input-ground" class="xt__input-ground">
<template v-for="(item, index) in size"> <template v-for="(item, index) in size" :key="index">
<view <view
:key="index"
:style="{ borderColor: code.length === index && cursorVisible ? boxActiveColor : boxNormalColor }" :style="{ borderColor: code.length === index && cursorVisible ? boxActiveColor : boxNormalColor }"
:class="['xt__box', `xt__box-${type + ''}`, `xt__box::after`]" :class="['xt__box', `xt__box-${type + ''}`, `xt__box::after`]"
> >
<view :style="{ borderColor: boxActiveColor }" class="xt__middle-line" v-if="type === 'middle' && !code[index]"></view> <view :style="{ borderColor: boxActiveColor }" class="xt__middle-line" v-if="type === 'middle' && !code[index]"></view>
<text class="xt__code-text">{{ code[index] | codeFormat(isPassword) }}</text> <text class="xt__code-text">{{ codeFormat(code[index], isPassword) }}</text>
</view> </view>
</template> </template>
</view> </view>
@@ -178,14 +177,7 @@ export default {
// 输入失去焦点 // 输入失去焦点
inputBlur() { inputBlur() {
this.cursorVisible = false; this.cursorVisible = false;
} },
},
watch: {
value(val) {
this.code = val;
}
},
filters: {
codeFormat(val, isPassword) { codeFormat(val, isPassword) {
let value = ''; let value = '';
if (val) { if (val) {
@@ -193,6 +185,11 @@ export default {
} }
return value; return value;
} }
},
watch: {
value(val) {
this.code = val;
}
} }
}; };
</script> </script>

View File

@@ -1,8 +1,7 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; var b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/;
exports.weBtoa = function (string) { export function weBtoa(string) {
string = String(string); string = String(string);
var bitmap, a, b, c, result = "", i = 0, rest = string.length % 3; var bitmap, a, b, c, result = "", i = 0, rest = string.length % 3;
for (; i < string.length;) { for (; i < string.length;) {
@@ -15,8 +14,8 @@ exports.weBtoa = function (string) {
b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63); b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63);
} }
return rest ? result.slice(0, rest - 3) + "===".substring(rest) : result; return rest ? result.slice(0, rest - 3) + "===".substring(rest) : result;
}; }
exports.weAtob = function (string) { export function weAtob(string) {
string = String(string).replace(/[\t\n\f\r ]+/g, ""); string = String(string).replace(/[\t\n\f\r ]+/g, "");
if (!b64re.test(string)) if (!b64re.test(string))
throw new TypeError("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded."); throw new TypeError("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.");
@@ -30,9 +29,9 @@ exports.weAtob = function (string) {
String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255); String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255);
} }
return result; return result;
}; }
function b64DecodeUnicode(str) { function b64DecodeUnicode(str) {
return decodeURIComponent(exports.weAtob(str).replace(/(.)/g, function (p) { return decodeURIComponent(weAtob(str).replace(/(.)/g, function (p) {
var code = p.charCodeAt(0).toString(16).toUpperCase(); var code = p.charCodeAt(0).toString(16).toUpperCase();
if (code.length < 2) { if (code.length < 2) {
code = "0" + code; code = "0" + code;
@@ -58,7 +57,7 @@ function base64_url_decode(str) {
return b64DecodeUnicode(output); return b64DecodeUnicode(output);
} }
catch (err) { catch (err) {
return exports.weAtob(output); return weAtob(output);
} }
} }
function weappJwtDecode(token, options) { function weappJwtDecode(token, options) {
@@ -74,4 +73,4 @@ function weappJwtDecode(token, options) {
throw ("Invalid token specified: " + e.message); throw ("Invalid token specified: " + e.message);
} }
} }
exports.default = weappJwtDecode; export default weappJwtDecode;

View File

@@ -265,7 +265,7 @@ function checkSystemEnableLocation() {
} }
} }
module.exports = { export default {
judgeIosPermission: judgeIosPermission, judgeIosPermission: judgeIosPermission,
requestAndroidPermission: requestAndroidPermission, requestAndroidPermission: requestAndroidPermission,
checkSystemEnableLocation: checkSystemEnableLocation, checkSystemEnableLocation: checkSystemEnableLocation,

124
main.js
View File

@@ -1,59 +1,67 @@
import Vue from "vue"; import { createSSRApp } from 'vue'
import App from "./App"; import App from './App'
import * as filters from "./utils/filters.js"; // global filter import uviewPlus, { setConfig } from 'uview-plus'
import uView from "uview-ui"; import store from './store'
import store from "./store"; import config from '@/config/config'
import config from '@/config/config'; import airBtn from '@/components/m-airbtn/index.vue'
import airBtn from "@/components/m-airbtn/index.vue"; import mpShare from '@/utils/mpShare.js'
import socketIO from './pages/mine/im/socket'; import * as filterUtils from './utils/filters.js'
/**
* 仅在h5中显示唤醒app功能 export function createApp() {
* 在h5页面手动挂载 const app = createSSRApp(App)
*
*/ // #ifdef MP-WEIXIN
// #ifdef H5 // 微信开发者工具部分版本在输出 Vue warn 时会触发
if (config.enableMiniBarStartUpApp) { // TypeError: Cannot read property '__global' of null自定义 handler 绕过默认路径
let btn = Vue.component("airBtn", airBtn); //全局注册 app.config.warnHandler = (msg, _instance, trace) => {
document.body.appendChild(new btn().$mount().$el); if (
typeof msg === 'string' &&
msg.includes('enumerating keys on a component instance')
) {
return
}
try {
console.warn(`[Vue warn]: ${msg}${trace || ''}`)
} catch (e) {
// 忽略开发者工具 console 代理异常
}
}
// #endif
app.use(store)
app.use(uviewPlus)
// uview-plus 的图标字体默认每个 u-icon 实例都会触发 uni.loadFontFace
// 导致进入页面时同一字体被反复请求。开启 loadFontOnce 后全局只加载一次。
setConfig({
config: {
loadFontOnce: true,
},
})
app.config.globalProperties.$store = store
app.config.globalProperties.$mainColor = config.mainColor
app.config.globalProperties.$lightColor = config.lightColor
app.config.globalProperties.$aiderLightColor = config.aiderLightColor
const filterMethods = {}
Object.keys(filterUtils).forEach((key) => {
if (typeof filterUtils[key] === 'function') {
filterMethods[key] = filterUtils[key]
}
})
app.mixin({ methods: filterMethods })
app.mixin(mpShare)
// #ifdef H5
if (config.enableMiniBarStartUpApp) {
const mountPoint = document.createElement('div')
document.body.appendChild(mountPoint)
createSSRApp(airBtn).mount(mountPoint)
}
// #endif
return {
app
}
} }
// #endif
// 引入uView对小程序分享的mixin封装
let mpShare = require('uview-ui/libs/mixin/mpShare.js');
Vue.mixin(mpShare)
/**
* 全局filters
*/
Object.keys(filters).forEach((key) => {
Vue.filter(key, filters[key]);
});
// 引入Vuex
Vue.prototype.$store = store;
// Vue.prototype.socketIo = new socketIO();
Vue.use(uView);
Vue.config.productionTip = false;
/**
* 注意!
* 此处将常用的颜色嵌入到原型链上面
* 颜色使用驼峰命名对应 uni.scss中全局颜色变量名
* 如需更换主题请修改此处以及uni.scss中的全局颜色
*/
// 主题色
Vue.prototype.$mainColor = config.mainColor;
// 高亮主题色
Vue.prototype.$lightColor = config.lightColor;
// 辅助高亮颜色
Vue.prototype.$aiderLightColor = config.aiderLightColor;
App.mpType = "app";
const app = new Vue({
...App,
});
app.$mount();

View File

@@ -1,4 +1,5 @@
{ {
"vueVersion" : "3",
"name" : "lilishop", "name" : "lilishop",
"appid" : "__UNI__ED807EA", "appid" : "__UNI__ED807EA",
"description" : "", "description" : "",
@@ -204,9 +205,6 @@
"permission" : { "permission" : {
"scope.userLocation" : { "scope.userLocation" : {
"desc" : "位置信息将用于高德地图的效果展示" "desc" : "位置信息将用于高德地图的效果展示"
},
"scope.writePhotosAlbum" : {
"desc" : "将用于保存图片"
} }
}, },
"plugins" : {}, "plugins" : {},

2154
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

24
package.json Normal file
View File

@@ -0,0 +1,24 @@
{
"name": "lilishop-uniapp",
"version": "4.5.3",
"description": "Lilishop uni-app mobile client (Vue 3)",
"main": "main.js",
"scripts": {
"migrate:vue3": "node scripts/migrate-vue3.js && node scripts/migrate-filters-usage.js",
"postinstall": "patch-package"
},
"repository": {
"type": "git",
"url": "https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp"
},
"license": "ISC",
"dependencies": {
"sass": "^1.89.2",
"uview-plus": "^3.4.72",
"vuex": "^4.1.0"
},
"devDependencies": {
"patch-package": "^8.0.1",
"postinstall-postinstall": "^2.1.0"
}
}

View File

@@ -1,7 +1,16 @@
{ {
"easycom": { "easycom": {
"^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue" "autoscan": true,
"custom": {
"^u--(.*)": "uview-plus/components/u-$1/u-$1.vue",
"^up-(.*)": "uview-plus/components/u-$1/u-$1.vue",
"^u-loading$": "uview-plus/components/u-loading-icon/u-loading-icon.vue",
"^u-alert-tips$": "uview-plus/components/u-alert/u-alert.vue",
"^u-time-line-item$": "@/components/u-time-line/u-time-line-item.vue",
"^u-time-line$": "@/components/u-time-line/u-time-line.vue",
"^u-([^-].*)": "uview-plus/components/u-$1/u-$1.vue"
}
}, },
"pages": [ "pages": [
@@ -48,10 +57,10 @@
"navigationStyle": "custom", // 隐藏系统导航栏 "navigationStyle": "custom", // 隐藏系统导航栏
"navigationBarTextStyle": "black", "navigationBarTextStyle": "black",
"disableScroll": true, "disableScroll": true,
"app-plus": {
"bounce": "none", "bounce": "none",
"scrollIndicator": "none" "scrollIndicator": "none"
}
} }
}, },
@@ -467,8 +476,10 @@
"navigationStyle": "custom", "navigationStyle": "custom",
"style": { "style": {
"navigationBarTitleText": "商品评价", "navigationBarTitleText": "商品评价",
//app页面不显示滚动条 "app-plus": {
"scrollIndicator": "none" //app页面不显示滚动条
"scrollIndicator": "none"
}
} }
}, },
{ // 客服 { // 客服
@@ -827,10 +838,8 @@
"globalStyle": { "globalStyle": {
"navigationBarTextStyle": "black", "navigationBarTextStyle": "black",
"navigationBarTitleText": "Lili商城", "navigationBarTitleText": "Lili商城",
"titleColor": "#303133",
"navigationBarBackgroundColor": "#fff", "navigationBarBackgroundColor": "#fff",
"backgroundColor": "#fff", "backgroundColor": "#fff",
"color": "#FFFFFF",
"app-plus": { "app-plus": {
// 全局关闭回弹功能 // 全局关闭回弹功能
"bounce": "none" "bounce": "none"

View File

@@ -15,7 +15,7 @@
<span v-if="item.couponType == 'DISCOUNT'">{{ item.couponDiscount }}</span> <span v-if="item.couponType == 'DISCOUNT'">{{ item.couponDiscount }}</span>
<span v-else>{{ item.price }}</span> <span v-else>{{ item.price }}</span>
</view> </view>
<view>{{ item.consumeThreshold | unitPrice }}元可用</view> <view>{{unitPrice(item.consumeThreshold) }}元可用</view>
</view> </view>
<view class="circle circle-top"></view> <view class="circle circle-top"></view>
<view class="circle circle-bottom"></view> <view class="circle circle-bottom"></view>

View File

@@ -3,7 +3,7 @@
<view class="body"> <view class="body">
<view class="top-view"> <view class="top-view">
<view class="title">{{coupon.title}}</view> <view class="title">{{coupon.title}}</view>
<view class="price" v-if="coupon.couponType =='PRICE'"><text></text>{{coupon.price | unitPrice}}</view> <view class="price" v-if="coupon.couponType =='PRICE'"><text></text>{{unitPrice(coupon.price)}}</view>
<view class="price" v-if="coupon.couponType =='DISCOUNT'">{{coupon.discount}}</view> <view class="price" v-if="coupon.couponType =='DISCOUNT'">{{coupon.discount}}</view>
<view class="text">{{coupon.consumeThreshold}}元可用</view> <view class="text">{{coupon.consumeThreshold}}元可用</view>
<view class="bg-quan"> <view class="bg-quan">

View File

@@ -26,7 +26,7 @@
<span v-if="item.couponType == 'DISCOUNT'">{{ item.discount }}</span> <span v-if="item.couponType == 'DISCOUNT'">{{ item.discount }}</span>
<span v-else>{{ item.price }}</span> <span v-else>{{ item.price }}</span>
</view> </view>
<view>{{ item.consumeThreshold | unitPrice }}元可用</view> <view>{{unitPrice(item.consumeThreshold) }}元可用</view>
</view> </view>
<view class="circle circle-top"></view> <view class="circle circle-top"></view>
<view class="circle circle-bottom"></view> <view class="circle circle-bottom"></view>

View File

@@ -37,7 +37,6 @@
<!-- 数据 --> <!-- 数据 -->
<view <view
v-if="navItem.dataList && coupon"
class="coupon-item" class="coupon-item"
:class="{ 'coupon-used': navIndex != 0 }" :class="{ 'coupon-used': navIndex != 0 }"
v-for="(coupon, index) in navItem.dataList" v-for="(coupon, index) in navItem.dataList"
@@ -57,7 +56,7 @@
> >
<view class="price" v-else>{{ coupon.price }}</view> <view class="price" v-else>{{ coupon.price }}</view>
<view class="sub-price" <view class="sub-price"
>{{ coupon.consumeThreshold | unitPrice }}可用</view >{{unitPrice(coupon.consumeThreshold) }}可用</view
> >
</view> </view>
<view class="circle circle-top"></view> <view class="circle circle-top"></view>

View File

@@ -10,7 +10,7 @@
</p> </p>
<p class="ptips"> <p class="ptips">
支付金额 支付金额
<span>¥{{ cashierParams.price | unitPrice }}</span> <span>¥{{unitPrice(cashierParams.price) }}</span>
</p> </p>
</div> </div>
</div> </div>
@@ -31,7 +31,7 @@
</div> </div>
<div v-if="item == 'WALLET'"> <div v-if="item == 'WALLET'">
<u-icon class="method_icon" name="red-packet-fill" color="#dd6161" size="80"></u-icon> <u-icon class="method_icon" name="red-packet-fill" color="#dd6161" size="80"></u-icon>
<span class="method_name">余额支付(当前余额¥{{ walletValue | unitPrice }})</span> <span class="method_name">余额支付(当前余额¥{{unitPrice(walletValue) }})</span>
</div> </div>
</div> </div>
<div class="col3" @click="awaitPay(item)" textAlign="right"> <div class="col3" @click="awaitPay(item)" textAlign="right">

View File

@@ -1,9 +1,9 @@
<template> <template>
<view class="wrapper" v-if="flag"> <view class="wrapper" v-if="flag">
<div class='goods' v-if="selectedGoods"> <div class='goods' v-if="selectedGoods">
<image class="goods-image" :src="selectedGoods.thumbnail" alt=""> <image class="goods-image" :src="selectedGoods.thumbnail" alt="" />
<p class="goodsName">{{selectedGoods.goodsName}}</p> <p class="goodsName">{{selectedGoods.goodsName}}</p>
<div class="goodsPrice">{{(selectedGoods.promotionPrice || selectedGoods.price ) | unitPrice('¥')}}</div> <div class="goodsPrice">{{ unitPrice(selectedGoods.promotionPrice || selectedGoods.price, '¥') }}</div>
</div> </div>
<div> <div>
<div class="tips"> <div class="tips">
@@ -55,7 +55,7 @@
<div class="user-list" v-if="data.pintuanMemberVOS"> <div class="user-list" v-if="data.pintuanMemberVOS">
<div class="user-item" v-for="(item,index) in data.pintuanMemberVOS" :key="index"> <div class="user-item" v-for="(item,index) in data.pintuanMemberVOS" :key="index">
<span class="master" v-if="item.orderSn == ''">团长</span> <span class="master" v-if="item.orderSn == ''">团长</span>
<image class="img" :src="item.face" alt=""> <image class="img" :src="item.face" alt="" />
</div> </div>
</div> </div>

View File

@@ -2,7 +2,7 @@
<div class="wrapper"> <div class="wrapper">
<div class="pay-wrapper"> <div class="pay-wrapper">
<div class="pay-money"> <div class="pay-money">
{{ Number(payPrice) | unitPrice }} {{unitPrice(Number(payPrice)) }}
</div> </div>
<div class="pay-btns"> <div class="pay-btns">
<div v-show="!from" @click="checkOrder">查看{{ this.orderType == "RECHARGE" ? '余额' : '订单' }}</div> <div v-show="!from" @click="checkOrder">查看{{ this.orderType == "RECHARGE" ? '余额' : '订单' }}</div>
@@ -16,7 +16,7 @@
<div> <div>
支付方式 支付方式
</div> </div>
<div>{{ paymentMethod | paymentTypeFilter }}</div> <div>{{ paymentTypeFilter(paymentMethod) }}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -41,7 +41,14 @@ export default {
components: { components: {
goodsRecommend, goodsRecommend,
}, },
filters: { onLoad(options) {
this.paymentMethod = options.paymentMethod || "";
this.from = options.from || "";
this.payPrice = options.payPrice || 0;
this.orderType = options.orderType;
},
methods: {
paymentTypeFilter(val) { paymentTypeFilter(val) {
switch (val) { switch (val) {
case "WECHAT": case "WECHAT":
@@ -54,15 +61,6 @@ export default {
return ""; return "";
} }
}, },
},
onLoad(options) {
this.paymentMethod = options.paymentMethod || "";
this.from = options.from || "";
this.payPrice = options.payPrice || 0;
this.orderType = options.orderType;
},
methods: {
checkOrder() { checkOrder() {
/** /**
* 查看订单 * 查看订单

View File

@@ -1,7 +1,7 @@
<template> <template>
<view class="add-address"> <view class="add-address">
<div class="uForm"> <div class="uForm">
<u-form :border-bottom="false" :model="form" ref="uForm" :error-type="['toast']" :rule="rules"> <u-form :border-bottom="false" :model="form" ref="uForm" error-type="toast" :rules="rules">
<!-- #ifndef H5 --> <!-- #ifndef H5 -->
<view class="selectAddress" @click="clickUniMap"> <view class="selectAddress" @click="clickUniMap">
选择收货地址 选择收货地址
@@ -25,9 +25,7 @@
<u-form-item label="地址别名" label-width="130"> <u-form-item label="地址别名" label-width="130">
<u-input v-model="form.alias" placeholder="请输入地址别名" /> <u-input v-model="form.alias" placeholder="请输入地址别名" />
</u-form-item> </u-form-item>
<u-checkbox-group shape="circle" size="30"> <u-checkbox usedAlone shape="circle" size="30" :active-color="lightColor" v-model:checked="form.isDefault" label="设为默认地址"></u-checkbox>
<u-checkbox :active-color="lightColor" v-model="form.isDefault">设为默认地址</u-checkbox>
</u-checkbox-group>
<div class="saveBtn" @click="save">保存</div> <div class="saveBtn" @click="save">保存</div>
</u-form> </u-form>
@@ -144,33 +142,43 @@ export default {
// 保存当前 地址 // 保存当前 地址
save() { save() {
this.$refs.uForm.validate((valid) => { this.$refs.uForm.validate().then(() => {
if (valid) { const params = { ...this.form };
let pages = getCurrentPages(); //获取页面栈 delete params.___path;
let beforePage = pages[pages.length - 2]; //上个页面
// 如果没有id则为新增地址 if (Array.isArray(params.consigneeAddressIdPath)) {
if (!this.form.id) { params.consigneeAddressIdPath = params.consigneeAddressIdPath.join(",");
// 删除没有的数据
delete this.form.___path;
addAddress(this.form).then((res) => {
if (res.data.success) {
uni.navigateBack();
}
});
} else {
// 修改地址
delete this.form.___path;
delete this.form.updateBy;
delete this.form.updateTime;
editAddress(this.form).then((res) => {
if (res.data.success) {
uni.navigateBack();
}
});
}
} }
}); if (Array.isArray(params.consigneeAddressPath)) {
params.consigneeAddressPath = params.consigneeAddressPath.join(",");
}
if (!params.id) {
addAddress(params).then((res) => {
if (res.data.success) {
uni.navigateBack();
} else {
uni.showToast({
title: res.data.message || "保存失败",
icon: "none",
});
}
});
} else {
delete params.updateBy;
delete params.updateTime;
editAddress(params).then((res) => {
if (res.data.success) {
uni.navigateBack();
} else {
uni.showToast({
title: res.data.message || "保存失败",
icon: "none",
});
}
});
}
}).catch(() => {});
}, },
// 三级地址联动回调 // 三级地址联动回调
@@ -277,7 +285,7 @@ export default {
getAddressDetail(option.id).then((res) => { getAddressDetail(option.id).then((res) => {
const params = res.data.result; const params = res.data.result;
params.___path = params.consigneeAddressPath; params.___path = params.consigneeAddressPath;
this.$set(this, "form", params); this["form"] = params;
if (this.$store.state.isShowToast){ uni.hideLoading() }; if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });

View File

@@ -119,14 +119,22 @@
background: $light-color; background: $light-color;
position: fixed; position: fixed;
width: 690rpx; width: 690rpx;
bottom: 60rpx; bottom: calc(60rpx + constant(safe-area-inset-bottom));
bottom: calc(60rpx + env(safe-area-inset-bottom));
height: 80rpx; height: 80rpx;
left: 30rpx; left: 30rpx;
font-size: 30rpx; font-size: 30rpx;
line-height: 80rpx; color: #fff;
border-radius: 40rpx;
display: flex;
align-items: center;
justify-content: center;
z-index: 99;
overflow: hidden;
.u-icon { .btn-text {
margin-right: 10rpx; margin-left: 12rpx;
line-height: 1;
} }
} }
} }

View File

@@ -34,11 +34,11 @@
</view> </view>
<view style="height: 100px"></view> <view style="height: 100px"></view>
</view> </view>
<button type="default" class="btn" @click="addAddress('')"> <view class="btn" @click="addAddress('')">
<u-icon name="plus-circle"></u-icon> <u-icon name="plus-circle" color="#ffffff" size="18"></u-icon>
添加新收货人 <text class="btn-text">添加新收货人</text>
</button> </view>
<u-action-sheet :list="removeList" :tips="tips" v-model="showAction" @click="deleteAddressMessage"></u-action-sheet> <u-action-sheet :list="removeList" :tips="tips" v-model:show="showAction" @click="deleteAddressMessage"></u-action-sheet>
</view> </view>
</template> </template>

View File

@@ -34,12 +34,12 @@
<view style="height: 100px"></view> <view style="height: 100px"></view>
</view> </view>
<button type="default" class="btn" @click="addAddress('')"> <view class="btn" @click="addAddress('')">
<u-icon name="plus-circle"></u-icon> <u-icon name="plus-circle" color="#ffffff" size="18"></u-icon>
添加新收货人 <text class="btn-text">添加新收货人</text>
</button> </view>
<u-action-sheet :list="removeList" :tips="tips" v-model="showAction" @click="deleteAddressMessage"></u-action-sheet> <u-action-sheet :list="removeList" :tips="tips" v-model:show="showAction" @click="deleteAddressMessage"></u-action-sheet>
</view> </view>
</template> </template>
@@ -86,7 +86,7 @@ export default {
* 进入页面检测当前账户是否登录 * 进入页面检测当前账户是否登录
*/ */
onShow() { onShow() {
if (this.$options.filters.tipsToLogin()) { if (this.tipsToLogin()) {
this.getAddressList(); this.getAddressList();
} }
}, },

View File

@@ -16,7 +16,7 @@
</view> </view>
<view style="height: 100px"></view> <view style="height: 100px"></view>
</view> </view>
<u-action-sheet :list="removeList" :tips="tips" v-model="showAction" @click="deleteAddressMessage"></u-action-sheet> <u-action-sheet :list="removeList" :tips="tips" v-model:show="showAction" @click="deleteAddressMessage"></u-action-sheet>
</view> </view>
</template> </template>

View File

@@ -5,7 +5,7 @@
<view class="wrapper-show-money"> <view class="wrapper-show-money">
<view class="money-view"> <view class="money-view">
<h3>预存款金额 </h3> <h3>预存款金额 </h3>
<view class="money">{{walletNum | unitPrice }}</view> <view class="money">{{unitPrice(walletNum) }}</view>
</view> </view>
</view> </view>
@@ -20,9 +20,9 @@
<!-- <view class="-number">{{logItem.detail}}</view> --> <!-- <view class="-number">{{logItem.detail}}</view> -->
</view> </view>
<view class="view-item-change"> <view class="view-item-change">
<view class="-money green" v-if="logItem.serviceType == 'WALLET_PAY' || logItem.serviceType == 'WALLET_WITHDRAWAL'"> {{logItem.money | unitPrice}} </view> <view class="-money green" v-if="logItem.serviceType == 'WALLET_PAY' || logItem.serviceType == 'WALLET_WITHDRAWAL'"> {{unitPrice(logItem.money)}} </view>
<view class="-money" v-if="logItem.serviceType == 'WALLET_REFUND' || logItem.serviceType == 'WALLET_RECHARGE' || logItem.serviceType == 'WALLET_COMMISSION' "> <view class="-money" v-if="logItem.serviceType == 'WALLET_REFUND' || logItem.serviceType == 'WALLET_RECHARGE' || logItem.serviceType == 'WALLET_COMMISSION' ">
+{{logItem.money | unitPrice}} </view> +{{unitPrice(logItem.money)}} </view>
<view class="-time">{{logItem.createTime}}</view> <view class="-time">{{logItem.createTime}}</view>
</view> </view>
</view> </view>

View File

@@ -1,13 +1,13 @@
<template> <template>
<view class="wrapper"> <view class="wrapper">
<u-cell-group> <u-cell-group>
<u-cell-item title="申请单号"></u-cell-item> <u-cell title="申请单号"></u-cell>
<u-cell-item title="提现金额" value="新版本"></u-cell-item> <u-cell title="提现金额" value="新版本"></u-cell>
<u-cell-item title="收款银行"></u-cell-item> <u-cell title="收款银行"></u-cell>
<u-cell-item title="收款账号" value="新版本"></u-cell-item> <u-cell title="收款账号" value="新版本"></u-cell>
<u-cell-item title="开户人姓名"></u-cell-item> <u-cell title="开户人姓名"></u-cell>
<u-cell-item title="创建时间" value="新版本"></u-cell-item> <u-cell title="创建时间" value="新版本"></u-cell>
<u-cell-item title="提现状态" value="新版本"></u-cell-item> <u-cell title="提现状态" value="新版本"></u-cell>
</u-cell-group> </u-cell-group>
</view> </view>
</template> </template>

View File

@@ -1,9 +1,9 @@
<template> <template>
<div class="wrapper"> <div class="wrapper">
<u-navbar :custom-back="back" title="余额"></u-navbar> <u-navbar :auto-back="false" @leftClick="back" title="余额"></u-navbar>
<div class="box"> <div class="box">
<div class="deposit">预存款金额</div> <div class="deposit">预存款金额</div>
<div class="money">{{walletNum | unitPrice }}</div> <div class="money">{{unitPrice(walletNum) }}</div>
<div class="operation-btns"> <div class="operation-btns">
<div class="operation-btn light" @click="navigateTo('/pages/mine/deposit/withdrawal')">提现</div> <div class="operation-btn light" @click="navigateTo('/pages/mine/deposit/withdrawal')">提现</div>
<div class="operation-btn" @click="navigateTo('/pages/mine/deposit/recharge')">充值</div> <div class="operation-btn" @click="navigateTo('/pages/mine/deposit/recharge')">充值</div>
@@ -33,11 +33,11 @@ export default {
}; };
}, },
async onShow() { async onShow() {
if (this.$options.filters.isLogin("auth")) { if (this.isLogin("auth")) {
let result = await getUserWallet(); //预存款 let result = await getUserWallet(); //预存款
this.walletNum = result.data.result.memberWallet; this.walletNum = result.data.result.memberWallet;
} else { } else {
this.$options.filters.navigateToLogin("redirectTo"); this.navigateToLogin("redirectTo");
} }
}, },
methods: { methods: {

View File

@@ -8,7 +8,7 @@
<view class="-number" v-if="item.inspectRemark || item.errorMessage">{{ item.inspectRemark || item.errorMessage }}</view> <view class="-number" v-if="item.inspectRemark || item.errorMessage">{{ item.inspectRemark || item.errorMessage }}</view>
</view> </view>
<view class="view-item-change"> <view class="view-item-change">
<view class="-money">-{{ item.applyMoney | unitPrice }}</view> <view class="-money">-{{unitPrice(item.applyMoney) }}</view>
<view class="-time">{{ item.createTime || item.inspectTime || "" }}</view> <view class="-time">{{ item.createTime || item.inspectTime || "" }}</view>
<view v-if="item.applyStatus === 'WAIT_USER_CONFIRM'" class="confirm-btn" @click.stop="confirmWechatReceive(item)">确认收款</view> <view v-if="item.applyStatus === 'WAIT_USER_CONFIRM'" class="confirm-btn" @click.stop="confirmWechatReceive(item)">确认收款</view>
</view> </view>

View File

@@ -18,7 +18,7 @@
<view class="all"> <view class="all">
<view @click="handleAll" :style="{ color: $mainColor }">全部</view> <view @click="handleAll" :style="{ color: $mainColor }">全部</view>
<view style="font-size: 24rpx; color: #999">可提现金额<span>{{ walletNum | unitPrice }}</span></view> <view style="font-size: 24rpx; color: #999">可提现金额<span>{{unitPrice(walletNum) }}</span></view>
</view> </view>
</view> </view>

View File

@@ -11,7 +11,7 @@
? "通过" ? "通过"
: "拒绝" : "拒绝"
}}</view> }}</view>
<view class="price">+{{ item.price | unitPrice }}</view> <view class="price">+{{unitPrice(item.price) }}</view>
</view> </view>
<view class="log-item-view"> <view class="log-item-view">
<view>{{ item.createTime }}</view> <view>{{ item.createTime }}</view>
@@ -24,7 +24,7 @@
<view class="log-item"> <view class="log-item">
<view class="log-item-view"> <view class="log-item-view">
<view class="title">{{ item.goodsName }}</view> <view class="title">{{ item.goodsName }}</view>
<view class="price">提成金额+{{ item.rebate | unitPrice }}</view> <view class="price">提成金额+{{unitPrice(item.rebate) }}</view>
</view> </view>
<view class="log-item-view"> <view class="log-item-view">
<view>创建时间{{ item.createTime }}</view> <view>创建时间{{ item.createTime }}</view>

View File

@@ -3,9 +3,9 @@
<view class="nav-list"> <view class="nav-list">
<view class="total">可提现金额</view> <view class="total">可提现金额</view>
<view class="price">{{ distributionData.canRebate | unitPrice }}</view> <view class="price">{{unitPrice(distributionData.canRebate) }}</view>
<view class="frozen" <view class="frozen"
>冻结金额{{ distributionData.commissionFrozen | unitPrice }}</view >冻结金额{{unitPrice(distributionData.commissionFrozen) }}</view
> >
</view> </view>
<view class="nav"> <view class="nav">
@@ -122,9 +122,7 @@ export default {
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
> * { gap: 20rpx;
margin: 10rpx 0;
}
width: 33%; width: 33%;
// color: #fff; // color: #fff;
} }

View File

@@ -1,7 +1,7 @@
<template> <template>
<view class="wrapper"> <view class="wrapper">
<!-- 筛选弹出层 TODO后续版本更新 --> <!-- 筛选弹出层 TODO后续版本更新 -->
<!-- <u-popup width="90%" v-model="popup" mode="right"> <!-- <u-popup width="90%" v-model:show="popup" mode="right">
<view class="screen-title">商品筛选</view> <view class="screen-title">商品筛选</view>
<view class="screen-view"> <view class="screen-view">
@@ -67,8 +67,9 @@
<view class="goods-list"> <view class="goods-list">
<scroll-view class="body-view" scroll-y @scrolltolower="renderDate"> <scroll-view class="body-view" scroll-y @scrolltolower="renderDate">
<u-swipe-action v-for="(item, index) in goodsList" :disabled="!params.checked" :show="item.___selected" @open="openAction(item)" :index="index" :options="options" bg-color="#fff" <u-swipe-action v-for="(item, index) in goodsList" ref="swiperAction" :key="item.id">
ref="swiperAction" :key="item.id" @click="changeActionTab(item)"> <u-swipe-action-item :disabled="!params.checked" :show="item.___selected" @open="openAction(item)" :name="index" :options="options"
@click="changeActionTab(item)">
<div class="goods-item"> <div class="goods-item">
<view class="goods-item-img" @click="handleNavgationGoods(item)"> <view class="goods-item-img" @click="handleNavgationGoods(item)">
@@ -82,7 +83,7 @@
<!-- 商品金额 --> <!-- 商品金额 -->
<view class="-item-price" @click="handleNavgationGoods(item)"> <view class="-item-price" @click="handleNavgationGoods(item)">
佣金: 佣金:
<span> {{ item.commission | unitPrice }}</span> <span> {{unitPrice(item.commission) }}</span>
</view> </view>
<!-- 比率佣金 --> <!-- 比率佣金 -->
<view class="-item-bottom"> <view class="-item-bottom">
@@ -92,7 +93,7 @@
<span>{{ "5.00%" }}</span> <span>{{ "5.00%" }}</span>
</view> --> </view> -->
<view class="-item-yj"> <view class="-item-yj">
<span>{{ item.price | unitPrice }}</span> <span>{{unitPrice(item.price) }}</span>
</view> </view>
</view> </view>
<view> <view>
@@ -102,6 +103,7 @@
</view> </view>
</view> </view>
</div> </div>
</u-swipe-action-item>
</u-swipe-action> </u-swipe-action>
</scroll-view> </scroll-view>
@@ -112,7 +114,7 @@
</view> </view>
<canvas class="canvas-hide" canvas-id="qrcode" /> <canvas class="canvas-hide" canvas-id="qrcode" />
<drawCanvas ref="drawCanvas" v-if="showFlag" :res="res" /> <drawCanvas ref="drawCanvas" v-if="showFlag" :res="res" />
<u-modal v-model="deleteShow" :confirm-style="{'color':lightColor}" @confirm="delectConfirm" show-cancel-button :content="deleteContent" :async-close="true"></u-modal> <u-modal v-model:show="deleteShow" :confirm-style="{'color':lightColor}" @confirm="delectConfirm" show-cancel-button :content="deleteContent" :async-close="true"></u-modal>
</view> </view>
</template> </template>
@@ -215,9 +217,9 @@ export default {
*/ */
openAction(val) { openAction(val) {
this.goodsList.forEach((item) => { this.goodsList.forEach((item) => {
this.$set(item, "___selected", false); item["___selected"] = false;
}); });
this.$set(val, "___selected", true); val["___selected"] = true;
}, },
/** /**
@@ -242,7 +244,7 @@ export default {
let callback = result.data.result; let callback = result.data.result;
this.res.container.title = `${goods.goodsName}`; this.res.container.title = `${goods.goodsName}`;
this.res.bottom.code = `data:image/png;base64,${callback}`; this.res.bottom.code = `data:image/png;base64,${callback}`;
this.res.bottom.price = this.$options.filters.unitPrice( this.res.bottom.price = this.unitPrice(
goods.price, goods.price,
"¥" "¥"
); );
@@ -294,7 +296,7 @@ export default {
distributionGoods(this.params).then((res) => { distributionGoods(this.params).then((res) => {
if (res.data.success && res.data.result.records.length >= 1) { if (res.data.success && res.data.result.records.length >= 1) {
res.data.result.records.forEach((item) => { res.data.result.records.forEach((item) => {
this.$set(item, "___selected", false); item["___selected"] = false;
}); });
this.goodsList.push(...res.data.result.records); this.goodsList.push(...res.data.result.records);
} }

View File

@@ -11,7 +11,7 @@
<view class="all"> <view class="all">
<view @click="handleAll" :style="{ color: $mainColor }">全部</view> <view @click="handleAll" :style="{ color: $mainColor }">全部</view>
<view style="font-size: 24rpx; color: #999" <view style="font-size: 24rpx; color: #999"
>可提现金额<span>{{ distributionData.canRebate | unitPrice }}</span >可提现金额<span>{{unitPrice(distributionData.canRebate) }}</span
></view ></view
> >
</view> </view>

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="wrapper"> <div class="wrapper">
<u-parse :show-with-animation="true" :lazy-load="true" :selectable="true" :html="res.content" v-if="res"></u-parse> <u-parse :lazy-load="true" :selectable="true" :content="res.content" v-if="res"></u-parse>
</div> </div>
</template> </template>

View File

@@ -35,8 +35,7 @@
JSON.parse(item.text)['goodsName'] JSON.parse(item.text)['goodsName']
}}</text> }}</text>
</view> </view>
<view class="goods-desc-rice" >{{ <view class="goods-desc-rice" >{{unitPrice(JSON.parse(item.text)['price'])
JSON.parse(item.text)['price'] | unitPrice
}} }}
</view> </view>
</view> </view>
@@ -52,8 +51,7 @@
<div class="wes-2" >{{ <div class="wes-2" >{{
order.name order.name
}}</div> }}</div>
<div class="main-color goods-desc-rice">{{ <div class="main-color goods-desc-rice">{{unitPrice(order.goodsPrice, "¥")
order.goodsPrice | unitPrice("¥")
}}</div> }}</div>
</view> </view>
@@ -145,8 +143,7 @@
goodListData.goodsName goodListData.goodsName
}}</text> }}</text>
</view> </view>
<view class="goods-desc-rice" > {{ <view class="goods-desc-rice" > {{unitPrice(goodListData.price)
goodListData.price | unitPrice
}} }}
</view> </view>
</view> </view>

View File

@@ -6,13 +6,15 @@
<div class="bagbar">{{$u.timeFormat(row.send_time, 'yyyy-mm-dd')}}</div> <div class="bagbar">{{$u.timeFormat(row.send_time, 'yyyy-mm-dd')}}</div>
</div> </div>
<u-card @click="goDetail(row.sn,row.logi_id,row.ship_no)" :title="title" title-color="#666666" title-size="24" sub-title-color="#666666" sub-title-size="24" :border="false" :sub-title=row.status> <u-card @click="goDetail(row.sn,row.logi_id,row.ship_no)" :title="title" title-color="#666666" title-size="24" sub-title-color="#666666" sub-title-size="24" :border="false" :sub-title=row.status>
<view class="msg-body" slot="body"> <template #body>
<view class="msg-body">
<image class="msgImg" :src="row.goods_img" mode=""></image> <image class="msgImg" :src="row.goods_img" mode=""></image>
<view class="msgView"> <view class="msgView">
<view>{{row.goodsName}}</view> <view>{{row.goodsName}}</view>
<view class="msgNum">订单号:{{row.sn}}</view> <view class="msgNum">订单号:{{row.sn}}</view>
</view> </view>
</view> </view>
</template>
</u-card> </u-card>
</view> </view>
</block> </block>
@@ -99,7 +101,7 @@ export default {
color: #fff; color: #fff;
font-size: 24rpx; font-size: 24rpx;
padding: 10rpx 20rpx; padding: 10rpx 20rpx;
background: $u-type-info-disabled; background: $u-info-disabled;
} }
.storeImg { .storeImg {
width: 100%; width: 100%;

View File

@@ -10,11 +10,11 @@
</div> </div>
<div class="msgMsg">{{$u.timeFormat(row.send_time, 'yyyy-mm-dd')}}</div> <div class="msgMsg">{{$u.timeFormat(row.send_time, 'yyyy-mm-dd')}}</div>
<u-card :title="title" :title-size="35" :border="false"> <u-card :title="title" :title-size="35" :border="false">
<view class slot="body"> <template #body>
<view class="u-body-item u-flex u-row-between u-p-b-0"> <view class="u-body-item u-flex u-row-between u-p-b-0">
<view class="u-body-item-title u-line-2">{{row.content}}</view> <view class="u-body-item-title u-line-2">{{row.content}}</view>
</view> </view>
</view> </template>
</u-card> </u-card>
</view> </view>
</block> </block>

View File

@@ -1,60 +1,96 @@
<template> <template>
<view class="content"> <view class="content">
<u-navbar> <u-navbar
<u-tabs :active-color="lightColor" class="slot-wrap" :list="navList" count="count" :is-scroll="true" :current="tabCurrentIndex" @change="tabClick"></u-tabs> :fixed="true"
:placeholder="true"
:border="false"
left-icon=""
title=""
>
<template #center>
<view class="slot-wrap">
<u-tabs
:active-color="lightColor"
class="collect-tabs"
:list="navList"
:is-scroll="true"
:current="tabCurrentIndex"
@change="tabClick"
></u-tabs>
</view>
</template>
</u-navbar> </u-navbar>
<view class="swiper-box"> <view class="collect-body">
<!-- 显示商品栏 --> <!-- 显示商品栏 -->
<view v-if="tabCurrentIndex == 0" class="tab-content"> <view v-if="tabCurrentIndex == 0" class="tab-content">
<scroll-view class="list-scroll-content" scroll-y> <scroll-view class="list-scroll-content" scroll-y>
<!-- 空白页 -->
<u-empty style="margin-top: 40rpx" text="暂无收藏商品数据" mode="favor" v-if="goodsEmpty"></u-empty> <u-empty style="margin-top: 40rpx" text="暂无收藏商品数据" mode="favor" v-if="goodsEmpty"></u-empty>
<!-- 商品展示数据 --> <template v-else>
<u-swipe-action @open="openLeftChange(item, index, 'goods')" :show="item.selected" btn-width="180" <u-swipe-action
:options="LeftOptions" v-else v-for="(item, index) in goodList" v-for="(item, index) in goodList"
@click="clickGoodsSwiperAction(item, index)" :index="index" :key="index"> :key="index"
<view class="goods" @click="goGoodsDetail(item)"> class="collect-swipe"
<u-image width="131rpx" height="131rpx" :src="item.image" mode="aspectFit"> >
<u-loading slot="loading"></u-loading> <u-swipe-action-item
</u-image> @open="openLeftChange(item, 'goods')"
<view class="goods-intro"> :show="item.selected"
<view>{{ item.goodsName }}</view> :options="LeftOptions"
<view class="goods-sn">{{ item.goods_sn }}</view> @click="clickGoodsSwiperAction(item, index)"
<view>{{ item.price | unitPrice }}</view> :name="index"
</view> >
</view> <view class="goods" @click="goGoodsDetail(item)">
</u-swipe-action> <u-image width="131rpx" height="131rpx" :src="item.image" mode="aspectFit">
<template #loading><u-loading></u-loading></template>
</u-image>
<view class="goods-intro">
<view class="goods-name">{{ item.goodsName }}</view>
<view class="goods-sn">{{ item.goods_sn }}</view>
<view class="goods-price">{{ unitPrice(item.price) }}</view>
</view>
</view>
</u-swipe-action-item>
</u-swipe-action>
</template>
</scroll-view> </scroll-view>
</view> </view>
<!-- 显示收藏的店铺栏 --> <!-- 显示收藏的店铺栏 -->
<view v-else class="tab-content"> <view v-else class="tab-content">
<scroll-view class="list-scroll-content" scroll-y> <scroll-view class="list-scroll-content" scroll-y>
<!-- 空白页 -->
<u-empty style="margin-top: 40rpx" text="暂无收藏店铺数据" mode="favor" v-if="storeEmpty"></u-empty> <u-empty style="margin-top: 40rpx" text="暂无收藏店铺数据" mode="favor" v-if="storeEmpty"></u-empty>
<!-- 店铺展示数据 --> <template v-else>
<u-swipe-action @open="openLeftChange(item, 'store')" :show="item.selected" btn-width="180" <u-swipe-action
:options="LeftOptions" v-else v-for="(item, index) in storeList" :key="index" v-for="(item, index) in storeList"
@click="clickStoreSwiperAction(item)"> :key="index"
<view class="store" @click="goStoreMainPage(item.id)"> class="collect-swipe"
<view class="intro"> >
<view class="store-logo"> <u-swipe-action-item
<u-image width="102rpx" height="102rpx" :src="item.storeLogo" :alt="item.storeName" @open="openLeftChange(item, 'store')"
mode="aspectFit"> :show="item.selected"
<u-loading slot="loading"></u-loading> :options="LeftOptions"
</u-image> @click="clickStoreSwiperAction(item)"
:name="index"
>
<view class="store" @click="goStoreMainPage(item.id)">
<view class="intro">
<view class="store-logo">
<u-image width="102rpx" height="102rpx" :src="item.storeLogo" :alt="item.storeName"
mode="aspectFit">
<template #loading><u-loading></u-loading></template>
</u-image>
</view>
<view class="store-name">
<view>{{ item.storeName }}</view>
<u-tag size="mini" type="error" :color="$mainColor" v-if="item.selfOperated"
text="自营" mode="plain" shape="circle" />
</view>
<view class="store-collect">
<view>进店逛逛</view>
</view>
</view>
</view> </view>
<view class="store-name"> </u-swipe-action-item>
<view>{{ item.storeName }}</view> </u-swipe-action>
<u-tag size="mini" type="error" :color="$mainColor" v-if="item.selfOperated" </template>
text="自营" mode="plain" shape="circle" />
</view>
<view class="store-collect">
<view>进店逛逛</view>
</view>
</view>
</view>
</u-swipe-action>
</scroll-view> </scroll-view>
</view> </view>
</view> </view>
@@ -138,16 +174,10 @@
* 打开商品左侧取消收藏 * 打开商品左侧取消收藏
*/ */
openLeftChange(val, type) { openLeftChange(val, type) {
const { const way = type === "goods" ? this.goodList : this.storeList;
goodList,
storeList
} = this;
let way;
type == "goods" ? (way = goodList) : (way = storeList);
way.forEach((item) => { way.forEach((item) => {
this.$set(item, "selected", false); item.selected = false;
}); });
this.$set(val, "selected", false);
val.selected = true; val.selected = true;
}, },
@@ -280,19 +310,30 @@
height: 100%; height: 100%;
} }
.slot-wrap{
flex: 1;
display: flex;
justify-content: center;
padding-right: 72rpx;
}
.content { .content {
width: 100%; width: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
}
.slot-wrap {
width: 100%;
display: flex;
justify-content: center;
}
.collect-tabs {
width: 100%;
} }
.swiper-box { .collect-body {
overflow-y: auto; flex: 1;
min-height: 0;
}
.tab-content {
height: 100%;
} }
.list-scroll-content { .list-scroll-content {
@@ -300,63 +341,52 @@
width: 100%; width: 100%;
} }
::v-deep .u-swipe-content { .collect-swipe,
:deep(.u-swipe-action),
:deep(.u-swipe-action-item),
:deep(.u-swipe-action-item__content) {
width: 100%;
}
:deep(.u-swipe-action-item__content) {
overflow: hidden; overflow: hidden;
} }
.goods { .goods {
background-color: #fff; background-color: #fff;
border-bottom: 1px solid $border-color-light; border-bottom: 1px solid $border-color-light;
height: 190rpx; min-height: 190rpx;
box-sizing: border-box;
display: flex; display: flex;
align-items: center; align-items: center;
padding: 30rpx 20rpx; padding: 30rpx 20rpx;
margin-top: 20rpx; margin-top: 20rpx;
width: 100%;
image {
width: 131rpx;
height: 131rpx;
border-radius: 10rpx;
}
.goods-intro { .goods-intro {
flex: 1; flex: 1;
min-width: 0;
font-size: $font-base; font-size: $font-base;
line-height: 48rpx; line-height: 48rpx;
margin-left: 30rpx; margin-left: 30rpx;
view:nth-child(1) { .goods-name {
line-height: 1.4em; line-height: 1.4em;
font-size: 24rpx; font-size: 24rpx;
max-height: 2.8em; //height是line-height的整数倍防止文字显示不全 max-height: 2.8em;
overflow: hidden; overflow: hidden;
color: #666; color: #666;
} }
view:nth-child(2) { .goods-sn {
color: #cccccc; color: #cccccc;
font-size: 24rpx; font-size: 24rpx;
} }
view:nth-child(3) { .goods-price {
color: $light-color; color: $light-color;
} }
} }
button {
color: $main-color;
height: 50rpx;
width: 120rpx;
font-size: $font-sm;
padding: 0;
line-height: 50rpx;
background-color: #ffffff;
margin-top: 80rpx;
&::after {
border-color: $main-color;
}
}
} }
.store { .store {
@@ -364,90 +394,42 @@
border: 1px solid $border-color-light; border: 1px solid $border-color-light;
border-radius: 16rpx; border-radius: 16rpx;
margin: 20rpx 10rpx; margin: 20rpx 10rpx;
width: calc(100% - 20rpx);
box-sizing: border-box;
.intro { .intro {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
padding: 0 30rpx 0 40rpx; padding: 0 30rpx 0 40rpx;
height: 170rpx; min-height: 170rpx;
.store-logo { .store-logo {
width: 102rpx; width: 102rpx;
height: 102rpx; height: 102rpx;
border-radius: 50%; border-radius: 50%;
overflow: hidden; overflow: hidden;
flex-shrink: 0;
image {
width: 100%;
height: 100%;
border-radius: 50%;
}
} }
.store-name { .store-name {
flex: 1; flex: 1;
min-width: 0;
margin-left: 30rpx; margin-left: 30rpx;
line-height: 2em; line-height: 2em;
:first-child { :first-child {
font-size: $font-base; font-size: $font-base;
} }
:last-child {
font-size: $font-sm;
color: #999;
}
} }
.store-collect { .store-collect {
flex-shrink: 0;
border-left: 1px solid $border-color-light; border-left: 1px solid $border-color-light;
padding-left: 20rpx; padding-left: 20rpx;
text-align: center; text-align: center;
color: #999;
:last-child { font-size: $font-sm;
color: #999;
font-size: $font-sm;
}
}
}
}
.navbar {
display: flex;
height: 40px;
padding: 0 5px;
background: #fff;
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.06);
position: relative;
z-index: 10;
.nav-item {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
height: 100%;
font-size: 26rpx;
text {
position: relative;
}
text.current {
color: $light-color;
font-weight: bold;
font-size: 28rpx;
&::after {
content: "";
position: absolute;
left: 20rpx;
bottom: -10rpx;
width: 30rpx;
height: 0;
border-bottom: 2px solid $light-color;
}
} }
} }
} }

View File

@@ -1,48 +1,56 @@
<template> <template>
<view class="myTracks"> <view class="myTracks">
<u-navbar title="我的足迹"> <u-navbar title="我的足迹">
<div slot="right"> <template #right>
<div class="light-color edit" @click="isEdit = !isEdit">{{ !isEdit ? '编辑' : '完成'}}</div> <div class="light-color edit" @click="isEdit = !isEdit">{{ !isEdit ? '编辑' : '完成'}}</div>
</div> </template>
</u-navbar> </u-navbar>
<u-notice-bar mode="vertical" :list="['右划删除浏览记录']"></u-notice-bar> <view class="tracks-tip">
<u-icon name="volume" color="#f9ae3d" size="19"></u-icon>
<text class="tracks-tip-text">右划删除浏览记录</text>
</view>
<u-empty text="暂无历史记录" style="margin-top:200rpx;" mode="history" v-if="whetherEmpty"></u-empty> <u-empty text="暂无历史记录" style="margin-top:200rpx;" mode="history" v-if="whetherEmpty"></u-empty>
<div v-else> <view v-else class="tracks-list">
<view v-for="(item, index) in trackList" :key="index"> <block v-for="(item, index) in trackList" :key="index">
<view class="myTracks-title" @click="navigateToStore(item)">{{item.storeName}}</view> <view class="myTracks-title" @click="navigateToStore(item)">{{ item.storeName }}</view>
<view class="myTracks-items"> <u-swipe-action class="myTracks-swipe">
<u-swipe-action-item
<u-swipe-action style="width: 100%;" :show="item.show" :index="index" :key="item.id" :show="item.show"
@click="delTracks" @open="open" :options="options"> :name="index"
@click="delTracks"
@open="open"
:options="options"
>
<view class="myTracks-item"> <view class="myTracks-item">
<u-checkbox-group v-if="isEdit" class="store-line-check"> <u-checkbox-group v-if="isEdit" class="store-line-check">
<u-checkbox shape="circle" :active-color="lightColor" v-model="item.checked" <u-checkbox
@change="checkboxChangeDP(item)"></u-checkbox> usedAlone
shape="circle"
:active-color="lightColor"
v-model:checked="item.checked"
@change="checkboxChangeDP(item)"
></u-checkbox>
</u-checkbox-group> </u-checkbox-group>
<view class="myTracks-item-img" @click.stop="navigateToDetail(item)"> <view class="myTracks-item-img" @click.stop="navigateToDetail(item)">
<image :src="item.thumbnail"></image> <image class="track-thumb" :src="item.thumbnail"></image>
</view> </view>
<view class="myTracks-item-content" @click.stop="navigateToDetail(item)"> <view class="myTracks-item-content" @click.stop="navigateToDetail(item)">
<view class="myTracks-item-title"> <view class="myTracks-item-title">
{{ item.goodsName }} {{ item.goodsName }}
<view class="myTracks-item-title-desc"> </view>
</view> </view>
<view class="myTracks-item-price"> <view class="myTracks-item-price">
{{ item.price | unitPrice }} {{ unitPrice(item.price) }}
</view> </view>
</view> </view>
</view> </view>
</u-swipe-action> </u-swipe-action-item>
</u-swipe-action>
</view>
<view class="myTracks-divider"></view> <view class="myTracks-divider"></view>
</block>
</view> <view v-if="isEdit" class="submit" @click="handleClickDeleteSelected">
<div @click="handleClickDeleteSelected" v-if="isEdit" class="submit">
删除所选 删除所选
</div> </view>
</div> </view>
</view> </view>
</template> </template>
@@ -163,8 +171,11 @@
/** /**
* 删除足迹 * 删除足迹
*/ */
delTracks(index,ids) { delTracks(e, ids) {
deleteHistoryListId(ids || this.trackList[index].goodsId).then((res) => { const index = typeof e === 'object' ? (e.name ?? e.index) : e;
const goodsId = ids || this.trackList[index]?.goodsId;
if (!goodsId) return;
deleteHistoryListId(goodsId).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
this.trackList = []; this.trackList = [];
this.params.pageNumber = 1 this.params.pageNumber = 1
@@ -183,9 +194,10 @@
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.submit{ .submit {
position: fixed; position: fixed;
bottom: 20rpx; bottom: calc(20rpx + constant(safe-area-inset-bottom));
bottom: calc(20rpx + env(safe-area-inset-bottom));
left: 10%; left: 10%;
width: 80%; width: 80%;
height: 80rpx; height: 80rpx;
@@ -195,110 +207,110 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background: $light-color; background: $light-color;
z-index: 99;
} }
.myTracks { .myTracks {
width: 100%; width: 100%;
padding-top: 2rpx; padding-top: 2rpx;
} }
.tracks-tip {
display: flex;
align-items: center;
padding: 18rpx 24rpx;
background: #fdf6ec;
}
.tracks-tip-text {
margin-left: 10rpx;
font-size: 28rpx;
color: #f9ae3d;
line-height: 1.4;
}
.tracks-list {
width: 100%;
}
.myTracks-swipe,
:deep(.u-swipe-action),
:deep(.u-swipe-action-item),
:deep(.u-swipe-action-item__content) {
width: 100%;
}
:deep(.u-swipe-action-item__content) {
overflow: hidden;
}
.myTracks-title { .myTracks-title {
width: 100%; width: 100%;
height: 110rpx; height: 110rpx;
padding-left: 20rpx; padding: 0 20rpx;
font-size: 28rpx; font-size: 28rpx;
color: #666; color: #666;
font-weight: bold; font-weight: bold;
background-color: #fff; background-color: #fff;
align-items: center;
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
}
.myTracks-items {
padding-top: 2rpx;
align-items: center; align-items: center;
display: -webkit-box; box-sizing: border-box;
display: -webkit-flex;
display: flex;
flex-direction: column;
} }
.myTracks-item { .myTracks-item {
width: 100%; width: 100%;
height: 226rpx; min-height: 226rpx;
padding-left: 20rpx; padding: 30rpx 20rpx;
padding-right: 20rpx;
margin-bottom: 2rpx;
// border-radius: 6/@px;
background-color: #fff; background-color: #fff;
position: relative; box-sizing: border-box;
align-items: center;
display: -webkit-box;
display: -webkit-flex;
display: flex; display: flex;
align-items: center;
}
.store-line-check {
margin-right: 16rpx;
flex-shrink: 0;
} }
.myTracks-item-img { .myTracks-item-img {
margin-right: 20rpx; margin-right: 20rpx;
border-radius: 8rpx; flex-shrink: 0;
image { .track-thumb {
width: 130rpx; width: 130rpx;
height: 130rpx; height: 130rpx;
border-radius: 8rpx; border-radius: 8rpx;
display: block;
} }
} }
.myTracks-item-content {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
justify-content: center;
}
.myTracks-item-title { .myTracks-item-title {
font-size: 28rpx; font-size: 28rpx;
color: #333; color: #333;
} line-height: 1.4;
.myTracks-item-title-desc {
font-size: 28rpx;
color: #999;
} }
.myTracks-item-price { .myTracks-item-price {
font-size: 28rpx; font-size: 28rpx;
color: $light-color; color: $light-color;
padding: 10rpx 0 0 0; padding-top: 10rpx;
}
.myTracks-action {
display: flex;
justify-content: space-between;
position: fixed;
bottom: 0;
left: 0;
width: 100%;
background: #fff;
height: 75rpx;
align-items: center;
padding: 0 32rpx;
}
.myTracks-action-btn {
width: 130rpx;
height: 60rpx;
line-height: 60rpx;
} }
.myTracks-divider { .myTracks-divider {
width: 100%; width: 100%;
height: 20rpx; height: 20rpx;
background: #f5f5f5;
} }
.edit {
padding-right: 32rpx;
.myTracks-action-check {
align-items: center;
display: -webkit-box;
display: -webkit-flex;
display: flex;
}
.edit{
padding-right: 32rpx;
} }
</style> </style>

View File

@@ -8,24 +8,27 @@
</view> </view>
</view> </view>
<u-row class="portrait-box2"> <view class="point-summary">
<u-col span="6" class="portrait-box2-col" :gutter="16"> <view class="point-summary-item">
<text>累计获得</text> <text>累计获得</text>
<text class="pcolor">{{ pointData.totalPoint || 0 }}</text> <text class="pcolor">{{ pointData.totalPoint || 0 }}</text>
</u-col> </view>
<u-col span="6" class="portrait-box2-col"> <view class="point-summary-divider"></view>
<view class="point-summary-item">
<text>剩余积分</text> <text>剩余积分</text>
<text class="pcolor">{{ pointData.point || 0 }}</text> <text class="pcolor">{{ pointData.point || 0 }}</text>
</u-col> </view>
</u-row> </view>
<div class="point-list"> <div class="point-list">
<view class="point-item" v-for="(item, index) in pointList" :key="index"> <view class="point-item" v-for="(item, index) in pointList" :key="index">
<view> <view class="point-item-left">
<view class="point-label">{{ item.content }}</view> <view class="point-label">{{ item.content }}</view>
<view>{{ item.createTime}}</view> <view class="point-item-time">{{ item.createTime }}</view>
</view>
<view class="point-item-value" :class="[item.pointType == 'INCREASE' ? 'plus' : 'reduce']">
<text>{{ item.pointType == "INCREASE" ? "+" : "-" }}</text>{{ item.variablePoint }}
</view> </view>
<view :class="[item.pointType == 'INCREASE' ? 'plus' : 'reduce']"><span>{{item.pointType == "INCREASE" ? '+' : '-'}}</span>{{ item.variablePoint }}</view>
</view> </view>
<uni-load-more :status="count.loadStatus"></uni-load-more> <uni-load-more :status="count.loadStatus"></uni-load-more>
</div> </div>
@@ -76,11 +79,11 @@ export default {
if (res.data.success) { if (res.data.success) {
let data = res.data.result.records; let data = res.data.result.records;
if (data.length < 10) { if (data.length < 10) {
this.$set(this.count, "loadStatus", "noMore"); this.count["loadStatus"] = "noMore";
this.pointList.push(...data); this.pointList.push(...data);
} else { } else {
this.pointList.push(...data); this.pointList.push(...data);
if (data.length < 10) this.$set(this.count, "loadStatus", "noMore"); if (data.length < 10) this.count["loadStatus"] = "noMore";
} }
} }
}); });
@@ -99,8 +102,8 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.point-list{ .point-list {
margin-top: 50rpx; margin-top: 20rpx;
} }
.title { .title {
height: 80rpx; height: 80rpx;
@@ -120,45 +123,61 @@ export default {
.point-item { .point-item {
width: 100%; width: 100%;
height: 130rpx; min-height: 130rpx;
padding: 0 20rpx; padding: 24rpx 20rpx;
background: #ffffff; background: #ffffff;
font-size: $font-sm; font-size: $font-sm;
border-bottom: 1px solid $border-color-light; border-bottom: 1px solid $border-color-light;
display: flex; display: flex;
justify-content: end; justify-content: space-between;
align-items: center; align-items: center;
> view:nth-child(1) { box-sizing: border-box;
.point-item-left {
flex: 1; flex: 1;
min-width: 0;
line-height: 40rpx; line-height: 40rpx;
view {
color: #666666;
}
:last-child {
color: #999;
}
} }
> view:nth-child(2) { .point-item-time {
color: #999;
}
.point-item-value {
flex-shrink: 0;
width: 100rpx; width: 100rpx;
text-align: center; text-align: center;
} }
} }
.portrait-box2 { .point-summary {
height: 100rpx; display: flex;
align-items: center;
min-height: 100rpx;
padding: 28rpx 0;
background: #ffffff; background: #ffffff;
border-radius: 0 0 20rpx 20rpx; border-radius: 0 0 20rpx 20rpx;
margin: 0 20rpx; margin: 0 20rpx;
font-size: 26rpx; font-size: 26rpx;
::v-deep .u-col { box-sizing: border-box;
text-align: center !important;
.point-summary-item {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
} }
::v-deep .u-col:first-child {
border-right: 1px solid $border-color-light; .point-summary-divider {
width: 1px;
height: 48rpx;
background: $border-color-light;
flex-shrink: 0;
} }
.pcolor { .pcolor {
color: $light-color; color: $light-color;
margin-left: 8rpx;
} }
} }
@@ -222,8 +241,9 @@ export default {
} }
} }
.point-label{ .point-label {
font-weight: bold; font-weight: bold;
margin-bottom: 10rpx; margin-bottom: 10rpx;
color: #666666;
} }
</style> </style>

View File

@@ -15,15 +15,15 @@
<!-- {{localVersion}} --> <!-- {{localVersion}} -->
<u-cell-group class="cell" :border="false"> <u-cell-group class="cell" :border="false">
<!-- #ifdef APP-PLUS --> <!-- #ifdef APP-PLUS -->
<u-cell-item v-if="IosWhether" @click="checkStar" title="去评分"></u-cell-item> <u-cell v-if="IosWhether" @click="checkStar" title="去评分"></u-cell>
<u-cell-item title="功能介绍" @click="navigateTo('/pages/mine/set/versionFunctionList')"></u-cell-item> <u-cell title="功能介绍" @click="navigateTo('/pages/mine/set/versionFunctionList')"></u-cell>
<u-cell-item title="检查更新" @click="checkUpdate"></u-cell-item> <u-cell title="检查更新" @click="checkUpdate"></u-cell>
<!-- #endif --> <!-- #endif -->
<u-cell-item title="证照信息" @click="navigateTo('/pages/mine/help/tips?type=LICENSE_INFORMATION')"></u-cell-item> <u-cell title="证照信息" @click="navigateTo('/pages/mine/help/tips?type=LICENSE_INFORMATION')"></u-cell>
<u-cell-item title="服务协议" @click="navigateTo('/pages/mine/help/tips?type=USER_AGREEMENT')"></u-cell-item> <u-cell title="服务协议" @click="navigateTo('/pages/mine/help/tips?type=USER_AGREEMENT')"></u-cell>
<u-cell-item title="隐私协议" @click="navigateTo('/pages/mine/help/tips?type=PRIVACY_POLICY')"></u-cell-item> <u-cell title="隐私协议" @click="navigateTo('/pages/mine/help/tips?type=PRIVACY_POLICY')"></u-cell>
<u-cell-item title="关于我们" :border-bottom="false" @click="navigateTo('/pages/mine/help/tips?type=ABOUT')"></u-cell-item> <u-cell title="关于我们" :border="false" @click="navigateTo('/pages/mine/help/tips?type=ABOUT')"></u-cell>
</u-cell-group> </u-cell-group>

View File

@@ -9,7 +9,7 @@
<div class="feedBack-box"> <div class="feedBack-box">
<h4>问题反馈 <span style="margin-left:10rpx;" v-if="feedBack.type">@{{ list.find(item=>{return item.value == feedBack.type }).text }}</span></h4> <h4>问题反馈 <span style="margin-left:10rpx;" v-if="feedBack.type">@{{ list.find(item=>{return item.value == feedBack.type }).text }}</span></h4>
<u-input class="field-input" height="500" :border-bottom="false" v-model="feedBack.context" type="textarea" placeholder="请输入反馈信息"> <u-input class="field-input" height="500" border="none" v-model="feedBack.context" type="textarea" placeholder="请输入反馈信息">
</u-input> </u-input>
</div> </div>
@@ -18,14 +18,14 @@
<view class="opt-view"> <view class="opt-view">
<view class="img-title">上传凭证最多2张</view> <view class="img-title">上传凭证最多2张</view>
<view class="images-view"> <view class="images-view">
<u-upload :header=" { accessToken: storage.getAccessToken() }" :action="action" width="150" @on-uploaded="onUploaded" :max-count="2" :show-progress="false"></u-upload> <u-upload :file-list="uploadFileList" :auto-upload="false" width="150" @afterRead="onUploadAfterRead" :max-count="2"></u-upload>
</view> </view>
</view> </view>
</div> </div>
<div class="feedBack-box"> <div class="feedBack-box">
<h4>手机号</h4> <h4>手机号</h4>
<u-input :border-bottom="false" v-model="feedBack.mobile" placeholder="请输入您的手机号"> <u-input border="none" v-model="feedBack.mobile" placeholder="请输入您的手机号">
</u-input> </u-input>
</div> </div>
@@ -38,7 +38,7 @@
import storage from "@/utils/storage.js"; import storage from "@/utils/storage.js";
import config from "@/config/config"; import config from "@/config/config";
import { feedBack } from "@/api/members.js"; import { feedBack } from "@/api/members.js";
import { upload } from "@/api/common.js"; import { handleUploadAfterRead } from "@/utils/uploadHelper.js";
export default { export default {
data() { data() {
return { return {
@@ -47,7 +47,7 @@ export default {
feedBack: { feedBack: {
type: "FUNCTION", //默认反馈问题为 '功能相关' type: "FUNCTION", //默认反馈问题为 '功能相关'
}, },
action: upload, //图片上传地址 uploadFileList: [],
list: [ list: [
{ text: "功能相关", value: "FUNCTION" }, { text: "功能相关", value: "FUNCTION" },
{ text: "优化反馈", value: "OPTIMIZE" }, { text: "优化反馈", value: "OPTIMIZE" },
@@ -58,16 +58,13 @@ export default {
methods: { methods: {
// 点击反馈内容 // 点击反馈内容
handleClick(index) { handleClick(index) {
this.$set(this.feedBack, "type", this.list[index].value); this.feedBack["type"] = this.list[index].value;
}, },
//图片上传 onUploadAfterRead(event) {
onUploaded(lists) { handleUploadAfterRead(event, this.uploadFileList, (urls) => {
let images = []; this.feedBack.images = urls.join(",");
lists.forEach((item) => {
images.push(item.response.result);
}); });
this.feedBack.images = images.join(",");
}, },
/** /**

View File

@@ -17,7 +17,7 @@
<u-form-item label="生日" label-width="150" right-icon="arrow-right"> <u-form-item label="生日" label-width="150" right-icon="arrow-right">
<div style="width: 100%;" @click="showBirthday = true">{{ birthday || '请选择出生日期' }}</div> <div style="width: 100%;" @click="showBirthday = true">{{ birthday || '请选择出生日期' }}</div>
<u-picker v-model="showBirthday" mode="time" :confirm-color="lightColor" @confirm="selectTime"></u-picker> <u-picker v-model:show="showBirthday" mode="time" :confirm-color="lightColor" @confirm="selectTime"></u-picker>
</u-form-item> </u-form-item>
<u-form-item label="城市" label-width="150" placeholder="请选择城市" right-icon="arrow-right"> <u-form-item label="城市" label-width="150" placeholder="请选择城市" right-icon="arrow-right">
<div style="width: 100%;" @click="clickRegion">{{ form.___path || '请选择城市' }}</div> <div style="width: 100%;" @click="clickRegion">{{ form.___path || '请选择城市' }}</div>
@@ -44,10 +44,9 @@
import { saveUserInfo, getUserInfo } from "@/api/members.js"; import { saveUserInfo, getUserInfo } from "@/api/members.js";
import { upload } from "@/api/common.js"; import { upload } from "@/api/common.js";
import storage from "@/utils/storage.js"; import storage from "@/utils/storage.js";
import uFormItem from "@/uview-ui/components/u-form-item/u-form-item.vue";
import city from "@/components/m-city/m-city.vue"; import city from "@/components/m-city/m-city.vue";
export default { export default {
components: { uFormItem, "m-city": city }, components: { "m-city": city },
data() { data() {
return { return {
lightColor: this.$lightColor, //高亮颜色 lightColor: this.$lightColor, //高亮颜色
@@ -83,7 +82,7 @@ export default {
* 退出登录 * 退出登录
*/ */
quiteLoginOut() { quiteLoginOut() {
this.$options.filters.quiteLoginOut(); this.quiteLoginOut();
}, },
/** /**
@@ -157,11 +156,9 @@ export default {
* 选择地址 * 选择地址
*/ */
selectRegion(region) { selectRegion(region) {
this.$set(
this.form, this.form["address"] = `${region.province.label} ${region.city.label} ${region.area.label}`
"address", ;
`${region.province.label} ${region.city.label} ${region.area.label}`
);
}, },
/** /**

View File

@@ -15,8 +15,8 @@
<u-form-item class="sendCode" label-width="120" prop="code" label="验证码"> <u-form-item class="sendCode" label-width="120" prop="code" label="验证码">
<u-input v-model="codeForm.code" placeholder="请输入验证码" /> <u-input v-model="codeForm.code" placeholder="请输入验证码" />
<u-verification-code unique-key="page-edit" :seconds="seconds" @end="end" @start="start" <u-code unique-key="page-edit" :seconds="seconds" @end="end" @start="start"
ref="uCode" @change="codeChange"></u-verification-code> ref="uCode" @change="codeChange"></u-code>
<view @tap="getCode" class="text-tips">{{ tips }}</view> <view @tap="getCode" class="text-tips">{{ tips }}</view>
</u-form-item> </u-form-item>

View File

@@ -15,8 +15,8 @@
<u-form-item class="sendCode" label-width="120" prop="code" label="验证码"> <u-form-item class="sendCode" label-width="120" prop="code" label="验证码">
<u-input v-model="codeForm.code" placeholder="请输入验证码" /> <u-input v-model="codeForm.code" placeholder="请输入验证码" />
<u-verification-code unique-key="page-edit" :seconds="seconds" @end="end" @start="start" <u-code unique-key="page-edit" :seconds="seconds" @end="end" @start="start"
ref="uCode" @change="codeChange"></u-verification-code> ref="uCode" @change="codeChange"></u-code>
<view @tap="getCode" class="text-tips">{{ tips }}</view> <view @tap="getCode" class="text-tips">{{ tips }}</view>
</u-form-item> </u-form-item>
@@ -197,7 +197,7 @@
/**判断是否是当前用户的手机号 */ /**判断是否是当前用户的手机号 */
isUserPhone() { isUserPhone() {
let flage = false; let flage = false;
let user = this.$options.filters.isLogin(); let user = this.isLogin();
if (user.mobile != this.codeForm.mobile) { if (user.mobile != this.codeForm.mobile) {
uni.showToast({ uni.showToast({
title: "请输入当前绑定手机号", title: "请输入当前绑定手机号",

View File

@@ -2,9 +2,11 @@
<template> <template>
<view class="face-login"> <view class="face-login">
<u-cell-group> <u-cell-group>
<u-cell-item class="border-top" :arrow="false" title="面容登录"> <u-cell class="border-top" :isLink="false" title="面容登录">
<u-switch slot="right-icon" @change="faceSwitchChange" active-color="#1abc9c" size="40" v-model="checked"></u-switch> <template #right-icon>
</u-cell-item> <u-switch @change="faceSwitchChange" active-color="#1abc9c" size="40" v-model="checked"></u-switch>
</template>
</u-cell>
</u-cell-group> </u-cell-group>
<view class="describe">开启后可使用面容认证完成快捷登录设置仅对本机生效</view> <view class="describe">开启后可使用面容认证完成快捷登录设置仅对本机生效</view>
</view> </view>

View File

@@ -2,9 +2,11 @@
<template> <template>
<view class="finger"> <view class="finger">
<u-cell-group> <u-cell-group>
<u-cell-item class="border-top" :arrow="false" title="指纹登录"> <u-cell class="border-top" :isLink="false" title="指纹登录">
<u-switch slot="right-icon" @change="fingerSwitchChange" :active-color="lightColor" size="40" v-model="checked"></u-switch> <template #right-icon>
</u-cell-item> <u-switch @change="fingerSwitchChange" :active-color="lightColor" size="40" v-model="checked"></u-switch>
</template>
</u-cell>
</u-cell-group> </u-cell-group>
<view class="describe">开启后可使用指纹认证完成快捷登录设置仅对本机生效如需修改指纹请在系统设置中操作</view> <view class="describe">开启后可使用指纹认证完成快捷登录设置仅对本机生效如需修改指纹请在系统设置中操作</view>
</view> </view>

View File

@@ -1,8 +1,8 @@
<template> <template>
<view class="securityCenter"> <view class="securityCenter">
<u-cell-group> <u-cell-group>
<u-cell-item title="修改密码" @click="navigateTo('/pages/mine/set/securityCenter/updatePwdTab')"></u-cell-item> <u-cell title="修改密码" @click="navigateTo('/pages/mine/set/securityCenter/updatePwdTab')"></u-cell>
<u-cell-item title="注销账户" @click="zhuxiao"></u-cell-item> <u-cell title="注销账户" @click="zhuxiao"></u-cell>
</u-cell-group> </u-cell-group>
</view> </view>
</template> </template>

View File

@@ -1,8 +1,8 @@
<template> <template>
<view class="securityCenter"> <view class="securityCenter">
<u-cell-group> <u-cell-group>
<u-cell-item title="验证密码" @click="navigateTo('/pages/mine/set/securityCenter/editLoginPassword')"></u-cell-item> <u-cell title="验证密码" @click="navigateTo('/pages/mine/set/securityCenter/editLoginPassword')"></u-cell>
<u-cell-item title="验证手机号" @click="navigateTo('/pages/mine/set/securityCenter/editPassword')"></u-cell-item> <u-cell title="验证手机号" @click="navigateTo('/pages/mine/set/securityCenter/editPassword')"></u-cell>
</u-cell-group> </u-cell-group>
</view> </view>
</template> </template>

View File

@@ -13,16 +13,16 @@
<!-- #endif --> <!-- #endif -->
<u-cell-group :border="false"> <u-cell-group :border="false">
<!-- #ifdef APP-PLUS --> <!-- #ifdef APP-PLUS -->
<u-cell-item title="清除缓存" :value="fileSizeString" @click="clearCache"></u-cell-item> <u-cell title="清除缓存" :value="fileSizeString" @click="clearCache"></u-cell>
<!-- #endif --> <!-- #endif -->
<!-- #ifndef MP-WEIXIN --> <!-- #ifndef MP-WEIXIN -->
<u-cell-item title="安全中心" @click="navigateTo('/pages/mine/set/securityCenter/securityCenter')"></u-cell-item> <u-cell title="安全中心" @click="navigateTo('/pages/mine/set/securityCenter/securityCenter')"></u-cell>
<!-- #endif --> <!-- #endif -->
<u-cell-item title="用户注销" v-if="userInfo.id" @click="logoff"></u-cell-item> <u-cell title="用户注销" v-if="userInfo.id" @click="logoff"></u-cell>
<u-cell-item title="意见反馈" @click="navigateTo('/pages/mine/set/feedBack')"></u-cell-item> <u-cell title="意见反馈" @click="navigateTo('/pages/mine/set/feedBack')"></u-cell>
<!-- #ifndef H5 --> <!-- #ifndef H5 -->
<!-- #endif --> <!-- #endif -->
<u-cell-item :title="`关于${config.name}`" @click="navigateTo('/pages/mine/set/editionIntro')"></u-cell-item> <u-cell :title="`关于${config.name}`" @click="navigateTo('/pages/mine/set/editionIntro')"></u-cell>
</u-cell-group> </u-cell-group>
<view class="submit" v-if="userInfo.id" @click="quiteLoginOut">退出登录</view> <view class="submit" v-if="userInfo.id" @click="quiteLoginOut">退出登录</view>
</view> </view>
@@ -54,14 +54,14 @@ export default {
* 退出登录 * 退出登录
*/ */
quiteLoginOut() { quiteLoginOut() {
this.$options.filters.quiteLoginOut(); this.quiteLoginOut();
}, },
/** /**
* 用户注销 * 用户注销
*/ */
logoff(){ logoff(){
this.$options.filters.logoff(); this.logoff();
}, },
/** /**
@@ -91,10 +91,10 @@ export default {
* 判断当前是否进入用户中心 * 判断当前是否进入用户中心
*/ */
checkUserInfo() { checkUserInfo() {
if (this.$options.filters.isLogin("auth")) { if (this.isLogin("auth")) {
this.navigateTo("/pages/mine/set/personMsg"); this.navigateTo("/pages/mine/set/personMsg");
} else { } else {
this.$options.filters.tipsToLogin(); this.tipsToLogin();
} }
}, },
@@ -155,7 +155,7 @@ export default {
}, },
}, },
onShow() { onShow() {
this.userInfo = this.$options.filters.isLogin(); this.userInfo = this.isLogin();
// #ifdef APP-PLUS // #ifdef APP-PLUS
this.getCacheSize(); this.getCacheSize();
// #endif // #endif

View File

@@ -111,13 +111,41 @@ page {
margin-bottom: 20rpx; margin-bottom: 20rpx;
} }
} }
.scoll-page { .scoll-page,
.goods-scroll {
flex: 1;
height: 0;
overflow: auto; overflow: auto;
} }
.search-navbar-wrap {
box-sizing: border-box;
flex-shrink: 0;
}
.search-navbar {
width: 100%;
:deep(.u-navbar__content__left) {
width: auto !important;
padding: 0 0 0 16rpx !important;
}
}
.goods-content {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
background: $bg-color;
}
.content { .content {
background-color: $bg-color; background-color: $bg-color;
height: 100vh; height: 100vh;
overflow: hidden; overflow: hidden;
display: flex;
flex-direction: column;
} }
.index-nav-arrow:last-child { .index-nav-arrow:last-child {
@@ -266,6 +294,8 @@ view {
.search-keyword { .search-keyword {
width: 100%; width: 100%;
flex: 1;
min-height: 0;
background-color: #ededed; background-color: #ededed;
} }

View File

@@ -1,18 +1,31 @@
<template> <template>
<view class="content"> <view class="content">
<u-navbar :background="navObj" :is-back="false"> <u-navbar
<mSearch :bg-color="navObj.background"
ref="mSearch" :auto-back="false"
class="mSearch-input-box" :fixed="true"
@clickLeft="back" :placeholder="true"
:mode="2" :border="false"
:placeholder="defaultKeyword" left-icon=""
@search="doSearch(false)" title=""
@confirm="doSearch(false)" class="search-navbar"
@SwitchType="doSearchSwitch()" >
v-model="keyword" <template #left>
:isFocusVal="!isShowSeachGoods" <view class="search-navbar-wrap" :style="searchNavbarStyle">
></mSearch> <mSearch
ref="mSearch"
class="mSearch-input-box"
@clickLeft="back"
:mode="2"
:placeholder="defaultKeyword"
@search="doSearch(false)"
@confirm="doSearch(false)"
@SwitchType="doSearchSwitch()"
v-model="keyword"
:isFocusVal="!isShowSeachGoods"
></mSearch>
</view>
</template>
</u-navbar> </u-navbar>
<view class="search-keyword" v-if="!isShowSeachGoods"> <view class="search-keyword" v-if="!isShowSeachGoods">
@@ -33,9 +46,11 @@
<view class="keyword-block" v-if="oldKeywordList.length > 0"> <view class="keyword-block" v-if="oldKeywordList.length > 0">
<view class="keyword-list-header"><view class="u-tips">搜索历史</view></view> <view class="keyword-list-header"><view class="u-tips">搜索历史</view></view>
<div class="oldKeyList"> <div class="oldKeyList">
<div class="oldKeyItem" v-if="keyword" v-for="(keyword, index) in oldKeywordList" :key="index" @click="doSearch(keyword)"> <template v-for="(keyword, index) in oldKeywordList" :key="index">
<div class="oldKeyItem" v-if="keyword" @click="doSearch(keyword)">
<span>{{ keyword }}</span> <span>{{ keyword }}</span>
</div> </div>
</template>
<div @click="showMore" v-if="oldKeywordIndex > loadIndex" class="oldKeyItem">展示更多</div> <div @click="showMore" v-if="oldKeywordIndex > loadIndex" class="oldKeyItem">展示更多</div>
</div> </div>
@@ -77,39 +92,35 @@
<view class="nav-item" @click="sortGoods">筛选</view> <view class="nav-item" @click="sortGoods">筛选</view>
</view> </view>
<!-- 一行一个商品展示 --> <!-- 一行一个商品展示 -->
<div v-if="isSWitch"> <scroll-view
<scroll-view v-if="isSWitch"
:style="{ height: goodsHeight }" class="goods-scroll"
enableBackToTop="true" enableBackToTop="true"
lower-threshold="250" lower-threshold="250"
@scrolltolower="loadmore()" @scrolltolower="loadmore()"
scroll-with-animation scroll-with-animation
scroll-y scroll-y
class="scoll-page" >
> <goodsList :res="goodsList" type="oneColumns" :keyword="keyword" />
<goodsList :res="goodsList" type="oneColumns" :keyword="keyword" /> <uni-load-more :status="loadingType" @loadmore="loadmore()"></uni-load-more>
<uni-load-more :status="loadingType" @loadmore="loadmore()"></uni-load-more> </scroll-view>
</scroll-view>
</div>
<!-- 一行两个商品展示 --> <!-- 一行两个商品展示 -->
<div v-if="!isSWitch && !(goodsList == [] || goodsList == '' || goodsList == null)"> <scroll-view
<scroll-view v-if="!isSWitch && !(goodsList == [] || goodsList == '' || goodsList == null)"
:style="{ height: goodsHeight }" class="goods-scroll"
scroll-anchoring scroll-anchoring
enableBackToTop="true" enableBackToTop="true"
@scrolltolower="loadmore()" @scrolltolower="loadmore()"
scroll-with-animation scroll-with-animation
scroll-y scroll-y
lower-threshold="250" lower-threshold="250"
class="scoll-page" >
> <goodsList :res="goodsList" :keyword="keyword" />
<goodsList :res="goodsList" :keyword="keyword" /> <uni-load-more :status="loadingType"></uni-load-more>
<uni-load-more :status="loadingType"></uni-load-more> </scroll-view>
</scroll-view>
</div>
</view> </view>
<u-popup border-radius="20" mode="right" width="90%" v-model="sortPopup"> <u-popup border-radius="20" mode="right" width="90%" v-model:show="sortPopup">
<view class="status_bar"></view> <view class="status_bar"></view>
<view class="sort-box "> <view class="sort-box ">
<view class="sort-list"> <view class="sort-list">
@@ -229,7 +240,6 @@ export default {
type: '', type: '',
index: '' index: ''
}, },
goodsHeight: '',
defaultKeyword: '', defaultKeyword: '',
keyword: '', keyword: '',
oldKeywordList: [], oldKeywordList: [],
@@ -267,10 +277,25 @@ export default {
categoryId: '' categoryId: ''
}, },
routerVal: '' routerVal: '',
capsuleInsetRight: 0,
searchNavbarWidth: 0,
}; };
}, },
computed: {
searchNavbarStyle() {
if (this.searchNavbarWidth) {
return {
width: `${this.searchNavbarWidth}px`,
};
}
return {
width: '100%',
};
},
},
onPageScroll(e) { onPageScroll(e) {
console.log(e); console.log(e);
this.scrollTop = e.scrollTop; this.scrollTop = e.scrollTop;
@@ -309,6 +334,9 @@ export default {
} }
this.loadData(); this.loadData();
}, },
onReady() {
this.setSearchNavbarWidth();
},
components: { components: {
mSearch, mSearch,
goodsList goodsList
@@ -338,40 +366,22 @@ export default {
this.loadData(); this.loadData();
}, },
mounted() {
const { windowWidth, windowHeight } = uni.getSystemInfoSync();
let topHeight = 0;
let navHeight = 0;
uni.getSystemInfo({
success: function(res) {
// res - 各种参数
let top = uni.createSelectorQuery().select('.u-navbar');
top.boundingClientRect(function(data) {
if (data && data.height) {
//data - 各种参数
topHeight = data.height; // 获取元素宽度
}
}).exec();
let nav = uni.createSelectorQuery().select('.navbar');
nav.boundingClientRect(function(data) {
if (data && data.height) {
//data - 各种参数
navHeight = data.height; // 获取元素宽度
}
}).exec();
}
});
this.goodsHeight = windowHeight - navHeight - topHeight;
// #ifdef APP-PLUS
this.goodsHeight = this.goodsHeight - 100;
// #endif
this.goodsHeight += 'px';
},
methods: { methods: {
setSearchNavbarWidth() {
// #ifdef MP-WEIXIN
try {
const menuButton = uni.getMenuButtonBoundingClientRect();
const { windowWidth } = uni.getWindowInfo();
this.capsuleInsetRight = windowWidth - menuButton.left;
const leftPadding = uni.upx2px(16);
const gap = uni.upx2px(8);
this.searchNavbarWidth =
windowWidth - this.capsuleInsetRight - leftPadding - gap;
} catch (e) {
this.searchNavbarWidth = 280;
}
// #endif
},
// 数据去重一下 只显示一次 减免 劵 什么的 // 数据去重一下 只显示一次 减免 劵 什么的
getPromotion(item) { getPromotion(item) {
if (item.promotionMap) { if (item.promotionMap) {
@@ -539,10 +549,10 @@ export default {
if (this.params.sort == type) { if (this.params.sort == type) {
this.params.order == 'asc' ? (this.params.order = 'desc') : (this.params.order = 'asc'); this.params.order == 'asc' ? (this.params.order = 'desc') : (this.params.order = 'asc');
this.$set(this.params, 'sort', type); this.params['sort'] = type;
} else { } else {
this.params.order = 'desc'; this.params.order = 'desc';
this.$set(this.params, 'sort', type); this.params['sort'] = type;
} }
if (index == 0) { if (index == 0) {
@@ -709,7 +719,7 @@ export default {
this.$refs.mSearch.inputVal = keyword; this.$refs.mSearch.inputVal = keyword;
this.params.keyword = this.keyword; this.params.keyword = this.keyword;
this.params.pageNumber = 1; this.params.pageNumber = 1;
this.$set(this.sortParams, 'keyword', keyword); this.sortParams['keyword'] = keyword;
this.loadData('refresh', 1); this.loadData('refresh', 1);
}, },
//保存关键字到历史记录 //保存关键字到历史记录

View File

@@ -54,7 +54,7 @@
<view class="goods-title u-line-2">{{ sku.name }}</view> <view class="goods-title u-line-2">{{ sku.name }}</view>
<!-- 如果商品多个则不显示每个商品价格--> <!-- 如果商品多个则不显示每个商品价格-->
<view class="goods-price" v-if="order.orderItems.length <= 1"> <view class="goods-price" v-if="order.orderItems.length <= 1">
{{ order.flowPrice | unitPrice }} {{unitPrice(order.flowPrice) }}
</view> </view>
</view> </view>
<view class="goods-num"> <view class="goods-num">
@@ -89,31 +89,31 @@
class="cannot_apply not_center" class="cannot_apply not_center"
v-if="order.serviceType == 'RETURN_GOODS'" v-if="order.serviceType == 'RETURN_GOODS'"
> >
退货处理-{{ order.serviceStatus | serviceStatusList }}</view 退货处理-{{serviceStatusList(order.serviceStatus) }}</view
> >
<view <view
class="cannot_apply not_center" class="cannot_apply not_center"
v-if="order.serviceType == 'SUPPLY_AGAIN_GOODS'" v-if="order.serviceType == 'SUPPLY_AGAIN_GOODS'"
> >
补发商品-{{ order.serviceStatus | serviceStatusList }}</view 补发商品-{{serviceStatusList(order.serviceStatus) }}</view
> >
<view <view
class="cannot_apply not_center" class="cannot_apply not_center"
v-if="order.serviceType == 'RETURN_MONEY'" v-if="order.serviceType == 'RETURN_MONEY'"
> >
退款-{{ order.serviceStatus | serviceStatusList }}</view 退款-{{serviceStatusList(order.serviceStatus) }}</view
> >
<view <view
class="cannot_apply not_center" class="cannot_apply not_center"
v-if="order.serviceType == 'EXCHANGE_GOODS'" v-if="order.serviceType == 'EXCHANGE_GOODS'"
> >
换货-{{ order.serviceStatus | serviceStatusList }}</view 换货-{{serviceStatusList(order.serviceStatus) }}</view
> >
<view <view
class="cannot_apply not_center" class="cannot_apply not_center"
v-if="order.serviceType == 'CANCEL'" v-if="order.serviceType == 'CANCEL'"
> >
取消订单-{{ order.serviceStatus | serviceStatusList }}</view 取消订单-{{serviceStatusList(order.serviceStatus) }}</view
> >
</div> </div>
@@ -177,7 +177,7 @@
<!-- 多个商品显示订单总价格 --> <!-- 多个商品显示订单总价格 -->
<view class="cannot_apply"> <view class="cannot_apply">
订单总金额:<span class="countMoney" 订单总金额:<span class="countMoney"
>¥{{ order.flowPrice | unitPrice }}</span >¥{{unitPrice(order.flowPrice) }}</span
> >
</view> </view>
</view> </view>
@@ -187,11 +187,11 @@
<u-modal <u-modal
show-cancel-button show-cancel-button
@confirm="closeService" @confirm="closeService"
v-model="cancelShow" v-model:show="cancelShow"
content="确认取消售后" content="确认取消售后"
></u-modal> ></u-modal>
<u-modal <u-modal
v-model="tipsShow" v-model:show="tipsShow"
content="当订单未确认收货|已过售后服务有效期|已申请售后服务时,不能申请售后" content="当订单未确认收货|已过售后服务有效期|已申请售后服务时,不能申请售后"
></u-modal> ></u-modal>
</view> </view>

View File

@@ -10,7 +10,8 @@
</view> </view>
</view> </view>
<view> <view>
<view class="goods-item-view" v-for="(item,index) in sku.orderItems" v-if="item.sn == sn" <template v-for="(item,index) in sku.orderItems" :key="index">
<view class="goods-item-view" v-if="item.sn == sn"
@click="gotoGoodsDetail(sku.goods_id)"> @click="gotoGoodsDetail(sku.goods_id)">
<view class="goods-img"> <view class="goods-img">
<u-image border-radius="6" width="131rpx" height="131rpx" :src="item.image"></u-image> <u-image border-radius="6" width="131rpx" height="131rpx" :src="item.image"></u-image>
@@ -24,6 +25,7 @@
</view> </view>
</view> </view>
</view> </view>
</template>
</view> </view>
<view class="after-num"> <view class="after-num">
<view>申请数量</view> <view>申请数量</view>
@@ -49,8 +51,8 @@
<view class="opt-view"> <view class="opt-view">
<view class="img-title">上传凭证最多5张</view> <view class="img-title">上传凭证最多5张</view>
<view class="images-view"> <view class="images-view">
<u-upload :header=" { accessToken: storage.getAccessToken() }" :action="action" width="150" <u-upload :file-list="fileList" :auto-upload="false" width="150"
@on-uploaded="onUploaded" :max-count="5" :show-progress="false"></u-upload> @afterRead="onUploadAfterRead" :max-count="5"></u-upload>
</view> </view>
</view> </view>
@@ -87,10 +89,10 @@
<u-button type="primary" ripple shape="circle" v-if="applyInfo.refundWay" :custom-style="customStyle" <u-button type="primary" ripple shape="circle" v-if="applyInfo.refundWay" :custom-style="customStyle"
@click="onSubmit">提交申请</u-button> @click="onSubmit">提交申请</u-button>
</view> </view>
<u-select mode="single-column" :list="reasonList" v-model="reasonSelectShow" @confirm="reasonSelectConfirm"> <u-select mode="single-column" :list="reasonList" v-model:show="reasonSelectShow" @confirm="reasonSelectConfirm">
</u-select> </u-select>
<u-select mode="single-column" :list="typeList" v-model="typeSelectShow" @confirm="typeSelectConfirm"></u-select> <u-select mode="single-column" :list="typeList" v-model:show="typeSelectShow" @confirm="typeSelectConfirm"></u-select>
<u-select mode="single-column" :list="returnList" v-model="returnSelectShow" @confirm="returnSelectConfirm"> <u-select mode="single-column" :list="returnList" v-model:show="returnSelectShow" @confirm="returnSelectConfirm">
</u-select> </u-select>
<u-toast ref="uToast" /> <u-toast ref="uToast" />
</view> </view>
@@ -104,7 +106,7 @@ import {
} from "@/api/after-sale"; } from "@/api/after-sale";
import city from "@/components/m-city/m-city"; import city from "@/components/m-city/m-city";
import { upload } from "@/api/common.js"; import { handleUploadAfterRead } from "@/utils/uploadHelper.js";
import { checkBankno } from "@/utils/Foundation"; import { checkBankno } from "@/utils/Foundation";
import storage from "@/utils/storage.js"; import storage from "@/utils/storage.js";
export default { export default {
@@ -115,7 +117,6 @@ export default {
return { return {
storage, storage,
list: [{ id: "", localName: "请选择", children: [] }], list: [{ id: "", localName: "请选择", children: [] }],
action: upload, //图片上传数据
fileList: [], fileList: [],
sn: "", sn: "",
sku: {}, sku: {},
@@ -263,14 +264,10 @@ export default {
valChange(e) { valChange(e) {
this.form.num = e.value; this.form.num = e.value;
}, },
//图片上传 onUploadAfterRead(event) {
onUploaded(lists) { handleUploadAfterRead(event, this.fileList, (urls) => {
let images = []; this.form.images = urls;
lists.forEach((item) => {
images.push(item.response.result);
}); });
this.form.images = images;
}, },
//提交申请 //提交申请
onSubmit() { onSubmit() {

View File

@@ -17,7 +17,7 @@
<view class="goods-info"> <view class="goods-info">
<view class="goods-title u-line-2">{{ sku.name }}</view> <view class="goods-title u-line-2">{{ sku.name }}</view>
<view class="goods-price"> <view class="goods-price">
<span>{{ sku.price | unitPrice }}</span> <span>{{unitPrice(sku.price) }}</span>
<span class="num">购买数量: {{ sku.num }} </span> <span class="num">购买数量: {{ sku.num }} </span>
</view> </view>
</view> </view>
@@ -55,9 +55,9 @@
</u-button> </u-button>
</view> </view>
</u-form> </u-form>
<u-select mode="single-column" :list="companyList" v-model="companySelectShow" <u-select mode="single-column" :list="companyList" v-model:show="companySelectShow"
@confirm="companySelectConfirm"></u-select> @confirm="companySelectConfirm"></u-select>
<u-calendar v-model="timeshow" :mode="'date'" @change="onTimeChange"></u-calendar> <u-calendar v-model:show="timeshow" :mode="'date'" @change="onTimeChange"></u-calendar>
<u-toast ref="uToast"/> <u-toast ref="uToast"/>
</view> </view>
</template> </template>

View File

@@ -9,7 +9,8 @@
</view> </view>
</view> </view>
<view> <view>
<view class="goods-item-view" :key="index" v-for="(item,index) in sku.orderItems" v-if="item.sn == sn" @click="navigateToGoodsDetail(sku.skuId)"> <template v-for="(item,index) in sku.orderItems" :key="index">
<view class="goods-item-view" v-if="item.sn == sn" @click="navigateToGoodsDetail(sku.skuId)">
<view class="goods-img"> <view class="goods-img">
<u-image border-radius="6" width="131rpx" height="131rpx" :src="item.image"></u-image> <u-image border-radius="6" width="131rpx" height="131rpx" :src="item.image"></u-image>
</view> </view>
@@ -22,6 +23,7 @@
</view> </view>
</view> </view>
</view> </view>
</template>
</view> </view>
</view> </view>

View File

@@ -11,12 +11,10 @@
<view class="apply-info-view"> <view class="apply-info-view">
<view class="status-info"> <view class="status-info">
<view class="status-info-box"> <view class="status-info-box">
<view class="status-val">{{ <view class="status-val">{{serviceStatusList(serviceDetail.serviceStatus)
serviceDetail.serviceStatus | serviceStatusList
}}</view> }}</view>
<view class="status-tip">{{ <view class="status-tip">{{statusFilter(serviceDetail.serviceStatus)
serviceDetail.serviceStatus | statusFilter
}}</view> }}</view>
</view> </view>
</view> </view>
@@ -43,7 +41,7 @@
}}</view> }}</view>
<view class="goods-price"> <view class="goods-price">
<view class="price"> {{ serviceDetail.flowPrice | unitPrice }}</view> <view class="price"> {{unitPrice(serviceDetail.flowPrice) }}</view>
<view> <view>
<view>申请售后数量{{ serviceDetail.num }}</view> <view>申请售后数量{{ serviceDetail.num }}</view>
</view> </view>
@@ -116,44 +114,40 @@
v-if="serviceDetail.serviceType != 'RETURN_MONEY' && serviceDetail.serviceStatus != 'APPLY'"> v-if="serviceDetail.serviceType != 'RETURN_MONEY' && serviceDetail.serviceStatus != 'APPLY'">
<view class="title">联系方式:</view> <view class="title">联系方式:</view>
<view class="value">{{ <view class="value">{{
storeAfterSaleAddress.salesConsigneeMobile || "" | secrecyMobile storeAfterSaleAddress.salesConsigneeMobile
? secrecyMobile(storeAfterSaleAddress.salesConsigneeMobile)
: ''
}}</view> }}</view>
</view> </view>
<view v-if="refundShow"> <view v-if="refundShow">
<view class="detail-item"> <view class="detail-item">
<view class="title">退款金额:</view> <view class="title">退款金额:</view>
<view class="value">{{ <view class="value">{{unitPrice(serviceDetail.flowPrice, "¥")
serviceDetail.flowPrice | unitPrice("¥")
}}</view> }}</view>
</view> </view>
<view class="detail-item" v-if="serviceDetail.agree_price"> <view class="detail-item" v-if="serviceDetail.agree_price">
<view class="title">同意退款:</view> <view class="title">同意退款:</view>
<view class="value">{{ <view class="value">{{unitPrice(serviceDetail.agree_price, "¥")
serviceDetail.agree_price | unitPrice("¥")
}}</view> }}</view>
</view> </view>
<view class="detail-item" v-if="serviceDetail.actual_price"> <view class="detail-item" v-if="serviceDetail.actual_price">
<view class="title">实际退款:</view> <view class="title">实际退款:</view>
<view class="value">{{ <view class="value">{{unitPrice(serviceDetail.actual_price, "¥")
serviceDetail.actual_price | unitPrice("¥")
}}</view> }}</view>
</view> </view>
<view class="detail-item" v-if="serviceDetail.actual_price"> <view class="detail-item" v-if="serviceDetail.actual_price">
<view class="title">退款时间:</view> <view class="title">退款时间:</view>
<view class="value">{{ <view class="value">{{unixToDate(serviceDetail.refund_time)
serviceDetail.refund_time | unixToDate
}}</view> }}</view>
</view> </view>
<view class="detail-item" v-if="serviceDetail.refund_price !== 0"> <view class="detail-item" v-if="serviceDetail.refund_price !== 0">
<view class="title">退款方式:</view> <view class="title">退款方式:</view>
<view class="value">{{ <view class="value">{{refundWayFilter(serviceDetail.refundWay)
serviceDetail.refundWay | refundWayFilter
}}</view> }}</view>
</view> </view>
<view class="detail-item" v-if="accountShow && serviceDetail.refund_price != 0"> <view class="detail-item" v-if="accountShow && serviceDetail.refund_price != 0">
<view class="title">账户类型:</view> <view class="title">账户类型:</view>
<view class="value">{{ <view class="value">{{accountTypeFilter(serviceDetail.accountType)
serviceDetail.accountType | accountTypeFilter
}}</view> }}</view>
</view> </view>
<view class="detail-item" v-if=" <view class="detail-item" v-if="
@@ -232,10 +226,7 @@ export default {
this.getAddress(); this.getAddress();
this.getLog(options.sn); this.getLog(options.sn);
}, },
filters: { methods: {
/**
* 售后状态信息
*/
statusFilter(val) { statusFilter(val) {
switch (val) { switch (val) {
case "APPLY": case "APPLY":
@@ -264,25 +255,16 @@ export default {
return ""; return "";
} }
}, },
/**
* 退款信息
*/
refundWayFilter(val) { refundWayFilter(val) {
switch (val) { switch (val) {
case "OFFLINE": case "OFFLINE":
return "账户退款"; return "账户退款";
case "OFFLINE":
return "线下退款";
case "ORIGINAL": case "ORIGINAL":
return "原路退回"; return "原路退回";
default: default:
return ""; return "";
} }
}, },
/**
* 账户信息
*/
accountTypeFilter(val) { accountTypeFilter(val) {
switch (val) { switch (val) {
case "WEIXINPAY": case "WEIXINPAY":
@@ -295,8 +277,6 @@ export default {
return ""; return "";
} }
}, },
},
methods: {
/** /**
* 点击图片放大或保存 * 点击图片放大或保存
*/ */

View File

@@ -18,12 +18,11 @@
<view class="info-view"> <view class="info-view">
<view> <view>
<u-time-line v-if="logList.length != 0"> <u-time-line v-if="logList.length != 0">
<u-time-line-item> <u-time-line-item v-for="(time, index) in logList" :key="index">
<!-- 此处没有自定义左边的内容会默认显示一个点 --> <template #content>
<template v-slot:content> <view>
<view v-for="(time,index) in logList" :key="index"> <view class="u-order-desc">{{ time.message }}</view>
<view class="u-order-desc">{{time.message}}</view> <view class="u-order-time">{{ time.createTime }}</view>
<view class="u-order-time">{{time.createTime}}</view>
</view> </view>
</template> </template>
</u-time-line-item> </u-time-line-item>

View File

@@ -5,29 +5,31 @@
<view class="seller-info u-flex u-row-between"> <view class="seller-info u-flex u-row-between">
<view class="seller-name"> <view class="seller-name">
<view class="name">{{ order.storeName || "" }}</view> <view class="name">{{ order.storeName || "" }}</view>
<view class="status">{{ orderStatusList[order.orderStatus] }}</view> <view class="status">{{ orderStatusMap[order.orderStatus] }}</view>
</view> </view>
<view class="order-sn"></view> <view class="order-sn"></view>
</view> </view>
<u-line color="#DCDFE6"></u-line> <u-line color="#DCDFE6"></u-line>
<view class="goods-item-view" v-for="(sku, index) in orderGoodsList" :key="index" v-if="sku.skuId == skuId"> <template v-for="(sku, index) in orderGoodsList" :key="index">
<view class="goods-item-view" v-if="sku.skuId == skuId">
<view class="goods-img"> <view class="goods-img">
<u-image border-radius="6" width="131rpx" height="131rpx" :src="sku.image"></u-image> <u-image border-radius="6" width="131rpx" height="131rpx" :src="sku.image"></u-image>
</view> </view>
<view class="goods-info"> <view class="goods-info">
<view class="goods-title u-line-2">{{ sku.goodsName }}</view> <view class="goods-title u-line-2">{{ sku.goodsName }}</view>
<view class="goods-price"> <view class="goods-price">
{{ sku.flowPrice | unitPrice }} {{unitPrice(sku.flowPrice) }}
</view> </view>
</view> </view>
<view class="goods-num"> <view class="goods-num">
<view>x{{ sku.num }}</view> <view>x{{ sku.num }}</view>
</view> </view>
</view> </view>
</template>
</view> </view>
<!-- 投诉主题 --> <!-- 投诉主题 -->
<u-select @confirm="confirmComplain" v-model="complainShow" :list="complainList"></u-select> <u-select @confirm="confirmComplain" v-model:show="complainShow" :list="complainList"></u-select>
<!-- 投诉模块 --> <!-- 投诉模块 -->
<view class="cell"> <view class="cell">
<view class="cell-item between" @click="complainShow = true"> <view class="cell-item between" @click="complainShow = true">
@@ -45,7 +47,7 @@
<view class="cell-item"> <view class="cell-item">
<view class="cell-title"> 投诉凭证 </view> <view class="cell-title"> 投诉凭证 </view>
<view class="cell-view"> <view class="cell-view">
<u-upload ref="uUpload" :header=" { accessToken: storage.getAccessToken() }" :action="action" width="200" @on-uploaded="onUploaded" :max-count="5"> <u-upload :file-list="uploadFileList" :auto-upload="false" width="200" @afterRead="onUploadAfterRead" :max-count="5">
</u-upload> </u-upload>
</view> </view>
</view> </view>
@@ -59,13 +61,13 @@
import storage from "@/utils/storage.js"; import storage from "@/utils/storage.js";
import { getOrderDetail } from "@/api/order.js"; import { getOrderDetail } from "@/api/order.js";
import { getComplainReason, addComplain } from "@/api/after-sale.js"; import { getComplainReason, addComplain } from "@/api/after-sale.js";
import { upload } from "@/api/common.js"; import { handleUploadAfterRead } from "@/utils/uploadHelper.js";
export default { export default {
data() { data() {
return { return {
storage, storage,
action: upload, //上传图片地址 uploadFileList: [],
orderStatusList: { orderStatusMap: {
//订单状态列表 //订单状态列表
UNDELIVERED: "待发货", UNDELIVERED: "待发货",
PARTS_DELIVERED: "部分发货", PARTS_DELIVERED: "部分发货",
@@ -97,15 +99,10 @@ export default {
}, },
methods: { methods: {
/** onUploadAfterRead(event) {
* 上传完成 handleUploadAfterRead(event, this.uploadFileList, (urls) => {
*/ this.images = urls;
onUploaded(lists) {
let images = [];
lists.forEach((item) => {
images.push(item.response.result);
}); });
this.images = images;
}, },
/** /**
* 提交 * 提交

View File

@@ -2,11 +2,11 @@
<view class="wrapper"> <view class="wrapper">
<view class="tips">我的投诉信息</view> <view class="tips">我的投诉信息</view>
<u-cell-group> <u-cell-group>
<u-cell-item :arrow="false" :value="complainDetail.goodsName" title="投诉商品"></u-cell-item> <u-cell :isLink="false" :value="complainDetail.goodsName" title="投诉商品"></u-cell>
<u-cell-item :arrow="false" :value="statusData[complainDetail.complainStatus]" title="投诉状态"></u-cell-item> <u-cell :isLink="false" :value="statusData[complainDetail.complainStatus]" title="投诉状态"></u-cell>
<u-cell-item :arrow="false" :value="complainDetail.createTime" title="投诉时间"></u-cell-item> <u-cell :isLink="false" :value="complainDetail.createTime" title="投诉时间"></u-cell>
<u-cell-item :arrow="false" :value="complainDetail.complainTopic" title="投诉主题"></u-cell-item> <u-cell :isLink="false" :value="complainDetail.complainTopic" title="投诉主题"></u-cell>
<u-cell-item :arrow="false" :value="complainDetail.content" title="投诉内容"></u-cell-item> <u-cell :isLink="false" :value="complainDetail.content" title="投诉内容"></u-cell>
<view class="row" v-if="complainDetail.orderComplaintImages"> <view class="row" v-if="complainDetail.orderComplaintImages">
<u-image width="100rpx" height="100rpx" border-radius="10" style="margin: 0 10rpx" v-for="(item, index) in complainDetail.orderComplaintImages" :key="index" :src="item" <u-image width="100rpx" height="100rpx" border-radius="10" style="margin: 0 10rpx" v-for="(item, index) in complainDetail.orderComplaintImages" :key="index" :src="item"
@click="preview(complainDetail.orderComplaintImages, index)" /> @click="preview(complainDetail.orderComplaintImages, index)" />
@@ -14,8 +14,8 @@
</u-cell-group> </u-cell-group>
<view class="tips">商家申诉信息</view> <view class="tips">商家申诉信息</view>
<u-cell-group> <u-cell-group>
<u-cell-item :arrow="false" :value="complainDetail.appealTime || '暂无'" title="申诉时间"></u-cell-item> <u-cell :isLink="false" :value="complainDetail.appealTime || '暂无'" title="申诉时间"></u-cell>
<u-cell-item :arrow="false" :value="complainDetail.appealContent || '暂无'" title="申诉内容"></u-cell-item> <u-cell :isLink="false" :value="complainDetail.appealContent || '暂无'" title="申诉内容"></u-cell>
<view class="row" v-if="complainDetail.appealImagesList"> <view class="row" v-if="complainDetail.appealImagesList">
<u-image width="100rpx" height="100rpx" border-radius="10" style="margin: 0 10rpx" v-for="(item, index) in complainDetail.appealImagesList" <u-image width="100rpx" height="100rpx" border-radius="10" style="margin: 0 10rpx" v-for="(item, index) in complainDetail.appealImagesList"
@click="preview(complainDetail.appealImagesList, index)" :key="index" :src="item" /> @click="preview(complainDetail.appealImagesList, index)" :key="index" :src="item" />
@@ -46,7 +46,7 @@
</div> </div>
<view class="tips">平台仲裁</view> <view class="tips">平台仲裁</view>
<u-cell-group> <u-cell-group>
<u-cell-item :arrow="false" title="仲裁意见" :value="complainDetail.arbitrationResult || '暂无'"></u-cell-item> <u-cell :isLink="false" title="仲裁意见" :value="complainDetail.arbitrationResult || '暂无'"></u-cell>
</u-cell-group> </u-cell-group>
</view> </view>
</template> </template>

View File

@@ -15,7 +15,7 @@
<view class="goods-info" @click="handleToGoods(item)"> <view class="goods-info" @click="handleToGoods(item)">
<view class="goods-title u-line-2">{{ item.goodsName }}</view> <view class="goods-title u-line-2">{{ item.goodsName }}</view>
<view class="goods-price"> <view class="goods-price">
{{ item.goodsPrice | unitPrice }} {{unitPrice(item.goodsPrice) }}
<!-- <span>+{{ '1' }}积分</span> --> <!-- <span>+{{ '1' }}积分</span> -->
</view> </view>
</view> </view>
@@ -36,7 +36,7 @@
<u-empty v-if="empty" :style="{'marginTop':complaionDetail.total == 0 ? '200rpx':'0rpx'}" class="empty" style="" text="暂无投诉列表" mode="list"></u-empty> <u-empty v-if="empty" :style="{'marginTop':complaionDetail.total == 0 ? '200rpx':'0rpx'}" class="empty" style="" text="暂无投诉列表" mode="list"></u-empty>
<u-modal show-cancel-button @confirm="handleClearConfirm" v-model="show" :content="content"></u-modal> <u-modal show-cancel-button @confirm="handleClearConfirm" v-model:show="show" :content="content"></u-modal>
</view> </view>
</template> </template>

View File

@@ -3,7 +3,7 @@
<view class="logistics-detail"> <view class="logistics-detail">
<view class="card"> <view class="card">
<div v-if="logisticsList && logisticsList.length>0"> <div v-if="logisticsList && logisticsList.length>0">
<ul class="express-log" v-for="(packageItem, packageIndex) in logisticsList" :key="packageIndex" v-if="packageItem"> <ul class="express-log" v-for="(packageItem, packageIndex) in logisticsList" :key="packageIndex">
<div class="layui-layer-wrap"> <div class="layui-layer-wrap">
<dl> <dl>
<dt>物流公司</dt> <dt>物流公司</dt>

View File

@@ -18,7 +18,7 @@
<!-- 如果有图片则会循环显示评价的图片 --> <!-- 如果有图片则会循环显示评价的图片 -->
<view class="goods-imgs-view" v-if="comment.images != null && comment.images.length != 0"> <view class="goods-imgs-view" v-if="comment.images != null && comment.images.length != 0">
<view class="img-view" v-for="(img, imgIndex) in comment.images.split(',')" :key="imgIndex"> <view class="img-view" v-for="(img, imgIndex) in comment.images.split(',')" :key="imgIndex">
<u-image @click.native="preview(comment.images.split(','),imgIndex)" width="160rpx" height="160rpx" :src="img"></u-image> <u-image @click="preview(comment.images.split(','),imgIndex)" width="160rpx" height="160rpx" :src="img"></u-image>
</view> </view>
</view> </view>
<view class="goods-name"> <view class="goods-name">

View File

@@ -7,7 +7,8 @@
</view> </view>
<swiper class="swiper-box" :current="current" @change="changeSwiper" duration="500"> <swiper class="swiper-box" :current="current" @change="changeSwiper" duration="500">
<swiper-item v-for="(item, listIndex) in list" :key="listIndex"> <swiper-item v-for="(item, listIndex) in list" :key="listIndex">
<scroll-view scroll-y style="height: 100%" @scrolltolower="renderData(listIndex)"> <scroll-view scroll-y :enable-flex="true" class="evaluate-scroll" @scrolltolower="renderData(listIndex)">
<view class="evaluate-scroll-inner">
<u-empty text="尚无需要评价的商品" mode="list" v-if="orderList.length == 0"></u-empty> <u-empty text="尚无需要评价的商品" mode="list" v-if="orderList.length == 0"></u-empty>
<view class="seller-view" v-for="(order, index) in orderList" :key="index"> <view class="seller-view" v-for="(order, index) in orderList" :key="index">
<!-- 店铺名称 --> <!-- 店铺名称 -->
@@ -38,7 +39,7 @@
<view class="goods-imgs-view" v-if="order.image"> <view class="goods-imgs-view" v-if="order.image">
<view class="img-view" v-if="order.image" v-for="(img, imgIndex) in order.image.split(',')" <view class="img-view" v-if="order.image" v-for="(img, imgIndex) in order.image.split(',')"
:key="imgIndex"> :key="imgIndex">
<u-image v-if="order.image" @click.native=" <u-image v-if="order.image" @click="
preview(order.image.split(','), imgIndex) preview(order.image.split(','), imgIndex)
" width="160rpx" height="160rpx" :src="img"></u-image> " width="160rpx" height="160rpx" :src="img"></u-image>
</view> </view>
@@ -62,6 +63,7 @@
</view> </view>
<uni-load-more :status="params.loadStatus"></uni-load-more> <uni-load-more :status="params.loadStatus"></uni-load-more>
</view>
</scroll-view> </scroll-view>
</swiper-item> </swiper-item>
</swiper> </swiper>
@@ -327,6 +329,16 @@ page {
height: calc(100% - 88rpx); height: calc(100% - 88rpx);
} }
.evaluate-scroll {
height: 100%;
display: flex;
flex-direction: column;
}
.evaluate-scroll-inner {
width: 100%;
}
.goods-specs { .goods-specs {
margin-bottom: 10rpx; margin-bottom: 10rpx;
color: #cccccc; color: #cccccc;

View File

@@ -51,8 +51,8 @@
</view> </view>
<view class="info-evaluate-view"> <view class="info-evaluate-view">
<view class="images-view"> <view class="images-view">
<u-upload :header=" { accessToken: storage.getAccessToken() }" :action="action" width="150" <u-upload :file-list="uploadFileList" :auto-upload="false" width="150"
@on-uploaded="onUploaded" :max-count="5" :show-progress="false"></u-upload> @afterRead="onUploadAfterRead" :max-count="5"></u-upload>
</view> </view>
</view> </view>
</view> </view>
@@ -62,20 +62,20 @@
<view class="seller-rate-view"> <view class="seller-rate-view">
<view class="rate-title">描述相符</view> <view class="rate-title">描述相符</view>
<view> <view>
<u-rate count="count" gutter="20" active-color="#FFC71C" v-model="form.descriptionScore" :size="40"> <u-rate :count="5" gutter="20" active-color="#FFC71C" v-model="form.descriptionScore" :size="40">
</u-rate> </u-rate>
</view> </view>
</view> </view>
<view class="seller-rate-view"> <view class="seller-rate-view">
<view class="rate-title">服务态度</view> <view class="rate-title">服务态度</view>
<view> <view>
<u-rate count="count" gutter="20" active-color="#FFC71C" v-model="form.serviceScore" :size="40"></u-rate> <u-rate :count="5" gutter="20" active-color="#FFC71C" v-model="form.serviceScore" :size="40"></u-rate>
</view> </view>
</view> </view>
<view class="seller-rate-view"> <view class="seller-rate-view">
<view class="rate-title">物流服务</view> <view class="rate-title">物流服务</view>
<view> <view>
<u-rate count="count" gutter="20" active-color="#FFC71C" v-model="form.deliveryScore" :size="40"></u-rate> <u-rate :count="5" gutter="20" active-color="#FFC71C" v-model="form.deliveryScore" :size="40"></u-rate>
</view> </view>
</view> </view>
</view> </view>
@@ -89,7 +89,7 @@
<script> <script>
import storage from "@/utils/storage.js"; import storage from "@/utils/storage.js";
import { commentsMemberOrder } from "@/api/members.js"; import { commentsMemberOrder } from "@/api/members.js";
import { upload } from "@/api/common.js"; import { handleUploadAfterRead } from "@/utils/uploadHelper.js";
export default { export default {
data() { data() {
@@ -111,7 +111,7 @@ export default {
serviceScore: 5, //默认服务得分为5分 serviceScore: 5, //默认服务得分为5分
deliveryScore: 5, //默认物流得分为5分 deliveryScore: 5, //默认物流得分为5分
}, },
action: upload, //图片上传地址 uploadFileList: [],
}; };
}, },
onLoad(options) { onLoad(options) {
@@ -153,15 +153,10 @@ export default {
}); });
}, },
/** onUploadAfterRead(event) {
* 图片成功后回调 handleUploadAfterRead(event, this.uploadFileList, (urls) => {
*/ this.form.images = urls;
onUploaded(lists) {
let images = [];
lists.forEach((item) => {
images.push(item.response.result);
}); });
this.form.images = images;
}, },
}, },
}; };

View File

@@ -34,7 +34,7 @@
<!-- 姓名 手机号 --> <!-- 姓名 手机号 -->
<div> <div>
<span>{{ address.name }}</span> <span>{{ address.name }}</span>
<span class="mobile">{{ address.mobile | secrecyMobile }}</span> <span class="mobile">{{secrecyMobile(address.mobile) }}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -101,7 +101,7 @@
width="81rpx" width="81rpx"
height="81rpx" height="81rpx"
> >
<view slot="loading"></view> <template #loading><view></view></template>
</u-image> </u-image>
<u-image <u-image
class="head-img" class="head-img"
@@ -174,11 +174,11 @@
<p class="goods-prices"> <p class="goods-prices">
<span></span> <span></span>
<span class="goods-price">{{ <span class="goods-price">{{
$options.filters.goodsFormatPrice(val.purchasePrice)[0] goodsFormatPrice(val.purchasePrice)[0]
}}</span> }}</span>
<span <span
>.{{ >.{{
$options.filters.goodsFormatPrice(val.purchasePrice)[1] goodsFormatPrice(val.purchasePrice)[1]
}}</span }}</span
> >
</p> </p>
@@ -190,7 +190,7 @@
:span="8" :span="8"
class="tipsColor" class="tipsColor"
textAlign="right" textAlign="right"
@click.native="invoice()" @click="invoice()"
> >
<span v-if="receiptList" <span v-if="receiptList"
>{{ receiptList.receiptTitle }} - >{{ receiptList.receiptTitle }} -
@@ -214,9 +214,7 @@
@click="shippingFlag = true" @click="shippingFlag = true"
> >
{{ {{
shippingMethod.find((e) => { getShippingLabel()
return e.value == shippingText;
}).label
}} }}
</u-col> </u-col>
</u-row> </u-row>
@@ -243,7 +241,7 @@
/> />
<u-select <u-select
@confirm="confirmDistribution" @confirm="confirmDistribution"
v-model="shippingFlag" v-model:show="shippingFlag"
v-if="shippingMethod.length != 0" v-if="shippingMethod.length != 0"
:list="shippingMethod" :list="shippingMethod"
></u-select> ></u-select>
@@ -254,7 +252,7 @@
<u-col :span="9">商品合计</u-col> <u-col :span="9">商品合计</u-col>
<u-col :span="3" textAlign="right"> <u-col :span="3" textAlign="right">
<span <span
>{{ orderMessage.priceDetailDTO.goodsPrice | unitPrice }}</span >{{unitPrice(orderMessage.priceDetailDTO.goodsPrice) }}</span
> >
</u-col> </u-col>
</u-row> </u-row>
@@ -274,8 +272,7 @@
>包邮</span >包邮</span
> >
<span v-else <span v-else
>{{ >{{unitPrice(orderMessage.priceDetailDTO.freightPrice)
orderMessage.priceDetailDTO.freightPrice | unitPrice
}}</span }}</span
> >
</u-col> </u-col>
@@ -298,10 +295,10 @@
@click="GET_Discount()" @click="GET_Discount()"
> >
<span class="main-color" <span class="main-color"
>-¥{{ orderMessage.priceDetailDTO.couponPrice | unitPrice }}</span >-¥{{unitPrice(orderMessage.priceDetailDTO.couponPrice) }}</span
> >
</u-col> </u-col>
<!-- orderMessage.priceDetailDTO.couponPrice | unitPrice --> <!--unitPrice(orderMessage.priceDetailDTO.couponPrice) -->
<u-col :span="3" v-else textAlign="right" @click="GET_Discount()"> <u-col :span="3" v-else textAlign="right" @click="GET_Discount()">
{{ orderMessage.canUseCoupons.length || "0" }} 张可用 {{ orderMessage.canUseCoupons.length || "0" }} 张可用
<u-icon name="arrow-right"></u-icon> <u-icon name="arrow-right"></u-icon>
@@ -316,7 +313,7 @@
v-if="orderMessage.priceDetailDTO.couponPrice" v-if="orderMessage.priceDetailDTO.couponPrice"
> >
<span class="main-color"> <span class="main-color">
-¥{{ orderMessage.priceDetailDTO.couponPrice | unitPrice }}</span -¥{{unitPrice(orderMessage.priceDetailDTO.couponPrice) }}</span
> >
</u-col> </u-col>
<u-col :span="3" textAlign="right" v-else>0.00</u-col> <u-col :span="3" textAlign="right" v-else>0.00</u-col>
@@ -327,8 +324,7 @@
<u-col :span="6">活动优惠</u-col> <u-col :span="6">活动优惠</u-col>
<u-col :span="6" class="tr tipsColor" textAlign="right"> <u-col :span="6" class="tr tipsColor" textAlign="right">
<span v-if="orderMessage.priceDetailDTO.discountPrice" <span v-if="orderMessage.priceDetailDTO.discountPrice"
>-¥{{ >-¥{{unitPrice(orderMessage.priceDetailDTO.discountPrice)
orderMessage.priceDetailDTO.discountPrice | unitPrice
}}</span }}</span
> >
<span v-else>0.00</span> <span v-else>0.00</span>
@@ -355,21 +351,20 @@
<div v-if="!orderMessage.priceDetailDTO.payPoint" class="number"> <div v-if="!orderMessage.priceDetailDTO.payPoint" class="number">
<span>¥</span> <span>¥</span>
<span class="price">{{ <span class="price">{{
$options.filters.goodsFormatPrice( goodsFormatPrice(
orderMessage.priceDetailDTO.flowPrice orderMessage.priceDetailDTO.flowPrice
)[0] )[0]
}}</span> }}</span>
<span <span
>.{{ >.{{
$options.filters.goodsFormatPrice( goodsFormatPrice(
orderMessage.priceDetailDTO.flowPrice orderMessage.priceDetailDTO.flowPrice
)[1] )[1]
}} }}
</span> </span>
</div> </div>
<span v-else class="number" <span v-else class="number"
><span style="margin-right: 10rpx">{{ ><span style="margin-right: 10rpx">{{unitPrice(orderMessage.priceDetailDTO.payPoint)
orderMessage.priceDetailDTO.payPoint | unitPrice
}}</span }}</span
>积分</span >积分</span
> >
@@ -462,25 +457,6 @@ export default {
computed: { computed: {
...mapState(["remark"]), ...mapState(["remark"]),
}, },
filters: {
/**
* 发票收据类型
*/
receiptType(type) {
switch (type) {
case "1":
case "VATORDINARY":
case "ELECTRO":
return "电子普通发票";
case "2":
case "VATOSPECIAL":
return "增值税专用发票";
default:
return "不开发票";
}
},
},
/** /**
* 监听返回 * 监听返回
*/ */
@@ -535,6 +511,13 @@ export default {
mounted() {}, mounted() {},
methods: { methods: {
getShippingLabel() {
const item =
this.shippingMethod.find((e) => e.value === this.shippingText) ||
this.shippingWay.find((e) => e.value === this.shippingText);
return item ? item.label : "";
},
//发票回调 选择发票之后刷新购物车 //发票回调 选择发票之后刷新购物车
async callbackInvoice(val) { async callbackInvoice(val) {
this.invoiceFlag = false; this.invoiceFlag = false;
@@ -578,7 +561,7 @@ export default {
pintuanWay() { pintuanWay() {
const { memberId } = this.routerVal.parentOrder; const { memberId } = this.routerVal.parentOrder;
const userInfo = this.$options.filters.isLogin(); const userInfo = this.isLogin();
if (memberId) { if (memberId) {
this.endWay = userInfo; this.endWay = userInfo;
this.masterWay = this.routerVal.parentOrder; this.masterWay = this.routerVal.parentOrder;
@@ -768,6 +751,9 @@ export default {
}); });
}); });
this.shippingMethod = way; this.shippingMethod = way;
if (way.length && !way.some((item) => item.value === this.shippingText)) {
this.shippingText = way[0].value;
}
} }
}, },
@@ -826,7 +812,7 @@ export default {
storeId: item.storeId, storeId: item.storeId,
}; };
this.$set(this.remarkVal, index, repeatData); this.remarkVal[index] = repeatData;
}); });
this.orderMessage = res.data.result; this.orderMessage = res.data.result;

View File

@@ -8,7 +8,7 @@
<view></view> <view></view>
</view> </view>
</view> </view>
<view>{{order.receiptPrice | unitPrice('¥')}}</view> <view>{{unitPrice(order.receiptPrice, '¥')}}</view>
</view> </view>
</view> </view>
<view class="common-msg flex-center"> <view class="common-msg flex-center">
@@ -29,19 +29,19 @@
</view> </view>
</view> </view>
<u-cell-group :border="false"> <u-cell-group :border="false">
<u-cell-item title="发票类型" :border-top="false" :value="order.receiptType || '-'" :arrow="false"></u-cell-item> <u-cell title="发票类型" :border-top="false" :value="order.receiptType || '-'" :isLink="false"></u-cell>
<u-cell-item title="发票内容" :value="order.receiptContent" :arrow="false"></u-cell-item> <u-cell title="发票内容" :value="order.receiptContent" :isLink="false"></u-cell>
<u-cell-item :title="title_type + '名称'" :value="getTitleNameValue()" :arrow="false"></u-cell-item> <u-cell :title="title_type + '名称'" :value="getTitleNameValue()" :isLink="false"></u-cell>
<u-cell-item title="纳税人识别号" v-if="order.taxpayerId" :value="order.taxpayerId" :arrow="false"></u-cell-item> <u-cell title="纳税人识别号" v-if="order.taxpayerId" :value="order.taxpayerId" :isLink="false"></u-cell>
<u-cell-item title="单位地址" v-if="order.companyAddress" :value="order.companyAddress" :arrow="false"></u-cell-item> <u-cell title="单位地址" v-if="order.companyAddress" :value="order.companyAddress" :isLink="false"></u-cell>
<u-cell-item title="单位电话" v-if="order.companyPhone" :value="order.companyPhone" :arrow="false"></u-cell-item> <u-cell title="单位电话" v-if="order.companyPhone" :value="order.companyPhone" :isLink="false"></u-cell>
<u-cell-item title="开户银行" v-if="order.bankName" :value="order.bankName" :arrow="false"></u-cell-item> <u-cell title="开户银行" v-if="order.bankName" :value="order.bankName" :isLink="false"></u-cell>
<u-cell-item title="银行账号" v-if="order.bankAccount" :value="order.bankAccount" :arrow="false"></u-cell-item> <u-cell title="银行账号" v-if="order.bankAccount" :value="order.bankAccount" :isLink="false"></u-cell>
<u-cell-item title="收票人手机" :value="order.receiptPhone" :arrow="false"></u-cell-item> <u-cell title="收票人手机" :value="order.receiptPhone" :isLink="false"></u-cell>
<u-cell-item title="收票人邮箱" v-if="order.receiptEmail" :value="order.receiptEmail" :arrow="false"></u-cell-item> <u-cell title="收票人邮箱" v-if="order.receiptEmail" :value="order.receiptEmail" :isLink="false"></u-cell>
</u-cell-group> </u-cell-group>
<u-popup <u-popup
v-model="showInvoicePopup" v-model:show="showInvoicePopup"
mode="center" mode="center"
width="90%" width="90%"
border-radius="20" border-radius="20"
@@ -60,8 +60,8 @@
</view> </view>
</u-popup> </u-popup>
<!-- <u-cell-group :border="false" style="margin-top: 20rpx;"> <!-- <u-cell-group :border="false" style="margin-top: 20rpx;">
<u-cell-item title="订单状态" :border-top="false" :value="order.order_status_text" :arrow="false"></u-cell-item> <u-cell title="订单状态" :border-top="false" :value="order.order_status_text" :isLink="false"></u-cell>
<u-cell-item title="订单编号" :value="order.sn" :arrow="false"></u-cell-item> <u-cell title="订单编号" :value="order.sn" :isLink="false"></u-cell>
</u-cell-group> --> </u-cell-group> -->
<!-- <view class="show-pic" @click="preview"> <!-- <view class="show-pic" @click="preview">

View File

@@ -1,5 +1,5 @@
<template> <template>
<u-popup closeable border-radius="28" @close="close" mode="bottom" height="80%" v-model="show"> <u-popup closeable border-radius="28" @close="close" mode="bottom" height="80%" v-model:show="show">
<div class="wrapper"> <div class="wrapper">
<!-- 发票类型 --> <!-- 发票类型 -->

View File

@@ -17,7 +17,7 @@
<view class="seller-name wes" @click="navigateToStore(order)"> <view class="seller-name wes" @click="navigateToStore(order)">
<view class="name">{{ order.storeName }}</view> <view class="name">{{ order.storeName }}</view>
<view class="name" v-if="order.orderPromotionType"> <view class="name" v-if="renderOrderTag(order.orderPromotionType)">
<u-tag <u-tag
:text="renderOrderTag(order.orderPromotionType)" :text="renderOrderTag(order.orderPromotionType)"
:color="renderOrderTagColor(order.orderPromotionType)" :color="renderOrderTagColor(order.orderPromotionType)"
@@ -25,8 +25,7 @@
</view> </view>
</view> </view>
<view class="order-sn">{{ <view class="order-sn">{{orderStatusList(order.orderStatus)
order.orderStatus | orderStatusList
}}</view> }}</view>
</view> </view>
<view> <view>
@@ -34,14 +33,14 @@
<view class="goods-item-view" @click="navigateToOrderDetail(order.sn)"> <view class="goods-item-view" @click="navigateToOrderDetail(order.sn)">
<view class="goods-img" v-for="(goods, goodsIndex) in order.orderItems" <view class="goods-img" v-for="(goods, goodsIndex) in order.orderItems"
:key="goodsIndex"> :key="goodsIndex">
<u-image border-radius="6" width="100%" height="100%" <u-image border-radius="6" width="131rpx" height="131rpx" mode="aspectFill"
:src="goods.image"></u-image> :src="getOrderItemImage(goods, order, goodsIndex)"></u-image>
</view> </view>
<view class="goods-info"> <view class="goods-info">
<view v-if="order.orderItems.length <= 1" class="goods-title u-line-2"> <view v-if="order.orderItems.length <= 1" class="goods-title u-line-2">
{{ order.groupName }}</view> {{ order.groupName }}</view>
<view v-if="order.orderItems.length <= 1" class="goods-price"> <view v-if="order.orderItems.length <= 1" class="goods-price">
{{ order.flowPrice | unitPrice }} {{unitPrice(order.flowPrice) }}
</view> </view>
</view> </view>
<view v-if="order.orderItems.length <= 1" class="goods-num"> <view v-if="order.orderItems.length <= 1" class="goods-num">
@@ -54,7 +53,7 @@
<!-- 等待付款 --> <!-- 等待付款 -->
<div v-if="order.payStatus === 'PAID'">已付金额:</div> <div v-if="order.payStatus === 'PAID'">已付金额:</div>
<div v-else>应付金额:</div> <div v-else>应付金额:</div>
<div class="price">{{ order.flowPrice | unitPrice }}</div> <div class="price">{{unitPrice(order.flowPrice) }}</div>
</view> </view>
<view class="goods-btn flex flex-a-c"> <view class="goods-btn flex flex-a-c">
<!-- 全部 --> <!-- 全部 -->
@@ -87,7 +86,7 @@
</scroll-view> </scroll-view>
</swiper-item> </swiper-item>
</swiper> </swiper>
<u-popup class="cancel-popup" v-model="cancelShow" mode="bottom" length="60%"> <u-popup class="cancel-popup" v-model:show="cancelShow" mode="bottom" length="60%">
<view class="header">取消订单</view> <view class="header">取消订单</view>
<view class="body"> <view class="body">
<view class="title">取消订单后本单享有的优惠可能会一并取消是否继续</view> <view class="title">取消订单后本单享有的优惠可能会一并取消是否继续</view>
@@ -95,8 +94,8 @@
<u-radio-group v-model="reason"> <u-radio-group v-model="reason">
<view class="value"> <view class="value">
<view class="radio-view" :key="index" v-for="(item, index) in cancelList"> <view class="radio-view" :key="index" v-for="(item, index) in cancelList">
<u-radio :active-color="lightColor" label-size="25" shape="circle" :name="item.reason" <u-radio :active-color="lightColor" shape="circle" :name="item.reason"
@change="reasonChange">{{ item.reason }}</u-radio> :label="item.reason" @change="reasonChange"></u-radio>
</view> </view>
</view> </view>
</u-radio-group> </u-radio-group>
@@ -107,7 +106,7 @@
</view> </view>
</u-popup> </u-popup>
<u-toast ref="uToast" /> <u-toast ref="uToast" />
<u-modal :confirm-color="lightColor" v-model="rogShow" :show-cancel-button="true" :content="'是否确认收货?'" <u-modal :confirm-color="lightColor" v-model:show="rogShow" :show-cancel-button="true" :content="'是否确认收货?'"
@confirm="confirmRog"></u-modal> @confirm="confirmRog"></u-modal>
</view> </view>
</template> </template>
@@ -209,7 +208,7 @@
cancelShow: false, //是否显示取消 cancelShow: false, //是否显示取消
orderSn: "", //ordersn orderSn: "", //ordersn
reason: "", //取消原因 reason: "", //取消原因
cancelList: "", //取消列表 cancelList: [], //取消列表
rogShow: false, //显示是否收货 rogShow: false, //显示是否收货
}; };
}, },
@@ -234,7 +233,7 @@
// this.loadData(this.status); // this.loadData(this.status);
}, },
onShow() { onShow() {
if (this.$options.filters.tipsToLogin()) { if (this.tipsToLogin()) {
if (!this.tabCurrentIndex) { if (!this.tabCurrentIndex) {
this.initData(0); this.initData(0);
} }
@@ -286,7 +285,7 @@
renderOrderTag(orderPromotionType) { renderOrderTag(orderPromotionType) {
switch (orderPromotionType) { switch (orderPromotionType) {
case "NORMAL": case "NORMAL":
return "普通订单"; return "";
case "PINTUAN": case "PINTUAN":
return "拼团订单"; return "拼团订单";
break; break;
@@ -321,6 +320,14 @@
return ""; return "";
} }
}, },
getOrderItemImage(goods, order, index) {
let image = goods.image;
if (!image && order.groupImages) {
const images = String(order.groupImages).split(",");
image = images[index] || images[0];
}
return this.parseGoodsImageUrl(image);
},
/** /**
* 取消订单 * 取消订单
*/ */
@@ -588,6 +595,7 @@
.list-scroll-content { .list-scroll-content {
height: 100%; height: 100%;
padding: 16rpx 20rpx 0;
} }
.navbar { .navbar {
@@ -633,11 +641,11 @@
.seller-view { .seller-view {
border-radius: 20rpx; border-radius: 20rpx;
background-color: #fff; background-color: #fff;
margin: 20rpx 0rpx; margin: 16rpx 0;
.seller-info { .seller-info {
height: 70rpx; padding: 24rpx 20rpx 16rpx;
padding: 0 20rpx; align-items: center;
.seller-name { .seller-name {
flex: 10; flex: 10;

View File

@@ -2,9 +2,9 @@
<view> <view>
<!-- 订单状态 --> <!-- 订单状态 -->
<div class="info-view order-view"> <div class="info-view order-view">
<div class="order-status" v-if="orderStatusList[order.orderStatus]"> <div class="order-status" v-if="orderStatusMap[order.orderStatus]">
{{ orderStatusList[order.orderStatus].title }} {{ orderStatusMap[order.orderStatus].title }}
<div>{{ orderStatusList[order.orderStatus].value }}</div> <div>{{ orderStatusMap[order.orderStatus].value }}</div>
</div> </div>
</div> </div>
@@ -35,7 +35,7 @@
<view> <view>
<view class="address-title"> <view class="address-title">
<span>{{ order.consigneeName || "未填写昵称" }}</span> <span>{{ order.consigneeName || "未填写昵称" }}</span>
<span>{{ order.consigneeMobile || "未填写手机号" | secrecyMobile }}</span> <span>{{ order.consigneeMobile ? secrecyMobile(order.consigneeMobile) : '未填写手机号' }}</span>
</view> </view>
<view class="address">地址{{ order.consigneeAddressPath }} <view class="address">地址{{ order.consigneeAddressPath }}
{{ order.consigneeDetail }}</view> {{ order.consigneeDetail }}</view>
@@ -67,7 +67,7 @@
<view class="seller-info u-flex u-row-between"> <view class="seller-info u-flex u-row-between">
<view class="seller-name" @click="goToShopPage(order)"> <view class="seller-name" @click="goToShopPage(order)">
<view class="name">{{ order.storeName }}</view> <view class="name">{{ order.storeName }}</view>
<view class="status" v-if="orderStatusList[order.orderStatus]"> {{ orderStatusList[order.orderStatus].title <view class="status" v-if="orderStatusMap[order.orderStatus]"> {{ orderStatusMap[order.orderStatus].title
}}</view> }}</view>
</view> </view>
<view class="order-sn"></view> <view class="order-sn"></view>
@@ -81,10 +81,10 @@
<view class="goods-info" @click="gotoGoodsDetail(sku)"> <view class="goods-info" @click="gotoGoodsDetail(sku)">
<view class="goods-title u-line-2">{{ sku.goodsName }}</view> <view class="goods-title u-line-2">{{ sku.goodsName }}</view>
<view class="goods-price"> <view class="goods-price">
{{ sku.goodsPrice | unitPrice }} {{unitPrice(sku.goodsPrice) }}
<!-- <span v-if="sku.point">+{{ sku.point }}积分</span> --> <!-- <span v-if="sku.point">+{{ sku.point }}积分</span> -->
<span style="font-size: 24rpx;margin-left: 14rpx;color: #ff9900;" v-if="sku.isRefund && sku.isRefund !== 'NO_REFUND'"> <span style="font-size: 24rpx;margin-left: 14rpx;color: #ff9900;" v-if="sku.isRefund && sku.isRefund !== 'NO_REFUND'">
{{refundPriceList(sku.isRefund)}} ({{ sku.refundPrice | unitPrice("") }}) {{refundPriceList(sku.isRefund)}} ({{unitPrice(sku.refundPrice, "") }})
</span> </span>
</view> </view>
</view> </view>
@@ -106,19 +106,19 @@
<view> <view>
<view class="order-info-view"> <view class="order-info-view">
<view class="title">商品总价</view> <view class="title">商品总价</view>
<view class="value">{{ order.goodsPrice | unitPrice }}</view> <view class="value">{{unitPrice(order.goodsPrice) }}</view>
</view> </view>
<view class="order-info-view" v-if="order.freightPrice"> <view class="order-info-view" v-if="order.freightPrice">
<view class="title">运费</view> <view class="title">运费</view>
<view class="value">{{ order.freightPrice | unitPrice }}</view> <view class="value">{{unitPrice(order.freightPrice) }}</view>
</view> </view>
<view class="order-info-view" v-if="order.priceDetailDTO"> <view class="order-info-view" v-if="order.priceDetailDTO">
<view class="title">优惠券</view> <view class="title">优惠券</view>
<view class="value main-color">-{{ order.priceDetailDTO.couponPrice | unitPrice }}</view> <view class="value main-color">-{{unitPrice(order.priceDetailDTO.couponPrice) }}</view>
</view> </view>
<view class="order-info-view"> <view class="order-info-view">
<view class="title">活动优惠</view> <view class="title">活动优惠</view>
<view class="value main-color">-{{ order.discountPrice | unitPrice }}</view> <view class="value main-color">-{{unitPrice(order.discountPrice) }}</view>
</view> </view>
<!-- <view class="order-info-view" v-if="order.use_point"> <!-- <view class="order-info-view" v-if="order.use_point">
<view class="title">使用积分</view> <view class="title">使用积分</view>
@@ -148,9 +148,9 @@
<view style="width: 100%"> <view style="width: 100%">
<view class="order-info-view"> <view class="order-info-view">
<view class="title">订单编号</view> <view class="title">订单编号</view>
<view class="value"> <view class="value order-sn-value">
{{ order.sn }} <text class="order-sn-text">{{ order.sn }}</text>
<u-tag class="copy" text="复制" type="info" size="mini" @click="onCopy(order.sn)" /> <u-tag class="copy" text="复制" type="info" mode="plain" size="mini" @click="onCopy(order.sn)" />
</view> </view>
</view> </view>
<view class="order-info-view"> <view class="order-info-view">
@@ -203,7 +203,7 @@
<text v-if="order.payStatus === 'PAID'">已付金额</text> <text v-if="order.payStatus === 'PAID'">已付金额</text>
<text v-else>应付金额</text> <text v-else>应付金额</text>
<text class="price" v-if="order.priceDetailDTO">{{ order.priceDetailDTO.flowPrice | unitPrice }}</text> <text class="price" v-if="order.priceDetailDTO">{{unitPrice(order.priceDetailDTO.flowPrice) }}</text>
</view> </view>
<view> <view>
<!-- 全部 --> <!-- 全部 -->
@@ -221,7 +221,7 @@
</view> </view>
</view> </view>
</view> </view>
<u-popup class="cancel-popup" v-model="cancelShow" mode="bottom" length="60%"> <u-popup class="cancel-popup" v-model:show="cancelShow" mode="bottom" length="60%">
<view class="header">取消订单</view> <view class="header">取消订单</view>
<view class="body"> <view class="body">
<view class="title">取消订单后本单享有的优惠可能会一并取消是否继续</view> <view class="title">取消订单后本单享有的优惠可能会一并取消是否继续</view>
@@ -229,8 +229,8 @@
<u-radio-group v-model="reason"> <u-radio-group v-model="reason">
<view class="value"> <view class="value">
<view class="radio-view" v-for="(item, index) in cancelList" :key="index"> <view class="radio-view" v-for="(item, index) in cancelList" :key="index">
<u-radio :active-color="lightColor" label-size="25" shape="circle" :name="item.reason" <u-radio :active-color="lightColor" shape="circle" :name="item.reason"
@change="reasonChange">{{ item.reason }}</u-radio> :label="item.reason" @change="reasonChange"></u-radio>
</view> </view>
</view> </view>
</u-radio-group> </u-radio-group>
@@ -241,7 +241,7 @@
</view> </view>
</u-popup> </u-popup>
<u-toast ref="uToast" /> <u-toast ref="uToast" />
<u-modal v-model="rogShow" :show-cancel-button="true" :content="'是否确认收货?'" :confirm-color="lightColor" <u-modal v-model:show="rogShow" :show-cancel-button="true" :content="'是否确认收货?'" :confirm-color="lightColor"
@confirm="confirmRog"></u-modal> @confirm="confirmRog"></u-modal>
<!-- 分享 --> <!-- 分享 -->
@@ -268,7 +268,7 @@ export default {
lightColor: this.$lightColor, lightColor: this.$lightColor,
logisticsList: "", //物流信息 logisticsList: "", //物流信息
shareFlag: false, //拼团分享开关 shareFlag: false, //拼团分享开关
orderStatusList: { orderStatusMap: {
UNPAID: { UNPAID: {
title: "未付款", title: "未付款",
value: "商品暂未付款", value: "商品暂未付款",
@@ -351,11 +351,11 @@ export default {
} }
}, },
callPhone(){ callPhone(){
this.$options.filters.callPhone(this.order.storeAddressMobile ) this.callPhone(this.order.storeAddressMobile )
}, },
//联系客服 //联系客服
contact(storeId){ contact(storeId){
this.$options.filters.talkIm(storeId) this.talkIm(storeId)
}, },
goToShopPage(val) { goToShopPage(val) {
uni.navigateTo({ uni.navigateTo({
@@ -413,7 +413,7 @@ export default {
}); });
}, },
onCopy(sn) { onCopy(sn) {
this.$options.filters.setClipboard(sn) setClipboard(sn)
}, },
/** /**
@@ -701,11 +701,20 @@ page,
flex:10; flex:10;
} }
.order-sn-value {
display: flex;
flex-direction: row;
align-items: center;
flex-wrap: wrap;
}
.order-sn-text {
word-break: break-all;
}
.copy { .copy {
font-size: 20rpx; margin-left: 16rpx;
color: #333; flex-shrink: 0;
border: 1px solid #dddddd;
margin-left: 30rpx;
} }
} }

View File

@@ -5,7 +5,7 @@
<view class="u-skeleton" v-if="!articleData"> <view class="u-skeleton" v-if="!articleData">
<u-empty text="文章暂无内容" mode="list"></u-empty> <u-empty text="文章暂无内容" mode="list"></u-empty>
</view> </view>
<u-parse v-else :html="articleData"></u-parse> <u-parse v-else :content="articleData"></u-parse>
</view> </view>
</view> </view>
</template> </template>

View File

@@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<u-navbar :border-bottom="false"></u-navbar> <u-navbar :border="false"></u-navbar>
<step1 v-if="current == 1" :companyData="companyData" @callback="next()" /> <step1 v-if="current == 1" :companyData="companyData" @callback="next()" />
<step2 v-if="current == 2" :companyData="companyData" @callback="next()" /> <step2 v-if="current == 2" :companyData="companyData" @callback="next()" />
<step3 <step3

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="wrapper"> <div class="wrapper">
<u-navbar :border-bottom="false"></u-navbar> <u-navbar :border="false"></u-navbar>
<div> <div>
<div class="title">店铺入驻</div> <div class="title">店铺入驻</div>
<div class="step-list"> <div class="step-list">
@@ -57,7 +57,7 @@ export default {
}; };
}, },
onShow() { onShow() {
if(this.$options.filters.tipsToLogin()){ if(this.tipsToLogin()){
this.init(); this.init();
} }
}, },

View File

@@ -116,12 +116,10 @@
<div> <div>
<u-upload <u-upload
:file-list="licencePhotoFileList" :file-list="licencePhotoFileList"
:header="{ accessToken: storage.getAccessToken() }" :auto-upload="false"
:action="action"
width="200" width="200"
@on-uploaded="onUploaded($event, 'licencePhoto')" @afterRead="onUploadAfterRead($event, 'licencePhoto', 'licencePhotoFileList')"
:max-count="1" :max-count="1"
:show-progress="false"
></u-upload> ></u-upload>
<div class="tips"> <div class="tips">
@@ -155,21 +153,17 @@
<div> <div>
<u-upload <u-upload
:file-list="legalPhotoFileList" :file-list="legalPhotoFileList"
:header="{ accessToken: storage.getAccessToken() }" :auto-upload="false"
:action="action"
width="200" width="200"
@on-uploaded="onUploaded($event, 'legalPhoto')" @afterRead="onUploadAfterRead($event, 'legalPhoto', 'legalPhotoFileList')"
:max-count="1" :max-count="1"
:show-progress="false"
></u-upload> ></u-upload>
<u-upload <u-upload
:file-list="legalPhotoFileList" :file-list="legalPhotoBackFileList"
:header="{ accessToken: storage.getAccessToken() }" :auto-upload="false"
:action="action"
width="200" width="200"
@on-uploaded="onUploaded($event, 'legalPhoto')" @afterRead="onUploadAfterRead($event, 'legalPhoto', 'legalPhotoBackFileList')"
:max-count="1" :max-count="1"
:show-progress="false"
></u-upload> ></u-upload>
</div> </div>
</u-form-item> </u-form-item>
@@ -192,20 +186,20 @@
import { applyFirst } from "@/api/entry"; import { applyFirst } from "@/api/entry";
import city from "@/components/m-city/m-city.vue"; import city from "@/components/m-city/m-city.vue";
import storage from "@/utils/storage.js"; import storage from "@/utils/storage.js";
import { upload } from "@/api/common.js"; import { handleUploadAfterRead, getUploadedUrls } from "@/utils/uploadHelper.js";
import * as RegExp from "@/utils/RegExp.js"; import * as RegExp from "@/utils/RegExp.js";
export default { export default {
components: { "m-city": city }, components: { "m-city": city },
data() { data() {
return { return {
storage, storage,
action: upload, //图片上传数据
defaultInputStyle: { defaultInputStyle: {
background: "#f7f7f7", background: "#f7f7f7",
padding: "0 20rpx", padding: "0 20rpx",
"border-radius": "10rpx", "border-radius": "10rpx",
}, },
legalPhotoFileList: [], legalPhotoFileList: [],
legalPhotoBackFileList: [],
licencePhotoFileList: [], licencePhotoFileList: [],
form: { form: {
companyName: "", companyName: "",
@@ -316,7 +310,7 @@ export default {
companyData: { companyData: {
handler(val) { handler(val) {
if (val) { if (val) {
this.$set(this, "form", val); this["form"] = val;
// 给图片赋值 // 给图片赋值
const judgeDeepPhoto = ["legalPhoto", "licencePhoto"]; const judgeDeepPhoto = ["legalPhoto", "licencePhoto"];
judgeDeepPhoto.forEach((key) => { judgeDeepPhoto.forEach((key) => {
@@ -332,16 +326,20 @@ export default {
}, },
}, },
methods: { methods: {
// 图片上传 onUploadAfterRead(event, key, fileListKey) {
onUploaded(lists, key) { if (!Array.isArray(this.form[key])) {
let images = [];
if(!this.form[key]){
this.form[key] = []; this.form[key] = [];
} }
lists.forEach((item) => { handleUploadAfterRead(event, this[fileListKey], () => {
images.push(item.response.result); if (key === "legalPhoto") {
this.form[key] = [
...getUploadedUrls(this.legalPhotoFileList),
...getUploadedUrls(this.legalPhotoBackFileList),
];
} else {
this.form[key] = getUploadedUrls(this[fileListKey]);
}
}); });
this.form[key].push(images[0]);
}, },
getPickerParentValue(e) { getPickerParentValue(e) {
this.form.companyAddressIdPath = []; this.form.companyAddressIdPath = [];

View File

@@ -89,7 +89,7 @@ export default {
watch: { watch: {
companyData: { companyData: {
handler(val) { handler(val) {
this.$set(this, "form", val); this["form"] = val;
console.log(this.form) console.log(this.form)
}, },
deep: true, deep: true,

View File

@@ -19,12 +19,10 @@
<div> <div>
<u-upload <u-upload
:file-list="storeLogoFileList" :file-list="storeLogoFileList"
:header="{ accessToken: storage.getAccessToken() }" :auto-upload="false"
:action="action"
width="200" width="200"
@on-uploaded="onUploaded($event, 'storeLogo')" @afterRead="onUploadAfterRead($event, 'storeLogo', 'storeLogoFileList')"
:max-count="1" :max-count="1"
:show-progress="false"
></u-upload> ></u-upload>
</div> </div>
</u-form-item> </u-form-item>
@@ -101,7 +99,7 @@
</m-city> </m-city>
<u-select <u-select
v-model="enableCategory" v-model:show="enableCategory"
@confirm="confirmCategory" @confirm="confirmCategory"
:list="categoryList" :list="categoryList"
></u-select> ></u-select>
@@ -115,7 +113,7 @@ import { applyThird } from "@/api/entry";
import { getCategoryList } from "@/api/goods"; import { getCategoryList } from "@/api/goods";
import city from "@/components/m-city/m-city.vue"; import city from "@/components/m-city/m-city.vue";
import storage from "@/utils/storage.js"; import storage from "@/utils/storage.js";
import { upload } from "@/api/common.js"; import { handleUploadAfterRead } from "@/utils/uploadHelper.js";
import uniMap from "@/components/uniMap"; import uniMap from "@/components/uniMap";
import permision from "@/js_sdk/wa-permission/permission.js"; import permision from "@/js_sdk/wa-permission/permission.js";
export default { export default {
@@ -124,7 +122,6 @@ export default {
return { return {
storage, storage,
mapFlag: false, mapFlag: false,
action: upload, //图片上传数据
defaultInputStyle: { defaultInputStyle: {
background: "#f7f7f7", background: "#f7f7f7",
padding: "0 20rpx", padding: "0 20rpx",
@@ -171,7 +168,7 @@ export default {
watch: { watch: {
companyData: { companyData: {
handler(val) { handler(val) {
this.$set(this, "form", val); this["form"] = val;
// 给图片赋值 // 给图片赋值
const judgeDeepPhoto = ["storeLogo"]; const judgeDeepPhoto = ["storeLogo"];
@@ -282,13 +279,10 @@ export default {
} }
} }
}, },
// 图片上传 onUploadAfterRead(event, key, fileListKey) {
onUploaded(lists, key) { handleUploadAfterRead(event, this[fileListKey], (urls) => {
let images = []; this.form[key] = urls;
lists.forEach((item) => {
images.push(item.response.result);
}); });
this.form[key] = images;
}, },
getPickerParentValue(e) { getPickerParentValue(e) {
this.form.storeAddressIdPath = []; this.form.storeAddressIdPath = [];
@@ -303,7 +297,7 @@ export default {
} else { } else {
name += item.localName + ","; name += item.localName + ",";
} }
this.$set(this.form,'storeAddressPath',name) this.form['storeAddressPath'] = name
} }
}); });

View File

@@ -1,12 +1,12 @@
<template> <template>
<div class="wrapper"> <div class="wrapper">
<div v-if="!wechatLogin"> <div v-if="!wechatLogin">
<u-navbar :is-back="showBack" :border-bottom="false"></u-navbar> <u-navbar :auto-back="showBack" :border="false"></u-navbar>
<div> <div>
<div class="title">{{ loginTitleWay[current].title }}</div> <div class="title">{{ loginTitleWay[current].title }}</div>
<div :class="current == 1 ? 'desc-light' : 'desc'"> <div :class="current == 1 ? 'desc-light' : 'desc'">
{{ loginTitleWay[current].desc {{ loginTitleWay[current].desc
}}<span v-if="current == 1">{{ mobile | secrecyMobile }}</span> }}<span v-if="current == 1">{{secrecyMobile(mobile) }}</span>
</div> </div>
</div> </div>
<!-- 手机号 --> <!-- 手机号 -->
@@ -24,9 +24,9 @@
boxNormalColor="#D8D8D8" cursorColor="#D8D8D8" /> boxNormalColor="#D8D8D8" cursorColor="#D8D8D8" />
<div class="fetch-btn"> <div class="fetch-btn">
<u-verification-code change-text="验证码已发送x" end-text="重新获取验证码" unique-key="page-login" <u-code change-text="验证码已发送x" end-text="重新获取验证码" unique-key="page-login"
:seconds="seconds" @end="end" @start="start" ref="uCode" @change="codeChange"> :seconds="seconds" @end="end" @start="start" ref="uCode" @change="codeChange">
</u-verification-code> </u-code>
<span @tap="fetchCode" :style="{ color: codeColor }"> <span @tap="fetchCode" :style="{ color: codeColor }">
{{ tips }}</span> {{ tips }}</span>
</div> </div>
@@ -46,9 +46,7 @@
</div> </div>
<div class="flex" v-show="current != 1"> <div class="flex" v-show="current != 1">
<u-checkbox-group :icon-size="24" width="45rpx"> <u-checkbox usedAlone :icon-size="24" shape="circle" v-model:checked="enablePrivacy" active-color="#FF5E00"></u-checkbox>
<u-checkbox shape="circle" v-model="enablePrivacy" active-color="#FF5E00"></u-checkbox>
</u-checkbox-group>
<div class="tips"> <div class="tips">
未注册的手机号验证后将自动创建用户账号登录即代表您已同意<span @click="navigateToPrivacy('PRIVACY_POLICY')">隐私协议</span> 未注册的手机号验证后将自动创建用户账号登录即代表您已同意<span @click="navigateToPrivacy('PRIVACY_POLICY')">隐私协议</span>
<span @click="navigateToPrivacy('USER_AGREEMENT')"> <span @click="navigateToPrivacy('USER_AGREEMENT')">
@@ -63,14 +61,15 @@
<!-- 循环出当前可使用的第三方登录模式 --> <!-- 循环出当前可使用的第三方登录模式 -->
<div class="flex login-list"> <div class="flex login-list">
<div v-if="item.code" :style="{ background: item.color }" class="login-item" <template v-for="(item, index) in loginList" :key="index">
v-for="(item, index) in loginList" :key="index"> <div v-if="item.code" :style="{ background: item.color }" class="login-item">
<u-icon v-if="item.title != 'APPLE'" color="#fff" size="42" :name="item.icon" <u-icon v-if="item.title != 'APPLE'" color="#fff" size="42" :name="item.icon"
@click="navigateLogin(item)"> @click="navigateLogin(item)">
</u-icon> </u-icon>
<u-image v-else src="/static/appleidButton@2x.png" :lazy-load="false" @click="navigateLogin(item)" <u-image v-else src="/static/appleidButton@2x.png" :lazy-load="false" @click="navigateLogin(item)"
width="80" height="80" /> width="80" height="80" />
</div> </div>
</template>
</div> </div>
<myVerification v-if="codeFlag" @send="verification" class="verification" ref="verification" <myVerification v-if="codeFlag" @send="verification" class="verification" ref="verification"
business="LOGIN" /> business="LOGIN" />

View File

@@ -46,7 +46,7 @@ export default {
}, },
}, },
onShow() { onShow() {
this.$options.filters.forceLogin(); this.forceLogin();
scannerCodeLogin({ token: this.token }).then((res) => { scannerCodeLogin({ token: this.token }).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
let code = res.data.result; let code = res.data.result;

View File

@@ -1,6 +1,6 @@
<template> <template>
<view class="container"> <view class="container">
<u-navbar :custom-back="back" title="公众网页登录"></u-navbar> <u-navbar :auto-back="false" @leftClick="back" title="公众网页登录"></u-navbar>
<view class="wx-auth-container"> <view class="wx-auth-container">
<div class="box"> <div class="box">
<view class="logo-info"> <view class="logo-info">

View File

@@ -1,7 +1,7 @@
<template> <template>
<view class="container"> <view class="container">
<u-navbar :custom-back="back" title="小程序登录"></u-navbar> <u-navbar :auto-back="false" :fixed="true" :placeholder="true" @leftClick="back" title="小程序登录"></u-navbar>
<u-modal v-model="phoneAuthPopup" :mask-close-able="true" :title="projectName+'商城'" <u-modal v-model:show="phoneAuthPopup" :mask-close-able="true" :title="projectName+'商城'"
:show-confirm-button="false"> :show-confirm-button="false">
<div class="tips"> <div class="tips">
为了更好地用户体验需要您授权手机号 为了更好地用户体验需要您授权手机号
@@ -24,14 +24,23 @@
class="btn-auth">登录</button> class="btn-auth">登录</button>
<div @click="backToHome" class="btn-callback">暂不登录</div> <div @click="backToHome" class="btn-callback">暂不登录</div>
</view> </view>
<div class="privacy"> <view class="privacy">
<u-checkbox shape="circle" v-model="checked" :active-color="lightColor"> <view class="privacy-row">
<div class="flex"> <u-checkbox
阅读并同意<navigator class="light-color" url="/pages/mine/help/tips?type=PRIVACY_POLICY">隐私协议</navigator> class="privacy-check"
<navigator class="light-color" url="/pages/mine/help/tips?type=USER_AGREEMENT">用户协议</navigator> usedAlone
</div> shape="circle"
</u-checkbox> v-model:checked="checked"
</div> :active-color="lightColor"
:icon-size="18"
></u-checkbox>
<view class="privacy-text">
阅读并同意
<navigator class="privacy-link" url="/pages/mine/help/tips?type=PRIVACY_POLICY">隐私协议</navigator>
<navigator class="privacy-link" url="/pages/mine/help/tips?type=USER_AGREEMENT">用户协议</navigator>
</view>
</view>
</view>
</div> </div>
</view> </view>
</view> </view>
@@ -237,18 +246,14 @@
.wx-auth-container { .wx-auth-container {
width: 100%; width: 100%;
margin-top: 20%; padding-top: 120rpx;
} }
.logo-info { .logo-info {
display: flex; display: flex;
flex-wrap: nowrap;
justify-content: flex-start;
flex-direction: row;
align-items: flex-start;
padding: 20rpx;
flex-direction: column; flex-direction: column;
align-items: flex-start;
padding: 0 20rpx;
font-weight: bold; font-weight: bold;
} }
@@ -375,9 +380,38 @@
} }
} }
.privacy{ .privacy {
text-align: center; margin-top: 32rpx;
margin-top: 20rpx;
width: 100%; width: 100%;
display: flex;
justify-content: center;
}
.privacy-row {
display: flex;
align-items: flex-start;
width: 92%;
}
.privacy-check {
flex-shrink: 0;
margin-top: 4rpx;
::v-deep .u-checkbox {
margin: 0;
}
}
.privacy-text {
flex: 1;
margin-left: 12rpx;
font-size: 24rpx;
line-height: 36rpx;
color: #666;
}
.privacy-link {
display: inline;
color: $light-color;
} }
</style> </style>

View File

@@ -22,7 +22,7 @@
<view class="section-info"> <view class="section-info">
<image class="portrait" :src="item.memberProfile || userImage" mode="aspectFit"></image> <image class="portrait" :src="item.memberProfile || userImage" mode="aspectFit"></image>
<view class="star-content"> <view class="star-content">
<text class="name">{{ item.memberName | noPassByName }}</text> <text class="name">{{noPassByName(item.memberName) }}</text>
<text class="time">{{ item.createTime }}</text> <text class="time">{{ item.createTime }}</text>
</view> </view>
<view class="stars"> <view class="stars">
@@ -351,9 +351,7 @@ page {
flex-wrap: wrap; flex-wrap: wrap;
/* height: 140rpx; */ /* height: 140rpx; */
overflow: hidden; overflow: hidden;
> * { gap: 16rpx;
margin-right: 16rpx;
}
} }
.bot { .bot {

View File

@@ -4,7 +4,6 @@
</view> </view>
</template> </template>
<script> <script>
var chat = requirePlugin('myPlugin')
export default { export default {
data() { data() {
return { return {
@@ -15,6 +14,19 @@
}, },
onLoad (e) { onLoad (e) {
// 腾讯云智服客服插件需在 manifest.json 的 mp-weixin.plugins 中注册后方可使用,
// 未注册时 requirePlugin 会抛出 "has not registered any plugins",此处做容错处理。
let chat
try {
chat = requirePlugin('myPlugin')
} catch (err) {
uni.showToast({
title: '客服功能暂未配置',
icon: 'none',
duration: 2000
})
return
}
const params = JSON.parse((decodeURIComponent(e.params))) const params = JSON.parse((decodeURIComponent(e.params)))
chat.init({ chat.init({
sign: params.mpSign, //必传,公司渠道唯一标识,腾讯云智服后台系统创建「小程序插件」渠道后,在「渠道管理」获取 sign: params.mpSign, //必传,公司渠道唯一标识,腾讯云智服后台系统创建「小程序插件」渠道后,在「渠道管理」获取

View File

@@ -17,7 +17,7 @@
:y="navbarListY" placement="top-start" /> :y="navbarListY" placement="top-start" />
<view class="index"> <view class="index">
<!-- topBar --> <!-- topBar -->
<u-navbar :background="navbar" :is-back="false" :class="headerFlag ? 'header' : 'header bg-none scroll-hide'"> <u-navbar :bg-color="navbar.background" :auto-back="false" @leftClick="back" :class="headerFlag ? 'header' : 'header bg-none scroll-hide'">
<div class="headerRow"> <div class="headerRow">
<div class="backs"> <div class="backs">
<u-icon @click="back()" name="arrow-left" class="icon-back"></u-icon> <u-icon @click="back()" name="arrow-left" class="icon-back"></u-icon>
@@ -35,8 +35,8 @@
</div> </div>
</u-navbar> </u-navbar>
<u-navbar :border-bottom="false" v-show="!headerFlag" class="header-only-back" :background="navbarOnlyBack" <u-navbar :border="false" v-show="!headerFlag" class="header-only-back" :bg-color="navbarOnlyBack.background"
:is-back="false"> :auto-back="false" @leftClick="back">
<div> <div>
<div class="bg-back"> <div class="bg-back">
<u-icon size="40" @click="back()" name="arrow-left" class="icon-back"></u-icon> <u-icon size="40" @click="back()" name="arrow-left" class="icon-back"></u-icon>
@@ -87,21 +87,21 @@
<span> <span>
<span v-if="wholesaleList.length"> <span v-if="wholesaleList.length">
<span>¥</span><span class="price">{{ <span>¥</span><span class="price">{{
$options.filters.goodsFormatPrice(wholesaleList[wholesaleList.length - 1].price)[0] goodsFormatPrice(wholesaleList[wholesaleList.length - 1].price)[0]
}}</span>.{{ }}</span>.{{
$options.filters.goodsFormatPrice(wholesaleList[wholesaleList.length - 1].price)[1] goodsFormatPrice(wholesaleList[wholesaleList.length - 1].price)[1]
}} }}
~ ~
<span>¥</span><span class="price">{{ <span>¥</span><span class="price">{{
$options.filters.goodsFormatPrice(wholesaleList[0].price)[0] goodsFormatPrice(wholesaleList[0].price)[0]
}}</span>.{{ }}</span>.{{
$options.filters.goodsFormatPrice(wholesaleList[0].price)[1] goodsFormatPrice(wholesaleList[0].price)[1]
}} }}
</span> </span>
<span v-else> <span v-else>
<span>¥</span><span class="price">{{ <span>¥</span><span class="price">{{
$options.filters.goodsFormatPrice(goodsDetail.price)[0] goodsFormatPrice(goodsDetail.price)[0]
}}</span>.{{ $options.filters.goodsFormatPrice(goodsDetail.price)[1] }} }}</span>.{{ goodsFormatPrice(goodsDetail.price)[1] }}
</span> </span>
</span> </span>
</view> </view>
@@ -169,8 +169,7 @@
<view class="card-flex" @click="shutMask(3)"> <view class="card-flex" @click="shutMask(3)">
<view class="card-title"> 送至</view> <view class="card-title"> 送至</view>
<view class="card-content"> <view class="card-content">
<span v-if="delivery">{{ <span v-if="delivery">{{clearStrComma(delivery.consigneeAddressPath)
delivery.consigneeAddressPath | clearStrComma
}}</span> }}</span>
<span v-else>暂无地址信息</span> <span v-else>暂无地址信息</span>
</view> </view>
@@ -199,15 +198,15 @@
<view class="page-bottom mp-iphonex-bottom" id="pageBottom"> <view class="page-bottom mp-iphonex-bottom" id="pageBottom">
<view class="icon-btn"> <view class="icon-btn">
<view class="icon-btn-item" @click="navigateToStore(goodsDetail.storeId)"> <view class="icon-btn-item" @click="navigateToStore(goodsDetail.storeId)">
<u-icon size="34" class="red" name="home-fill"></u-icon> <u-icon size="22" class="red" name="home-fill"></u-icon>
<view class="red icon-btn-name">店铺</view> <view class="red icon-btn-name">店铺</view>
</view> </view>
<view class="icon-btn-item" @click="linkMsgDetail()"> <view class="icon-btn-item" @click="linkMsgDetail()">
<u-icon size="34" name="kefu-ermai"></u-icon> <u-icon size="22" name="kefu-ermai"></u-icon>
<view class="icon-btn-name">客服</view> <view class="icon-btn-name">客服</view>
</view> </view>
<view class="icon-btn-item" @click="reluchToCart()"> <view class="icon-btn-item" @click="reluchToCart()">
<u-icon size="34" name="storeping-cart"></u-icon> <u-icon size="22" name="shopping-cart"></u-icon>
<view class="icon-btn-name">购物车</view> <view class="icon-btn-name">购物车</view>
<view v-if="nums && nums > 0" class="num-icon">{{ nums }}</view> <view v-if="nums && nums > 0" class="num-icon">{{ nums }}</view>
</view> </view>
@@ -227,11 +226,11 @@
<!-- 拼团结算 --> <!-- 拼团结算 -->
<view class="detail-btn" v-else-if="isGroup"> <view class="detail-btn" v-else-if="isGroup">
<view class="to-store-car pt-buy to-store-btn" @click="shutMask(4, 'buy')"> <view class="to-store-car pt-buy to-store-btn" @click="shutMask(4, 'buy')">
<view>{{ goodsDetail.price | unitPrice }}</view> <view>{{unitPrice(goodsDetail.price) }}</view>
<view>单独购买</view> <view>单独购买</view>
</view> </view>
<view class="to-buy pt-buy to-store-btn" @click="toAssembleBuyNow"> <view class="to-buy pt-buy to-store-btn" @click="toAssembleBuyNow">
<view>{{ goodsDetail.promotionPrice | unitPrice }}</view> <view>{{unitPrice(goodsDetail.promotionPrice) }}</view>
<view>拼团价格</view> <view>拼团价格</view>
</view> </view>
</view> </view>
@@ -239,7 +238,7 @@
<!-- 规格-模态层弹窗 --> <!-- 规格-模态层弹窗 -->
<view class="spec"> <view class="spec">
<!-- 促销弹窗 --> <!-- 促销弹窗 -->
<u-popup v-model="promotionShow" :height="setup.height" :mode="setup.mode" :border-radius="setup.radius" <u-popup v-model:show="promotionShow" :height="setup.height" :mode="setup.mode" :border-radius="setup.radius"
@close="promotionShow = false" :mask-close-able="setup.close" closeable> @close="promotionShow = false" :mask-close-able="setup.close" closeable>
<view class="header-title">优惠</view> <view class="header-title">优惠</view>
<view class="cuxiao"> <view class="cuxiao">
@@ -567,7 +566,7 @@ export default {
// }, 500); // }, 500);
} }
// 这里是绑定分销员 // 这里是绑定分销员
if ((distributionId || this.$store.state.distributionId) && this.$options.filters.isLogin("auth")) { if ((distributionId || this.$store.state.distributionId) && this.isLogin("auth")) {
let disResult = await getGoodsDistribution(distributionId); let disResult = await getGoodsDistribution(distributionId);
if (!disResult.data.success || disResult.statusCode == 403) { if (!disResult.data.success || disResult.statusCode == 403) {
this.$store.state.distributionId = distributionId; this.$store.state.distributionId = distributionId;
@@ -575,6 +574,10 @@ export default {
} }
/**商品信息以及规格信息存储 */ /**商品信息以及规格信息存储 */
this.goodsDetail = response.data.result.data; this.goodsDetail = response.data.result.data;
// 清洗缩略图,避免损坏地址(如 1?x-oss-process=style/400X400触发渲染层 500
if (this.goodsDetail) {
this.goodsDetail.thumbnail = this.parseGoodsImageUrl(this.goodsDetail.thumbnail);
}
this.wholesaleList = response.data.result.wholesaleList; this.wholesaleList = response.data.result.wholesaleList;
this.goodsSpec = response.data.result.specs; this.goodsSpec = response.data.result.specs;
this.PromotionList = response.data.result.promotionMap; this.PromotionList = response.data.result.promotionMap;
@@ -593,8 +596,12 @@ export default {
this.isSeckill = true this.isSeckill = true
} }
}); });
// 轮播图 // 轮播图:兼容上传 JSON 与纯 URL解析后去重
this.imgList = this.goodsDetail.goodsGalleryList.filter(i => i.indexOf("\"url\":") === -1 && i.indexOf("\"status\":") === -1); const gallery = (this.goodsDetail.goodsGalleryList || [])
.map((i) => this.parseGoodsImageUrl(i, ""))
.filter(Boolean);
this.imgList = [...new Set(gallery)];
// 获取店铺基本信息 // 获取店铺基本信息
this.getStoreBaseInfoFun(this.goodsDetail.storeId); this.getStoreBaseInfoFun(this.goodsDetail.storeId);
@@ -609,7 +616,7 @@ export default {
this.getOtherLikeGoods(); this.getOtherLikeGoods();
// 获取商品是否已被收藏 如果未登录不获取 // 获取商品是否已被收藏 如果未登录不获取
if (this.$options.filters.isLogin("auth")) { if (this.isLogin("auth")) {
this.getGoodsCollectionFun(this.goodsDetail.id); this.getGoodsCollectionFun(this.goodsDetail.id);
} }
// 获取IM 需要的话使用 // 获取IM 需要的话使用
@@ -625,7 +632,7 @@ export default {
linkMsgDetail () { linkMsgDetail () {
// lili 基础客服 // lili 基础客服
this.$options.filters.talkIm(this.goodsDetail.storeId, this.routerVal.goodsId, this.routerVal.id) this.talkIm(this.goodsDetail.storeId, this.routerVal.goodsId, this.routerVal.id)
// uni.navigateTo({ // uni.navigateTo({
// url: `/pages/mine/im/index?userId=${this.goodsDetail.storeId}&goodsid=${this.routerVal.goodsId}&skuid=${this.routerVal.id}` // url: `/pages/mine/im/index?userId=${this.goodsDetail.storeId}&goodsid=${this.routerVal.goodsId}&skuid=${this.routerVal.id}`
// }); // });
@@ -741,6 +748,9 @@ export default {
API_store.getStoreBaseInfo(id).then((res) => { API_store.getStoreBaseInfo(id).then((res) => {
if (res.data.success) { if (res.data.success) {
this.storeDetail = res.data.result; this.storeDetail = res.data.result;
if (this.storeDetail) {
this.storeDetail.storeLogo = this.parseGoodsImageUrl(this.storeDetail.storeLogo);
}
} }
}); });
}, },
@@ -781,7 +791,10 @@ export default {
storeId: this.goodsDetail.storeId, storeId: this.goodsDetail.storeId,
recommend: true, recommend: true,
}).then((res) => { }).then((res) => {
this.recommendList = res.data.result.records; this.recommendList = (res.data.result.records || []).map((item) => ({
...item,
thumbnail: this.parseGoodsImageUrl(item.thumbnail),
}));
}); });
}, },
@@ -796,7 +809,10 @@ export default {
currentGoodsId: this.goodsDetail.id, currentGoodsId: this.goodsDetail.id,
keyword: this.goodsDetail.name keyword: this.goodsDetail.name
}).then((res) => { }).then((res) => {
this.likeGoodsList = res.data.result.records; this.likeGoodsList = (res.data.result.records || []).map((item) => ({
...item,
thumbnail: this.parseGoodsImageUrl(item.thumbnail),
}));
}); });
}, },

View File

@@ -12,7 +12,7 @@
<view class="section-info"> <view class="section-info">
<u-avatar mode="circle" size="60" class="portrait" :src="commItem.memberProfile"></u-avatar> <u-avatar mode="circle" size="60" class="portrait" :src="commItem.memberProfile"></u-avatar>
<view class="star-con"> <view class="star-con">
<text class="name">{{ commItem.memberName | noPassByName }}</text> <text class="name">{{noPassByName(commItem.memberName) }}</text>
</view> </view>
</view> </view>
<view class="section-contant"> <view class="section-contant">
@@ -38,7 +38,7 @@
</view> </view>
<!-- 查看全部评价按钮 --> <!-- 查看全部评价按钮 -->
<view v-if="commDetail && commDetail.records && commDetail.records.length > 0" class="eva-section-btn" @click="toComment(goodsDetail.goodsId, goodsDetail.grade)"> <view v-if="commDetail && commDetail.records && commDetail.records.length > 0" class="eva-section-btn" @click="toComment(goodsDetail.goodsId, goodsDetail.grade)">
<text>查看全部评价</text> <text class="btn-text">查看全部评价</text>
</view> </view>
</view> </view>
</template> </template>
@@ -131,7 +131,7 @@ export default {
margin: 2px 0 20rpx 0; margin: 2px 0 20rpx 0;
background: #fff; background: #fff;
text { .btn-text {
width: 200rpx; width: 200rpx;
height: 50rpx; height: 50rpx;
font-size: 22rpx; font-size: 22rpx;
@@ -207,7 +207,7 @@ export default {
margin-right: 20rpx; margin-right: 20rpx;
} }
> view > text { > .star-con > .name {
margin-left: 6rpx; margin-left: 6rpx;
} }
} }

View File

@@ -15,9 +15,7 @@
<u-parse <u-parse
class="vhtml" class="vhtml"
:lazy-load="true" :lazy-load="true"
:use-cache="true" :content="res.mobileIntro"
:show-with-animation="true"
:html="res.mobileIntro"
:tag-style="style" :tag-style="style"
></u-parse> ></u-parse>
</view> </view>
@@ -57,7 +55,7 @@ export default {
return { return {
goodsDetail: "", goodsDetail: "",
style: { style: {
img:"display:block" img:"display:block;width:100%"
} }
}; };
}, },
@@ -116,15 +114,6 @@ export default {
width: 100%; width: 100%;
} }
.vhtml {
::v-deep img {
display: block !important;
}
}
::v-deep img {
width: 100%;
}
.goods-detail-box { .goods-detail-box {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;

View File

@@ -2,7 +2,7 @@
<!-- 轮播图 --> <!-- 轮播图 -->
<view class="carousel"> <view class="carousel">
<swiper circular="true" duration="400" @change="swiperChange"> <swiper class="goods-swiper" circular="true" duration="400" @change="swiperChange">
<swiper-item v-if='video'> <swiper-item v-if='video'>
<!-- #ifndef APP-PLUS --> <!-- #ifndef APP-PLUS -->
<video class="video" show-mute-btn style="width:100%; height:100%;" muted autoplay :src='video' loop <video class="video" show-mute-btn style="width:100%; height:100%;" muted autoplay :src='video' loop
@@ -20,9 +20,7 @@
<swiper-item class="swiper-item" v-for="(item, index) in res" :key="index"> <swiper-item class="swiper-item" v-for="(item, index) in res" :key="index">
<view class="image-wrapper"> <view class="image-wrapper">
<u-image :src="item" mode="aspectFit" class="loaded" width="100%" height="100%"> <image class="swiper-img" :src="item" mode="aspectFit"></image>
<u-loading slot="loading"></u-loading>
</u-image>
</view> </view>
</swiper-item> </swiper-item>
</swiper> </swiper>
@@ -63,7 +61,7 @@ export default {
height: 750rpx; height: 750rpx;
position: relative; position: relative;
swiper { .goods-swiper {
height: 100%; height: 100%;
} }
@@ -72,17 +70,17 @@ export default {
height: 100%; height: 100%;
} }
.swiper-img {
width: 100%;
height: 100%;
}
.swiper-item { .swiper-item {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-content: center; align-content: center;
height: 750rpx; height: 750rpx;
overflow: hidden; overflow: hidden;
image {
width: 100%;
height: 100%;
}
} }
position: relative; position: relative;
@@ -104,7 +102,7 @@ export default {
} }
} }
::v-deep .image-wrapper image { ::v-deep .image-wrapper .u-image__image {
opacity: 1 !important; opacity: 1 !important;
} }

View File

@@ -1,5 +1,5 @@
<template> <template>
<u-popup class="popup" v-model="addressFlag" :height="setup.height" :mode="setup.mode" :border-radius="setup.radius" @close="closeAddress()" closeable> <u-popup class="popup" :show="addressFlag" :height="setup.height" :mode="setup.mode" :border-radius="setup.radius" @close="closeAddress()" closeable>
<view class="header-title">选择地址</view> <view class="header-title">选择地址</view>
<view class="view-box" v-if="addressDetail"> <view class="view-box" v-if="addressDetail">
<view class="view-item" v-for="(item, index) in addressDetail" :key="index" @click="clickAddress(item)"> <view class="view-item" v-for="(item, index) in addressDetail" :key="index" @click="clickAddress(item)">
@@ -8,7 +8,7 @@
<u-icon v-if="item.isDefault" :class="{ active: item.isDefault }" name="checkmark" size="12"></u-icon> <u-icon v-if="item.isDefault" :class="{ active: item.isDefault }" name="checkmark" size="12"></u-icon>
</view> </view>
</view> </view>
<view class="view-box-dress" :class="{ 'box-dress-blod': item.isDefault }">{{ item.consigneeAddressPath | clearStrComma }}</view> <view class="view-box-dress" :class="{ 'box-dress-blod': item.isDefault }">{{clearStrComma(item.consigneeAddressPath) }}</view>
</view> </view>
</view> </view>
<view class="view-box" v-else> <view class="view-box" v-else>
@@ -46,21 +46,17 @@ export default {
], ],
}; };
}, },
filters: {}, props: ["goodsId", "addressFlag"],
watch: {},
mounted() { mounted() {
this.addressFlag = false; if (this.isLogin("auth")) {
if( this.$options.filters.isLogin("auth") ){ this.getShippingAddress();
this.getShippingAddress() } else {
}
else{
uni.navigateTo({ uni.navigateTo({
url: 'pages/passport/login' url: "/pages/passport/login",
}); });
} }
}, },
props: ["goodsId", "addressFlag"],
methods: { methods: {
/**关闭地址 */ /**关闭地址 */
@@ -70,7 +66,6 @@ export default {
}, },
getpicker() { getpicker() {
// this.$refs.cityPicker.show();
uni.navigateTo({ uni.navigateTo({
url: "/pages/mine/address/add", url: "/pages/mine/address/add",
}); });
@@ -79,7 +74,7 @@ export default {
/**获取地址 */ /**获取地址 */
getShippingAddress() { getShippingAddress() {
if (this.$options.filters.isLogin("auth")) { if (this.isLogin("auth")) {
API_Address.getAddressList(1, 50).then((res) => { API_Address.getAddressList(1, 50).then((res) => {
if (res.data.success) { if (res.data.success) {
this.addressDetail = res.data.result.records; this.addressDetail = res.data.result.records;
@@ -91,10 +86,6 @@ export default {
this.checked = addr[0]; this.checked = addr[0];
this.$emit("deliveryData", this.checked); this.$emit("deliveryData", this.checked);
} }
// addr[0] ? "" : (addr = res.data);
// /**获取默认地址是否有货 */
// this.clickAddress(addr[0]);
} }
}); });
} }

View File

@@ -5,7 +5,7 @@
<view class="group-item" v-for="(order, index) in assembleOrder" :key="index"> <view class="group-item" v-for="(order, index) in assembleOrder" :key="index">
<view class="group-item-user"> <view class="group-item-user">
<u-image shape="circle" width="40px" height="40px" :src="order.face || userImage"></u-image> <u-image shape="circle" width="40px" height="40px" :src="order.face || userImage"></u-image>
<span class="group-item-name">{{ order.nickName | noPassByName }}</span> <span class="group-item-name">{{noPassByName(order.nickName) }}</span>
</view> </view>
<view> <view>
<span class="group-item-name">还差{{ order.toBeGroupedNum }}人成团</span> <span class="group-item-name">还差{{ order.toBeGroupedNum }}人成团</span>

Some files were not shown because too many files have changed in this diff Show More