Compare commits

..

No commits in common. "master" and "hotfixbug" have entirely different histories.

97 changed files with 12434 additions and 19060 deletions

1089
App.vue

File diff suppressed because it is too large Load Diff

View File

@ -9,14 +9,6 @@
// +----------------------------------------------------------------------
import request from "@/utils/request.js";
/**
* 退款订单
* @param numType
*/
export function refundListNew(data) {
return request.get("refund/list", data);
}
/**
* 校验支付密码是否正确
* @param numType

View File

@ -28,11 +28,6 @@ export function getProductParmas(id, data) {
noAuth: true
});
}
export function getUnimpInfo() {
return request.get('intention/publish');
}
/**
* 获取店铺推荐商品
* @param int id
@ -305,19 +300,6 @@ export function getStoreCategory(id, data) {
noAuth: true
});
}
/**
* 新获取商品分类
* @param {Object} id 商铺 id
* @param {Object} data
*/
export function getProductCategoryList(data) {
return request.get("store/product/category/index", data, {
noAuth: true
});
}
/**
* 关注商铺
* @param {Object} type_id 商铺 id
@ -572,17 +554,6 @@ export function getParmasValue(id) {
noAuth: true
});
}
/**
* 获取参数值列表
* @param int id
*
*/
export function getIntention(uid) {
return request.get(`intention/info/${uid}`);
}
/**
* 到货通知
*
@ -684,12 +655,4 @@ export function getVillageInfo(data) {
return requestb.get(`shop_call/getVillageCompany`, data, {
noAuth: true
});
}
/*
获取店铺资质
*/
export function consultApi(data) {
return request.post(`service/consult`, data)
}

View File

@ -13,9 +13,9 @@ import Cache from '@/utils/cache';
* 获取版本信息
*/
export function Appversion(data) {
return request.get(`app/version`, data, {
noAuth: true
});
return request.get(`app/version`, data, {
noAuth: true
});
}
/**
* 获取用户信息
@ -117,17 +117,6 @@ export function registerForget(data) {
noAuth: true
});
}
/**
* 一键登录
*/
export function phonelogin(data) {
return request.post("auth/phonelogin", data, {
noAuth: true
});
}
/**
* 获取用户中心菜单
*
@ -268,14 +257,7 @@ export function extractCash(data) {
* 申请提现
*/
export function getAdminApplyAPI(merId, data) {
return request.get(`admin/${merId}/apply`, data);
}
/**
* 新商户
*/
export function isNewMer(uid, mer_id, data) {
return request.post(`auth/guide/${uid}/${mer_id}`, data);
return request.get(`admin/${merId}/apply`, data);
}
/**
* 提现银行/提现最低金额

View File

@ -1,11 +1,9 @@
<template>
<view :style="viewColor">
<view class="product-window"
:class="(attr.cartAttr === true ? 'on' : '') + ' ' + (iSbnt || destri?'join':'') + ' ' + (isPresell ?'presell-window':'product-window')">
<view class="product-window" :class="(attr.cartAttr === true ? 'on' : '') + ' ' + (iSbnt || destri?'join':'') + ' ' + (isPresell ?'presell-window':'product-window')">
<view class="textpic acea-row row-between-wrapper">
<view class="pictrue">
<image :src="(attr.productSelect&&attr.productSelect.image) ? attr.productSelect.image : ''"
@click="loookImg"></image>
<image :src="(attr.productSelect&&attr.productSelect.image) ? attr.productSelect.image : ''" @click="loookImg"></image>
</view>
<view class="text">
<view class="line1">
@ -15,8 +13,7 @@
<view>
预售价
<text class="num">{{ attr.productSelect.price }}</text>
<text v-if="presell_type === 2">定金<text
class="num">{{ attr.productSelect.down_price }}</text></text>
<text v-if="presell_type === 2">定金¥<text class="num">{{ attr.productSelect.down_price }}</text></text>
</view>
<text class="stock" v-if='isShow'>库存: {{ attr.productSelect.stock }}</text>
<text class='stock' v-if="limitNum">限量: {{attr.productSelect.quota_show}}</text>
@ -25,12 +22,11 @@
<view class="acea-row row-middle">
<view class="acea-row row-middle">
<text></text><text class="num">{{ attr.productSelect.price }}</text>
<view v-if="attr.productSelect && attr.productSelect.svip_price"
class="acea-row row-middle">
<!-- <text class='vip-money'>{{attr.productSelect.svip_price}}</text>
<view v-if="attr.productSelect && attr.productSelect.svip_price" class="acea-row row-middle">
<text class='vip-money'>{{attr.productSelect.svip_price}}</text>
<view class="vipImg">
<image :src="`${domain}/static/images/svip.png`"></image>
</view> -->
</view>
</view>
</view>
</view>
@ -45,9 +41,9 @@
<view class="productWinList">
<view class="item" v-for="(item, indexw) in attr.productAttr" :key="indexw">
<view class="title">{{ item.attr_name }}</view>
<view class="listn acea-row row-middle">
<view class="itemn" :class="item.index === itemn.attr ? 'on' : ''"
v-for="(itemn, indexn) in item.attr_value" @click="tapAttr(indexw, indexn)" :key="indexn">
<view class="listn acea-row row-middle">
<view class="itemn" :class="item.index === itemn.attr ? 'on' : ''" v-for="(itemn, indexn) in item.attr_value"
@click="tapAttr(indexw, indexn)" :key="indexn">
{{ itemn.attr }}
</view>
</view>
@ -71,12 +67,8 @@
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import {
mapGetters
} from "vuex";
import {
HTTP_REQUEST_URL
} from '@/config/app';
import { mapGetters } from "vuex";
import { HTTP_REQUEST_URL } from '@/config/app';
export default {
computed: mapGetters(['viewColor']),
props: {
@ -122,10 +114,11 @@
domain: HTTP_REQUEST_URL,
}
},
mounted() {},
mounted(){
},
methods: {
//
loookImg() {
loookImg(){
let self = this
let arr = [self.attr.productSelect.image ? self.attr.productSelect.image : self.image]
uni.previewImage({
@ -179,89 +172,72 @@
padding-bottom: calc(140rpx + env(safe-area-inset-bottom)); /// IOS>11.2/
transform: translate3d(0, 100%, 0);
transition: all .3s cubic-bezier(.25, .5, .5, .9);
&.presell-window {
padding-bottom: 200rpx;
}
}
.product-window.on {
transform: translate3d(0, 0, 0);
}
.product-window.join {
padding-bottom: 30rpx;
}
.product-window .textpic {
padding: 0 80rpx 0 30rpx;
margin-top: 29rpx;
position: relative;
}
.product-window .textpic .pictrue {
width: 150rpx;
height: 150rpx;
}
.product-window .textpic .pictrue image {
width: 100%;
height: 100%;
border-radius: 10rpx;
}
.product-window .textpic .text {
width: 460rpx;
font-size: 32rpx;
color: #202020;
}
.product-window .textpic .text .money {
font-size: 24rpx;
margin-top: 40rpx;
color: var(--view-priceColor);
}
.product-window .textpic .text .money .num {
font-size: 36rpx;
}
.product-window .textpic .text .money .stock {
color: #999;
margin-left: 18rpx;
}
.vip-money {
color: #282828;
font-size: 22rpx;
margin-left: 6rpx;
}
.vipImg {
width: 65rpx;
height: 28rpx;
margin-left: 4rpx;
image {
width: 100%;
height: 100%;
display: block;
}
}
.product-window .textpic .text .presell_price {
color: #FF7F00;
.num {
display: inline-block;
margin-right: 20rpx;
}
.stock {
margin-left: 0;
}
}
.product-window .textpic .iconfont {
position: absolute;
right: 30rpx;
@ -269,27 +245,22 @@
font-size: 35rpx;
color: #8a8a8a;
}
.product-window .productWinList {
max-height: 395rpx;
overflow: auto;
margin-top: 36rpx;
}
.product-window .productWinList .item~.item {
margin-top: 36rpx;
}
.product-window .productWinList .item .title {
font-size: 30rpx;
color: #999;
padding: 0 30rpx;
}
.product-window .productWinList .item .listn {
padding: 0 30rpx 0 16rpx;
}
.product-window .productWinList .item .listn .itemn {
border: 1px solid #bbb;
font-size: 26rpx;
@ -298,13 +269,11 @@
border-radius: 6rpx;
margin: 14rpx 0 0 14rpx;
}
.product-window .productWinList .item .listn .itemn.on {
color: #fff;
background-color: var(--view-theme);
border-color: var(--view-theme);
}
.product-window .cart {
margin-top: 36rpx;
padding: 0 30rpx;
@ -317,17 +286,14 @@
-ms-flex-pack: justify;
justify-content: space-between;
}
.product-window .cart .title {
font-size: 30rpx;
color: #999;
line-height: 54rpx;
}
.product-window .cart .carnum {
height: 54rpx;
}
.product-window .cart .carnum view {
border: 1px solid #a4a4a4;
width: 84rpx;
@ -337,34 +303,28 @@
color: #a4a4a4;
font-size: 45rpx;
}
.product-window .cart .carnum .reduce {
border-right: 0;
border-radius: 6rpx 0 0 6rpx;
line-height: 48rpx;
}
.product-window .cart .carnum .reduce.on {
border-color: #e3e3e3;
color: #dedede;
}
.product-window .cart .carnum .plus {
border-left: 0;
border-radius: 0 6rpx 6rpx 0;
line-height: 46rpx;
}
.product-window .cart .carnum .plus.on {
border-color: #e3e3e3;
color: #dedede;
}
.product-window .cart .carnum .num {
color: #282828;
font-size: 28rpx;
}
.product-window .joinBnt {
font-size: 30rpx;
width: 620rpx;
@ -374,15 +334,13 @@
line-height: 86rpx;
color: #fff;
margin: 100rpx auto 0 auto;
&.b-color {
&.b-color{
background-color: var(--view-theme);
}
}
.product-window .joinBnt.on {
background-color: #bbb;
color: #fff;
background-image: none;
}
</style>
</style>

View File

@ -3,15 +3,12 @@
<view class="address-window" :class="address.address==true?'on':''">
<view class='title'>选择地址<text class='iconfont icon-guanbi' @tap='close'></text></view>
<scroll-view scroll-y="true" class='list'>
<view class='item acea-row row-between-wrapper' :class='active==index?"t-color":""'
v-for="(item,index) in addressList" @tap='tapAddress(index,item.address_id)' :key='index'>
<view class='item acea-row row-between-wrapper' :class='active==index?"t-color":""' v-for="(item,index) in addressList"
@tap='tapAddress(index,item.address_id)' :key='index'>
<text class='iconfont icon-ditu' :class='active==index?"t-color":""'></text>
<view class='address'>
<view class='name' :class='active==index?"t-color":""'>{{item.real_name}}<text
class='phone'>{{item.phone}}</text></view>
<view class='line1'>
{{item.province}}{{item.city}}{{item.district}}{{item.street || ''}}{{item.detail}}
</view>
<view class='name' :class='active==index?"t-color":""'>{{item.real_name}}<text class='phone'>{{item.phone}}</text></view>
<view class='line1'>{{item.province}}{{item.city}}{{item.district}}{{item.street || ''}}{{item.detail}}</view>
</view>
<text class='iconfont icon-complete' :class='active==index?"t-color":""'></text>
</view>
@ -37,15 +34,9 @@
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import {
getAddressList
} from '@/api/user.js';
import {
mapGetters
} from "vuex";
import {
HTTP_REQUEST_URL
} from '@/config/app';
import { getAddressList } from '@/api/user.js';
import { mapGetters } from "vuex";
import { HTTP_REQUEST_URL } from '@/config/app';
export default {
props: {
pagesUrl: {
@ -96,7 +87,7 @@
let that = this;
getAddressList({
page: 1,
limit: 100
limit: 5
}).then(res => {
let addressList = res.data.list;
//
@ -123,11 +114,9 @@
transform: translate3d(0, 100%, 0);
transition: all .3s cubic-bezier(.25, .5, .5, .9);
}
.address-window.on {
transform: translate3d(0, 0, 0);
}
.address-window .title {
font-size: 32rpx;
font-weight: bold;
@ -136,18 +125,15 @@
line-height: 123rpx;
position: relative;
}
.address-window .title .iconfont {
position: absolute;
right: 30rpx;
color: #8a8a8a;
font-size: 35rpx;
}
.address-window .list {
.address-window .list{
max-height: 650rpx;
}
.address-window .list .item {
margin-left: 30rpx;
padding-right: 30rpx;
@ -156,32 +142,26 @@
font-size: 25rpx;
color: #333;
}
.address-window .list .item .iconfont {
font-size: 37rpx;
color: #2c2c2c;
}
.address-window .list .item .iconfont.icon-complete {
font-size: 30rpx;
color: #fff;
}
.address-window .list .item .address {
width: 560rpx;
}
.address-window .list .item .address .name {
font-size: 28rpx;
font-weight: bold;
color: #282828;
margin-bottom: 4rpx;
}
.address-window .list .item .address .name .phone {
margin-left: 18rpx;
}
.address-window .addressBnt {
font-size: 30rpx;
font-weight: bold;
@ -194,22 +174,17 @@
margin: 85rpx auto;
background-color: var(--view-theme);
}
.address-window .pictrue {
text-align: center;
}
.address-window .pictrue image,
.address-window .pictrue uni-image {
.address-window .pictrue image,.address-window .pictrue uni-image {
width: 414rpx;
height: 305rpx;
}
.address-window .pictrue view {
.address-window .pictrue view{
color: #999;
}
.t-color {
color: var(--view-theme) !important;
color: var(--view-theme)!important;
}
</style>
</style>

View File

@ -3,7 +3,8 @@
<view v-if="newData.status && newData.status.status" style="height: 100rpx;"></view>
<view class="foot" v-if="newData.status && newData.status.status">
<view class="page-footer" id="target" :style="{'background-color':newData.bgColor.color[0].item}">
<view class="foot-item" v-for="(item,index) in newData.menuList" :key="index" @click="goRouter(item)">
<view class="foot-item" v-for="(item,index) in newData.menuList" :key="index"
@click="goRouter(item)">
<block v-if="item.link == activeRouter">
<image :src="item.imgList[0]"></image>
<view class="txt" :style="{color:newData.activeTxtColor.color[0].item}">{{item.name}}
@ -29,7 +30,7 @@
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
export default {
export default{
props: {
newData: {
type: Object,
@ -40,15 +41,15 @@
default: '',
}
},
data() {
data(){
return {
}
},
mounted() {
},
methods: {
methods:{
goRouter(item) {
var pages = getCurrentPages();
var page = (pages[pages.length - 1]).$page.fullPath;
@ -64,6 +65,7 @@
},
}
}
</script>
<style lang="scss" scoped>
@ -83,11 +85,9 @@
box-shadow: 0px 0px 17rpx 1rpx rgba(206, 206, 206, 0.32);
padding-bottom: constant(safe-area-inset-bottom); /// IOS<11.2/
padding-bottom: env(safe-area-inset-bottom); /// IOS>11.2/
&.filter {
&.filter{
filter: blur(2rpx);
}
.foot-item {
display: flex;
width: max-content;
@ -95,7 +95,6 @@
justify-content: center;
flex-direction: column;
position: relative;
.count-num {
position: absolute;
display: flex;
@ -112,16 +111,14 @@
padding: 4rpx;
}
}
.foot-item image {
height: 50rpx;
width: 50rpx;
text-align: center;
margin: 0 auto;
}
.foot-item .txt {
font-size: 24rpx;
}
}
</style>
</style>

View File

@ -1,63 +1,56 @@
<template>
<view class="easy-loadimage" :id="uid">
<image class="origin-img" :src="imageSrc" mode="aspectFill" v-if="loadImg&&!isLoadError" v-show="showImg"
:class="{'no-transition':!openTransition,'show-transition':showTransition&&openTransition}"
@load="handleImgLoad" @error="handleImgError">
</image>
<view class="loadfail-img" v-else-if="isLoadError"
:style="{ 'background-image': `url(${domain}/static/easy-loadimage/loadfail.png)`}"></view>
<view :class="['loading-img','spin-circle',loadingMode]" v-show="!showImg&&!isLoadError"
:style="{ 'background-image': `url(${domain}/static/easy-loadimage/loading.gif)`}"></view>
</view>
<view class="easy-loadimage" :id="uid">
<image class="origin-img" :src="imageSrc" mode="aspectFill" v-if="loadImg&&!isLoadError" v-show="showImg"
:class="{'no-transition':!openTransition,'show-transition':showTransition&&openTransition}"
@load="handleImgLoad" @error="handleImgError">
</image>
<view class="loadfail-img" v-else-if="isLoadError" :style="{ 'background-image': `url(${domain}/static/images/loadfail.png)`}"></view>
<view :class="['loading-img','spin-circle',loadingMode]" v-show="!showImg&&!isLoadError" :style="{ 'background-image': `url(${domain}/static/images/loading.gif)`}"></view>
</view>
</template>
<script>
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEBCRMEB
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import {
throttle
} from '@/libs/uniApi';
import {
HTTP_REQUEST_URL
} from '@/config/app';
// id
function generateUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
let r = Math.random() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
})
}
export default {
props: {
imageSrc: {
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEBCRMEB
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import { throttle } from '@/libs/uniApi';
import { HTTP_REQUEST_URL } from '@/config/app';
// id
function generateUUID() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        let r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
        return v.toString(16);
    })
}
export default{
props:{
imageSrc:{
type: String,
},
mode: {
mode:{
type: String,
},
loadingMode: {
loadingMode:{
type: String,
default: 'looming-gray'
default:'looming-gray'
},
openTransition: {
openTransition:{
type: Boolean,
default: true,
default:true,
},
viewHeight: {
type: Number,
default () {
return uni.getSystemInfoSync().windowHeight;
viewHeight:{
type:Number,
default() {
return uni.getSystemInfoSync().windowHeight;
}
}
},
data() {
},
data(){
const that = this;
return {
domain: HTTP_REQUEST_URL,
@ -72,7 +65,7 @@
if (that.loadImg || that.isLoadError) return;
const id = that.uid
const query = uni.createSelectorQuery().in(that);
let t = 0;
let t = 0;
query.select('#' + id).boundingClientRect(data => {
if (!data) return;
if (data.top - that.viewHeight < 0) {
@ -82,15 +75,15 @@
}).exec()
}, 200)
}
},
methods: {
},
methods:{
init() {
this.$nextTick(this.onScroll)
},
handleBorderLoad() {
handleBorderLoad(){
this.borderLoaded = 1;
},
handleBorderError() {
handleBorderError(){
this.borderLoaded = 2;
},
handleImgLoad(e) {
@ -105,107 +98,88 @@
onScroll() {
this.scrollFn();
},
},
mounted() {
this.init()
uni.$on('scroll', this.scrollFn);
this.onScroll();
},
},
mounted() {
this.init()
uni.$on('scroll', this.scrollFn);
this.onScroll();
},
beforeDestroy() {
uni.$off('scroll', this.scrollFn);
}
}
}
</script>
<style scoped>
/* 官方优化图片tips */
image {
will-change: transform
}
/* 渐变过渡效果处理 */
image.origin-img {
width: 100%;
height: 100%;
opacity: 0.3;
max-height: 360rpx;
}
image.origin-img.show-transition {
transition: opacity .5s;
opacity: 1;
}
image.origin-img.no-transition {
opacity: 1;
}
/* 加载失败、加载中的占位图样式控制 */
.loadfail-img {
height: 100%;
background-repeat: no-repeat;
background-size: 50%;
background-position: center;
}
.loading-img {
height: 100%;
background-position: center;
}
/* 转圈 */
.spin-circle {
background-repeat: no-repeat;
background-size: 60%;
}
/* 动态灰色若隐若现 */
.looming-gray {
animation: looming-gray 1s infinite linear;
background-color: #e3e3e3;
}
@keyframes looming-gray {
0% {
background-color: #e3e3e3aa;
}
50% {
/* 官方优化图片tips */
image{
will-change: transform
}
/* 渐变过渡效果处理 */
image.origin-img{
width: 100%;
height: 100%;
opacity: 0.3;
max-height: 360rpx;
}
image.origin-img.show-transition{
transition: opacity .5s;
opacity: 1;
}
image.origin-img.no-transition{
opacity: 1;
}
/* 加载失败、加载中的占位图样式控制 */
.loadfail-img{
height: 100%;
background-repeat: no-repeat;
background-size: 50%;
background-position: center;
}
.loading-img{
height: 100%;
background-position: center;
}
/* 转圈 */
.spin-circle{
background-repeat: no-repeat;
background-size: 60%;
}
/* 动态灰色若隐若现 */
.looming-gray{
animation: looming-gray 1s infinite linear;
background-color: #e3e3e3;
}
}
@keyframes looming-gray{
0% {background-color:#e3e3e3aa;}
50% {background-color:#e3e3e3;}
100% {background-color:#e3e3e3aa;}
}
/* 骨架屏1 */
.skeleton-1{
background-color: #e3e3e3;
background-image: linear-gradient(100deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0) 80%);
background-size: 100rpx 100%;
background-repeat: repeat-y;
background-position:0 0;
animation: skeleton-1 .6s infinite;
}
@keyframes skeleton-1 {
to {
background-position: 200% 0;
}
}
/* 骨架屏2 */
.skeleton-2{
background-image: linear-gradient(-90deg, #fefefe 0%, #e6e6e6 50%,#fefefe 100%);
background-size: 400% 400%;
background-position:0 0;
animation: skeleton-2 1.2s ease-in-out infinite;
}
@keyframes skeleton-2{
to {
background-position: -135% 0;
}
}
</style>
100% {
background-color: #e3e3e3aa;
}
}
/* 骨架屏1 */
.skeleton-1 {
background-color: #e3e3e3;
background-image: linear-gradient(100deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0) 80%);
background-size: 100rpx 100%;
background-repeat: repeat-y;
background-position: 0 0;
animation: skeleton-1 .6s infinite;
}
@keyframes skeleton-1 {
to {
background-position: 200% 0;
}
}
/* 骨架屏2 */
.skeleton-2 {
background-image: linear-gradient(-90deg, #fefefe 0%, #e6e6e6 50%, #fefefe 100%);
background-size: 400% 400%;
background-position: 0 0;
animation: skeleton-2 1.2s ease-in-out infinite;
}
@keyframes skeleton-2 {
to {
background-position: -135% 0;
}
}
</style>

View File

@ -39,7 +39,7 @@
<view class="right-btn-box event_box">
<view class="btn-item"
v-if="evaluate != 2 && item.is_refund ==0 && pay_type!= 10 && status==0 && (evaluate != 10 && evaluate != 11) && orderData.refund_status || item.refund_num > 0"
@click.stop="showTips=true,refundItem=item">申请退款</view>
@click.stop="refund(item)">申请退款</view>
<view class="btn-item err" v-if="item.is_refund ==1">退款中 x
{{item.product_num - item.refund_num}}
</view>
@ -113,7 +113,7 @@
</view>
<view class="btn-item"
v-if="evaluate != 2 && item.refund_switch==1 && pay_type!= 10 && status==0 && (item.is_refund == 0 && evaluate != 9 && orderData.refund_status || item.refund_num > 0)"
@click.stop="showTips=true,refundItem=item">申请退款</view>
@click.stop="refund(item)">申请退款</view>
<view class='btn-item' v-if='item.is_reply==0 && evaluate==2 && item.refund_num > 0'
@click.stop="evaluateTap(item.order_product_id,orderId)">去评价</view>
<view class='btn-item on' v-else-if="item.is_reply==1 && evaluate==2">已评价</view>
@ -121,22 +121,6 @@
</view>
</view>
</view>
<u-overlay :show="showTips">
<view class="tips">
<view class="" style="font-size: 32rpx;">
温馨提示
</view>
<view class="">
下单后1小时内申请退款可极速退款
</view>
<u-button color="#61D137" text="我知道了" @tap="refund(refundItem)"></u-button>
</view>
</u-overlay>
</view>
</template>
@ -185,14 +169,14 @@
type: String,
default: '',
},
pay_type: {
type: [Number, String],
default: 0,
},
status: {
type: [Number, String],
default: 0,
},
pay_type:{
type: [Number, String],
default: 0,
},
status:{
type: [Number, String],
default: 0,
},
jump: {
type: Boolean,
default: false,
@ -203,16 +187,14 @@
return {};
}
},
sale_type: {
type: [Number, String],
default: 1,
},
sale_type: {
type: [Number, String],
default: 1,
},
},
computed: mapGetters(['viewColor']),
data() {
return {
showTips: false, //退
refundItem: null,
domain: HTTP_REQUEST_URL,
totalNmu: '',
isTimePay: false, //
@ -263,8 +245,7 @@
let id = res.data.product_assist_set_id;
uni.hideLoading();
uni.navigateTo({
url: '/pages/activity/assist_detail/index?id=' + id +
'&sale_type=' + this.sale_type
url: '/pages/activity/assist_detail/index?id=' + id + '&sale_type=' + this.sale_type
});
}).catch((err) => {
uni.showToast({
@ -276,7 +257,6 @@
},
// 退
refund(item) {
if (this.showTips) this.showTips = false;
// #ifdef MP
openOrderRefundSubscribe().then(() => {
uni.hideLoading();
@ -301,14 +281,12 @@
if (this.evaluate == 0 || this.evaluate == 9 || this.orderData.is_virtual != 0) {
uni.navigateTo({
url: '/pages/users/refund/confirm?order_id=' + this.orderId + '&type=1' + '&ids=' + item
.order_product_id + '&refund_type=1&order_type=' + this.orderData.order_type +
'&sale_type=' + this.sale_type
.order_product_id + '&refund_type=1&order_type=' + this.orderData.order_type + '&sale_type=' + this.sale_type
})
} else {
uni.navigateTo({
url: '/pages/users/refund/select?order_id=' + this.orderId + '&type=1&order_type=' + this
.orderData.order_type + '&ids=' + item.order_product_id + '&sale_type=' + this
.sale_type
.orderData.order_type + '&ids=' + item.order_product_id + '&sale_type=' + this.sale_type
})
}
// #endif
@ -481,21 +459,4 @@
background: #F0F0F0;
}
}
.tips {
width: 590rpx;
height: 354rpx;
background-color: white;
border-radius: 16rpx;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
box-sizing: border-box;
padding: 50rpx 40rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
}
</style>

View File

@ -82,10 +82,6 @@
returnUrl: {
type: String,
default: ''
},
sale_type: {
type: [Number,String],
default: 1
}
},
data() {
@ -239,7 +235,7 @@
icon: 'success'
}, {
tab: 5,
url: goPages + '?status=1&sale_type=' + that.sale_type
url: goPages + '?status=1'
});
break;
case 'alipay':
@ -271,7 +267,7 @@
icon: 'success'
}, {
tab: 5,
url: goPages + 'status=1&sale_type=' + that.saleType
url: goPages + 'status=1'
});
}).catch(res => {
console.log('测试支付数据无效的catch' + res.data)
@ -285,7 +281,7 @@
title: '取消支付'
}, {
tab: 5,
url: goPages + '?status=0&sale_type=' + that.sale_type
url: goPages + '?status=0'
});
}
}
@ -310,7 +306,7 @@
icon: 'success'
}, {
tab: 5,
url: goPages + 'status=1&sale_type=' + that.sale_type
url: goPages + 'status=1'
});
},
fail: (e) => {
@ -323,8 +319,7 @@
title: '取消支付'
}, {
tab: 5,
url: goPages + '?status=0&sale_type=' + that
.sale_type
url: goPages + '?status=0'
});
}
},
@ -359,8 +354,7 @@
icon: 'success'
}, {
tab: 5,
url: goPages + '?status=1&sale_type=' + that
.sale_type
url: goPages + '?status=1'
});
return that.$util.Tips({
@ -368,8 +362,7 @@
icon: 'success'
}, {
tab: 5,
url: goPages + '?status=1&sale_type=' + that
.sale_type
url: goPages + '?status=1'
});
},
fail: function(e) {
@ -441,8 +434,7 @@
icon: 'success'
}, {
tab: 5,
url: goPages + 'status=1&sale_type=' + that
.sale_type
url: goPages + 'status=1'
});
},

View File

@ -1,43 +1,45 @@
<template>
<view class='product-bg'>
<swiper :indicator-dots="indicatorDots" :current='current' indicator-active-color="#e93323" :autoplay="autoplay"
:circular="circular" :interval="interval" :duration="duration" @change="change" v-if="isPlay">
<swiper :indicator-dots="indicatorDots" indicator-active-color="#e93323" :autoplay="autoplay" :circular="circular"
:interval="interval" :duration="duration" @change="change" v-if="isPlay">
<!-- #ifndef APP-PLUS -->
<block v-for="(item,index) in imgUrls" :key='index'>
<swiper-item v-if="isVideoUrl(item)">
<video :src="isVideoUrl(item,true)" objectFit="cover" controls style="width:100%;height:100% "
show-center-play-btn show-mute-btn="true" auto-pause-if-navigate
:enable-progress-gesture="false" :poster="item+coverUrl"></video>
</swiper-item>
<swiper-item v-else>
<image :src="item" class="slide-image" @click='getpreviewImage(item)' />
</swiper-item>
</block>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<block v-for="(item,index) in imgUrls" :key='index'>
<swiper-item v-if="isVideoUrl(item)">
<view>
<image :src="item+coverUrl" class="slide-image" />
<image class="image-play-icon" src="../../static/images/stop.png"
@click='videoPlay(item,index)'>
</image>
<swiper-item v-if="videoline && videoline != '' && videoline != 'https:'">
<view class="item">
<video id="myVideo" :src='videoline && (videoline.substring(0,4) == "http" || videoline.substring(0,5) == "https") ? videoline : ("http:" + videoline)'
objectFit="cover" controls style="width:100%;height:100% " show-mute-btn="true"
auto-pause-if-navigate @ended="endedFun()"></video>
<view class="poster" v-if="controls">
<image class="image" :src="videoCoverImg"></image>
</view>
</swiper-item>
<swiper-item v-else>
<image :src="item" class="slide-image" @click='getpreviewImage(item)' />
<view class="stop" v-if="controls" @tap="bindPause">
<image class="image" src="../../static/images/stop.png"></image>
</view>
</view>
</swiper-item>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<swiper-item v-if="videoline">
<view class="item">
<view class="poster" v-show="controls">
<image class="image" :src="videoCoverImg"></image>
</view>
<view class="stop" v-show="controls" @tap="bindPause">
<image class="image" src="../../static/images/stop.png"></image>
</view>
</view>
</swiper-item>
<!-- #endif -->
<block v-for="(item,index) in imgUrls" :key='index'>
<swiper-item>
<image :src="item" class="slide-image" @click='getpreviewImage(item)' mode="widthFix" />
</swiper-item>
</block>
<!-- #endif -->
</swiper>
<!-- #ifdef APP-PLUS -->
<view v-if="!isPlay" style="width: 100%; height: 750rpx;">
<video id="myVideo" :src='playingUrl' objectFit="cover" controls style="width:100%;height:100% "
show-center-play-btn show-mute-btn="true" auto-pause-if-navigate :enable-progress-gesture="false"
:poster="playingUrl+coverUrl" @pause="videoPause" @ended="endedFun()"></video>
<video id="myVideo" :src='videoline && (videoline.substring(0,4) == "http" || videoline.substring(0,5) == "https") ? videoline : "http:" + videoline'
objectFit="cover" controls style="width:100%;height:100% " show-center-play-btn show-mute-btn="true"
auto-pause-if-navigate :enable-progress-gesture="false" :poster="videoCoverImg" @pause="videoPause" @ended="endedFun()"></video>
</view>
<!-- #endif -->
@ -48,7 +50,7 @@
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
// | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEBCRMEB
// +----------------------------------------------------------------------
@ -72,10 +74,6 @@
},
data() {
return {
coverUrl: '?spm=a2c4e.11153940.blogcont573781.6.c1032027sQ46VG&x-oss-process=video/snapshot,t_1000,m_fast',
current: '0',
videoTypeList: ['mp4', 'avi', 'mov', 'wmv', 'mkv', 'flv', 'mpeg', '3gp', 'webm'],
playingUrl: '',
indicatorDots: true,
circular: true,
autoplay: true,
@ -99,25 +97,6 @@
// #endif
},
methods: {
isVideoUrl(url, getRightUrl) {
const str = url;
const lastIndex = str.lastIndexOf(".");
let extension;
if (lastIndex !== -1) {
extension = str.substring(lastIndex + 1);
} else {
extension = 'jpg'
}
if (getRightUrl) return url.replace(/\\/g, "")
return this.videoTypeList.includes(extension)
},
videoPlay(url, index) {
this.playingUrl = url
this.current = index
console.log(this.current)
this.bindPause()
},
getpreviewImage: function(item) {
uni.previewImage({
urls: this.imgUrls,
@ -130,7 +109,6 @@
this.autoplay = true
// #endif
},
bindPause: function() {
// #ifndef APP-PLUS
this.videoContext.play();
@ -141,7 +119,7 @@
// #ifdef APP-PLUS
this.isPlay = false
this.videoContext = uni.createVideoContext('myVideo', this);
this.$nextTick(() => {
this.$nextTick(()=>{
this.videoContext.play();
})
// #endif
@ -162,18 +140,15 @@
height: 750rpx;
position: relative;
}
.product-bg swiper {
width: 100%;
height: 100%;
position: relative;
}
.product-bg .slide-image {
width: 750rpx;
height: 750rpx;
width: 100%;
height: 100%;
}
.product-bg .pages {
position: absolute;
background-color: #fff;
@ -186,18 +161,15 @@
font-size: 24rpx;
color: #050505;
}
#myVideo {
width: 100%;
height: 100%
}
.product-bg .item {
position: relative;
width: 100%;
height: 100%;
}
.product-bg .item .poster {
position: absolute;
top: 0;
@ -206,12 +178,10 @@
width: 100%;
z-index: 9;
}
.product-bg .item .poster .image {
width: 100%;
height: 100%;
}
.product-bg .item .stop {
position: absolute;
top: 50%;
@ -222,18 +192,8 @@
margin-left: -68rpx;
z-index: 9;
}
.product-bg .item .stop .image {
width: 100%;
height: 100%;
}
.image-play-icon {
position: absolute;
width: 100rpx;
height: 100rpx;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
</style>
</style>

View File

@ -1,7 +1,6 @@
<template>
<view :style="viewColor">
<view class="product-window"
:class="(attr.cartAttr === true ? 'on' : '') + ' ' + (iSbnt || destri?'join':'') + ' ' + (isPresell ?'presell-window':'')">
<view class="product-window" :class="(attr.cartAttr === true ? 'on' : '') + ' ' + (iSbnt || destri?'join':'') + ' ' + (isPresell ?'presell-window':'')">
<view class="textpic acea-row row-between-wrapper">
<view class="pictrue">
<image :src="attr.productSelect.image ? attr.productSelect.image : image" @click="loookImg"></image>
@ -14,8 +13,7 @@
<view>
预售价
<text class="num">{{ attr.productSelect.price }}</text>
<text v-if="presell_type === 2">定金<text
class="num">{{ attr.productSelect.down_price }}</text></text>
<text v-if="presell_type === 2">定金¥<text class="num">{{ attr.productSelect.down_price }}</text></text>
</view>
<text class="stock" v-if='isShow'>库存: {{ attr.productSelect.stock }}</text>
<text class='stock' v-if="limitNum">限量: {{attr.productSelect.quota_show}}</text>
@ -25,8 +23,7 @@
<view class="acea-row row-middle">
<view v-if="type=='points'" class="points_money">
<image :src="`${domain}/static/images/jf-point.png`" mode=""></image>
<text class="points-num">{{attr.productSelect.ot_price}}</text>积分 <text
v-if="attr.productSelect.price > 0">+{{attr.productSelect.price}}</text>
<text class="points-num">{{attr.productSelect.ot_price}}</text>积分 <text v-if="attr.productSelect.price > 0">+{{attr.productSelect.price}}</text>
<text v-if="limitCount > 0" class="points-limit">限购{{limitCount}}</text>
</view>
<view v-else>
@ -52,9 +49,9 @@
<view class="item" v-for="(item, indexw) in attr.productAttr" :key="indexw">
<view class="title">{{ item.attr_name }}</view>
<view class="listn acea-row row-middle">
<view class="itemn" :class="item.index === itemn.attr ? 'on' : ''"
v-for="(itemn, indexn) in item.attr_value" @click="tapAttr(indexw, indexn)" :key="indexn">
{{itemn.attr}}
<view class="itemn" :class="item.index === itemn.attr ? 'on' : ''" v-for="(itemn, indexn) in item.attr_value"
@click="tapAttr(indexw, indexn)" :key="indexn">
{{ itemn.attr }}
</view>
</view>
</view>
@ -63,32 +60,25 @@
<view class="title">数量</view>
<view class="carnum acea-row row-left">
<view class="buy_limit" v-if="minCount>0 || maxCount>0">
(<text v-if="minCount>0">{{minCount}}件起购<text
v-if="minCount>0 && maxCount>0"></text></text><text
v-if="maxCount>0">最多{{maxCount}}</text>)
(<text v-if="minCount>0">{{minCount}}件起购<text v-if="minCount>0 && maxCount>0"></text></text><text v-if="maxCount>0">最多{{maxCount}}</text>)
</view>
<view class="item reduce"
:class="(attr.productSelect.cart_num <= 1 || (minCount>0 && attr.productSelect.cart_num<=minCount)) ? 'on' : ''"
@click="CartNumDes">
<view class="item reduce" :class="(attr.productSelect.cart_num <= 1 || (minCount>0 && attr.productSelect.cart_num<=minCount)) ? 'on' : ''" @click="CartNumDes">
-
</view>
<view class='item num'>
<input type="number" v-model="attr.productSelect.cart_num" data-name="productSelect.cart_num"
@input="bindCode(attr.productSelect.cart_num)" @keydown.native="btKeyDown"
@keyup.native="btKeyUp"></input>
<input type="number" v-model="attr.productSelect.cart_num" data-name="productSelect.cart_num" @input="bindCode(attr.productSelect.cart_num)" @keydown.native="btKeyDown" @keyup.native="btKeyUp"></input>
</view>
<view v-if="iSplus" class="item plus"
:class="(attr.productSelect.cart_num >= attr.productSelect.stock || destri || (maxCount>0&&attr.productSelect.cart_num>=maxCount)) ? 'on' : ''"
@click="CartNumAdd">+</view>
<view v-else class='item plus'
:class='((attr.productSelect.cart_num >= attr.productSelect.quota_show)
<view v-if="iSplus" class="item plus" :class="(attr.productSelect.cart_num >= attr.productSelect.stock || destri || (maxCount>0&&attr.productSelect.cart_num>=maxCount)) ? 'on' : ''"
@click="CartNumAdd">+</view>
<view v-else class='item plus' :class='((attr.productSelect.cart_num >= attr.productSelect.quota_show)
|| (attr.productSelect.cart_num >= attr.productSelect.product_stock) || (maxCount>0&&attr.productSelect.cart_num>=maxCount)) ? "on":""'
@click='CartNumAdd'>+</view>
@click='CartNumAdd'>+</view>
</view>
</view>
<view class="joinBnt b-color" v-if="destri && attr.productSelect.stock>0" @click="goCat">立即购买</view>
<view class="joinBnt on" v-else-if="destri && attr.productSelect.stock<=0">已售罄</view>
<view class="joinBnt b-color" v-if="iSbnt && attr.productSelect.stock>0" @click="goCat">我要参团</view>
<view class="joinBnt b-color" v-if="iSbnt && attr.productSelect.stock>0"
@click="goCat">我要参团</view>
<view class="joinBnt on" v-else-if="(iSbnt && attr.productSelect.stock<=0)">已售罄</view>
</view>
<view class="mask" @touchmove.prevent :hidden="attr.cartAttr === false" @click="closeAttr"></view>
@ -105,9 +95,7 @@
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import {
mapGetters
} from "vuex";
import { mapGetters } from "vuex";
export default {
props: {
attr: {
@ -177,14 +165,15 @@
},
computed: mapGetters(['viewColor']),
data() {
return {};
return {
};
},
mounted() {
mounted(){
console.log(this.maxCount)
},
methods: {
//
loookImg() {
loookImg(){
let self = this
let arr = [self.attr.productSelect.image ? self.attr.productSelect.image : self.image]
uni.previewImage({
@ -203,11 +192,10 @@
this.$emit('iptCartNum', num);
},
btKeyDown(e) {
e.target.value = e.target.value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5]/g, "");
e.target.value = e.target.value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5]/g,"");
},
btKeyUp(e) {
e.target.value = e.target.value.replace(
/[`~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、]/g, "")
e.target.value = e.target.value.replace(/[`~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、]/g,"")
},
closeAttr: function() {
this.$emit('myevent');
@ -263,68 +251,56 @@
padding-bottom: calc(140rpx + env(safe-area-inset-bottom)); /// IOS>11.2/
transform: translate3d(0, 100%, 0);
transition: all .3s cubic-bezier(.25, .5, .5, .9);
&.presell-window {
padding-bottom: 200rpx;
padding-bottom: calc(200rpx+ constant(safe-area-inset-bottom)); /// IOS<11.2/
padding-bottom: calc(200rpx + env(safe-area-inset-bottom)); /// IOS>11.2/
}
}
.product-window.on {
transform: translate3d(0, 0, 0);
}
.product-window.join {
padding-bottom: 30rpx;
}
.product-window .textpic {
padding: 0 80rpx 0 30rpx;
margin-top: 29rpx;
position: relative;
}
.product-window .textpic .pictrue {
width: 150rpx;
height: 150rpx;
}
.product-window .textpic .pictrue image {
width: 100%;
height: 100%;
border-radius: 10rpx;
}
.product-window .textpic .text {
width: 460rpx;
font-size: 32rpx;
color: #202020;
}
.product-window .textpic .text .money {
font-size: 24rpx;
margin-top: 26rpx;
font-weight: 700;
color: var(--view-priceColor);
}
.product-window .textpic .text .money .points_money {
font-weight: normal;
display: flex;
align-items: baseline;
}
.product-window .textpic .text .money .points_money image {
.product-window .textpic .text .money .points_money image{
width: 26rpx;
height: 26rpx;
}
.product-window .textpic .text .money .points_money .points-num {
.product-window .textpic .text .money .points_money .points-num{
font-size: 34rpx;
}
.product-window .textpic .text .money .points_money .points-limit {
.product-window .textpic .text .money .points_money .points-limit{
display: flex;
padding: 0 10rpx;
align-items: center;
@ -337,52 +313,42 @@
margin-left: 10rpx;
font-size: 18rpx;
}
.product-window .stock_count {
.product-window .stock_count{
margin-top: 5rpx;
}
.product-window .textpic .text .money .num {
font-size: 36rpx;
}
.product-window .textpic .text .money .stock {
color: #999;
margin-left: 18rpx;
font-weight: normal;
}
.product-window .textpic .text .presell_price {
color: #FF7F00;
.num {
display: inline-block;
margin-right: 20rpx;
}
.stock {
margin-left: 0;
}
}
.vip-money {
color: #282828;
font-size: 22rpx;
margin-left: 6rpx;
}
.vipImg {
width: 65rpx;
height: 28rpx;
margin-left: 4rpx;
image {
width: 100%;
height: 100%;
display: block;
}
}
.product-window .textpic .iconfont {
position: absolute;
right: 30rpx;
@ -390,27 +356,22 @@
font-size: 35rpx;
color: #8a8a8a;
}
.product-window .productWinList {
max-height: 395rpx;
overflow: auto;
margin-top: 36rpx;
}
.product-window .productWinList .item~.item {
margin-top: 36rpx;
}
.product-window .productWinList .item .title {
font-size: 30rpx;
color: #999;
padding: 0 30rpx;
}
.product-window .productWinList .item .listn {
padding: 0 30rpx 0 16rpx;
}
.product-window .productWinList .item .listn .itemn {
border: 1px solid #bbb;
font-size: 26rpx;
@ -419,13 +380,11 @@
border-radius: 6rpx;
margin: 14rpx 0 0 14rpx;
}
.product-window .productWinList .item .listn .itemn.on {
color: #fff;
background-color: var(--view-theme);
border-color: var(--view-theme);
}
.product-window .cart {
margin-top: 36rpx;
padding: 0 30rpx;
@ -438,24 +397,20 @@
-ms-flex-pack: justify;
justify-content: space-between;
}
.product-window .cart .title {
font-size: 30rpx;
color: #999;
line-height: 54rpx;
}
.product-window .cart .carnum {
height: 54rpx;
align-items: center;
}
.product-window .cart .carnum .buy_limit {
font-size: 22rpx;
color: var(--view-theme);
margin-right: 30rpx;
}
.product-window .cart .carnum .item {
border: 1px solid #a4a4a4;
width: 84rpx;
@ -465,34 +420,28 @@
color: #a4a4a4;
font-size: 45rpx;
}
.product-window .cart .carnum .reduce {
border-right: 0;
border-radius: 6rpx 0 0 6rpx;
line-height: 48rpx;
}
.product-window .cart .carnum .reduce.on {
border-color: #e3e3e3;
color: #dedede;
}
.product-window .cart .carnum .plus {
border-left: 0;
border-radius: 0 6rpx 6rpx 0;
line-height: 46rpx;
}
.product-window .cart .carnum .plus.on {
border-color: #e3e3e3;
color: #dedede;
}
.product-window .cart .carnum .num {
color: #282828;
font-size: 28rpx;
}
.product-window .joinBnt {
font-size: 30rpx;
width: 620rpx;
@ -502,15 +451,13 @@
line-height: 86rpx;
color: #fff;
margin: 21rpx auto 0 auto;
&.b-color {
&.b-color{
background-color: var(--view-theme);
}
}
.product-window .joinBnt.on {
background-color: #bbb;
color: #fff;
background-image: none;
}
</style>
</style>

View File

@ -63,7 +63,7 @@
</view>
<!-- tab导航 -->
<view class="tabs" v-if="showTab" :style="{top:'calc(98rpx + var(--status-bar-height))'}">
<view class="tabs" v-if="showTab">
<block v-for="(item,indx) in tabsArr" :key="indx">
<view v-if="indx>0" style="width: 3rpx;height: 36rpx;background-color: #ccc;"></view>
<view :class="{'tabs-item-active':item.val==currTabs}" class="tabs-item" @click="changeTab(item.val)">
@ -74,14 +74,9 @@
</view>
<view class='recommendList' :class="indexP?'on':''">
<view class="loadingicon acea-row row-center-wrapper"
v-if="!hostProduct || hostProduct.length == 0 || loading">
<text class="loading iconfont icon-jiazai loading-flex"></text>
{{ hotTitle }}
</view>
<WaterfallsFlow v-if="hostProduct.length>0" :wfList='hostProduct' @itemTap="goDetail" :type="0"
:sale_type="sale_type" />
<view class='pictrue' v-if="!loading && hostProduct.length==0">
<view class='pictrue' v-if="!loading&&hostProduct.length==0">
<image :src="`${domain}/static/images/noCart.png`"></image>
<view>暂无商品看点别的吧</view>
</view>
@ -144,10 +139,6 @@
type: Boolean,
default: false
},
hotTitle: {
type: String,
default: '加载更多'
}
},
data() {
return {
@ -170,14 +161,12 @@
val: 4
}],
currTabs: 1,
list: [],
tabsTop: ''
list: []
};
},
mounted() {
this.getArticleList();
},
methods: {
changeTab(e) {
this.currTabs = e;
@ -197,18 +186,6 @@
limit: 10
}).then(res => {
this.list = res.data.list;
setTimeout(() => {
this.$util.getDom(this, '.tabs', res => {
// #ifdef APP
this.tabsTop = res.top + 10;
// #endif
// #ifdef H5
this.tabsTop = res.top;
// #endif
})
}, 300)
})
},
goDetail(item) {
@ -303,15 +280,10 @@
}
.tabs {
position: sticky;
top: 0;
z-index: 900;
background: #fff;
padding-bottom: 20rpx;
display: flex;
justify-content: space-between;
align-items: center;
margin: 0 -20rpx 10rpx;
margin: 0 -20rpx 30rpx;
padding-top: 20rpx;
.tabs-item {
@ -351,7 +323,6 @@
.recommend .recommendList {
padding: 0 20rpx;
min-height: 100rpx;
min-height: calc(100vh - 82rpx - var(--status-bar-height));
}
.recommend .recommendList.on {
@ -363,6 +334,10 @@
}
.information {
// display: flex;
// justify-content: space-between;
// margin-bottom: 20rpx;
.nav-item {
width: 227rpx;
overflow: hidden;
@ -408,11 +383,6 @@
}
}
.loading-flex {
width: auto !important;
margin-right: 10rpx;
}
.pictrue {
display: flex;
flex-direction: column;

View File

@ -15,9 +15,9 @@ let openPlantGrass = '-openPlantGrass-'
let httpSix, httpApi;
// const env = 'dev'; // 开发
const env = 'dev'; // 开发
// const env = 'prod'; // 生产
const env = 'prew'; // 预上线
// const env = 'prew'; // 预上线
switch (env) {
case 'prod':

View File

@ -1,353 +1,352 @@
{
"name": "惠农生活",
"appid": "__UNI__3A527D1",
"description": "",
"versionName": "2.0.53",
"versionCode": 2053,
"transformPx": false,
/* 5+App */
"app-plus": {
"titleNView": true,
"usingComponents": true,
"nvueCompiler": "uni-app",
"nvueStyleCompiler": "uni-app",
"compilerVersion": 3,
"compatible": {
"ignoreVersion": true //trueHBuilderX1.9.0
},
"splashscreen": {
"alwaysShowBeforeRender": false,
"waiting": false,
"autoclose": true,
"delay": 0
},
/* */
"modules": {
"VideoPlayer": {},
"OAuth": {},
"Payment": {},
"Share": {},
"iBeacon": {},
"Maps": {},
"Geolocation": {},
"UniMP": {
"description": "uni小程序"
},
"Push": {},
"Barcode": {},
"Camera": {}
},
"safearea": {
"bottom": {
"offset": "none"
}
},
/* */
"distribute": {
/* android */
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_LOCATION_EXTRA_COMMANDS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.BATTERY_STATS\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH\"/>",
"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_CONFIGURATION\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\"/>"
],
"abiFilters": ["armeabi-v7a", "arm64-v8a", "x86"],
"permissionExternalStorage": {
"request": "none",
"prompt": "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"
},
"permissionPhoneState": {
"request": "none" //
},
"minSdkVersion": 23,
"targetSdkVersion": 30
},
/* ios */
"ios": {
"privacyDescription": {
"NSPhotoLibraryUsageDescription": "上传用户头像保存分享海报",
"NSPhotoLibraryAddUsageDescription": "上传用户头像保存分享海报",
"NSCameraUsageDescription": "上传用户头像保存分享海报",
"NSLocationWhenInUseUsageDescription": "根据客户地理位置推荐最近门店",
"NSLocationAlwaysUsageDescription": "根据客户地理位置推荐最近门店"
},
"idfa": false,
"dSYMs": false
},
/* SDK */
"sdkConfigs": {
"maps": {
"amap": {
"appkey_ios": "0a3202688624938fd5d2f37b52c30d5d",
"appkey_android": "0354f5ddc11e2ea76c5aac647f44d945",
"name": "amapIvoVHpJR"
}
},
"payment": {
"weixin": {
"__platform__": ["ios", "android"],
"appid": "wx2e8f79ff281284f5",
"UniversalLinks": "https://shop.lihaink.cn/"
}
},
"share": {
"weixin": {
"appid": "wx2e8f79ff281284f5",
"UniversalLinks": "https://shop.lihaink.cn/"
}
},
"geolocation": {
"amap": {
"name": "amapIvoVHpJR",
"__platform__": ["ios", "android"],
"appkey_ios": "0a3202688624938fd5d2f37b52c30d5d",
"appkey_android": "0354f5ddc11e2ea76c5aac647f44d945"
}
},
"push": {},
"oauth": {
"weixin": {
"appid": "wx2e8f79ff281284f5",
"UniversalLinks": "https://shop.lihaink.cn/"
},
"univerify": {}
},
"ad": {}
},
"icons": {
"android": {
"hdpi": "unpackage/res/icons/72x72.png",
"xhdpi": "unpackage/res/icons/96x96.png",
"xxhdpi": "unpackage/res/icons/144x144.png",
"xxxhdpi": "unpackage/res/icons/192x192.png"
},
"ios": {
"appstore": "unpackage/res/icons/1024x1024.png",
"ipad": {
"app": "unpackage/res/icons/76x76.png",
"app@2x": "unpackage/res/icons/152x152.png",
"notification": "unpackage/res/icons/20x20.png",
"notification@2x": "unpackage/res/icons/40x40.png",
"proapp@2x": "unpackage/res/icons/167x167.png",
"settings": "unpackage/res/icons/29x29.png",
"settings@2x": "unpackage/res/icons/58x58.png",
"spotlight": "unpackage/res/icons/40x40.png",
"spotlight@2x": "unpackage/res/icons/80x80.png"
},
"iphone": {
"app@2x": "unpackage/res/icons/120x120.png",
"app@3x": "unpackage/res/icons/180x180.png",
"notification@2x": "unpackage/res/icons/40x40.png",
"notification@3x": "unpackage/res/icons/60x60.png",
"settings@2x": "unpackage/res/icons/58x58.png",
"settings@3x": "unpackage/res/icons/87x87.png",
"spotlight@2x": "unpackage/res/icons/80x80.png",
"spotlight@3x": "unpackage/res/icons/120x120.png"
}
}
},
"splashscreen": {
"useOriginalMsgbox": true,
"androidStyle": "common"
}
},
"nativePlugins": {
"JG-JCore": {
"JPUSH_APPKEY_IOS": "8a5efd65cda14fafa6e64ad3",
"JPUSH_CHANNEL_IOS": "8a5efd65cda14fafa6e64ad3",
"JPUSH_APPKEY_ANDROID": "b5f679f4357018605ea6fd2e",
"JPUSH_CHANNEL_ANDROID": "",
"__plugin_info__": {
"name": "JG-JCore",
"description": "极光推送JCore插件",
"platforms": "Android,iOS",
"url": "",
"android_package_name": "uni.UNI3A527D1",
"ios_bundle_id": "",
"isCloud": false,
"bought": -1,
"pid": "",
"parameters": {
"JPUSH_APPKEY_IOS": {
"des": "[iOS]极光portal配置应用信息时分配的AppKey",
"key": "JCore:APP_KEY",
"value": "daebe19b547c43128796a078"
},
"JPUSH_CHANNEL_IOS": {
"des": "[iOS]用于统计分发渠道不需要可填默认值developer-default",
"key": "JCore:CHANNEL",
"value": ""
},
"JPUSH_APPKEY_ANDROID": {
"des": "[Android]极光portal配置应用信息时分配的AppKey",
"key": "JPUSH_APPKEY",
"value": ""
},
"JPUSH_CHANNEL_ANDROID": {
"des": "[Android]用于统计分发渠道不需要可填默认值developer-default",
"key": "JPUSH_CHANNEL",
"value": ""
}
}
}
},
"JG-JPush": {
"JPUSH_ISPRODUCTION_IOS": "true",
"JPUSH_ADVERTISINGID_IOS": "",
"JPUSH_DEFAULTINITJPUSH_IOS": "true",
"JPUSH_OPPO_APPKEY": "",
"JPUSH_OPPO_APPID": "",
"JPUSH_OPPO_APPSECRET": "",
"JPUSH_VIVO_APPKEY": "",
"JPUSH_VIVO_APPID": "",
"JPUSH_MEIZU_APPKEY": "",
"JPUSH_MEIZU_APPID": "",
"JPUSH_XIAOMI_APPKEY": "",
"JPUSH_XIAOMI_APPID": "",
"__plugin_info__": {
"name": "JG-JPush",
"description": "极光推送Hbuilder插件",
"platforms": "Android,iOS",
"url": "",
"android_package_name": "uni.UNI3A527D1",
"ios_bundle_id": "",
"isCloud": false,
"bought": -1,
"pid": "",
"parameters": {
"JPUSH_ISPRODUCTION_IOS": {
"des": "[iOS]是否是生产环境是填true不是填false或者不填",
"key": "JPush:ISPRODUCTION",
"value": ""
},
"JPUSH_ADVERTISINGID_IOS": {
"des": "[iOS]广告标识符IDFA如果不需要使用IDFA可不填",
"key": "JPush:ADVERTISINGID",
"value": ""
},
"JPUSH_DEFAULTINITJPUSH_IOS": {
"des": "[iOS]是否默认初始化是填true不是填false或者不填",
"key": "JPush:DEFAULTINITJPUSH",
"value": ""
},
"JPUSH_OPPO_APPKEY": {
"des": "厂商OPPO-appkey,示例OP-12345678",
"key": "OPPO_APPKEY",
"value": ""
},
"JPUSH_OPPO_APPID": {
"des": "厂商OPPO-appId,示例OP-12345678",
"key": "OPPO_APPID",
"value": ""
},
"JPUSH_OPPO_APPSECRET": {
"des": "厂商OPPO-appSecret,示例OP-12345678",
"key": "OPPO_APPSECRET",
"value": ""
},
"JPUSH_VIVO_APPKEY": {
"des": "厂商VIVO-appkey,示例12345678",
"key": "com.vivo.push.api_key",
"value": ""
},
"JPUSH_VIVO_APPID": {
"des": "厂商VIVO-appId,示例12345678",
"key": "com.vivo.push.app_id",
"value": ""
},
"JPUSH_MEIZU_APPKEY": {
"des": "厂商MEIZU-appKey,示例MZ-12345678",
"key": "MEIZU_APPKEY",
"value": ""
},
"JPUSH_MEIZU_APPID": {
"des": "厂商MEIZU-appId,示例MZ-12345678",
"key": "MEIZU_APPID",
"value": ""
},
"JPUSH_XIAOMI_APPKEY": {
"des": "厂商XIAOMI-appKey,示例MI-12345678",
"key": "XIAOMI_APPKEY",
"value": ""
},
"JPUSH_XIAOMI_APPID": {
"des": "厂商XIAOMI-appId,示例MI-12345678",
"key": "XIAOMI_APPID",
"value": ""
}
}
}
}
}
},
/* */
"quickapp": {},
/* */
"mp-weixin": {
"appid": "wx5fb1cc8edb3f8baa",
"setting": {
"urlCheck": false,
"minified": true,
"postcss": true,
"es6": true
},
"permission": {
"scope.userLocation": {
"desc": "获取您的位置"
}
},
"requiredPrivateInfos": ["getLocation", "chooseAddress"],
"usingComponents": true,
"__usePrivacyCheck__": true
},
"mp-alipay": {
"usingComponents": true
},
"mp-baidu": {
"usingComponents": true
},
"mp-toutiao": {
"usingComponents": true
},
"h5": {
"devServer": {
"https": false
},
"router": {
"mode": "history",
"base": ""
},
"domain": "",
"sdkConfigs": {
"maps": {
"qqmap": {
"key": "SMJBZ-WCHK4-ZPZUA-DSIXI-XDDVQ-XWFX7"
}
}
},
"title": "加载中...",
"template": "template.h5.html",
"optimization": {
"treeShaking": {
"enable": true
}
}
}
"name" : "惠农生活",
"appid" : "__UNI__3A527D1",
"description" : "",
"versionName" : "2.0.35",
"versionCode" : 2035,
"transformPx" : false,
/* 5+App */
"app-plus" : {
"titleNView" : true,
"usingComponents" : true,
"nvueCompiler" : "uni-app",
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"compatible" : {
"ignoreVersion" : true //trueHBuilderX1.9.0
},
"splashscreen" : {
"alwaysShowBeforeRender" : false,
"waiting" : false,
"autoclose" : true,
"delay" : 0
},
/* */
"modules" : {
"VideoPlayer" : {},
"OAuth" : {},
"Payment" : {},
"Share" : {},
"iBeacon" : {},
"Maps" : {},
"Geolocation" : {},
"UniMP" : {
"description" : "uni小程序"
},
"Push" : {},
"Barcode" : {},
"Camera" : {}
},
"safearea" : {
"bottom" : {
"offset" : "none"
}
},
/* */
"distribute" : {
/* android */
"android" : {
"permissions" : [
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_LOCATION_EXTRA_COMMANDS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.BATTERY_STATS\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH\"/>",
"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_CONFIGURATION\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\"/>"
],
"abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
"permissionExternalStorage" : {
"request" : "none",
"prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"
},
"permissionPhoneState" : {
"request" : "none" //
},
"minSdkVersion" : 23,
"targetSdkVersion" : 30
},
/* ios */
"ios" : {
"privacyDescription" : {
"NSPhotoLibraryUsageDescription" : "上传用户头像保存分享海报",
"NSPhotoLibraryAddUsageDescription" : "上传用户头像保存分享海报",
"NSCameraUsageDescription" : "上传用户头像保存分享海报",
"NSLocationWhenInUseUsageDescription" : "根据客户地理位置推荐最近门店",
"NSLocationAlwaysUsageDescription" : "根据客户地理位置推荐最近门店"
},
"idfa" : false,
"dSYMs" : false
},
/* SDK */
"sdkConfigs" : {
"maps" : {
"amap" : {
"appkey_ios" : "0a3202688624938fd5d2f37b52c30d5d",
"appkey_android" : "0354f5ddc11e2ea76c5aac647f44d945",
"name" : "amapIvoVHpJR"
}
},
"payment" : {
"weixin" : {
"__platform__" : [ "ios", "android" ],
"appid" : "wx2e8f79ff281284f5",
"UniversalLinks" : "https://shop.lihaink.cn/"
}
},
"share" : {
"weixin" : {
"appid" : "wx2e8f79ff281284f5",
"UniversalLinks" : "https://shop.lihaink.cn/"
}
},
"geolocation" : {
"amap" : {
"name" : "amapIvoVHpJR",
"__platform__" : [ "ios", "android" ],
"appkey_ios" : "0a3202688624938fd5d2f37b52c30d5d",
"appkey_android" : "0354f5ddc11e2ea76c5aac647f44d945"
}
},
"push" : {},
"oauth" : {
"weixin" : {
"appid" : "wx2e8f79ff281284f5",
"UniversalLinks" : "https://shop.lihaink.cn/"
}
},
"ad" : {}
},
"icons" : {
"android" : {
"hdpi" : "unpackage/res/icons/72x72.png",
"xhdpi" : "unpackage/res/icons/96x96.png",
"xxhdpi" : "unpackage/res/icons/144x144.png",
"xxxhdpi" : "unpackage/res/icons/192x192.png"
},
"ios" : {
"appstore" : "unpackage/res/icons/1024x1024.png",
"ipad" : {
"app" : "unpackage/res/icons/76x76.png",
"app@2x" : "unpackage/res/icons/152x152.png",
"notification" : "unpackage/res/icons/20x20.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"proapp@2x" : "unpackage/res/icons/167x167.png",
"settings" : "unpackage/res/icons/29x29.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"spotlight" : "unpackage/res/icons/40x40.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png"
},
"iphone" : {
"app@2x" : "unpackage/res/icons/120x120.png",
"app@3x" : "unpackage/res/icons/180x180.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"notification@3x" : "unpackage/res/icons/60x60.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"settings@3x" : "unpackage/res/icons/87x87.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png",
"spotlight@3x" : "unpackage/res/icons/120x120.png"
}
}
},
"splashscreen" : {
"useOriginalMsgbox" : true,
"androidStyle" : "common"
}
},
"nativePlugins" : {
"JG-JCore" : {
"JPUSH_APPKEY_IOS" : "8a5efd65cda14fafa6e64ad3",
"JPUSH_CHANNEL_IOS" : "8a5efd65cda14fafa6e64ad3",
"JPUSH_APPKEY_ANDROID" : "b5f679f4357018605ea6fd2e",
"JPUSH_CHANNEL_ANDROID" : "",
"__plugin_info__" : {
"name" : "JG-JCore",
"description" : "极光推送JCore插件",
"platforms" : "Android,iOS",
"url" : "",
"android_package_name" : "uni.UNI3A527D1",
"ios_bundle_id" : "",
"isCloud" : false,
"bought" : -1,
"pid" : "",
"parameters" : {
"JPUSH_APPKEY_IOS" : {
"des" : "[iOS]极光portal配置应用信息时分配的AppKey",
"key" : "JCore:APP_KEY",
"value" : "daebe19b547c43128796a078"
},
"JPUSH_CHANNEL_IOS" : {
"des" : "[iOS]用于统计分发渠道不需要可填默认值developer-default",
"key" : "JCore:CHANNEL",
"value" : ""
},
"JPUSH_APPKEY_ANDROID" : {
"des" : "[Android]极光portal配置应用信息时分配的AppKey",
"key" : "JPUSH_APPKEY",
"value" : ""
},
"JPUSH_CHANNEL_ANDROID" : {
"des" : "[Android]用于统计分发渠道不需要可填默认值developer-default",
"key" : "JPUSH_CHANNEL",
"value" : ""
}
}
}
},
"JG-JPush" : {
"JPUSH_ISPRODUCTION_IOS" : "true",
"JPUSH_ADVERTISINGID_IOS" : "",
"JPUSH_DEFAULTINITJPUSH_IOS" : "true",
"JPUSH_OPPO_APPKEY" : "",
"JPUSH_OPPO_APPID" : "",
"JPUSH_OPPO_APPSECRET" : "",
"JPUSH_VIVO_APPKEY" : "",
"JPUSH_VIVO_APPID" : "",
"JPUSH_MEIZU_APPKEY" : "",
"JPUSH_MEIZU_APPID" : "",
"JPUSH_XIAOMI_APPKEY" : "",
"JPUSH_XIAOMI_APPID" : "",
"__plugin_info__" : {
"name" : "JG-JPush",
"description" : "极光推送Hbuilder插件",
"platforms" : "Android,iOS",
"url" : "",
"android_package_name" : "uni.UNI3A527D1",
"ios_bundle_id" : "",
"isCloud" : false,
"bought" : -1,
"pid" : "",
"parameters" : {
"JPUSH_ISPRODUCTION_IOS" : {
"des" : "[iOS]是否是生产环境是填true不是填false或者不填",
"key" : "JPush:ISPRODUCTION",
"value" : ""
},
"JPUSH_ADVERTISINGID_IOS" : {
"des" : "[iOS]广告标识符IDFA如果不需要使用IDFA可不填",
"key" : "JPush:ADVERTISINGID",
"value" : ""
},
"JPUSH_DEFAULTINITJPUSH_IOS" : {
"des" : "[iOS]是否默认初始化是填true不是填false或者不填",
"key" : "JPush:DEFAULTINITJPUSH",
"value" : ""
},
"JPUSH_OPPO_APPKEY" : {
"des" : "厂商OPPO-appkey,示例OP-12345678",
"key" : "OPPO_APPKEY",
"value" : ""
},
"JPUSH_OPPO_APPID" : {
"des" : "厂商OPPO-appId,示例OP-12345678",
"key" : "OPPO_APPID",
"value" : ""
},
"JPUSH_OPPO_APPSECRET" : {
"des" : "厂商OPPO-appSecret,示例OP-12345678",
"key" : "OPPO_APPSECRET",
"value" : ""
},
"JPUSH_VIVO_APPKEY" : {
"des" : "厂商VIVO-appkey,示例12345678",
"key" : "com.vivo.push.api_key",
"value" : ""
},
"JPUSH_VIVO_APPID" : {
"des" : "厂商VIVO-appId,示例12345678",
"key" : "com.vivo.push.app_id",
"value" : ""
},
"JPUSH_MEIZU_APPKEY" : {
"des" : "厂商MEIZU-appKey,示例MZ-12345678",
"key" : "MEIZU_APPKEY",
"value" : ""
},
"JPUSH_MEIZU_APPID" : {
"des" : "厂商MEIZU-appId,示例MZ-12345678",
"key" : "MEIZU_APPID",
"value" : ""
},
"JPUSH_XIAOMI_APPKEY" : {
"des" : "厂商XIAOMI-appKey,示例MI-12345678",
"key" : "XIAOMI_APPKEY",
"value" : ""
},
"JPUSH_XIAOMI_APPID" : {
"des" : "厂商XIAOMI-appId,示例MI-12345678",
"key" : "XIAOMI_APPID",
"value" : ""
}
}
}
}
}
},
/* */
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "wx5fb1cc8edb3f8baa",
"setting" : {
"urlCheck" : false,
"minified" : true,
"postcss" : true,
"es6" : true
},
"permission" : {
"scope.userLocation" : {
"desc" : "获取您的位置"
}
},
"requiredPrivateInfos" : [ "getLocation", "chooseAddress" ],
"usingComponents" : true,
"__usePrivacyCheck__" : true
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"h5" : {
"devServer" : {
"https" : false
},
"router" : {
"mode" : "history",
"base" : ""
},
"domain" : "",
"sdkConfigs" : {
"maps" : {
"qqmap" : {
"key" : "SMJBZ-WCHK4-ZPZUA-DSIXI-XDDVQ-XWFX7"
}
}
},
"title" : "加载中...",
"template" : "template.h5.html",
"optimization" : {
"treeShaking" : {
"enable" : true
}
}
}
}

View File

@ -19,39 +19,13 @@
"enablePullDownRefresh": true,
// #endif
"app-plus": {
"scrollIndicator": false, //
"subNVues": [{
"id": "concatIndex", //
"path": "pages/index/subnvue/concat", //
"type": "popup",
"style": {
"position": "absolute",
"dock": "right",
"width": "750rpx",
"height": "1000px",
"background": "rgba(0,0,0,0.2)"
}
},
{
"id": "newUser", //
"path": "pages/index/subnvue/newUser", //
"type": "popup",
"style": {
"position": "absolute",
"dock": "right",
"width": "750rpx",
"height": "1000px",
"background": "rgba(0,0,0,0.2)"
}
}
]
"scrollIndicator": false //
}
}
}, {
"path": "pages/whole_sale/index",
"style": {
"enablePullDownRefresh": false,
"enablePullDownRefresh": true,
"navigationBarTitleText": "批发",
"navigationStyle": "custom"
}
@ -60,22 +34,7 @@
"style": {
"enablePullDownRefresh": true,
"navigationBarTitleText": "工作台",
"navigationStyle": "custom",
"app-plus": {
"scrollIndicator": false, //
"subNVues": [{
"id": "concat", //
"path": "pages/gather/subnvue/concat", //
"type": "popup",
"style": {
"position": "absolute",
"dock": "right",
"width": "750rpx",
"height": "1500rpx",
"background": "rgba(0,0,0,0.2)"
}
}]
}
"navigationStyle": "custom"
}
}, {
"path": "pages/order_addcart/order_addcart",
@ -95,22 +54,7 @@
"style": {
"enablePullDownRefresh": true,
"navigationBarTitleText": "个人中心",
"navigationStyle": "custom",
"app-plus": {
"scrollIndicator": false, //
"subNVues": [{
"id": "userSubnvu", //
"path": "pages/user/subnvue/index", //
"type": "popup",
"style": {
"position": "absolute",
"dock": "right",
"width": "750rpx",
"height": "1500rpx",
"background": "rgba(0,0,0,0.2)"
}
}]
}
"navigationStyle": "custom"
}
},
{
@ -161,13 +105,6 @@
// #endif
}
},
{
"path": "pages/goods_details/videoPlay",
"style": {
"navigationBarTitleText": "视屏详情"
}
},
{
"path": "pages/goods_cate/goods_cate",
"style": {
@ -388,7 +325,7 @@
"style": {
"navigationBarTitleText": "里海云仓",
"navigationStyle": "custom",
"enablePullDownRefresh": false
"enablePullDownRefresh": true
}
},
{
@ -641,8 +578,7 @@
"path": "order_list/index",
"style": {
"navigationBarTitleText": "我的订单",
"navigationStyle": "custom",
"enablePullDownRefresh": true
"navigationStyle": "custom"
}
},
{
@ -870,14 +806,7 @@
"path": "settled/index",
"style": {
"navigationBarTitleText": "商家入驻",
"navigationStyle": "custom",
"enablePullDownRefresh": false
}
},
{
"path": "settled/index1",
"style": {
"navigationBarTitleText": "商家入驻"
"navigationStyle": "custom"
}
},
{
@ -1586,9 +1515,7 @@
"backgroundColor": "#F8F8F8"
//#ifndef H5
,
"titleNView": true,
"backgroundColorTop": "#40AE36",
"backgroundTextStyle": "light"
"titleNView": true
//#endif
//#ifdef H5
,

File diff suppressed because it is too large Load Diff

View File

@ -12,11 +12,10 @@
<view class="con line1" v-if="item.last && item.last.msn_type == 2">[表情]</view>
<view class="con line1" v-if="item.last && item.last.msn_type == 3">[图片]</view>
<view class="con line1" v-if="item.last && item.last.msn_type == 4">[商品]</view>
<view class="con line1"
v-if="item.last && (item.last.msn_type == 5 || item.last.msn_type == 6)">[订单]</view>
<view class="con line1" v-if="item.last && (item.last.msn_type == 5 || item.last.msn_type == 6)">[订单]</view>
</view>
<view class="right-box">
<view class="time">{{item.display_time}}</view>
<view class="time">{{item.last && item.last.create_time.split(' ')[1] || ''}}</view>
<view class="num" v-if="item.num>0">{{item.num}}</view>
</view>
</div>
@ -24,21 +23,18 @@
<block v-if="type == 1 && list.length>0" v-for="(item,index) in list" :key="index">
<div class="item acea-row" @click="goPage(item)">
<view class="logo">
<image :src="(item.user && item.user.avatar) ? item.user.avatar : '/static/images/f.png'"
mode=""></image>
<image :src="(item.user && item.user.avatar) ? item.user.avatar : '/static/images/f.png'" mode=""></image>
</view>
<view class="info">
<view class="name">{{item.user && item.user.nickname}}</view>
<view class="con line1" v-if="item.last && item.last.msn_type == 1">{{item.last.msn}}</view>
<view class="con line1" v-if="item.last && item.last.msn_type == 2">[表情]</view>
<view class="con line1" v-if="item.last && item.last.msn_type == 3">[图片]</view>
<view class="con line1"
v-if="item.last && (item.last.msn_type == 4 || item.last.msn_type == 7)">[商品]</view>
<view class="con line1"
v-if="item.last && (item.last.msn_type == 5 || item.last.msn_type == 6)">[订单]</view>
<view class="con line1" v-if="item.last && (item.last.msn_type == 4 || item.last.msn_type == 7)">[商品]</view>
<view class="con line1" v-if="item.last && (item.last.msn_type == 5 || item.last.msn_type == 6)">[订单]</view>
</view>
<view class="right-box">
<view class="time">{{item.display_time}}</view>
<view class="time">{{item.last && item.last.create_time.split(' ')[1]}}</view>
<view class="num" v-if="item.num>0">{{item.num}}</view>
</view>
</div>
@ -61,19 +57,12 @@
// +----------------------------------------------------------------------
import emptyPage from '@/components/emptyPage.vue'
import {
serviceList,
serviceUserList
} from "@/api/user";
import {
toLogin
} from '@/libs/login.js';
import {
mapGetters
} from "vuex";
import { serviceList, serviceUserList } from "@/api/user";
import { toLogin } from '@/libs/login.js';
import { mapGetters } from "vuex";
export default {
name: "CustomerList",
components: {
components:{
emptyPage,
},
data() {
@ -81,63 +70,63 @@
list: [],
productId: 0,
orderId: "",
type: 0, // 0 1
type: 0 ,// 0 1
timer: null,
page: 1,
limit: 9999,
page:1,
limit:9999,
mer_id: '',
loading: false,
clear: false,
};
},
computed: mapGetters(['isLogin', 'viewColor']),
computed: mapGetters(['isLogin','viewColor']),
onLoad(optios) {
this.type = optios.type;
this.mer_id = optios.mer_id;
if (this.isLogin) {
if(this.isLogin){
this.getList(this.mer_id)
} else {
toLogin()
}
},
onShow(option) {
if (this.isLogin) {
if(this.isLogin){
this.liveUpdate();
} else {
toLogin()
}
},
onHide() {
if (this.timer) {
clearInterval(this.timer);
this.timer = null;
}
onHide(){
if(this.timer) {
clearInterval(this.timer);
this.timer = null;
}
this.clear = true;
},
onUnload() {
if (this.timer) {
clearInterval(this.timer);
this.timer = null;
}
if(this.timer) {
clearInterval(this.timer);
this.timer = null;
}
this.clear = true;
},
methods: {
getList(mer_id) {
getList(mer_id) {
this.loading = true;
if (this.type == 0) {
if(this.type == 0){
serviceList({
page: this.page,
limit: this.limit
page:this.page,
limit:this.limit
}).then(res => {
this.list = res.data.list;
if (res.status == 400) {
if(res.status == 400){
clearInterval(this.timer);
this.timer = null;
this.timer = null;
return this.$util.Tips({
title: res.message
})
}
}).finally(v => {
}
}).finally(v=>{
this.loading = false;
return this.$util.Tips({
title: v
@ -147,59 +136,59 @@
title: err
})
});
} else {
serviceUserList(mer_id, {
page: this.page,
limit: this.limit
}).then(res => {
}else{
serviceUserList(mer_id,{
page:this.page,
limit:this.limit
}).then(res =>{
this.list = res.data.list;
if (res.status == 400) {
if(res.status == 400){
clearInterval(this.timer);
this.timer = null;
this.timer = null;
return this.$util.Tips({
title: res.message
})
}
}).finally(v => {
}).finally(v=>{
this.loading = false;
clearInterval(this.timer);
this.timer = null;
this.timer = null;
return this.$util.Tips({
title: v
})
}).catch(err => {
clearInterval(this.timer);
this.timer = null;
this.timer = null;
return this.$util.Tips({
title: err
})
});
}
}
},
//
liveUpdate() {
liveUpdate(){
let that = this;
this.clear = false;
if (that.timer) {
if(that.timer) {
clearInterval(that.timer);
that.timer = null;
}
that.timer = setInterval(function() {
if (that.clear) {
that.timer = null;
}
that.timer = setInterval(function(){
if(that.clear){
clearInterval(that.timer);
return;
return ;
}
//
(!that.loading) && that.getList(that.mer_id);
}, 5000);
},5000);
},
goPage(item) {
item.num = 0;
if (this.type == 0) {
if(this.type == 0){
uni.navigateTo({
url: `/pages/chat/customer_list/chat?mer_id=${item.mer_id}`
})
} else {
}else{
uni.navigateTo({
url: `/pages/chat/customer_list/chat?userId=${item.user.uid}&mer_id=${item.mer_id}`
})
@ -218,8 +207,7 @@
transform: rotate(180deg);
font-size: 36rpx;
}
.popupn {
.popupn{
position: fixed;
width: 100%;
text-align: center;
@ -229,78 +217,65 @@
height: 90rpx;
line-height: 90rpx;
z-index: 100;
.title {
.title{
max-width: 560rpx;
margin: 0 auto;
position: relative;
}
.iconfont {
.iconfont{
display: inline-block;
position: relative;
top: 4rpx;
right: 0;
}
.mer_logo {
.mer_logo{
width: 34rpx;
height: 34rpx;
position: relative;
top: 6rpx;
right: 10px;
right: 10px;
}
.mer_name {
.mer_name{
display: inline-block;
max-width: 650rpx;
}
.invoice-content {
.invoice-content{
background-color: #ffffff;
}
}
.list_count {
.list_count{
margin-top: 104rpx;
}
.item {
align-items: center;
border-bottom: 1px solid #eee;
padding: 20rpx 30rpx;
background-color: #fff;
.logo image {
.logo image{
width: 88rpx;
height: 88rpx;
border-radius: 50%;
}
.info {
.info{
width: 334rpx;
margin-left: 20rpx;
.con {
.con{
margin-top: 10rpx;
color: #999999;
font-size: 24rpx;
}
}
.right-box {
.right-box{
flex: 1;
display: flex;
flex-direction: column;
align-items: flex-end;
font-size: 20rpx;
color: #BBBBBB;
.time {
.time{
margin-bottom: 10rpx;
}
.num {
.num{
min-width: 6px;
background-color: var(--view-theme);
border-radius: 15px;
@ -312,4 +287,4 @@
}
}
}
</style>
</style>

View File

@ -7,77 +7,99 @@
background-color: #f8fafb !important;
.wholeSale-header {
position: sticky;
top: 0;
z-index: 9;
margin-bottom: 20rpx;
background-color: #40AE36;
// background-color: #40AE36;
.scrollview {
display: flex;
align-items: center;
height: 98rpx;
padding-left: 32rpx;
.scrollview-item {
margin-right: 30rpx;
font-size: 28rpx;
color: #FFFFFF;
}
.scrollview-active {
position: relative;
font-weight: bold;
font-size: 36rpx;
color: #FFFFFF;
&::after {
content: "";
display: inline-block;
position: absolute;
bottom: -6rpx;
left: 50%;
transform: translateX(-50%);
width: 100%;
height: 6rpx;
background-color: #FFFFFF;
}
}
}
}
.wholeSale-section {
position: sticky;
top: calc(82rpx + var(--status-bar-height));
padding: 0rpx 20rpx;
background-color: #fff;
transition: height .5s;
overflow: hidden;
margin-bottom: 20rpx;
.wholeSale-con {
margin: 0 20rpx;
.wholeSale-nav {
display: flex;
align-items: center;
padding-bottom: 20rpx;
margin-bottom: 40rpx;
.icon {
margin-right: 20rpx;
}
}
.search_content {
flex: 1;
height: 70rpx;
padding: 2px 2px 2px 21.05rpx;
border-radius: 80rpx;
background: #EDEFF2;
position: relative;
box-sizing: border-box;
.search_content {
// margin-bottom: 40rpx;
flex: 1;
height: 70rpx;
padding: 2px 2px 2px 21.05rpx;
border-radius: 80rpx;
background: #EDEFF2;
position: relative;
box-sizing: border-box;
.search_content_wrap {
width: 100%;
.search_content_wrap {
width: 100%;
.icon-sousuo {
font-size: 26.32rpx;
font-weight: bold;
color: #c8c7c6;
margin-right: 17.54rpx;
}
input {
width: 80%;
}
.icon-sousuo {
font-size: 26.32rpx;
font-weight: bold;
color: #c8c7c6;
margin-right: 17.54rpx;
}
.search_btn {
width: 106rpx;
height: 60rpx;
line-height: 60rpx;
background: #40AE36;
border-radius: 100px;
font-size: 28rpx;
color: #fff;
input {
width: 80%;
}
}
.search_btn {
width: 106rpx;
height: 60rpx;
line-height: 60rpx;
background: #40AE36;
border-radius: 100px;
font-size: 28rpx;
color: #fff;
}
}
.category {
position: relative;
width: 100%;
overflow: auto;
margin-bottom: 20rpx;
padding-right: 70rpx;
.category-wrap {
display: flex;
padding-bottom: 10rpx;
padding-bottom: 20rpx;
.category-item {
display: flex;
@ -118,24 +140,6 @@
}
}
}
.category-all {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
height: 100%;
background-color: #f3f3f3;
z-index: 10;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
font-size: 24rpx;
border-radius: 4rpx;
width: 70rpx;
color: #919191;
}
}
.cate {
@ -165,83 +169,42 @@
}
}
}
}
.popup-wrap {
background-color: #fff;
padding: 20rpx;
.comprehensive {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 50rpx;
.popup-wrap-title {
font-size: 36rpx;
color: #333;
font-weight: bold;
margin-bottom: 20rpx;
}
.popup-wrap-category {
width: 100%;
.popup-wrap-category-wrap {
[class^=comprehensive-] {
display: flex;
flex-wrap: wrap;
align-items: center;
.popup-wrap-category-item {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin: 0 20rpx 20rpx 0;
&:nth-child(5n) {
margin-right: 0;
}
text {
margin-top: 16rpx;
font-size: 24rpx;
color: #666666;
white-space: nowrap;
}
.popup-wrap-category-item-text {
width: 120rpx;
text-align: center;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
text {
margin-right: 12rpx;
font-size: 26rpx;
color: #666666;
}
.popup-wrap-category-item-active {
position: relative;
image {
width: 28rpx;
height: 28rpx;
}
.popup-wrap-category-item-img {
border: 2px solid #40AE36;
border-radius: 50%;
}
text {
background-color: #40AE36;
color: #fff;
padding: 2rpx 10rpx 6rpx 10rpx;
border-radius: 50rpx;
}
.loudou {
width: 24rpx;
height: 24rpx;
}
}
}
}
.wholeSale-con {
height: 100vh;
margin: 0 20rpx;
padding-bottom: 30rpx;
}
}
</style>
<template>
<view class="wholeSale">
<!-- 顶部 -->
<view class="wholeSale-header">
<view class="wholeSale-header" style="position: fixed;top: 0;left: 0;width: 100%;z-index: 999;">
<!-- 适配不同机 -->
<view style="height: var(--status-bar-height);background-color: #40af37;"></view>
<view style="display: flex;padding: 20rpx 28rpx;background-color: #40af37;color: #fff;">
@ -250,9 +213,11 @@
</view>
</view>
<!-- 分类区域 -->
<view class="wholeSale-section" :style="{height:wrapHeight + 'rpx'}">
<!-- 内容 -->
<view class="wholeSale-con" style="padding-top: calc(var(--status-bar-height) + 100rpx);">
<view class="wholeSale-nav">
<!-- <u-icon class="icon" name="arrow-left" size="20" @click="navBack"></u-icon> -->
<!-- 搜索 -->
<view @click="navTo(`/pages/columnGoods/goods_search/index?back=true&searchVal=${where.keyword}`)"
hover-class="none" class="search_content flex_a_c_j_sb">
<view class="flex_a_c search_content_wrap">
@ -260,6 +225,7 @@
<input type="text" placeholder="搜索商品名称" :value="where.keyword"
placeholder-style="font-size: 30rpx;color:#999;" disabled style="pointer-events: none;">
</view>
<!-- <button class="search_btn">搜索</button> -->
</view>
</view>
@ -281,11 +247,6 @@
</block>
</view>
</scroll-view>
<view class="category-all" v-if="store_category.length > 0" @click="onAllCategory">
<view style="margin-bottom: 20rpx;">全部</view>
<u-icon name="list"></u-icon>
</view>
</view>
<!-- 商品小分类 -->
@ -301,45 +262,26 @@
</view>
</scroll-view>
</view>
</view>
<!-- 内容 -->
<view class="wholeSale-con"
:style="{height:'calc(100vh - '+wrapHeight+'rpx - 142rpx '+(isShowSmall?' - 48rpx':'')+')'}">
<scroll-view :scroll-y="true" @scrolltolower="onScrollBottom" @scroll="onScroll" style="height: 100%;"
:refresher-enabled="true" :refresher-triggered="isTriggered" @refresherpulling="onPulling"
@refresherrefresh="onRefresh" :refresher-threshold="45" :scroll-anchoring='true'>
<view>
<!-- 流水瀑布 -->
<WaterfallsFlow :wfList='hostProduct' @itemTap="goDetail" :type="0" />
<loadmore :type="isLoading" style="padding: 12rpx 0;"></loadmore>
<!-- 综合查询 -->
<!-- <view class="comprehensive">
<view class="comprehensive-price">
<text>价格</text>
<image src="@/static/new_define/priceChange.png"></image>
</view>
</scroll-view>
</view>
<view class="comprehensive-sales_num">
<text>销量</text>
</view>
<view class="comprehensive-discount">
<text>抵扣</text>
<image class="loudou" src="@/static/new_define/loudou.png"></image>
</view>
</view> -->
<!-- 弹框大分类 -->
<uni-popup ref="popup" type="top" border-radius="10px 10px 0 0" z-index="1000">
<view class="popup-wrap">
<view style="height: var(--status-bar-height);"></view>
<view class="popup-wrap-title">分类</view>
<view class="popup-wrap-category">
<view class="popup-wrap-category-wrap">
<block v-for="(item,index) in store_category" :key="index">
<view class="popup-wrap-category-item" :class="{'category-item-active': index==cate_change}"
@click="changeCate(index)">
<u--image class="popup-wrap-category-item-img" width="108rpx" :src="item.pic"
height="108rpx" shape="circle">
<template v-slot:loading>
<u-loading-icon color="#999" size="15" />
</template>
</u--image>
<text class="popup-wrap-category-item-text">{{item.cate_name}}</text>
</view>
</block>
</view>
</view>
</view>
</uni-popup>
<!-- 流水瀑布 -->
<WaterfallsFlow :wfList='hostProduct' @itemTap="goDetail" :type="0" />
<loadmore :type="isLoading"></loadmore>
</view>
</view>
</template>
@ -368,68 +310,27 @@
page: 1,
limit: 20,
mer_type: 1, //1-, 2-, 3-
cate_pid: '',
mer_cate_id: '',
keyword: '',
deduction_rate: '', //
rand: 1
},
wrapHeight: 300,
isShowSmall: false,
scrollTop: 0,
isTriggered: true
}
}
},
onLoad(option) {
this.getStoreCategory();
this.getProductslist(true);
},
onPageScroll(e) {
onReachBottom() {
this.getProductslist();
},
onPageScroll() {
uni.$emit('scroll');
},
watch: {
'where.cate_pid'(newVal, oldVal) {
if (newVal && !oldVal) {
this.wrapHeight = 300 + 48;
this.isShowSmall = true;
}
if (!newVal && oldVal) {
this.wrapHeight = 300;
this.isShowSmall = false;
}
}
onPullDownRefresh() {
this.getProductslist(true);
},
methods: {
//
onPulling() {
if (!this.isTriggered) {
this.isTriggered = true;
this.getProductslist(true);
}
},
onRefresh(e) {
this.isTriggered = true;
},
onScrollBottom(e) {
this.getProductslist();
},
onAllCategory() {
this.$refs.popup.open();
},
onScroll(e) {
if (this.scrollTop > e.target.scrollTop) { //
this.wrapHeight = 300;
if (this.where.cate_pid) this.wrapHeight = this.wrapHeight + 48;
} else {
this.wrapHeight = 0;
}
this.scrollTop = e.target.scrollTop;
},
navTo(url) {
uni.navigateTo({
url: url,
@ -443,11 +344,12 @@
}
})
},
navBack() {
uni.navigateBack();
},
tabsChange(e) {
this.tabsCurr = e;
},
changeCate(e) {
this.cate_change = e;
this.store_category_children = [];
@ -457,16 +359,13 @@
store_category_id: ''
})
this.cate_change_children = 0;
this.where.cate_pid = this.store_category[e].store_category_id;
this.where.mer_cate_id = this.store_category[e].store_category_id;
this.getProductslist(true);
this.$refs.popup && this.$refs.popup.close();
},
changeChildrenCate(e) {
this.cate_change_children = e;
this.where.cate_pid = this.store_category_children[e].store_category_id;
if (e == 0) this.where.cate_pid = this.store_category[this.cate_change]
this.where.mer_cate_id = this.store_category_children[e].store_category_id;
if (e == 0) this.where.mer_cate_id = this.store_category[this.cate_change]
.store_category_id; // , id
this.getProductslist(true);
},
@ -492,17 +391,16 @@
}
if (this.isLoading == -1) return;
this.isLoading = 1;
getProductslist(this.where).then(res => {
this.where.limit = res.data.limit
this.where.page = res.data.page
this.isTriggered = false;
uni.stopPullDownRefresh();
this.hostProduct = [...this.hostProduct, ...res.data.list];
this.isLoading = 0;
if (res.data.list.length < this.where.limit) this.isLoading = -1;
this.where.page++;
}).catch(err => {
this.isTriggered = false;
uni.stopPullDownRefresh();
})
},
goDetail(item) {

File diff suppressed because it is too large Load Diff

View File

@ -1,36 +1,238 @@
<style lang="scss" scoped>
page {
background-color: #f8fafb !important;
}
.wholeSale {
background-color: #f8fafb !important;
.wholeSale-header {
margin-bottom: 20rpx;
// background-color: #40AE36;
.scrollview {
display: flex;
align-items: center;
height: 98rpx;
padding-left: 32rpx;
.scrollview-item {
margin-right: 30rpx;
font-size: 28rpx;
color: #FFFFFF;
}
.scrollview-active {
position: relative;
font-weight: bold;
font-size: 36rpx;
color: #FFFFFF;
&::after {
content: "";
display: inline-block;
position: absolute;
bottom: -6rpx;
left: 50%;
transform: translateX(-50%);
width: 100%;
height: 6rpx;
background-color: #FFFFFF;
}
}
}
}
.wholeSale-con {
margin: 0 20rpx;
.wholeSale-nav{
display: flex;
align-items: center;
margin-bottom: 40rpx;
.icon{
margin-right: 20rpx;
}
}
.search_content {
// margin-bottom: 40rpx;
flex: 1;
height: 70rpx;
padding: 2px 2px 2px 21.05rpx;
border-radius: 80rpx;
background: #EDEFF2;
position: relative;
box-sizing: border-box;
.search_content_wrap {
width: 100%;
.icon-sousuo {
font-size: 26.32rpx;
font-weight: bold;
color: #c8c7c6;
margin-right: 17.54rpx;
}
input {
width: 80%;
}
}
.search_btn {
width: 106rpx;
height: 60rpx;
line-height: 60rpx;
pic: #40AE36;
border-radius: 100px;
font-size: 28rpx;
color: #fff;
}
}
.category {
width: 100%;
overflow: auto;
margin-bottom: 20rpx;
.category-wrap {
display: flex;
padding-bottom: 20rpx;
.category-item {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin-right: 38rpx;
text {
margin-top: 16rpx;
font-size: 24rpx;
color: #666666;
white-space: nowrap;
}
.category-item-text {
width: 120rpx;
text-align: center;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
.category-item-active {
position: relative;
.category-item-img {
border: 2px solid #40AE36;
border-radius: 50%;
}
text {
background-color: #40AE36;
color: #fff;
padding: 2rpx 10rpx 6rpx 10rpx;
border-radius: 50rpx;
}
}
}
}
.cate {
width: 100%;
overflow: auto;
margin-bottom: 30rpx;
.cate-wrap {
display: flex;
padding-bottom: 8rpx;
.cate-item {
text {
padding: 4rpx 16rpx;
white-space: nowrap;
font-size: 30rpx;
color: #333;
}
}
.cate-item-active {
text {
color: #40AE36;
font-weight: bold;
}
}
}
}
.comprehensive {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 50rpx;
[class^=comprehensive-] {
display: flex;
align-items: center;
text {
margin-right: 12rpx;
font-size: 26rpx;
color: #666666;
}
image {
width: 28rpx;
height: 28rpx;
}
.loudou {
width: 24rpx;
height: 24rpx;
}
}
}
}
}
</style>
<template>
<view class="wholeSale">
<!-- 适配不同机 -->
<view class="wholeSale-header">
<view class="wholeSale">
<!-- 顶部 -->
<view class="wholeSale-header" style="position: fixed;top: 0;left: 0;width: 100%;z-index: 999;">
<!-- 适配不同机 -->
<view style="height: var(--status-bar-height);background-color: #40af37;"></view>
<view style="display: flex;padding: 20rpx 28rpx;background-color: #40af37;color: #fff;">
<view style="display: flex;font-weight: bold;font-size: 32rpx;"><u-icon style="margin-right: 20rpx;"
name="arrow-left" size="20" color="#fff" @click="navBack"></u-icon>名优特产</view>
</view>
<view style="display: flex;padding: 20rpx 28rpx;background-color: #40af37;color: #fff;">
<view style="display: flex;font-weight: bold;font-size: 32rpx;"><u-icon style="margin-right: 20rpx;" name="arrow-left" size="20" color="#fff" @click="navBack"></u-icon>名优特产</view>
</view>
</view>
<view class="wholeSale-section" :style="{height:wrapHeight + 'rpx'}">
<view class="wholeSale-nav">
<!-- 搜索 -->
<view @click="navTo(`/pages/columnGoods/goods_search/index?back=true&searchVal=${where.keyword}`)"
hover-class="none" class="search_content flex_a_c_j_sb">
<view class="flex_a_c search_content_wrap">
<view class="iconfont icon-sousuo" style="font-size: 39rpx;"></view>
<input type="text" placeholder="搜索商品名称" :value="where.keyword"
placeholder-style="font-size: 30rpx;color:#999;" disabled style="pointer-events: none;">
</view>
</view>
</view>
<!-- 内容 -->
<view class="wholeSale-con" style="padding-top: calc(var(--status-bar-height) + 100rpx);">
<view class="wholeSale-nav">
<!-- <u-icon class="icon" name="arrow-left" size="20" @click="navBack"></u-icon> -->
<!-- 搜索 -->
<view @click="navTo(`/pages/columnGoods/goods_search/index?back=true&searchVal=${where.keyword}`)" hover-class="none"
class="search_content flex_a_c_j_sb">
<view class="flex_a_c search_content_wrap">
<view class="iconfont icon-sousuo" style="font-size: 39rpx;"></view>
<input type="text" placeholder="搜索商品名称" :value="where.keyword" placeholder-style="font-size: 30rpx;color:#999;"
disabled style="pointer-events: none;">
</view>
<!-- <button class="search_btn">搜索</button> -->
</view>
</view>
<!-- 商品大分类 -->
<view class="category">
<scroll-view scroll-x="true">
<view class="category-wrap">
<block v-for="(item,index) in store_category" :key="index">
<view class="category-item" :class="{'category-item-active': index==cate_change}"
@click="changeCate(index)">
<u--image class="category-item-img" width="108rpx" :src="item.pic" height="108rpx"
shape="circle">
<view class="category-item" :class="{'category-item-active': index==cate_change}" @click="changeCate(index)">
<u--image class="category-item-img" width="108rpx" :src="item.pic" height="108rpx" shape="circle">
<template v-slot:loading>
<u-loading-icon color="#999" size="15" />
</template>
@ -40,11 +242,6 @@
</block>
</view>
</scroll-view>
<view class="category-all" v-if="store_category.length > 0" @click="onAllCategory">
<view style="margin-bottom: 20rpx;">全部</view>
<u-icon name="list"></u-icon>
</view>
</view>
<!-- 商品小分类 -->
@ -52,53 +249,33 @@
<scroll-view scroll-x="true">
<view class="cate-wrap">
<block v-for="(item,index) in store_category_children" :key="index">
<view class="cate-item" :class="{'cate-item-active':index == cate_change_children}"
@click="changeChildrenCate(index)">
<view class="cate-item" :class="{'cate-item-active':index == cate_change_children}" @click="changeChildrenCate(index)">
<text>{{item.cate_name}}</text>
</view>
</block>
</view>
</scroll-view>
</view>
</view>
<!-- 内容 -->
<view class="wholeSale-con" :style="{height:'calc(100vh - '+wrapHeight+'rpx - 142rpx )'}">
<scroll-view :scroll-y="true" @scrolltolower="onScrollBottom" @scroll="onScroll" style="height: 100%;"
:refresher-enabled="true" :refresher-triggered="isTriggered" @refresherpulling="onPulling"
@refresherrefresh="onRefresh" :refresher-threshold="45" :scroll-anchoring='true'>
<view>
<!-- 流水瀑布 -->
<WaterfallsFlow :wfList='hostProduct' @itemTap="goDetail" :type="0" />
<loadmore :type="isLoading" style="padding: 12rpx 0;"></loadmore>
<!-- 综合查询 -->
<!-- <view class="comprehensive">
<view class="comprehensive-price">
<text>价格</text>
<image src="@/static/new_define/priceChange.png"></image>
</view>
</scroll-view>
</view>
<view class="comprehensive-sales_num">
<text>销量</text>
</view>
<view class="comprehensive-discount">
<text>抵扣</text>
<image class="loudou" src="@/static/new_define/loudou.png"></image>
</view>
</view> -->
<!-- 弹框大分类 -->
<uni-popup ref="popup" type="top" border-radius="10px 10px 0 0" z-index="1000">
<view class="popup-wrap">
<view style="height: var(--status-bar-height);"></view>
<view class="popup-wrap-title">分类</view>
<view class="popup-wrap-category">
<view class="popup-wrap-category-wrap">
<block v-for="(item,index) in store_category" :key="index">
<view class="popup-wrap-category-item"
:class="{'popup-wrap-category-item-active': index==cate_change}"
@click="changeCate(index)">
<u--image class="popup-wrap-category-item-img" width="108rpx" :src="item.pic"
height="108rpx" shape="circle">
<template v-slot:loading>
<u-loading-icon color="#999" size="15" />
</template>
</u--image>
<text class="popup-wrap-category-item-text">{{item.cate_name}}</text>
</view>
</block>
</view>
</view>
</view>
</uni-popup>
<!-- 流水瀑布 -->
<WaterfallsFlow :wfList='hostProduct' @itemTap="goDetail" :type="0" />
<loadmore :type="isLoading"></loadmore>
</view>
</view>
</template>
@ -107,149 +284,108 @@
goShopDetail
} from '@/libs/order.js'
import WaterfallsFlow from '@/components/WaterfallsFlow/WaterfallsFlow.vue'
import {
getCategoryIndexList,
getProductslist
} from "@/api/store.js"
import {
getCategoryIndexList,
getProductslist
} from "@/api/store.js"
export default {
components: {
WaterfallsFlow
},
data() {
return {
hostProduct: [],
store_category: [], //
store_category_children: [], //
cate_change: 0,
cate_change_children: 0,
isLoading: 0,
where: {
page: 1,
limit: 20,
cate_pid: '',
keyword: '',
mer_type: 3, //1-, 2-, 3-
sale_type: 1, //1-, 2-
},
wrapHeight: 300,
scrollTop: 0,
isTriggered: true
hostProduct: [],
store_category: [], //
store_category_children: [], //
cate_change: 0,
cate_change_children: 0,
isLoading: 0,
where: {
page: 1,
limit: 20,
cate_pid: '',
keyword: '',
mer_type: 3, //1-, 2-, 3-
sale_type: 1, //1-, 2-
}
}
},
onLoad(option) {
this.getCategoryIndexList();
this.getProductslist(true);
},
onPageScroll() {
uni.$emit('scroll');
},
onLoad(option){
this.getCategoryIndexList();
this.getProductslist(true);
},
onReachBottom() {
this.getProductslist();
},
onPageScroll() {
uni.$emit('scroll');
},
methods: {
//
onPulling() {
if (!this.isTriggered) {
this.isTriggered = true;
this.getProductslist(true);
}
},
onRefresh(e) {
this.isTriggered = true;
},
onScrollBottom(e) {
this.getProductslist();
},
onAllCategory() {
this.$refs.popup.open();
},
onScroll(e) {
if (this.scrollTop > e.target.scrollTop) { //
this.wrapHeight = 300;
} else {
this.wrapHeight = 0;
}
this.scrollTop = e.target.scrollTop;
},
navTo(url) {
uni.navigateTo({
url: url,
success: () => {
uni.$once('searchValue', (e) => {
this.$nextTick(() => {
this.where.keyword = e;
this.getProductslist(true);
})
})
}
})
},
navBack() {
uni.navigateBack();
},
changeCate(e) {
this.cate_change = e;
this.store_category_children = [{
cate_name: '全部',
store_category_id: ''
}];
if (this.store_category[e].children) this.store_category_children = [...this.store_category_children, ...
this.store_category[e].children
];
this.cate_change_children = 0;
this.where.cate_pid = this.store_category[e].store_category_id;
this.getProductslist(true);
this.$refs.popup && this.$refs.popup.close();
this.$forceUpdate();
},
changeChildrenCate(e) {
this.cate_change_children = e;
this.where.cate_pid = this.store_category_children[e].store_category_id;
if (e == 0) this.where.cate_pid = this.store_category[this.cate_change]
.store_category_id; // , id
this.getProductslist(true);
},
getCategoryIndexList() {
getCategoryIndexList({
mer_type: this.where.mer_type,
sale_type: this.where.sale_type
}).then(res => {
this.store_category = [{
cate_name: '全部',
pic: 'https://lihai001.oss-cn-chengdu.aliyuncs.com/def/0bc7a202404021652194310.png',
store_category_id: ''
}, ...res.data];
this.store_category_children = this.store_category[0].children || [];
this.store_category_children.unshift({
cate_name: '全部',
store_category_id: ''
})
})
},
getProductslist(reLoad = false) {
if (reLoad) {
this.where.page = 1;
this.hostProduct = [];
this.isLoading = 0;
}
if (this.isLoading == -1) return;
this.isLoading = 1;
getProductslist(this.where).then(res => {
this.isTriggered = false;
this.hostProduct = [...this.hostProduct, ...res.data.list];
this.where.page++;
this.isLoading = 0;
if (res.data.list.length < this.where.limit) this.isLoading = -1;
}).catch(() => {
this.isTriggered = false;
})
navTo(url){
uni.navigateTo({
url:url,
success: () => {
uni.$once('searchValue', (e)=>{
this.$nextTick(()=>{
this.where.keyword = e;
this.getProductslist(true);
})
})
}
})
},
navBack(){
uni.navigateBack();
},
tabsChange(e) {
this.tabsCurr = e;
},
changeCate(e){
this.cate_change = e;
this.store_category_children = [{
cate_name: '全部',
store_category_id: ''
}];
if(this.store_category[e].children) this.store_category_children = [...this.store_category_children, ...this.store_category[e].children];
this.cate_change_children = 0;
this.where.cate_pid = this.store_category[e].store_category_id;
this.getProductslist(true);
},
changeChildrenCate(e){
this.cate_change_children = e;
this.where.cate_pid = this.store_category_children[e].store_category_id;
if(e==0) this.where.cate_pid = this.store_category[this.cate_change].store_category_id; // , id
this.getProductslist(true);
},
getCategoryIndexList(){
getCategoryIndexList({mer_type: this.where.mer_type, sale_type: this.where.sale_type}).then(res=>{
this.store_category = [{
cate_name: '全部',
pic: 'https://lihai001.oss-cn-chengdu.aliyuncs.com/def/0bc7a202404021652194310.png',
store_category_id: ''
}, ...res.data];
this.store_category_children = this.store_category[0].children || [];
this.store_category_children.unshift({
cate_name: '全部',
store_category_id: ''
})
})
},
getProductslist(reLoad=false){
if(reLoad){
this.where.page = 1;
this.hostProduct = [];
this.isLoading = 0;
}
if(this.isLoading==-1)return;
this.isLoading = 1;
getProductslist(this.where).then(res=>{
this.hostProduct = [...this.hostProduct, ...res.data.list];
this.where.page++;
this.isLoading = 0;
if(res.data.list.length<this.where.limit) this.isLoading = -1;
})
},
goDetail(item) {
goShopDetail(item, this.uid).then(res => {
if (this.isLogin) {
@ -272,216 +408,4 @@
}
}
}
</script>
<style lang="scss" scoped>
page {
background-color: #f8fafb !important;
}
.wholeSale {
.wholeSale-header {
position: sticky;
top: 0;
z-index: 90;
background-color: #40AE36;
}
.wholeSale-section {
position: sticky;
top: calc(82rpx + var(--status-bar-height));
padding: 0rpx 20rpx;
background-color: #fff;
transition: height .5s;
overflow: hidden;
margin-bottom: 20rpx;
padding-top: 20rpx;
z-index: 20;
.wholeSale-nav {
display: flex;
align-items: center;
margin-bottom: 40rpx;
.icon {
margin-right: 20rpx;
}
.search_content {
flex: 1;
height: 70rpx;
padding: 2px 2px 2px 21.05rpx;
border-radius: 80rpx;
background: #EDEFF2;
position: relative;
box-sizing: border-box;
.search_content_wrap {
width: 100%;
.icon-sousuo {
font-size: 26.32rpx;
font-weight: bold;
color: #c8c7c6;
margin-right: 17.54rpx;
}
input {
width: 80%;
}
}
.search_btn {
width: 106rpx;
height: 60rpx;
line-height: 60rpx;
pic: #40AE36;
border-radius: 100px;
font-size: 28rpx;
color: #fff;
}
}
}
.category {
position: relative;
width: 100%;
overflow: auto;
margin-bottom: 20rpx;
padding-right: 70rpx;
.category-wrap {
display: flex;
padding-bottom: 20rpx;
.category-item {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin-right: 38rpx;
text {
margin-top: 16rpx;
font-size: 24rpx;
color: #666666;
white-space: nowrap;
}
.category-item-text {
width: 120rpx;
text-align: center;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
.category-item-active {
position: relative;
.category-item-img {
border: 2px solid #40AE36;
border-radius: 50%;
}
text {
background-color: #40AE36;
color: #fff;
padding: 2rpx 10rpx 6rpx 10rpx;
border-radius: 50rpx;
}
}
}
.category-all {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
height: 100%;
background-color: #f3f3f3;
z-index: 10;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
font-size: 24rpx;
border-radius: 4rpx;
width: 70rpx;
color: #919191;
}
}
}
.popup-wrap {
background-color: #fff;
padding: 20rpx;
.popup-wrap-title {
font-size: 36rpx;
color: #333;
font-weight: bold;
margin-bottom: 20rpx;
}
.popup-wrap-category {
width: 100%;
.popup-wrap-category-wrap {
display: flex;
flex-wrap: wrap;
.popup-wrap-category-item {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin: 0 20rpx 20rpx 0;
&:nth-child(5n) {
margin-right: 0;
}
text {
margin-top: 16rpx;
font-size: 24rpx;
color: #666666;
white-space: nowrap;
}
.popup-wrap-category-item-text {
width: 120rpx;
text-align: center;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
.popup-wrap-category-item-active {
position: relative;
.popup-wrap-category-item-img {
border: 2px solid #40AE36;
border-radius: 50%;
}
text {
background-color: #40AE36;
color: #fff;
padding: 2rpx 10rpx 6rpx 10rpx;
border-radius: 50rpx;
}
}
}
}
}
.wholeSale-con {
padding-bottom: 30rpx;
margin: 0 20rpx;
}
}
</style>
</script>

File diff suppressed because it is too large Load Diff

View File

@ -1,191 +0,0 @@
<template>
<view class="" style="width: 750rpx;height: 100%;">
<view class="jump" @click="jump">
<text class="font">跳过</text>
</view>
<view class="tabbar" :style="{top:(top-12)+'px',left:(left-12)+'px'}">
<image src="https://lihai001.oss-cn-chengdu.aliyuncs.com/def/0fa43202312291702314919.png" class="tab-icon">
</image>
</view>
<view class="" class="pointe" :style="{ left:(left-10)+'px',top:(top)+'px'}">
<image src="/static/images/pointer.png" style="width: 254rpx;height: 254rpx;" mode=""></image>
</view>
<view class="center" :style="{left:(left+20)+'px', top:(top+55)+'px'}">
<image src="/static/images/greenLineDown.png" style="width:35px;height: 60px;" mode=""></image>
</view>
<view class="tips-box" :style="{ left:left+'px',top:(top+80)+'px'}">
<view class="tips" style="position: absolute;padding-left: 10rpx;">
<view class="tras" :class="{act:isActive}">
<text style="font-size: 28rpx;line-height: 100rpx;color: white;">点击供销助农平台进入商户平台</text>
</view>
</view>
<image src="/static/images/starpng.png" class="start" mode="">
</image>
</view>
<view class="next-btn center">
<text class="next-btn-text font" @click="next">下一步(2/4)</text>
</view>
</view>
</template>
<script>
import {
isNewMer
} from '@/api/user.js';
export default {
data() {
return {
isActive: false,
left: 0,
top: 0,
subNVue: null,
offsetX: 0,
offsetY: 0,
iconWidth: 0,
}
},
methods: {
next() {
this.subNVue.hide('zoom-in', 300, )
setTimeout(() => {
uni.$emit('diverGatherSubEmit');
}, 500)
},
jump() {
isNewMer(this.$store.state.app.userInfo.uid, this.$store.state.app.userInfo.service?.mer_id, {
done: 1
}).then(res => {
console.log(res, 'res')
})
}
},
onLoad() {
let that = this
this.subNVue = uni.getSubNVueById('concat')
uni.$on('diverGatherEmit', (data) => {
that.left = data.left
that.top = data.top
})
setTimeout(() => {
that.isActive = true
}, 500)
}
}
</script>
<style>
.jump {
position: absolute;
right: 30rpx;
top: 80rpx;
border: 1px solid white;
padding: 10rpx 20rpx;
border-radius: 30rpx;
}
/* .tips {
width: 462rpx;
height: 106rpx;
background-color: #5BE157;
border-radius: 20rpx;
} */
.tips-box {
width: 462rpx;
height: 178rpx;
position: absolute;
padding-top: 72rpx;
position: absolute;
}
.start {
width: 72rpx;
height: 72rpx;
position: absolute;
right: 0;
top: 20px;
}
.tips {
width: 462rpx;
height: 106rpx;
background-color: #5BE157;
border-radius: 20rpx;
}
.center {
position: absolute;
left: 375rpx;
transform: translateX(-50%);
}
.tabbar {
width: 136rpx;
height: 136rpx;
background-color: white;
border-radius: 136rpx;
position: absolute;
}
.tab-icon {
width: 50rpx;
height: 50rpx;
position: absolute;
left: 68rpx;
transform: translate(-50%, -50%);
top: 68rpx;
}
.te {
font-size: 20rpx;
position: absolute;
left: 68rpx;
transform: translate(-50%, 0);
top: 100rpx;
}
.pointe {
position: absolute;
}
.tras {
padding-left: 10rpx;
position: absolute;
z-index: 999 !important;
width: 20px;
transition-property: width;
transition-duration: 3s;
transition-delay: 0.1s;
transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1.0);
}
.act {
width: 462rpx;
}
.font {
font-size: 28rpx;
color: white;
lines: 1;
}
.next-btn {
position: absolute;
bottom: 100px;
left: 375rpx;
transform: translateX(-50%);
width: 240rpx;
height: 76rpx;
border: 1px solid white;
border-radius: 38rpx;
background-color: rgba(255, 255, 255, 0.4);
}
.next-btn-text {
line-height: 76rpx;
text-align: center;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@ -1,45 +0,0 @@
<template>
<view class="">
<video :src="url" style="width: 750rpx;height: 1400rpx;" :autoplay='true' id="myvideo" controls></video>
</view>
</template>
<script>
export default {
data() {
return {
url: ""
}
},
methods: {
videoPlay() {
console.log("开始播放了")
},
videoShow() {
this.videoContext = uni.createVideoContext("myvideo", this); // this这个是实例对象 必传
this.videoUrl = this.url;
this.videoContext.requestFullScreen({
// direction: 90
});
this.videoContext.play();
this.videoPlay = true; // 显示播放盒子
}
},
onLoad(option) {
this.url = option.url
setTimeout(() => {
this.videoShow()
})
}
}
</script>
<style>
</style>

View File

@ -18,13 +18,6 @@
我是农民用户
</view>
</view>
<view class="li" style="margin-top: 50rpx;" @click="navSw('/pages/index/index',true)">
<u-image src="https://lihai001.oss-cn-chengdu.aliyuncs.com/public/static/merchant.webp" width="690rpx"
height="200rpx" style="position: absolute;"></u-image>
<view class="btn">
我是商户
</view>
</view>
</view>
</template>
@ -44,9 +37,7 @@
url
})
},
navSw(url, isNewStore) {
uni.setStorageSync('newStore', Boolean(isNewStore))
// return
navSw(url) {
uni.switchTab({
url: url
})

File diff suppressed because it is too large Load Diff

View File

@ -29,6 +29,11 @@
</swiper-item>
</block>
</swiper>
<!-- <view class="dots" :class="'dot'+txtStyle">
<block v-for="(item,index) in imgUrls" :key="index">
<view class="dot" :class="[docConfig == 1 ? 'square' : docConfig == 0 ? 'circular' : 'nodoc',index == swiperCur ? ' active' : '']"></view>
</block>
</view> -->
</view>
</block>
</view>

View File

@ -3,30 +3,22 @@
<!-- #ifdef MP || APP-PLUS -->
<view style="visibility: hidden;" :style="{ height: navHeight + 'rpx' }" v-if="isFixed"></view>
<!-- #endif -->
<view class="navTabBox tabNav" :class="{isFixed:isFixed}"
:style="'background:'+bgColor+';margin-top:'+mbConfig+'rpx;color:'+txtColor+';top:'+isTop">
<view class="navTabBox tabNav" :class="{isFixed:isFixed}" :style="'background:'+bgColor+';margin-top:'+mbConfig+'rpx;color:'+txtColor+';top:'+isTop">
<view class="longTab" :style='"width:"+mainWidth+"px"'>
<scroll-view scroll-x="true" style="white-space: nowrap; display: flex;" scroll-with-animation
:scroll-left="tabLeft" show-scrollbar="true">
<view class="longItem"
:style="'width:'+isWidth+'px;color:'+(index===tabClick ? activeColor : txtColor)"
:data-index="index" :class="index===tabClick?'click':''" v-for="(item,index) in tabTitle"
:key="index" :id="'id'+index" @click="longClick(index,item.store_category_id,item.pid)">
{{item.cate_name}}</view>
<scroll-view scroll-x="true" style="white-space: nowrap; display: flex;" scroll-with-animation :scroll-left="tabLeft" show-scrollbar="true">
<view class="longItem" :style="'width:'+isWidth+'px;color:'+(index===tabClick ? activeColor : txtColor)" :data-index="index" :class="index===tabClick?'click':''" v-for="(item,index) in tabTitle" :key="index" :id="'id'+index" @click="longClick(index,item.store_category_id,item.pid)">{{item.cate_name}}</view>
<view class="underlineBox" :style='"transform:translateX("+isLeft+"px);width:"+isWidth+"px"'>
<view class="underline" :style="'background-color:'+activeColor"></view>
</view>
</scroll-view>
</view>
<navigator v-if="merId" :url="'/pages/store/home/index?id='+merId+'&type=2'" class="category"
hover-class="none" :style="'background-color:'+bgColor+';color:'+txtColor">
<navigator v-if="merId" :url="'/pages/store/home/index?id='+merId+'&type=2'" class="category" hover-class="none" :style="'background-color:'+bgColor+';color:'+txtColor">
<text class="iconfont icon-fenlei3"></text>分类
</navigator>
<navigator v-else open-type='switchTab' url="/pages/goods_cate/goods_cate" class="category"
hover-class="none" :style="'background-color:'+bgColor+';color:'+txtColor">
<navigator v-else open-type='switchTab' url="/pages/goods_cate/goods_cate" class="category" hover-class="none" :style="'background-color:'+bgColor+';color:'+txtColor">
<text class="iconfont icon-fenlei3"></text>分类
</navigator>
</view>
</view>
</view>
</template>
@ -40,9 +32,7 @@
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import {
getCateData
} from '@/api/api.js';
import { getCateData } from '@/api/api.js';
let app = getApp();
export default {
name: 'navTab',
@ -71,13 +61,13 @@
isLeft: 0, //线
isWidth: 0, //
mainWidth: 0,
tabLeft: 0,
swiperIndex: 0,
childIndex: 0,
childID: 0,
bgColor: this.dataConfig.bgColor.color[0].item,
mbConfig: this.dataConfig.mbConfig.val * 2,
txtColor: this.dataConfig.txtColor.color[0].item,
tabLeft:0,
swiperIndex:0,
childIndex:0,
childID:0,
bgColor:this.dataConfig.bgColor.color[0].item,
mbConfig:this.dataConfig.mbConfig.val * 2,
txtColor:this.dataConfig.txtColor.color[0].item,
activeColor: this.dataConfig.activeColor.color[0].item,
fixedTop: 0,
isTop: 0,
@ -86,12 +76,12 @@
unique: this.dataConfig.timestamp,
};
},
watch: {
watch:{
// #ifdef MP || APP-PLUS
isFixed(nVal, oVal) {
if (nVal) {
isFixed(nVal,oVal){
if(nVal){
this.isTop = (uni.getSystemInfoSync().statusBarHeight + 43) + 'px'
} else {
}else{
this.isTop = 0
}
}
@ -102,9 +92,9 @@
that.getCateData()
//
uni.getSystemInfo({
success(e) {
success(e) {
that.mainWidth = e.windowWidth
that.isWidth = (e.windowWidth - 65) / 4
that.isWidth = (e.windowWidth-65) / 4
}
})
setTimeout((e) => {
@ -127,14 +117,14 @@
// #ifdef H5
this.isTop = 0
// #endif
},
methods: {
getCateData() {
getCateData(){
getCateData({
diy_id: this.diy_id,
unique: this.unique,
}).then(res => {
}).then(res => {
res.data.unshift({
cate_name: '首页'
});
@ -142,36 +132,36 @@
});
},
//
longClick(index, id, fid) {
longClick(index,id,fid){
app.globalData.fid = fid;
this.childIndex = 0;
if (this.tabTitle.length > 3) {
if(this.tabTitle.length>3){
var tempIndex = index - 2;
tempIndex = tempIndex <= 0 ? 0 : tempIndex;
this.tabLeft = (index - 2) * this.isWidth //线
tempIndex = tempIndex<=0 ? 0 : tempIndex;
this.tabLeft = (index-2) * this.isWidth //线
}
this.tabClick = index //
this.isLeft = index * this.isWidth //线
let obj = {
index: index,
pid: id //id
index:index,
pid:id//id
}
if (!this.merId) {
if(!this.merId){
this.parentEmit(obj);
} else {
if (id) {
}else{
if(id){
uni.navigateTo({
url: '/pages/store/list/index?id=' + id + '&mer_id=' + this.merId
url: '/pages/store/list/index?id='+id+'&mer_id='+this.merId
});
} else {
}else{
uni.navigateTo({
url: '/pages/store/home/index?id=' + this.merId
url: '/pages/store/home/index?id='+this.merId
});
}
}
}
},
parentEmit(obj) {
parentEmit(obj){
this.$emit('changeTab', obj);
}
}
@ -182,13 +172,11 @@
.tabNav {
padding-top: 10rpx;
}
.navTabBox {
width: 100%;
color: rgba(255, 255, 255, 1);
position: relative;
padding-bottom: 10rpx;
&.isFixed {
z-index: 10;
position: fixed;
@ -198,21 +186,18 @@
top: 0;
/* #endif */
}
.click {
color: white;
}
.longTab {
/* #ifdef H5 */
padding-right: 106rpx;
/* #endif */
/* #ifdef MP || APP-PLUS */
padding-right: 116rpx;
/* #endif */
.longItem {
height: 50upx;
.longItem{
height: 50upx;
display: inline-block;
line-height: 50upx;
text-align: center;
@ -222,14 +207,12 @@
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
&.click {
&.click{
font-weight: bold;
font-size: 30rpx;
color: #E93323;
}
}
.underlineBox {
height: 3px;
width: 20%;
@ -237,20 +220,13 @@
align-content: center;
justify-content: center;
transition: .5s;
.underline {
width: 33rpx;
height: 4rpx;
}
}
}
.category_wrap {
transition: height .4s;
overflow: hidden;
}
.category {
.category{
position: absolute;
right: 0;
top: 10rpx;
@ -267,15 +243,13 @@
line-height: 50upx;
z-index: 3;
padding: 0 15rpx 0 25rpx;
.iconfont {
.iconfont{
font-size: 30rpx;
margin-right: 6rpx;
margin-right:6rpx;
}
}
}
.child-box {
.child-box{
width: 100%;
position: relative;
background-color: #fff;
@ -284,46 +258,40 @@
/* #endif */
/* #ifdef MP */
box-shadow: 0 2rpx 3rpx 1rpx #f9f9f9;
/* #endif */
.wrapper {
.wrapper{
display: flex;
align-items: center;
padding: 20rpx 0;
background: #fff;
}
.child-item {
.child-item{
flex-shrink: 0;
width: 140rpx;
width:140rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin-left: 10rpx;
image {
image{
width: 90rpx;
height: 90rpx;
border-radius: 50%;
}
.txt {
.txt{
font-size: 24rpx;
color: #282828;
text-align: center;
margin-top: 10rpx;
}
&.on {
image {
&.on{
image{
border: 1px solid $theme-color-opacity;
}
.txt {
.txt{
color: $theme-color;
}
}
}
}
</style>
</style>

View File

@ -11,8 +11,8 @@
<!-- #ifdef H5 -->
<homeComb v-if="smallPage" class="home-comb" :isScale="isScale" :isMenu="isMenu"
:dataConfig="homeCombData" :userInfo="userInfo" :isFixed="isFixed" :isScrolled="isScrolled"
@changeDiy="changeDiy">
</homeComb>
@changeDiy="changeDiy"></homeComb>
<!-- <card></card> -->
<view v-for="(item, index) in styleConfig" :key="index">
<block
v-if="item.name != 'headerSerch' && item.name != 'tabNav' && item.name != 'shopList' && item.name != 'homeComb' && item.name != 'hotRanking' && item.name != 'pageFoot'">
@ -39,33 +39,12 @@
<hotRanking :dataConfig="item"></hotRanking>
</block>
</view>
<view class="main" v-show="navIndex == 0">
<!-- 首页推荐 -->
<view v-if="recommend_switch == 1" class="index-product-wrapper">
<!-- 首发新品 -->
<recommend ref="recommendRef" :hostProduct="hostProduct[hostIndex]"
@changeRecommedTab="changeRecommedTab" showTab :indexP="true" :isLogin="isLogin"
:loading="hotLoading[hostIndex]" :hotTitle="hotTitle">
</recommend>
<view class="loadingicon acea-row row-center-wrapper"
v-if="hostProduct[hostIndex].length > 0 || hotLoading[hostIndex]">
<text class="loading iconfont icon-jiazai"
:hidden="hotLoading[hostIndex] == false"></text>
{{ hotTitle }}
</view>
</view>
</view>
<view v-show="navIndex == 0" class="loadingicon acea-row row-center-wrapper"
v-if="tempArr.length && styleConfig[styleConfig.length - 1].name == 'promotionList'">
<text class="loading iconfont icon-jiazai" :hidden="loading == false"></text>
{{ loadTitle }}
</view>
<!-- #endif -->
<!-- #ifdef MP || APP-PLUS -->
<homeComb class="home-comb" v-if="smallPage" :isScale="isScale" :isMenu="isMenu"
:dataConfig="homeCombData" :isFixed="isFixed" :isScrolled="isScrolled" :userInfo="userInfo"
@changeDiy="changeDiy" @bindHeight="bindHeighta"></homeComb>
<!-- <card></card> -->
<block v-for="(item, index) in styleConfig" :key="index">
<view v-show="navIndex == 0">
<homeComb v-if="item.name == 'homeComb' && !smallPage" :isMenu="isMenu" :dataConfig="item"
@ -103,14 +82,15 @@
<tabNav v-if="item.name == 'tabNav'" :dataConfig="item" class="tabNav" :tabTitle="navTop"
@bindHeight="bindHeighta" @changeTab="changeTab" :isFixed="isFixed"></tabNav>
</block>
<!-- #endif -->
<!-- 首页推荐 -->
<view class="main">
<view class="index-product-wrapper">
<view class="main" v-show="navIndex == 0">
<!-- 首页推荐 -->
<view v-if="recommend_switch == 1" class="index-product-wrapper">
<!-- 首发新品 -->
<recommend ref="recommendRef" :hostProduct="hostProduct[hostIndex]"
@changeRecommedTab="changeRecommedTab" showTab :indexP="true" :isLogin="isLogin"
:loading="hotLoading[hostIndex]" :hotTitle="hotTitle">
:loading="loading">
</recommend>
<view class="loadingicon acea-row row-center-wrapper"
v-if="hostProduct[hostIndex].length > 0 || hotLoading[hostIndex]">
@ -120,12 +100,11 @@
</view>
</view>
</view>
<view class="loadingicon acea-row row-center-wrapper"
<view v-show="navIndex == 0" class="loadingicon acea-row row-center-wrapper"
v-if="tempArr.length && styleConfig[styleConfig.length - 1].name == 'promotionList'">
<text class="loading iconfont icon-jiazai" :hidden="loading == false"></text>
{{ loadTitle }}
</view>
<!-- #endif -->
</block>
<!-- 分类页 -->
<view class="productList" v-if="navIndex > 0">
@ -281,7 +260,7 @@
<passwordPopup></passwordPopup>
<!-- #endif -->
<!--自定义底部tab栏-->
<!-- <customTab :newData="newData" :activeRouter="activeRouter"></customTab> -->
<customTab :newData="newData" :activeRouter="activeRouter"></customTab>
<view v-if="overflow" class="overflow-mask" @touchmove.stop.prevent="() => {}"></view>
</view>
</template>
@ -298,8 +277,7 @@
var statusBarHeight = uni.getSystemInfoSync().statusBarHeight + 'px';
let app = getApp();
import {
getUserInfo,
isNewMer
getUserInfo
} from '@/api/user.js';
import {
getDiy,
@ -452,8 +430,6 @@
},
data() {
return {
subNvue: null,
diverFlag: true,
domain: HTTP_REQUEST_URL,
couponTypeMsg: {
10: '通用券',
@ -545,29 +521,27 @@
overflow: false,
diyId: 0,
preview: false,
isSupport: true,
isIndexClick: true,
scrollTop: 0,
tabScroll: 0
isSupport: true
};
},
onTabItemTap(e) {
if (this.isIndexClick) {
uni.pageScrollTo({
scrollTop: 0,
duration: 300
});
} else {
this.isIndexClick = true;
}
},
//
onPageScroll(e) {
this.isIndexClick = true;
this.scrollTop = e.scrollTop;
this.isFixed = e.scrollTop > 40;
// uni.setTabBarItem({
// index: 0,
// text: "123",
// selectedIconPath: "/static/tabbar_icon/b-a.png"
// })
// this.$forceUpdate();
if (this.isHeaderSerch) {
let isScroll = false
isScroll = e.scrollTop > 50
@ -577,20 +551,6 @@
}
// scrollTopeasy-loadimage
uni.$emit('scroll');
if (e.scrollTop >= 100) {
uni.setTabBarItem({
index: 0,
text: "首页",
selectedIconPath: "/static/tabbar_icon/back_a.png"
})
} else {
uni.setTabBarItem({
index: 0,
text: "首页",
selectedIconPath: "/static/tabbar_icon/a-a.png"
})
}
},
/**
@ -620,11 +580,6 @@
};
},
// #endif
created(options) {
let routes = getCurrentPages(); //
let curRoute = routes[routes.length - 1].route //
this.activeRouter = '/' + curRoute
},
onLoad(options) {
let that = this
this._options = options;
@ -643,10 +598,13 @@
that.pageLoad(options);
this.$store.dispatch('INIT_CONFIG');
},
created(options) {
let routes = getCurrentPages(); //
let curRoute = routes[routes.length - 1].route //
this.activeRouter = '/' + curRoute
},
onShow() {
if (uni.getStorageSync('newStore')) this.openDiver();
let that = this;
let that = this
that.isIntegral = uni.getStorageSync('isIntegral')
// #ifdef APP-PLUS
if (that.appUpdate.openUpgrade == '1') {
@ -662,8 +620,6 @@
that.isScrolled = res[0].top <= -60
})
})
this.isIndexClick = false;
if (this.isLogin) {
this.getUserInfo();
}
@ -671,7 +627,9 @@
onHide() {
uni.setStorageSync('isIntegral', false)
},
onReady() {
},
watch: {
globalDatas(nVal, oVal) {
// #ifdef H5
@ -680,62 +638,17 @@
},
},
onPullDownRefresh() {
// this.overflow = true;
// this.reconnect();
// that.overflow = true;
this.overflow = true;
this.reconnect();
// #ifdef APP-PLUS
setTimeout(() => {
this.hotPage = 1;
this.hotScroll = true;
let hostList = this.hostProduct;
hostList[this.hostIndex] = [];
this.$set(this, 'hostProduct', hostList);
this.loadGoods(this.hostIndex + 1);
uni.reLaunch({
url: "/pages/index/index"
});
}, 50)
// #endif
},
methods: {
/*新商户引导页相关*/
openDiver() {
// #ifdef APP
this.subNvue = uni.getSubNVueById('newUser')
this.subNvue.show('slide-in-left', 300)
uni.$on('offSubnvue', () => {
this.subNvue.hide('slide-out-left')
if (uni.getStorageSync("newStore")) {
uni.switchTab({
url: '/pages/user/index'
})
}
});
// uni.$on('diverIndexSubEmit', () => {
// this.subNvue.hide('slide-out-left')
// uni.switchTab({
// url: '/pages/gather/gather'
// })
// })
// #endif
},
/* 新商户发布商品引导页 */
openListGoodsDiver() {
if (Boolean(this.userInfo.service?.mer_id)) {
uni.$on('diverIndexSubEmit', () => {
this.subNvue.hide('slide-out-left')
uni.switchTab({
url: '/pages/gather/gather'
})
})
isNewMer(this.userInfo.uid, this.userInfo.service?.mer_id).then(
res => {
if (res.data == 'true') {
this.subNvue = uni.getSubNVueById('concatIndex')
this.subNvue.show('slide-in-left', 300)
}
})
}
},
loadCoupon() {
if (!this.showCoupon && !uni.getStorageSync('show_coupon') && uni.getStorageSync('is_new_user')) {
getNewPeopleCouponLst().then(res => {
@ -795,7 +708,7 @@
},
bindHeighta(data) {
// #ifdef APP-PLUS
// this.sortMpTop = data.top + data.height;
this.sortMpTop = data.top + data.height;
// #endif
},
//
@ -1073,12 +986,8 @@
showTab(res.data);
that.userInfo = res.data;
this.$store.commit('SET_USERINFO', res.data);
// #ifdef APP
this.openListGoodsDiver()
// #endif
});
},
// 访
setVisit() {
setVisit({
@ -1112,31 +1021,32 @@
self.sortMarTop = 10;
}
},
//
get_product_list: function() {
let that = this;
if (that.loading || that.loadend) return;
that.loading = true;
that.loadTitle = '';
getProductslist(that.where).then(res => {
let list = res.data.list;
let productList = that.$util.SplitArray(list, that.sortProduct);
let loadend = list.length < that.where.limit;
that.loadend = loadend;
that.loading = false;
that.loadTitle = loadend ? '已全部加载' : '加载更多';
that.$set(that, 'sortProduct', productList);
that.$set(that.where, 'page', that.where.page + 1);
}).catch(err => {
that.loading = false;
that.loadTitle = '加载更多';
});
getProductslist(that.where)
.then(res => {
let list = res.data.list;
let productList = that.$util.SplitArray(list, that.sortProduct);
let loadend = list.length < that.where.limit;
that.loadend = loadend;
that.loading = false;
that.loadTitle = loadend ? '已全部加载' : '加载更多';
that.$set(that, 'sortProduct', productList);
that.$set(that.where, 'page', that.where.page + 1);
})
.catch(err => {
that.loading = false;
that.loadTitle = '加载更多';
});
},
//
/**
* 点击组件选项卡
*/
changeRecommedTab(e) {
let that = this;
this.hotPage = 1;
this.hotScroll = true;
this.hostIndex = e - 1;
@ -1144,61 +1054,50 @@
hostList[e - 1] = [];
this.$set(this, 'hostProduct', hostList);
this.loadGoods(e);
uni.pageScrollTo({
scrollTop: that.$refs.recommendRef.tabsTop,
duration: 200
})
},
loadGoods(e = 1) {
this.$nextTick(() => {
if (e == 1) return this.get_host_product(0);
if (e == 2) return this.get_host_home({
mer_type: 1
}, 1);
if (e == 3) return this.get_host_home({
mer_type: 2
}, 2);
if (e == 4) return this.get_host_home({
mer_type: 3
}, 3);
})
if (e == 1) return this.get_host_product(0);
if (e == 2) return this.get_host_home({
mer_type: 1
}, 1);
if (e == 3) return this.get_host_home({
mer_type: 2
}, 2);
if (e == 4) return this.get_host_home({
mer_type: 3
}, 3);
},
//
/**
* 获取我的推荐
*/
get_host_product: function(e = 0) {
let that = this;
let num = that.hotLimit;
if (!that.hotScroll) return;
if (that.hotLoading[e]) return;
that.hotLoading[e] = true;
that.hotTitle = '加载中';
getProductHot(that.hotPage, that.hotLimit, 1, 1).then(res => {
uni.stopPullDownRefresh();
res.data.list = this.shuffleArray(res.data.list);
let list = res.data.list;
let productList = that.hostProduct;
if (!productList[e]) productList[e] = [];
productList[e] = [...productList[e], ...res.data.list];
let hotScroll = list.length <= res.data.limit && list.length != 0;
that.hotScroll = hotScroll;
that.hotLoading[e] = false;
that.hotTitle = !hotScroll ? '已全部加载' : '加载更多';
that.$set(that, 'hostProduct', productList);
if (this.hostIndex == e) this.$forceUpdate();
that.$set(that, 'hotPage', res.data.page + 1);
that.$set(that, 'hotLimit', res.data.limit);
this.$forceUpdate();
});
},
// , ,
/**
* 获取里海云仓, 云市场, 名优特产
*/
get_host_home: function(query = {}, e = 1) {
let that = this;
let num = that.hotLimit;
@ -1213,7 +1112,6 @@
getProductslist({
...query
}).then(res => {
uni.stopPullDownRefresh();
res.data.list = this.shuffleArray(res.data.list);
let list = res.data.list;
let productList = that.hostProduct;
@ -1247,13 +1145,11 @@
this.$set(this, 'navTop', res.data);
});
},
reloadData() {
setTimeout(() => {
this.showSkeleton = false
}, 500)
},
//
goDetail(item) {
if (item.activity && item.activity.type === '2' && !this.isLogin) {
@ -1297,7 +1193,6 @@
});
}
},
//#ifdef H5
ShareInfo(datas) {
let data = this.storeInfo;
@ -1333,7 +1228,6 @@
this.domHeight = res[0].height;
})
},
//
onReachBottom() {
if (this.recommend_switch == 1 && this.navIndex == 0) {
@ -1345,7 +1239,7 @@
this.get_product_list();
}
}
}
},
};
</script>
<style>

View File

@ -1,213 +0,0 @@
<template>
<view class="" style="width: 750rpx;height: 100%;">
<view class="jump" @click="jump">
<text class="font">跳过</text>
</view>
<view class="next-btn" :style="{top:(offsetY-250)+'px'}">
<text class="next-btn-text font" @click="next">下一步(1/4)</text>
</view>
<view class="tips-box" :style="{right:20, top:(offsetY-218)+'px'}">
<view class="tips" style="position: absolute;padding-left: 10rpx;">
<view class="tras" :class="{act:isActive}">
<text style="font-size: 28rpx;line-height: 100rpx;color: white;">点击工作台,进入办公助手</text>
</view>
</view>
<image src="/static/images/starpng.png" class="start" mode="">
</image>
</view>
<view style="position: absolute;" class="center" :style="{top:(offsetY-120)+'px'}">
<image src="/static/images/greenLine.png" style="width:35px;height: 60px;" mode=""></image>
</view>
<view class="tabbar2 center" :style="{top:(offsetY-68)+'px'}">
<image src="/static/images/ydwd.png" class="tab-icon"></image>
<text class="te">工作台</text>
</view>
<view class="pointe2" :style="{top:(offsetY-58)+'px'}">
<image src="/static/images/pointer.png" style="width: 254rpx;height: 254rpx;" mode=""></image>
</view>
</view>
</template>
<script>
import {
isNewMer
} from '@/api/user.js';
export default {
data() {
return {
isActive: false,
subNVue: null,
screenWidth: 400,
offsetX: 0,
offsetY: 0,
isStore: false,
}
},
methods: {
next() {
uni.$emit('diverIndexSubEmit');
},
jump() {
isNewMer(this.$store.state.app.userInfo.uid, this.$store.state.app.userInfo.service?.mer_id, {
done: 1
}).then(res => {
console.log(res, 'res')
})
uni.$emit('diverIndexSubEmit');
}
},
onLoad() {
uni.$on('diverIndexEmit', (data) => {
this.isStore = Boolean(data.mer_info?.mer_name)
})
let that = this
this.subNVue = uni.getSubNVueById('concatIndex')
const res = uni.getSystemInfo({
success: (res => {
this.offsetY = res.screenHeight
this.screenWidth = res.screenWidth
})
});
setTimeout(() => {
that.isActive = true
}, 1000)
}
}
</script>
<style>
.jump {
position: absolute;
right: 30rpx;
top: 80rpx;
}
.tips-box {
width: 462rpx;
height: 178rpx;
position: absolute;
padding-top: 72rpx;
position: absolute;
}
.start {
width: 72rpx;
height: 72rpx;
position: absolute;
right: 0;
top: 20px;
}
.tips {
width: 462rpx;
height: 106rpx;
background-color: #5BE157;
border-radius: 20rpx;
}
.center {
position: absolute;
left: 375rpx;
transform: translateX(-50%);
}
.tabbar {
width: 136rpx;
height: 136rpx;
background-color: white;
border-radius: 136rpx;
position: absolute;
left: 375rpx;
transform: translateX(-50%);
/* bottom: 0; */
}
.tabbar2 {
width: 136rpx;
height: 136rpx;
background-color: white;
border-radius: 136rpx;
position: absolute;
}
.tab-icon {
width: 50rpx;
height: 50rpx;
position: absolute;
left: 68rpx;
transform: translate(-50%, -50%);
top: 68rpx;
}
.te {
font-size: 20rpx;
position: absolute;
left: 68rpx;
transform: translate(-50%, 0);
top: 100rpx;
}
.pointe {
position: absolute;
left: 420rpx;
transform: translateX(-50%);
}
.pointe2 {
position: absolute;
left: 420rpx;
transform: translateX(-50%);
/* left: 150rpx; */
}
.tras {
padding-left: 10rpx;
position: absolute;
z-index: 999 !important;
width: 0px;
transition-property: width;
transition-duration: 3s;
transition-delay: 0.1s;
transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1.0);
}
.act {
width: 462rpx;
}
.font {
font-size: 28rpx;
color: white;
lines: 1;
}
.next-btn {
position: absolute;
/* bottom: 100rpx; */
left: 375rpx;
transform: translateX(-50%);
width: 240rpx;
height: 76rpx;
border: 1px solid white;
border-radius: 38rpx;
background-color: rgba(255, 255, 255, 0.4);
}
.next-btn-text {
line-height: 76rpx;
text-align: center;
/* background-color: #939393; */
}
.jump {
position: absolute;
right: 30rpx;
top: 80rpx;
border: 1px solid white;
padding: 10rpx 20rpx;
border-radius: 30rpx;
}
</style>

View File

@ -1,167 +0,0 @@
<template>
<view class="">
<view class="jump" @click="jump">
<text class="font">跳过</text>
</view>
<view class="next-btn center" :style="{ left:screenWidth/2,top:(screenHeight-96)}">
<text class="next-btn-text font" style="line-height: 76rpx;" @click="next">下一步(1/2)</text>
</view>
<view class="target" :style="{left:screenWidth/4*3,top:screenHeight-68}">
<image src="https://lihai001.oss-cn-chengdu.aliyuncs.com/attach/96aba202405171618278261.png"
class="target-icon"></image>
<text class="target-text">我的</text>
</view>
<view :style="{left:screenWidth/4*3,top:screenHeight-130}">
<image src="/static/images/pointer.png" style="width: 254rpx;height: 254rpx;"></image>
</view>
<view class="tips-box" :style="{right:20,top:screenHeight-220}">
<view class="tips" style="position: absolute;padding-left: 20px;">
<view class="tras" :class="{act:isAct}">
<text style="font-size: 28rpx;line-height: 100rpx;color: white;">点击我的页面,进行商户入驻</text>
</view>
</view>
<image src="/static/images/starpng.png" class="start" mode="">
</image>
</view>
<image src="/static/images/greenLine.png" class="greenLine"
:style="{left:screenWidth/4*3+15,top:screenHeight-120}" mode=""></image>
</view>
</template>
<script>
export default {
data() {
return {
screenHeight: 800,
screenWidth: 375,
isAct: false
}
},
methods: {
jump() {
uni.setStorageSync("newStore", false)
uni.$emit('offSubnvue');
},
next() {
uni.$emit('offSubnvue');
}
},
onLoad() {
let that = this
const res = uni.getSystemInfo({
success: (res => {
this.screenHeight = res.screenHeight
this.screenWidth = res.screenWidth
})
});
setTimeout(() => {
that.isAct = true
})
}
}
</script>
<style>
.jump {
position: absolute;
right: 30rpx;
top: 80rpx;
border: 1px solid white;
padding: 10rpx 20rpx;
border-radius: 30rpx;
}
.font {
font-size: 28rpx;
color: white;
lines: 1;
text-align: center;
}
.center {
transform: translateX(-50%);
}
.next-btn {
position: absolute;
width: 240rpx;
height: 76rpx;
border: 1px solid white;
border-radius: 38rpx;
background: rgba(255, 255, 255, 0.4);
}
.target {
width: 136rpx;
height: 136rpx;
background-color: white;
border-radius: 136rpx;
}
.target-icon {
width: 50rpx;
height: 50rpx;
position: absolute;
left: 68rpx;
transform: translate(-50%, -50%);
top: 68rpx;
}
.target-text {
font-size: 20rpx;
position: absolute;
left: 68rpx;
transform: translate(-50%, 0);
top: 100rpx;
}
.pointer {
position: absolute;
}
.tips-box {
width: 462rpx;
height: 178rpx;
position: absolute;
padding-top: 72rpx;
position: absolute;
}
.start {
width: 72rpx;
height: 72rpx;
position: absolute;
right: 0;
top: 20px;
}
.tips {
width: 462rpx;
height: 106rpx;
background-color: #5BE157;
border-radius: 20rpx;
}
.tras {
width: 0px;
transition-property: width;
transition-duration: 3s;
transition-delay: 0.1s;
transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1.0);
}
.act {
width: 462rpx;
}
.greenLine {
width: 35px;
height: 60px;
position: absolute;
}
</style>

View File

@ -44,7 +44,7 @@
<navigator
:url="hide_mer_status == 0 ? `/pages/store/home/index?id=${item.mer_id}&sale_type=${tabsCurr}` : '#'"
class="info">
<view class="name line1" style="max-width: 450rpx;">{{item.mer_name}}</view>
<view class="name">{{item.mer_name}}</view>
<text class="iconfont icon-xiangyou" style="font-weight: bold;"></text>
</navigator>
</view>
@ -88,11 +88,13 @@
</view>
<view class='money acea-row row-middle'>
<view class="line1" style="max-width: 260rpx;">
<view>
<text class="money-price">{{goods.productAttr.price}}</text>
<text
class="money-unit">/{{goods.productAttr.sku || goods.product.unit_name}}</text>
<text class="money-unit">/</text>
</view>
<!-- <view v-if="goods.productAttr.show_svip_price" class="vipImg">
<image :src="`${domain}/static/images/svip.png`"></image>
</view> -->
</view>
</view>
<view class='carnum acea-row row-center-wrapper'>
@ -178,8 +180,8 @@
@ChangCouponsUseState="ChangCouponsUseState"></couponListWindow>
</block>
<!-- 组件 -->
<addcartWindow :key="addcartKey" :attr="attr" :isShow='1' :iSplus='1' :destri='1' @myevent="onMyEvent"
@ChangeAttr="ChangeAttr" @goCat="goCat" @attrVal="attrVal" id='product-window'></addcartWindow>
<addcartWindow :key="addcartKey" :attr="attr" :isShow='1' :iSplus='1' :destri='1' @myevent="onMyEvent" @ChangeAttr="ChangeAttr"
@goCat="goCat" @attrVal="attrVal" id='product-window'></addcartWindow>
<Authorize :isShowAuth="isShowAuth"></Authorize>
<!--自定义底部tab栏-->
<customTab :newData="newData" :activeRouter="activeRouter"></customTab>
@ -258,7 +260,7 @@
}],
tabsCurr: 1,
subsecCurr: 0,
addcartKey: 0,
addcartKey: 0,
domain: HTTP_REQUEST_URL,
loading: false, //
loadend: false, //
@ -304,7 +306,7 @@
currSku: '',
newData: {},
activeRouter: '',
attrTxt: '',
attrTxt: '',
userInfo: {},
mer_info: {
mer_settlement_agree_status: 0
@ -510,12 +512,12 @@
// //
// that.DefaultSelect(goods)
cartProductAttr(id).then(res => {
if (res.data.attr.length == 0) return Toast('此商品为单规格商品');
const sku = {};
res.data.attrValue.forEach((itemn) => {
if (this.tabsCurr == 2) itemn.price = itemn.wholesale_price; //
sku[itemn.sku] = itemn;
})
if(res.data.attr.length==0)return Toast('此商品为单规格商品');
const sku = {};
res.data.attrValue.forEach((itemn) => {
if(this.tabsCurr==2) itemn.price = itemn.wholesale_price; //
sku[itemn.sku] = itemn;
})
goods.attr = res.data.attr;
goods.attrValue = res.data.attrValue
that.attrValue = goods.productAttr.sku
@ -526,7 +528,7 @@
that.$set(that, 'productValue', sku);
let productSelect = sku[that.attrValue];
that.isOpen = that.attr.cartAttr = true;
this.newVal = sku[goods.productAttr.sku] || Object.keys(sku)[0];
this.newVal = sku[goods.productAttr.sku] || Object.keys(sku)[0];
that.DefaultSelect(goods)
}).catch(err => {
return that.$util.Tips({

View File

@ -128,19 +128,17 @@
</view>
<view class="merchant" v-if="orderInfo.merchant && orderInfo.order_type != 1"
@click="goStore(orderInfo.mer_id)">
<text class="merchant_name line1">{{orderInfo.merchant.mer_name}}</text>
{{orderInfo.merchant.mer_name}}
<text class="iconfont icon-xiangyou"></text>
</view>
<block v-if="cartInfo.length>0">
<orderGoods :orderData='orderInfo' :pay_type="orderInfo.pay_type" :status="orderInfo.status"
:evaluate='orderInfo.status' :activityType='orderInfo.activity_type' :sale_type="sale_type"
:orderId="order_id" :cartInfo="cartInfo" :jump="true">
<orderGoods :orderData='orderInfo' :pay_type="orderInfo.pay_type" :status="orderInfo.status" :evaluate='orderInfo.status'
:activityType='orderInfo.activity_type' :sale_type="sale_type" :orderId="order_id" :cartInfo="cartInfo" :jump="true">
</orderGoods>
<block
v-if="orderInfo.order_type == 1 && orderInfo.takeOrderList && orderInfo.takeOrderList.length > 0"
v-for="(item,index) in orderInfo.takeOrderList" :key="index">
<orderGoods :orderData='item' :pay_type="orderInfo.pay_type" :status="orderInfo.status"
:evaluate='item.status' :activityType='item.activity_type' :sale_type="sale_type"
<orderGoods :orderData='item' :pay_type="orderInfo.pay_type" :status="orderInfo.status" :evaluate='item.status' :activityType='item.activity_type' :sale_type="sale_type"
:orderId="item.order_id" :cartInfo="item.orderProduct" :jump="true"></orderGoods>
</block>
</block>
@ -246,9 +244,9 @@
<view class='conter' v-if="orderInfo.pay_type==4 || orderInfo.pay_type==5">支付宝支付</view>
<view class='conter'
v-if="orderInfo.pay_type==1 || orderInfo.pay_type==2 || orderInfo.pay_type==3">微信支付</view>
<view class='conter' v-if="orderInfo.pay_type==11">微信收款</view>
<view class='conter' v-if="orderInfo.pay_type==12">现金收款</view>
<view class='conter' v-if="orderInfo.pay_type==13">支付宝收款</view>
<view class='conter' v-if="orderInfo.pay_type==11">微信收款</view>
<view class='conter' v-if="orderInfo.pay_type==12">现金收款</view>
<view class='conter' v-if="orderInfo.pay_type==13">支付宝收款</view>
</view>
<view class='item acea-row row-between' v-if="orderInfo.mark">
<view>买家留言</view>
@ -288,11 +286,10 @@
<view>优惠券抵扣</view>
<view class='conter' style="color: #F55726;">-{{orderInfo.coupon_price}}</view>
</view>
<view class='item acea-row row-between' v-if='orderInfo.platform_coupon_price > 0'>
<view>平台优惠抵扣</view>
<view class='conter' style="width: auto;color: #F55726;">-{{orderInfo.platform_coupon_price}}
</view>
</view>
<view class='item acea-row row-between' v-if='orderInfo.platform_coupon_price > 0'>
<view>平台优惠抵扣</view>
<view class='conter' style="width: auto;color: #F55726;">-{{orderInfo.platform_coupon_price}}</view>
</view>
<view class='item acea-row row-between' v-if='orderInfo.integral'>
<view>积分抵扣</view>
<view class='conter'>-{{orderInfo.integral_price}}</view>
@ -514,7 +511,7 @@
invoice: false,
add: false,
},
sale_type: 1
sale_type: 1
};
},
computed: {
@ -537,7 +534,7 @@
onLoad: function(options) {
if (options.order_id) {
this.$set(this, 'order_id', options.order_id);
options.sale_type ? this.sale_type = options.sale_type : null;
options.sale_type ? this.sale_type = options.sale_type : null;
}
},
onShow() {
@ -616,7 +613,7 @@
goStore(mer_id) {
if (this.hide_mer_status != 1) {
uni.navigateTo({
url: '/pages/store/home/index?id=' + mer_id + '&sale_type=' + this.sale_type
url: '/pages/store/home/index?id=' + mer_id + '&sale_type=' + this.sale_type
})
}
},
@ -941,12 +938,11 @@
})
orderAgain({
data: data,
sale_type: this.sale_type
sale_type: this.sale_type
}).then(res => {
let cart_id = res.data.cart_id.join(',')
return uni.navigateTo({
url: '/pages/users/order_confirm/index?cartId=' + cart_id + '&sale_type=' +
this.sale_type
url: '/pages/users/order_confirm/index?cartId=' + cart_id + '&sale_type=' + this.sale_type
});
}).catch(err => {
that.$util.Tips({
@ -1058,7 +1054,6 @@
}
.merchant {
display: flex;
width: 100%;
height: 86rpx;
padding: 0 30rpx;
@ -1070,12 +1065,6 @@
box-sizing: border-box;
background-color: #fff;
.merchant_name {
display: inline-block;
overflow: hidden;
max-width: 700rpx;
}
.iconfont {
margin-top: 6rpx;
font-size: 22rpx;

View File

@ -57,7 +57,7 @@
</view>
<!-- 店铺商品列表 -->
<view class="order-wrapper" v-for="(item,index) in orderInfo.orderList" :key="index">
<view class="title line1" @click="goStore(item)">{{item.merchant.mer_name}}<text
<view class="title" @click="goStore(item)">{{item.merchant.mer_name}}<text
class="iconfont icon-xiangyou"></text>
</view>
<view class="goods-box" v-if="item.orderProduct">

View File

@ -138,10 +138,6 @@
this.mer_id = opt.mer_id;
},
onReady() {
this.handleOpenKeyboard();
},
onShow() {
if (!this.isLogin) {
Cache.set("login_back_url_weixin", "/" + getCurrentPages()[0].route + "?mer_id=" + this.mer_id);

View File

@ -1,50 +1,7 @@
<template>
<view style="padding: 42rpx 50rpx;">
<view class="card" v-for="item in listData" :key="item.mer_intention_id">
<view class="" style="display: flex;align-items: center;">
<view class="ciecle"
style="width: 24rpx;height: 24rpx;border-radius: 24rpx;border: 1px solid #DDDDDD;margin-right: 30rpx;">
</view>
<view class="" style="color: #777777;font-size: 24rpx;">
{{item.create_time}}
</view>
</view>
<view class=""
style="padding:40rpx;margin: 30rpx 0; width: 606rpx;margin-left: 30rpx;border-radius: 16rpx;box-shadow: 0rpx 6rpx 12rpx 2rpx rgba(0,0,0,0.16);">
<view class="" v-if="item.status==0" style="color: #20B128;font-size: 32rpx;">
待审核
</view>
<view class="" v-if="item.status==1" style="color: #20B128;font-size: 32rpx;">
审核通过
</view>
<view class="" v-if="item.status==2"
style="color: #FC452F;font-size: 32rpx;display: flex;justify-content: space-between;">
审核失败
<view style="color: #20B128;" @click="navgo">
重新申请
</view>
</view>
<u-line style="margin: 28rpx 0;"></u-line>
<view class="" style="margin-bottom: 20rpx;">
{{item.mer_name}}
</view>
<view class="" v-if="item.status==1" style="font-size: 24rpx; color: #777777;">
可以登录我们的工作台把您的商品推向市场了
</view>
<view class="" v-if='item.status==2' style="font-size: 24rpx; color: #777777;">
备注:{{item.fail_msg}}
</view>
</view>
</view>
<u-button v-if="showBtn" @click="openApplet" color="#3ABD40" shape="circle" text="立即发布产品"></u-button>
<view>
<view class="application-record" v-if="listData.length">
<!-- <view class="card-list" v-for="item in listData" :key="item.mer_intention_id">
<view class="card-list" v-for="item in listData" :key="item.mer_intention_id">
<view class="card-top">
<view class="title">{{item.mer_name}}</view>
<view class="time">提交时间{{item.create_time}}</view>
@ -60,7 +17,7 @@
</view>
<view class="status-btn" @click="jump(item)">{{statusBtn(item.status)}}</view>
</view>
</view> -->
</view>
</view>
<view class='no-shop' v-if="!listData.length && !loading">
<view class='pictrue' style="margin: 0 auto;">
@ -82,22 +39,15 @@
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import {
getApplicationRecordList,
getUnimpInfo
getApplicationRecordList
} from '@/api/store.js'
import {
HTTP_REQUEST_URL
} from '@/config/app';
import uniMP from '@/utils/uniMP.js';
import {HTTP_REQUEST_URL} from '@/config/app';
export default {
data() {
return {
domain: HTTP_REQUEST_URL,
domain:HTTP_REQUEST_URL,
loading: false,
showBtn: false,
listData: [],
uniMpInfo: {},
pageData: {
page: 1,
limit: 10,
@ -121,10 +71,6 @@
}
},
methods: {
openApplet() {
this.uniMpInfo.showToast = true
uniMP.loadAppletMP(this.uniMpInfo)
},
getListData() {
this.loading = true
uni.showLoading({
@ -133,23 +79,8 @@
getApplicationRecordList(this.pageData).then(res => {
this.count = res.data.count
this.listData = this.listData.concat(res.data.list)
this.showBtn = (this.listData[this.listData.length - 1].status == 1)
if (this.showBtn) {
getUnimpInfo().then(res => {
this.uniMpInfo = res.data
})
}
uni.hideLoading();
this.loading = false
}).catch(() => {
uni.hideLoading();
this.loading = false
})
},
navgo() {
// uni.navigateBack()
uni.navigateTo({
url: '/pages/store/settled/index?type=1'
})
},
//
@ -196,24 +127,76 @@
align-items: center;
background-color: #F5F5F5;
padding: 20rpx 30rpx;
.card-list {
width: 100%;
background-color: #fff;
padding: 20rpx 24rpx;
margin: 10rpx 20rpx;
border-radius: 12rpx;
.card-top {
height: 140rpx;
.title {
font-size: 28rpx;
font-weight: bold;
color: #333333;
}
.time {
color: #999999;
font-size: 24rpx;
padding: 5rpx 0;
}
.reason {
color: #E93323;
font-weight: bold;
font-size: 24rpx;
}
}
.line {
height: 2rpx;
margin: 20rpx 0 20rpx 0;
background-color: #EEEEEE;
}
.card-bottom {
display: flex;
justify-content: space-between;
align-items: center;
color: #333;
.card-status {
display: flex;
align-items: center;
.status-icon {
width: 30rpx;
height: 30rpx;
margin: 10rpx;
}
.status-text {
font-size: 28rpx;
font-weight: 500;
}
}
.status-btn {
font-size: 26rpx;
color: #555;
border: 1px solid #999999;
padding: 8rpx 32rpx;
border-radius: 40rpx;
}
}
}
}
.no-shop {
width: 100%;
background-color: #fff;
height: 100vh;
.pictrue {
display: flex;
flex-direction: column;
align-items: center;
color: $uni-nothing-text;
image {
width: 414rpx;
height: 380rpx;
}
}
}
</style>
</style>

View File

@ -1,7 +1,58 @@
<style lang="scss">
.tab-cont {
display: flex;
.aside-left-placeholder {
width: 152rpx;
}
.aside-left {
position: fixed;
left: 0;
z-index: 2;
display: flex;
flex-wrap: wrap;
width: 152rpx;
overflow-y: auto;
background-color: #F4F4F4;
.aside-left-item {
width: 100%;
height: 94rpx;
line-height: 94rpx;
text-align: center;
padding: 0 14rpx;
}
.aside-active {
position: relative;
font-weight: bold;
font-size: 26rpx;
color: #40AE36;
background-color: #fff;
&::before {
content: "";
display: inline-block;
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 6rpx;
height: 36rpx;
background: #40AE36;
border-radius: 0rpx 4rpx 4rpx 0rpx;
}
}
}
}
</style>
<template>
<view class="store-home">
<view class="header">
<view style="height: var(--status-bar-height);"></view>
<view class="head-menu">
<view class="iconfont icon-xiangzuo" @click="goback" style="color: #fff;"></view>
<navigator :url="'/pages/store/list/index?mer_id='+id" hover-class="none"
@ -13,6 +64,15 @@
</view>
<view class="shop">
<!-- <view class="shop-img">
<u-image width="100rpx" height="154rpx" :lazyLoad="true" :fade="true" :src="store.mer_avatar"
radius="10">
<template v-slot:loading>
<u-loading-icon color="#999"></u-loading-icon>
</template>
</u-image>
</view> -->
<view class="shop-info">
<view class="shop-info-title" @click="navTo('/pages/store/detail/index?id='+id)">
<text>{{store.mer_name}}</text>
@ -27,8 +87,7 @@
</view>
<view class="shop-info-sale">月销{{store.sales}}+</view>
<view v-if="store.services_type == 0" class="iconfont icon-kefu3" @click="goService"></view>
<view v-else-if="store.services_type == 1" class="iconfont icon-kefu3" @click="call(1)">
</view>
<view v-else-if="store.services_type == 1" class="iconfont icon-kefu3" @click="call(1)"></view>
<view v-else class="iconfont icon-kefu3" @click="call(0)"> </view>
</view>
<view class="shop-info-runtime" v-if="store.mer_info&&store.mer_info.mer_take_time">营业时间 :
@ -52,51 +111,50 @@
</view>
</view>
<view v-show="!navShow && (tabActive === 3 || tabActive === 7)" class="nav">
<view class="nav-cont" :class="{noPointer : preview}" id="nav-cont">
<view :class="{ active: navActive === 0 }" class="item" @click="set_where(0,0)">
<view class="cont">默认商品</view>
</view>
<scroll-view class="main" scroll-y="true" @scroll="scrollHome" catchtouchmove :style="viewColor">
<view v-show="!navShow && (tabActive === 3 || tabActive === 7)" class="nav">
<view class="nav-cont" :class="{noPointer : preview}" id="nav-cont">
<view :class="{ active: navActive === 0 }" class="item" @click="set_where(0,0)">
<view class="cont">默认商品</view>
</view>
<view :class="{ active: navActive === 1 }" class="item" @click="set_where(1,0)">
<view class="cont">销量</view>
</view>
<view :class="{ active: navActive === 1 }" class="item" @click="set_where(1,0)">
<view class="cont">销量</view>
</view>
<view :class="{ active: navActive === 2 }" class="item" @click="set_where(2,0)">
<view class="cont"> 价格
<image v-if="navActive === 2"
:src="!sortPrice ? domain+'/static/diy/up'+keyColor+'.png' : domain+'/static/diy/down'+keyColor+'.png'">
</image>
<view :class="{ active: navActive === 2 }" class="item" @click="set_where(2,0)">
<view class="cont"> 价格
<image v-if="navActive === 2"
:src="!sortPrice ? domain+'/static/diy/up'+keyColor+'.png' : domain+'/static/diy/down'+keyColor+'.png'">
</image>
</view>
</view>
<view :class="{ active: navActive === 3 }" class="item" @click="set_where(3,0)">
<view class="cont">评分</view>
</view>
</view>
<view :class="{ active: navActive === 3 }" class="item" @click="set_where(3,0)">
<view class="cont">评分</view>
</view>
<block v-if="tabActive != 7">
<view class="guanzhu" :class="{'guanzhu-active':store.care}" v-if="!isLogin" @click="authOpen">
{{ store.care ? '已关注' : '关注' }}
</view>
<view v-else class="guanzhu" :class="{'guanzhu-active':store.care}" @click="followToggle">
{{ store.care ? '已关注' : '关注' }}
</view>
</block>
</view>
<block v-if="tabActive != 7">
<view class="guanzhu" :class="{'guanzhu-active':store.care}" v-if="!isLogin" @click="authOpen">
{{ store.care ? '已关注' : '关注' }}
</view>
<view v-else class="guanzhu" :class="{'guanzhu-active':store.care}" @click="followToggle">
{{ store.care ? '已关注' : '关注' }}
</view>
</block>
</view>
<scroll-view class="main" scroll-y="true" @scroll="scrollHome" catchtouchmove :style="viewColor">
<view class="tab-cont"
:style="viewColor,{'height':'calc(100vh - '+(listHeight) + (tabActive == 2?' + 84rpx':'')+' )'}"
:style="viewColor,{'height':'calc(100vh - '+listHeight+' - 84rpx '+(tabActive == 2?' + 84rpx':'')+' )'}"
:class="{noPointer : preview}">
<!-- 占位 -->
<view class="aside-left-placeholder" v-if="tabActive != 2"></view>
<!-- 大分类 -->
<view class="aside-left" v-if="tabActive != 2"
:style="{'top':'calc('+headHeight+')','height':'calc(100vh - '+listHeight+')'}">
:style="{'top':'calc('+headHeight+')','height':'calc(100vh - '+listHeight+' - 84rpx)'}">
<block v-for="(item,index) in asideMenu" :key="index">
<block v-for="item in asideMenu" :key="item.store_category_id">
<view class="aside-left-item line1" @click="onChangeAsideMenu(item.store_category_id)"
:class="{'aside-active':asideCurr == item.store_category_id?true:false}">
{{item.cate_name}}
@ -150,30 +208,14 @@
</view>
<!-- 首页 -->
<view style="margin:0px auto;"
<view style="margin:0 auto;"
v-show="(tabActive == 3 || tabActive == 7 || diyActive == 1 || diyActive == 2) && tabActive != 5 && tabActive != 2">
<!-- 二级分类 -->
<scroll-view :scroll-x="true" class="small-classify" :style="{'width':'calc(100vw - 152rpx)'}"
v-if="asideCurr">
<view class="second-item-con-wrap">
<view class="second-item-con" :style="{'flex-wrap':isChangeSecTabStyle?'wrap':''}">
<block v-for="item in secondTabList" :key="item.store_category_id">
<view class="small-classify-item"
:class="{'small-classify-item-active':secondTabCurr == item.store_category_id?true:false}"
@click="onSecondTabChange(item.store_category_id)">
{{item.cate_name}}
</view>
</block>
</view>
<view class="sanjiaoxing" @click="onChangeSecTabStyle"></view>
</view>
</scroll-view>
<!-- 商品 -->
<view v-if="goods.length" class="goods-wrap" id="goods" @touchmove="onTouchmove"
:style="{'width':'calc(100vw - 152rpx)','padding-top':(!!asideCurr?'94rpx' :'')}">
:style="{'width':'calc(100vw - 152rpx)'}">
<view v-if="isColumn" class="goods column">
<view v-for="(item,indx) in goods" :key="indx" class="item" @click="goGoodsDetail(item)">
<view v-for="item in goods" :key="item.product_id" class="item"
@click="goGoodsDetail(item)">
<view class="image" style="width: 180rpx;height: 180rpx;">
<image style="width: 100%;height: 100%;" :src="item.image" lazy-load></image>
<view v-if="item.stock == 0" class="sell_out">已售罄</view>
@ -189,9 +231,7 @@
<!-- 标签 -->
<view class="tag" v-if="item.mer_label_name && item.mer_label_name.length > 0">
<view class="tag-item" v-for="(ii,indx) in item.mer_label_name" :key="indx">
{{ii}}
</view>
<view class="tag-item" v-for="(ii,indx) in item.mer_label_name">{{ii}}</view>
</view>
<!-- 规格产地 -->
@ -213,8 +253,7 @@
<WaterfallsFlow :wfList='goods' @itemTap="goGoodsDetail" :type="1" :isStore="1" />
</view>
</view>
<view v-if="goodsLoading" class="acea-row row-center-wrapper loadingicon"
:style="{'margin-top':!!asideCurr?'94rpx':''}">
<view v-if="goodsLoading" class="acea-row row-center-wrapper loadingicon">
<text :hidden="!goodsLoading" class="iconfont icon-jiazai loading"></text>
{{loadTitle}}
</view>
@ -230,19 +269,18 @@
<view class="iconfont icon-xiangyou"></view>
</view>
</view>
<view v-for="(item,indx) in category" :key="indx" class="section">
<view v-for="item in category" :key="item.store_category_id" class="section">
<view class="head" @click="goCategoryGoods(item.store_category_id)">
<view class="title">{{ item.cate_name }}</view>
<view class="iconfont icon-xiangyou"></view>
</view>
<view v-if="item.children" class="body">
<view v-for="(value,indx) in item.children" :key="indx" class="item"
<view v-for="value in item.children" :key="value.store_category_id" class="item"
@click="goCategoryGoods(value.store_category_id)">{{ value.cate_name }}</view>
</view>
</view>
</view>
<view class="acea-row row-center-wrapper loadingicon"
:style="{'margin-top':!!asideCurr?'94rpx':''}">
<view class="acea-row row-center-wrapper loadingicon">
<text :hidden="!categoryLoading" class="iconfont icon-jiazai loading"></text>
{{loadTitle}}
</view>
@ -391,7 +429,7 @@
navShow: false,
navActive: 0,
diyActive: 0,
tabActive: 3, //
tabActive: '', //
isCoupon: 0,
keyword: '',
order: '',
@ -476,6 +514,7 @@
tabs: [],
storeScroll: true,
storeTop: 0,
navHeight: 0,
currSpid: "",
topicList: [],
service_open: false,
@ -486,13 +525,7 @@
headHeight: 0,
asideMenu: [],
asideCurr: '',
CartCount: 0,
navHeight: 0,
listTop: 0,
mer_type: '', //
secondTabList: [],
secondTabCurr: '', //
isChangeSecTabStyle: false
CartCount: 0
}
},
computed: {
@ -549,7 +582,6 @@
break;
case 7:
this.resetParmas();
this.getMerClassifly();
this.goods = [];
this.getGoods();
break;
@ -580,9 +612,8 @@
}
}
// #endif
//
this.getStore();
// this.diyData();
this.diyData();
shareScence(this.currSpid, this.isLogin);
this.initHeight();
@ -603,8 +634,6 @@
})
this.getMerClassifly();
//
this.getCart();
},
@ -637,103 +666,39 @@
},
// #endif
methods: {
//
getCart() {
let that = this;
console.log(111)
getCartCounts({
sale_type: this.where.sale_type
}).then(res => {
console.log(res)
that.CartCount = res.data[0].count;
});
},
//
onChangeAsideMenu(e) {
//
this.getMerClassifly(e)
this.asideCurr = e;
this.resetParmas();
this.goods = [];
this.loadend = false;
//
this.secondTabCurr = '';
this.isChangeSecTabStyle = false;
},
//
getMerClassifly(pid) {
const param = {
mer_type: 2,
sale_type: this.where.sale_type,
mer_id: this.id,
mer_type: '',
pid: pid
};
// ()
if (this.tabActive == 7) {
param.mer_type = 1;
}
//()
if (this.tabActive == 3) {
param.mer_type = 2;
}
getCategoryIndexList(param).then(res => {
//
if (pid) {
this.secondTabList = [{
cate_name: '全部',
store_category_id: ''
}, ...res.data];
} else { //
this.asideMenu = [{
cate_name: '全部',
store_category_id: ''
}, ...res.data];
}
this.getGoods();
})
},
//
onSecondTabChange(e) {
this.isChangeSecTabStyle = false;
this.secondTabCurr = e;
this.resetParmas();
this.goods = [];
this.loadend = false;
this.getGoods();
},
//
tab: function(param) {
if (param == 9) return uni.switchTab({
url: "/pages/order_addcart/order_addcart"
});
this.tabActive = param;
this.goodsLoading = this.loadend = this.loading = false;
// tab
this.secondTabCurr = '';
this.secondTabList = [];
this.asideCurr = '';
this.asideMenu = [];
this.loadend = false;
this.getMerClassifly();
},
//
onChangeSecTabStyle() {
this.isChangeSecTabStyle = !this.isChangeSecTabStyle;
},
// navbar
scrollHome: function(e) {
// uni.$emit('scroll');
// this.navShow = e.detail.scrollTop >= 50;
//
getMerClassifly() {
getCategoryIndexList({
mer_type: 2,
sale_type: this.where.sale_type
}).then(res => {
this.asideMenu = [{
cate_name: '全部',
store_category_id: ''
}, ...res.data];
})
},
navTo(url) {
@ -741,7 +706,6 @@
url: url
})
},
//
showMaoLocation: function() {
if (!this.store.lat || !this.store.long) return this
@ -779,9 +743,10 @@
this.$nextTick(async () => {
const headHeight = await this.getDomInfo('.header');
const footerHeight = await this.getDomInfo('.footer');
const navObj = await this.getDomInfo('.nav');
const navHeight = await this.getDomInfo('#nav-cont');
this.headHeight = headHeight;
this.listHeight = headHeight.height + footerHeight.height + navObj.height + 'px';
this.listHeight = headHeight.height + footerHeight.height + 'px';
})
},
@ -954,6 +919,7 @@
},
//
getGoods: function() {
console.log(2)
let that = this;
if (that.loadend) return;
if (that.loading) return;
@ -961,11 +927,7 @@
that.goodsLoading = true;
that.loadTitle = '';
if (that.secondTabCurr) //
that.where.cate_pid = that.secondTabCurr;
else //
that.where.cate_pid = that.asideCurr;
that.where.cate_pid = that.asideCurr;
if (this.tabActive == 7) getStoreCloudGoods(that.id, that.where).then(res => {
that.goodsLoading = false;
@ -1174,6 +1136,11 @@
}
})
},
// navbar
scrollHome: function(e) {
uni.$emit('scroll');
this.navShow = e.detail.scrollTop >= 50;
},
goback: function() {
uni.navigateBack();
@ -1185,6 +1152,16 @@
});
},
//
tab: function(param) {
console.log(param)
if (param == 9) return uni.switchTab({
url: "/pages/order_addcart/order_addcart"
})
this.tabActive = param;
this.goodsLoading = this.loadend = this.loading = false
},
resetParmas() {
this.navActive = 0;
this.where = {
@ -1192,8 +1169,7 @@
keyword: '',
page: 1,
limit: 30,
sale_type: this.where.sale_type,
cate_pid: ''
sale_type: this.where.sale_type
}
},
@ -1244,7 +1220,6 @@
}
},
onPageScroll() {
this.isChangeSecTabStyle = false;
uni.$emit('scroll');
},
onPullDownRefresh() {
@ -1259,104 +1234,10 @@
</script>
<style lang="scss" scoped>
.small-classify {
position: fixed;
left: 152rpx;
min-height: 94rpx;
background: #fff;
z-index: 100;
padding: 20rpx 20rpx 10rpx;
box-sizing: border-box;
.second-item-con-wrap {
position: relative;
display: flex;
align-items: center;
.second-item-con {
display: flex;
width: 95%;
overflow: auto;
}
.sanjiaoxing {
position: absolute;
right: -2rpx;
top: 20rpx;
width: 0;
height: 0;
border: 12rpx solid;
border-color: #333 transparent transparent transparent;
margin-left: 4rpx;
}
}
.small-classify-item {
flex-shrink: 0;
padding: 10rpx 40rpx;
border-radius: 4rpx;
font-size: 24rpx;
color: #999;
background: #F6F6F6;
text-align: center;
margin-right: 10rpx;
margin-bottom: 10rpx;
}
.small-classify-item-active {
background: #ECFFE8;
color: #40AE36;
}
}
.tab-cont {
background: #f5f5f5;
min-height: 500rpx;
overflow: auto;
display: flex;
.aside-left-placeholder {
width: 152rpx;
}
.aside-left {
position: fixed;
left: 0;
z-index: 2;
width: 152rpx;
overflow-y: auto;
background-color: #F4F4F4;
.aside-left-item {
width: 100%;
height: 94rpx;
line-height: 94rpx;
text-align: center;
padding: 0 14rpx;
}
.aside-active {
position: relative;
font-weight: bold;
font-size: 26rpx;
color: #40AE36;
background-color: #fff;
&::before {
content: "";
display: inline-block;
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 6rpx;
height: 36rpx;
background: #40AE36;
border-radius: 0rpx 4rpx 4rpx 0rpx;
}
}
}
}
.car-number {
@ -1544,119 +1425,6 @@
}
}
.nav {
padding: 0 30rpx;
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
height: 90rpx;
background: #fff;
border-bottom: 1px solid #f3f3f3;
z-index: 10;
.nav-cont {
display: flex;
align-items: center;
height: 84rpx;
.item {
display: flex;
justify-content: center;
align-items: center;
min-width: 0;
.cont {
display: flex;
justify-content: center;
align-items: center;
width: 116rpx;
height: 44rpx;
border-radius: 22rpx;
font-weight: 500;
font-size: 24rpx;
color: #666666;
.arrow-icon {
margin-left: 10rpx;
font-size: 18rpx;
}
.layout-icon {
font-size: 32rpx;
}
.icon-pailie {
font-size: 32rpx;
}
image {
width: 15rpx;
height: 21rpx;
margin-left: 7rpx;
}
}
}
.active {
.cont {
font-size: 28rpx;
font-weight: bold;
color: var(--view-theme);
}
}
}
.guanzhu {
width: 146rpx;
height: 58rpx;
line-height: 58rpx;
background: #46B03A;
border-radius: 68rpx 68rpx 68rpx 68rpx;
font-weight: 600;
font-size: 28rpx;
color: #FFFFFF;
text-align: center;
}
.guanzhu-active {
background: transparent;
border: 2rpx solid #46B03A;
color: #46B03A;
}
.select {
position: absolute;
top: 100%;
left: 0;
z-index: 2;
width: 100%;
padding-right: 40rpx;
padding-bottom: 28rpx;
padding-left: 74rpx;
border-bottom-right-radius: 24rpx;
border-bottom-left-radius: 24rpx;
background-color: #FFFFFF;
box-shadow: 0px 2px 10px 0px rgba(0, 0, 0, 0.06);
.item {
margin-top: 28rpx;
font-size: 24rpx;
color: #454545;
}
.active {
color: var(--view-theme);
.iconfont {
color: var(--view-theme);
float: right;
font-size: 20rpx;
}
}
}
}
.main_count {
background-color: #ffffff;
padding: 30rpx 20rpx;
@ -1815,6 +1583,117 @@
}
}
.nav {
position: relative;
padding: 0 30rpx;
display: flex;
justify-content: space-between;
align-items: center;
background: #fff;
border-bottom: 1px solid #f3f3f3;
.nav-cont {
display: flex;
align-items: center;
height: 84rpx;
.item {
display: flex;
justify-content: center;
align-items: center;
min-width: 0;
.cont {
display: flex;
justify-content: center;
align-items: center;
width: 116rpx;
height: 44rpx;
border-radius: 22rpx;
font-weight: 500;
font-size: 24rpx;
color: #666666;
.arrow-icon {
margin-left: 10rpx;
font-size: 18rpx;
}
.layout-icon {
font-size: 32rpx;
}
.icon-pailie {
font-size: 32rpx;
}
image {
width: 15rpx;
height: 21rpx;
margin-left: 7rpx;
}
}
}
.active {
.cont {
font-size: 28rpx;
font-weight: bold;
color: var(--view-theme);
}
}
}
.guanzhu {
width: 146rpx;
height: 58rpx;
line-height: 58rpx;
background: #46B03A;
border-radius: 68rpx 68rpx 68rpx 68rpx;
font-weight: 600;
font-size: 28rpx;
color: #FFFFFF;
text-align: center;
}
.guanzhu-active {
background: transparent;
border: 2rpx solid #46B03A;
color: #46B03A;
}
.select {
position: absolute;
top: 100%;
left: 0;
z-index: 2;
width: 100%;
padding-right: 40rpx;
padding-bottom: 28rpx;
padding-left: 74rpx;
border-bottom-right-radius: 24rpx;
border-bottom-left-radius: 24rpx;
background-color: #FFFFFF;
box-shadow: 0px 2px 10px 0px rgba(0, 0, 0, 0.06);
.item {
margin-top: 28rpx;
font-size: 24rpx;
color: #454545;
}
.active {
color: var(--view-theme);
.iconfont {
color: var(--view-theme);
float: right;
font-size: 20rpx;
}
}
}
}
.goods {
display: flex;
flex-wrap: wrap;
@ -2355,7 +2234,7 @@
flex-direction: column;
justify-content: center;
align-items: center;
margin: 0 auto;
margin-top: 0;
image {
width: 414rpx;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -100,19 +100,19 @@
</view>
<view>补贴余额 ()</view>
</view> -->
<view class="p_d_item" @click="authTo('/pages/users/user_money/index')">
<view class="p_d_count">
<image
src="https://lihai001.oss-cn-chengdu.aliyuncs.com/def/e41f4202401201745498894.png">
</image>
<view style="font-size: 30rpx;">我的余额 ()</view>
</view>
</view>
<view class="p_d_item" @click="authTo('/pages/users/user_money/index')">
<view class="p_d_count">
<view>{{userInfo.now_money||"0.00"}}</view>
</view>
</view>
<view class="p_d_item" @click="authTo('/pages/users/user_money/index')">
<view class="p_d_count">
<image
src="https://lihai001.oss-cn-chengdu.aliyuncs.com/def/e41f4202401201745498894.png">
</image>
<view style="font-size: 30rpx;">我的余额 ()</view>
</view>
</view>
<view class="p_d_item" @click="authTo('/pages/users/user_money/index')">
<view class="p_d_count">
<view>{{userInfo.now_money||"0.00"}}</view>
</view>
</view>
</view>
<view @click="goSvip" class="cardVipA acea-row row-between-wrapper" v-if="svip_switch_status == 1">
@ -176,11 +176,11 @@
<view class="user-menus" style="margin-top: 20rpx;">
<view class="title skeleton-rect">我的服务</view>
<view class="menu-box">
<block v-for="(item,index) in personalMenu" :key="index" :id="'target'+index">
<view v-if="item.isShow" class="item ">
<view @click="authTo(item.url,item.name)" class="item-count">
<block v-for="(item,index) in personalMenu" :key="index">
<view v-if="item.isShow" class="item">
<view @click="authTo(item.url)" class="item-count">
<image v-if="showSkeleton" class="skeleton_image skeleton-radius"></image>
<image v-else :src="item.pic" class="targets"></image>
<image v-else :src="item.pic"></image>
<text>{{item.name}}</text>
</view>
</view>
@ -238,7 +238,7 @@
<view class="">备案号:蜀ICP备2022030133号-2A</view>
<view class="">增值电信营业许可证号:川B2-20221250</view>
<view class="">联系我们08302669767</view>
<view style="padding-top: 50rpx;">{{appVersion}}</view>
<view style="padding-top: 50rpx;">{{appVersion}}</view>
</view>
<!-- <view v-else class="copy-right">
<view class="iconfont icon-crmeb"></view>
@ -300,14 +300,12 @@
import Auth from '../../libs/wechat';
import {
HTTP_REQUEST_URL,
ENV
ENV
} from '@/config/app';
import {
toLogin
} from '@/libs/login.js';
import {
showTab
} from "@/utils/showTab.js";
import {showTab} from "@/utils/showTab.js";
const app = getApp();
export default {
components: {
@ -333,11 +331,9 @@
},
data() {
return {
elInfo: '',
//#ifdef H5
isWeixin: this.$wechat.isWeixin(),
//#endif
subNvue: '',
domain: HTTP_REQUEST_URL,
showSkeleton: true, //
isNodes: 0, //,
@ -457,68 +453,25 @@
newData: {},
activeRouter: '',
sysHeight: sysHeight,
appVersion: ''
appVersion: ''
}
},
onLoad() {
// #ifdef APP-PLUS
uni.$on('offuserSubnvue', () => {
this.subNvue.hide('slide-out-right');
})
this.appVersion = 'V ' + uni.getSystemInfoSync().appWgtVersion;
// #endif
// #ifdef H5
this.appVersion = 'V ' + uni.getSystemInfoSync().appVersion;
// #endif
if (ENV != 'prod') this.appVersion += " Beta"
// #ifdef APP-PLUS
this.appVersion = 'V ' + uni.getSystemInfoSync().appWgtVersion;
// #endif
// #ifdef H5
this.appVersion = 'V ' + uni.getSystemInfoSync().appVersion;
// #endif
if (ENV != 'prod') this.appVersion += " Beta"
},
onReady() {
// #ifdef APP
this.isNodes++;
let that = this
// setTimeout(() => {
// const query = uni.createSelectorQuery().in(this);
// query
// .select(".targets")
// .boundingClientRect((data) => {
// that.elInfo = data
// // #ifdef APP-PLUS
// if (Boolean(uni.getStorageSync('newStore'))) {
// that.subNvue = uni.getSubNVueById('userSubnvu')
// that.subNvue.show('slide-in-left', 300)
// uni.$emit('openUserSubnvue', JSON.stringify(data))
// }
// // #endif
// })
// .exec();
// }, 500)
// #endif
},
mounted: function() {
this.getVersion()
},
onShow: function() {
// #ifdef APP-PLUS
setTimeout(() => {
const query = uni.createSelectorQuery().in(this);
query
.select(".targets")
.boundingClientRect((data) => {
that.elInfo = data
// #ifdef APP-PLUS
if (Boolean(uni.getStorageSync('newStore'))) {
that.subNvue = uni.getSubNVueById('userSubnvu')
that.subNvue.show('slide-in-left', 300)
uni.$emit('openUserSubnvue', JSON.stringify(data))
}
// #endif
})
.exec();
}, 800)
// #endif
let that = this;
let routes = getCurrentPages();
let curRoute = routes[routes.length - 1].route
@ -526,7 +479,7 @@
this.getNav();
if (that.isLogin) {
this.getUserInfo();
this.orderNum();
} else {
// this.userInfo = {
// is_svip: 0
@ -541,16 +494,10 @@
}, 500)
},
methods: {
authTo(url, name) {
authTo(url) {
if (this.isLogin) {
let txt = "";
if (this.userInfo && this.userInfo.service && name == "商家入驻") {
txt = url + '?step=3'
} else {
txt = url;
}
uni.navigateTo({
url: txt
url: url
})
} else {
this.openAuto()
@ -577,6 +524,7 @@
} else {
this.openAuto()
}
},
goRouter(item) {
var pages = getCurrentPages();
@ -688,59 +636,31 @@
getUserInfo: function() {
let that = this;
getUserInfo().then(res => {
showTab(res.data);
showTab(res.data);
that.userInfo = res.data;
that.is_promoter = res.data.is_promoter;
that.extension_status = res.data.extension_status;
that.getMyMenus();
this.orderNum();
});
},
//
orderNum() {
let openType = '';
orderData().then(({
data
}) => {
this.orderMenu.forEach((item, index) => {
switch (item.title) {
case '待付款':
item.num = Number(data.noPay) + Number(data.mer_noPay);
if ((data.noPay >= data.mer_noPay) || data.noPay) {
openType = 1;
} else {
openType = 2;
}
item.url = '/pages/users/order_list/index?status=0&openType=' + openType
item.num = data.noPay
break
case '待发货':
item.num = Number(data.noPostage) + Number(data.mer_noPostage);
if ((data.noPostage >= data.mer_noPostage) || data.noPostage) {
openType = 1;
} else {
openType = 2;
}
item.url = '/pages/users/order_list/index?status=1&openType=' + openType
item.num = data.noPostage
break
case '待收货':
item.num = Number(data.noDeliver) + Number(data.mer_noDeliver);
if ((data.noDeliver >= data.mer_noDeliver) || data.noDeliver) {
openType = 1;
} else {
openType = 2;
}
item.url = '/pages/users/order_list/index?status=2&openType=' + openType
item.num = data.noDeliver
break
case '待评价':
item.num = Number(data.noComment) + Number(data.mer_noComment);
if ((data.noComment >= data.mer_noComment) || data.noComment) {
openType = 1;
} else {
openType = 2;
}
item.url = '/pages/users/order_list/index?status=3&openType=' + openType
item.num = data.noComment
break
case '售后/退款':
item.num = data.refund
@ -1343,11 +1263,11 @@
.iconnum {
min-width: 6px;
background-color: red;
color: #fff;
background-color: #fff;
color: var(--view-theme);
border-radius: 15rpx;
position: absolute;
left: 50rpx;
right: -10rpx;
top: -10rpx;
font-size: 10px;
padding: 0 4px;

View File

@ -1,179 +0,0 @@
<template>
<view class="">
<view class="jump" @click="next">
<text class="font">跳过</text>
</view>
<view class="next-btn center" :style="{ left:screenWidth/2,top:(screenHeight-96)}">
<text class="next-btn-text font" style="line-height: 76rpx;" @click="next">我知道了</text>
</view>
<view class="target" :style="{left:left-20,top:top-13.5}">
<image src="http://lihai001.oss-cn-chengdu.aliyuncs.com/def/6202d269b6163b9ec7a4383559fc67a8.png"
class="target-icon"></image>
<text class="target-text">商家入驻</text>
</view>
<view :style="{left:left-20+'px',top:top-70+'px'}" class="trans1">
<image src="/static/images/pointer.png" style="width: 254rpx;height: 254rpx;"></image>
</view>
<view class="tips-box" :style="{left:left-13.5,top:top-154}">
<view class="tips" style="position: absolute;padding-left: 20px;">
<view class="tras" :class="{act:isAct}">
<text style="font-size: 28rpx;line-height: 100rpx;color: white;">点击商户入驻,轻松开店</text>
</view>
</view>
<image src="/static/images/starpng.png" class="start" mode="">
</image>
</view>
<image src="/static/images/greenLine.png" class="greenLine" :style="{left:left-3.5,top:top-70}" mode="">
</image>
</view>
</template>
<script>
export default {
data() {
return {
screenHeight: 0,
screenWidth: 0,
isAct: false,
left: -100,
top: -100,
}
},
methods: {
next() {
uni.$emit('offuserSubnvue');
uni.setStorageSync("newStore", false)
}
},
onLoad() {
let that = this
uni.$on('openUserSubnvue', (data) => {
console.log('data')
console.log(data)
this.left = JSON.parse(data).left
this.top = JSON.parse(data).top
console.log(this.left, this.top)
})
const res = uni.getSystemInfo({
success: (res => {
this.screenHeight = res.screenHeight
this.screenWidth = res.screenWidth
})
});
setTimeout(() => {
that.isAct = true
}, 500)
}
}
</script>
<style>
.jump {
position: absolute;
right: 30rpx;
top: 80rpx;
border: 1px solid white;
padding: 10rpx 20rpx;
border-radius: 30rpx;
}
.font {
font-size: 28rpx;
color: white;
lines: 1;
text-align: center;
}
.center {
transform: translateX(-50%);
}
.next-btn {
position: absolute;
width: 240rpx;
height: 76rpx;
border: 1px solid white;
border-radius: 38rpx;
background: rgba(255, 255, 255, 0.4);
}
.target {
width: 136rpx;
height: 136rpx;
background-color: white;
border-radius: 136rpx;
}
.target-icon {
width: 50rpx;
height: 50rpx;
position: absolute;
left: 68rpx;
transform: translate(-50%, -50%);
top: 68rpx;
}
.target-text {
font-size: 20rpx;
position: absolute;
left: 68rpx;
transform: translate(-50%, 0);
top: 100rpx;
}
.pointer {
position: absolute;
}
.tips-box {
width: 462rpx;
height: 178rpx;
position: absolute;
padding-top: 72rpx;
position: absolute;
}
.start {
width: 72rpx;
height: 72rpx;
position: absolute;
right: 0;
top: 20px;
}
.tips {
width: 462rpx;
height: 106rpx;
background-color: #5BE157;
border-radius: 20rpx;
}
.tras {
width: 0px;
transition-property: width;
transition-duration: 3s;
transition-delay: 0.1s;
transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1.0);
}
.trans1 {
/* transition-property: left, top;
transition-duration: 3s;
transition-delay: 0.1s;
transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1.0); */
}
.act {
width: 462rpx;
}
.greenLine {
width: 35px;
height: 60px;
position: absolute;
}
</style>

View File

@ -1,7 +1,6 @@
<template>
<div :style="viewColor">
<div class="register_main"
:style="{ 'background-image': formItem == 1 ? `url(${domain}/static/images/logo_bgl.png)` : `url(${domain}/static/images/logo_bgh.png)`}">
<div class="register_main" :style="{ 'background-image': formItem == 1 ? `url(${domain}/static/images/logo_bgl.png)` : `url(${domain}/static/images/logo_bgh.png)`}">
<view class="system-height" :style="{ height: statusBarHeight }"></view>
<!-- #ifdef APP-PLUS -->
<view class="title-bar" style="height: 43px;">
@ -22,15 +21,12 @@
<div class="list" :hidden="current !== 0">
<form @submit.prevent="submit">
<div class="item">
<input type="text" placeholder="请输入手机号或账号" placeholder-class="placeholder"
v-model="account" required />
<input type="text" placeholder="请输入手机号或账号" placeholder-class="placeholder" v-model="account" required />
</div>
<div class="item">
<input type="password" placeholder="填写登录密码" placeholder-class="placeholder"
v-model="password" required />
<navigator class="forgetPwd" hover-class="none"
url="/pages/users/retrievePassword/index">
忘记密we码
<input type="password" placeholder="填写登录密码" placeholder-class="placeholder" v-model="password" required />
<navigator class="forgetPwd" hover-class="none" url="/pages/users/retrievePassword/index">
忘记密码
</navigator>
</div>
</form>
@ -41,10 +37,8 @@
<input type="text" placeholder="输入手机号码" placeholder-class="placeholder" v-model="account" />
</div>
<div class="item">
<input type="text" placeholder="填写验证码" placeholder-class="placeholder" class="codeIput"
v-model="captcha" />
<button class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''"
@click="handleVerify">
<input type="text" placeholder="填写验证码" placeholder-class="placeholder" class="codeIput" v-model="captcha" />
<button class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''" @click="handleVerify">
{{ text }}
</button>
</div>
@ -55,13 +49,11 @@
<div class="tip">
<text v-if="current==0" @click="current = 1">手机号登录</text>
<text v-else @click="current = 0">账号登录</text>
</div>
</div>
<div class="protocol acea-row row-between-wrapper">
<checkbox-group class="checkgroup" @change='isAgree=!isAgree'>
<checkbox class="checkbox" :checked="isAgree ? true : false" />
<text class="protocol_text">我已同意<text @click="userAgree"
class="font_pro">用户协议</text><text @click="userPrivacyAgree"
class="font_pro">隐私政策</text></text>
<text class="protocol_text">我已同意<text @click="userAgree" class="font_pro">用户协议</text><text @click="userPrivacyAgree" class="font_pro">隐私政策</text></text>
</checkbox-group>
</div>
<!-- #ifdef APP-PLUS -->
@ -91,23 +83,17 @@
<input type="text" placeholder="请输入手机号" placeholder-class="placeholder" v-model="account" />
</div>
<div class="item">
<input type="text" placeholder="填写验证码" placeholder-class="placeholder" class="codeIput"
v-model="captcha" />
<button class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''"
@click="handleVerify">
<input type="text" placeholder="填写验证码" placeholder-class="placeholder" class="codeIput" v-model="captcha" />
<button class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''" @click="handleVerify">
{{ text }}
</button>
</div>
<div class="item">
<input type="password" placeholder="填写您的登录密码" placeholder-class="placeholder"
v-model="password" />
<input type="password" placeholder="填写您的登录密码" placeholder-class="placeholder" v-model="password" />
</div>
<div class="item" v-if="isShowCode">
<input type="text" placeholder="填写验证码" placeholder-class="placeholder" class="codeIput"
v-model="codeVal" />
<div class="code" @click="getcaptcha">
<image class="code-img" style="width: 100%;height: 100%;" :src="codeUrl" />
</div>
<input type="text" placeholder="填写验证码" placeholder-class="placeholder" class="codeIput" v-model="codeVal" />
<div class="code" @click="getcaptcha"><image class="code-img" style="width: 100%;height: 100%;" :src="codeUrl" /></div>
</div>
</div>
<div class="tip">
@ -118,9 +104,7 @@
<div class="protocol acea-row row-between-wrapper">
<checkbox-group class="checkgroup" @change='isAgree=!isAgree'>
<checkbox class="checkbox" :checked="isAgree ? true : false" />
<text class="protocol_text">我已同意<text @click="userAgree"
class="font_pro">用户协议</text><text @click="userPrivacyAgree"
class="font_pro">隐私政策</text></text>
<text class="protocol_text">我已同意<text @click="userAgree" class="font_pro">用户协议</text><text @click="userPrivacyAgree" class="font_pro">隐私政策</text></text>
</checkbox-group>
</div>
<!-- #ifdef APP-PLUS -->
@ -139,7 +123,7 @@
</view>
</view>
</view>
<!-- #endif -->
<!-- #endif -->
</div>
<div class="bottom"></div>
</div>
@ -151,27 +135,21 @@
</view>
<view class="list">
<view class="item">
<input type='number' placeholder='填写手机号码' placeholder-class='placeholder'
v-model="account"></input>
<input type='number' placeholder='填写手机号码' placeholder-class='placeholder' v-model="account"></input>
</view>
<view class="item">
<input type='number' placeholder='填写验证码' placeholder-class='placeholder'
class="codeIput" v-model="captcha"></input>
<button class="code" :class="disabled === true ? 'on' : ''" :disabled='disabled'
@click="handleVerify">
<input type='number' placeholder='填写验证码' placeholder-class='placeholder' class="codeIput" v-model="captcha"></input>
<button class="code" :class="disabled === true ? 'on' : ''" :disabled='disabled' @click="handleVerify">
{{ text }}
</button>
</view>
<view class="item">
<input type='password' placeholder='填写登录密码' placeholder-class='placeholder'
v-model="password"></input>
<input type='password' placeholder='填写登录密码' placeholder-class='placeholder' v-model="password"></input>
</view>
<view class="protocol acea-row">
<checkbox-group class="checkgroup" @change='isAgree=!isAgree'>
<checkbox class="checkbox" :checked="isAgree ? true : false" />
<text class="protocol_text">您已同意<text @click="userAgree"
class="font_pro">用户协议</text><text @click="userPrivacyAgree"
class="font_pro">隐私政策</text></text>
<text class="protocol_text">您已同意<text @click="userAgree" class="font_pro">用户协议</text><text @click="userPrivacyAgree" class="font_pro">隐私政策</text></text>
</checkbox-group>
</view>
</view>
@ -179,11 +157,10 @@
<button form-type="submit" @click="auth_token = ''" class="logon back">返回</button>
</view>
</view>
</form>
<view class="copyright" @click="goCopyUrl">{{copyData}}</view>
<Verify @success="success" :captchaType="'blockPuzzle'" :imgSize="{ width: '330px', height: '155px' }"
ref="verify"></Verify>
<Verify @success="success" :captchaType="'blockPuzzle'" :imgSize="{ width: '330px', height: '155px' }" ref="verify"></Verify>
</div>
</div>
</template>
@ -213,10 +190,7 @@
loginMpPhone
} from "@/api/user";
// #ifdef APP-PLUS
import {
wechatAppAuth,
appleAppAuth
} from '@/api/api.js'
import { wechatAppAuth, appleAppAuth } from '@/api/api.js'
// #endif
import attrs, {
required,
@ -235,16 +209,10 @@
VUE_APP_API_URL,
configMap
} from "@/utils";
import {
HTTP_REQUEST_URL
} from '@/config/app';
import { HTTP_REQUEST_URL } from '@/config/app';
import parser from "@/components/jyf-parser/jyf-parser";
import {
commonAuth
} from '../../../api/public';
import {
mapGetters
} from "vuex";
import { commonAuth } from '../../../api/public';
import { mapGetters} from "vuex";
import Verify from '@/components/verify/verify.vue';
const BACK_URL = "login_back_url";
@ -285,14 +253,13 @@
copyright: {}
};
},
computed: {
...configMap(['login_logo', 'wechat_phone_switch'], mapGetters(['viewColor'])),
computed:{
...configMap(['login_logo','wechat_phone_switch'], mapGetters(['viewColor'])),
copyData() {
let copy = this.copyright.status == -1 ? this.copyright.year + " " + this.copyright.url : this.copyright
.Copyright
let copy = this.copyright.status == -1 ? this.copyright.year+" "+this.copyright.url : this.copyright.Copyright
return copy;
}
},
},
watch: {
formItem: function(nval, oVal) {
if (nval == 1) {
@ -315,37 +282,37 @@
mounted: function() {
this.getVersion();
},
onReady() {
onReady(){
let that = this
// #ifdef MP
wx.login({
success(res) {
if (res.code) {
that.codeVal = res.code
} else {
console.log('登录失败!' + res.errMsg)
}
}
success (res) {
if (res.code) {
that.codeVal = res.code
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
// #endif
},
onShow() {
uni.setStorageSync('tabbar_sale_type', 1);
},
onShow() {
uni.setStorageSync('tabbar_sale_type', 1);
},
methods: {
// #ifdef MP
getPhoneNumber(e) {
getPhoneNumber(e) {
let that = this;
if (!that.isAgree) {
if(!that.isAgree){
return that.$util.Tips({
title: '请勾选用户协议与隐私政策'
});
} else {
}else{
loginMpPhone({
iv: e.detail.iv,
encryptedData: e.detail.encryptedData,
code: that.codeVal,
auth_token: uni.getStorageSync('auth_token'),
iv:e.detail.iv,
encryptedData:e.detail.encryptedData,
code:that.codeVal,
auth_token: uni.getStorageSync('auth_token'),
}).then(({
data
}) => {
@ -357,11 +324,10 @@
});
that.$store.commit("SETUID", data.user.uid);
that.$store.commit('UPDATE_USERINFO', data.user);
let method
let indexPat = ['/pages/index/index', '/pages/order_addcart/order_addcart',
'/pages/goods_cate/goods_cate',
'/pages/user/index', '/pages/plant_grass/index'
let indexPat = ['/pages/index/index', '/pages/order_addcart/order_addcart', '/pages/goods_cate/goods_cate',
'/pages/user/index','/pages/plant_grass/index'
]
if (indexPat.includes(this.getPath(backUrl))) {
method = 'switchTab'
@ -384,7 +350,7 @@
});
});
}
},
// #endif
goCopyUrl() {
@ -392,20 +358,20 @@
location.href = this.copyright.url
// #endif
},
userAgree() {
userAgree(){
uni.navigateTo({
url: '/pages/users/user_about/index?from=sys_user_agree'
})
},
userPrivacyAgree() {
userPrivacyAgree(){
uni.navigateTo({
url: '/pages/users/user_about/index?from=sys_userr_privacy'
})
},
getSystem(system) {
if (system.indexOf('iOS') === -1) {
if(system.indexOf('iOS') === -1){
return system
} else {
}else{
let str = system.split(' ')[1]
if (str.indexOf('.')) {
return Number(str.split('.')[0])
@ -422,11 +388,11 @@
//
appleLogin() {
let self = this
if (!self.isAgree) {
if(!self.isAgree){
return self.$util.Tips({
title: '请勾选用户协议与隐私政策'
});
} else {
}else{
this.account = ''
this.captcha = ''
uni.showLoading({
@ -465,21 +431,19 @@
})
}
},
appleLoginApi() {
appleLoginApi(){
let that = this
commonAuth({
auth: {
type: 'apple',
type:'apple',
auth: {
userInfo: that.appleUserInfo,
openId: that.appleUserInfo.openId,
nickname: (that.appleUserInfo.fullName.familyName || '') + (that.appleUserInfo.fullName
.giveName || ''),
nickname: (that.appleUserInfo.fullName.familyName || '') + (that.appleUserInfo.fullName.giveName || ''),
}
}
}).then(res => {
}}).then(res => {
const data = res.data;
if (res.data.status == 200) {
if(res.data.status == 200){
const backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
that.$Cache.clear(BACK_URL);
that.$store.commit("LOGIN", {
@ -489,9 +453,8 @@
that.$store.commit("SETUID", data.result.user.uid);
that.$store.commit('UPDATE_USERINFO', data.result.user);
let method
let indexPat = ['/pages/index/index', '/pages/order_addcart/order_addcart',
'/pages/goods_cate/goods_cate',
'/pages/user/index', '/pages/plant_grass/index'
let indexPat = ['/pages/index/index', '/pages/order_addcart/order_addcart', '/pages/goods_cate/goods_cate',
'/pages/user/index','/pages/plant_grass/index'
]
if (indexPat.includes(this.getPath(backUrl))) {
method = 'switchTab'
@ -507,7 +470,7 @@
uni[method]({
url: backUrl
});
} else {
}else{
uni.hideLoading();
that.auth_token = res.data.result.key;
}
@ -558,16 +521,15 @@
const that = this
commonAuth({
auth: {
type: 'app_wechat',
type:'app_wechat',
auth: {
code: that.appUserInfo.authResult.access_token,
openid: that.appUserInfo.authResult.openid,
phone: this.account,
}
}
}).then(res => {
}}).then(res => {
const data = res.data;
if (res.data.status == 200) {
if(res.data.status == 200){
const backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
that.$Cache.clear(BACK_URL);
that.$store.commit("LOGIN", {
@ -577,9 +539,8 @@
that.$store.commit("SETUID", data.result.user.uid);
that.$store.commit('UPDATE_USERINFO', data.result.user);
let method
let indexPat = ['/pages/index/index', '/pages/order_addcart/order_addcart',
'/pages/goods_cate/goods_cate',
'/pages/user/index', '/pages/plant_grass/index'
let indexPat = ['/pages/index/index', '/pages/order_addcart/order_addcart', '/pages/goods_cate/goods_cate',
'/pages/user/index','/pages/plant_grass/index'
]
if (indexPat.includes(this.getPath(backUrl))) {
method = 'switchTab'
@ -595,11 +556,11 @@
uni[method]({
url: backUrl
});
} else {
}else{
that.auth_token = res.data.result.key;
that.bindStatus = true;
}
uni.hideLoading();
uni.hideLoading();
}).catch(res => {
uni.hideLoading();
uni.showToast({
@ -645,56 +606,55 @@
if (!that.isAgree) return that.$util.Tips({
title: '请勾选用户协议与隐私政策'
});
loginMobile({
auth_token: uni.getStorageSync('auth_token'),
phone: that.account,
sms_code: that.captcha,
spread: that.$Cache.get("spread"),
// #ifdef APP-PLUS
user_type: 'app',
// #endif
// #ifdef H5
user_type: 'h5',
// #endif
})
.then(({
data
}) => {
const backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
that.$Cache.clear(BACK_URL);
that.$store.commit("LOGIN", {
'token': data.token,
'time': data.exp
});
that.$store.commit("SETUID", data.user.uid);
that.$store.commit('UPDATE_USERINFO', data.user);
let method
let indexPat = ['/pages/index/index', '/pages/order_addcart/order_addcart',
'/pages/goods_cate/goods_cate',
'/pages/user/index'
]
if (indexPat.includes(this.getPath(backUrl))) {
method = 'switchTab'
} else {
method = 'navigateTo'
}
if (this.getPath(backUrl) === '/pages/users/login/index') {
uni.switchTab({
url: '/pages/index/index'
});
return
}
uni[method]({
url: backUrl
});
})
.catch(res => {
that.$util.Tips({
title: res
});
auth_token: uni.getStorageSync('auth_token'),
phone: that.account,
sms_code: that.captcha,
spread: that.$Cache.get("spread"),
// #ifdef APP-PLUS
user_type: 'app',
// #endif
// #ifdef H5
user_type: 'h5',
// #endif
})
.then(({
data
}) => {
const backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
that.$Cache.clear(BACK_URL);
that.$store.commit("LOGIN", {
'token': data.token,
'time': data.exp
});
that.$store.commit("SETUID", data.user.uid);
that.$store.commit('UPDATE_USERINFO', data.user);
let method
let indexPat = ['/pages/index/index', '/pages/order_addcart/order_addcart', '/pages/goods_cate/goods_cate',
'/pages/user/index'
]
if (indexPat.includes(this.getPath(backUrl))) {
method = 'switchTab'
} else {
method = 'navigateTo'
}
if (this.getPath(backUrl) === '/pages/users/login/index') {
uni.switchTab({
url: '/pages/index/index'
});
return
}
uni[method]({
url: backUrl
});
})
.catch(res => {
that.$util.Tips({
title: res
});
});
},
async register() {
let that = this;
@ -720,36 +680,36 @@
title: '请勾选用户协议与隐私政策'
});
register({
auth_token: this.auth_token || uni.getStorageSync('auth_token'),
phone: that.account,
sms_code: that.captcha,
pwd: that.password,
spread: that.$Cache.get("spread"),
// #ifdef APP-PLUS
user_type: 'app',
// #endif
// #ifdef H5
user_type: 'h5',
// #endif
})
.then(res => {
const backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
that.$Cache.clear(BACK_URL);
that.$store.commit("LOGIN", {
'token': res.data.token,
'time': res.data.exp
});
that.$store.commit("SETUID", res.data.user.uid);
that.$store.commit('UPDATE_USERINFO', res.data.user);
uni.switchTab({
url: '/pages/user/index'
})
})
.catch(res => {
that.$util.Tips({
title: res
});
auth_token: this.auth_token || uni.getStorageSync('auth_token'),
phone: that.account,
sms_code: that.captcha,
pwd: that.password,
spread: that.$Cache.get("spread"),
// #ifdef APP-PLUS
user_type: 'app',
// #endif
// #ifdef H5
user_type: 'h5',
// #endif
})
.then(res => {
const backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
that.$Cache.clear(BACK_URL);
that.$store.commit("LOGIN", {
'token': res.data.token,
'time': res.data.exp
});
that.$store.commit("SETUID", res.data.user.uid);
that.$store.commit('UPDATE_USERINFO', res.data.user);
uni.switchTab({
url: '/pages/user/index'
})
})
.catch(res => {
that.$util.Tips({
title: res
});
});
},
async code(data) {
let that = this;
@ -765,7 +725,7 @@
type: 'login',
key: that.keyCode,
// code: that.codeVal,
toke: data.token,
toke:data.token,
captchaType: 'blockPuzzle',
captchaVerification: data.captchaVerification
})
@ -832,8 +792,7 @@
that.$store.commit('UPDATE_USERINFO', data.user);
let method
let indexPat = ['/pages/index/index', '/pages/order_addcart/order_addcart',
'/pages/goods_cate/goods_cate',
let indexPat = ['/pages/index/index', '/pages/order_addcart/order_addcart', '/pages/goods_cate/goods_cate',
'/pages/user/index'
]
if (indexPat.includes(this.getPath(backUrl))) {
@ -849,7 +808,7 @@
}
uni[method]({
url: backUrl
});
});
})
.catch(e => {
that.$util.Tips({
@ -884,58 +843,51 @@
</script>
<style lang="scss" scoped>
/deep/uni-checkbox .uni-checkbox-input,
/deep/checkbox .wx-checkbox-input {
/deep/checkbox .wx-checkbox-input{
border-radius: 100%;
width: 28rpx;
height: 28rpx;
}
/deep/checkbox .uni-checkbox-input.uni-checkbox-input-checked,
/deep/checkbox .wx-checkbox-input.wx-checkbox-input-checked {
border: 1px solid var(--view-theme) !important;
background-color: var(--view-theme) !important;
border: 1px solid var(--view-theme)!important;
background-color: var(--view-theme)!important;
}
.ChangePassword .phone {
font-size: 32rpx;
font-weight: bold;
text-align: center;
margin-top: 55rpx;
}
.ChangePassword .list {
width: 580rpx;
margin: 53rpx auto 0 auto;
}
.ChangePassword .list .item {
width: 100%;
height: 110rpx;
border-bottom: 2rpx solid #f0f0f0;
}
.ChangePassword .list .item input {
width: 100%;
height: 100%;
font-size: 32rpx;
}
.ChangePassword .list .item .placeholder {
color: #bbbbbb;
}
.ChangePassword .list .item input.codeIput {
width: 240rpx;
width: 240rpx;
}
.register .whiteBg .title_info text {
.register .whiteBg .title_info text{
color: var(--view-theme);
}
.register .list .item .code {
color: var(--view-theme);
}
.title-bar {
position: relative;
display: flex;
@ -945,7 +897,6 @@
font-weight: 500;
color: #333333;
line-height: 48rpx;
.icon {
position: absolute;
left: 30rpx;
@ -955,15 +906,14 @@
justify-content: center;
width: 80rpx;
height: 80rpx;
image {
width: 50rpx;
height: 50rpx;
}
}
}
.getPhoneBtn {
.getPhoneBtn{
font-size: 32rpx;
width: 580rpx;
height: 90rpx;
@ -973,18 +923,15 @@
margin: 40rpx auto 0 auto;
text-align: center;
line-height: 90rpx;
.iconfont {
.iconfont{
font-size: 32rpx;
margin-right: 12rpx;
}
}
.code image {
width: 100%;
height: 100%;
}
.settlementAgreement {
width: 100%;
height: 100%;
@ -994,63 +941,52 @@
background: rgba(0, 0, 0, .5);
z-index: 10;
}
.protocol_text {
.protocol_text{
color: #999;
font-size: 24rpx;
}
.protocol {
.protocol{
margin-top: 82rpx;
justify-content: center;
}
.protocol_text {
.font_pro {
.protocol_text{
.font_pro{
color: var(--view-theme);
}
}
.appLogin {
margin-top: 82rpx;
.hds {
display: flex;
justify-content: center;
align-items: center;
font-size: 24rpx;
color: #B4B4B4;
color: #B4B4B4;
.line {
width: 68rpx;
height: 1rpx;
background: #CCCCCC;
}
}
p {
margin: 0 20rpx;
}
}
}
.btn-wrapper {
display: flex;
align-items: center;
justify-content: center;
margin-top: 30rpx;
.btn {
display: flex;
align-items: center;
justify-content: center;
width: 68rpx;
height: 68rpx;
border-radius: 50%;
+.btn {
border-radius: 50%;
+ .btn {
margin-left: 30rpx;
}
}
.apple-btn {
display: flex;
align-items: center;
@ -1061,38 +997,31 @@
background: #EAEAEA;
border-radius: 34rpx;
font-size: 24rpx;
.icon-s-pingguo {
color: #333;
margin-right: 10rpx;
font-size: 34rpx;
}
}
.iconfont {
font-size: 40rpx;
color: #fff;
}
.wx {
background-color: #61C64F;
&.btn-apple {
&.btn-apple{
margin-right: 0;
background-color: #333;
}
}
.mima {
background-color: #28B3E9;
}
.yanzheng {
background-color: #F89C23;
}
}
}
.whiteBg .logon {
display: flex;
align-items: center;
@ -1105,17 +1034,14 @@
color: #FFFFFF;
font-size: 30rpx;
}
.whiteBg .back {
border: 1px solid var(--view-theme);
.whiteBg .back{
border: 1px solid var(--view-theme);
color: var(--view-theme);
margin-top: 30rpx;
background-color: transparent;
}
.login-wrapper {
padding: 30rpx;
.shading {
display: flex;
align-items: center;
@ -1126,7 +1052,6 @@
/* #endif */
/* #ifndef APP-VUE */
margin-top: 200rpx;
/* #endif */
image {
width: 180rpx;
@ -1134,7 +1059,6 @@
}
}
}
.copyright {
position: fixed;
bottom: 30rpx;
@ -1145,4 +1069,4 @@
line-height: 28rpx;
color: #9E9E9E;
}
</style>
</style>

File diff suppressed because it is too large Load Diff

View File

@ -1,69 +0,0 @@
let customStyle = {
"fullScreen": true, // 是否全屏显示,默认值: false
"backgroundColor": "#ffffff", // 授权页面背景颜色,默认值:#ffffff
"backgroundImage": "", // 全屏显示的背景图片,默认值:"" (仅支持本地图片,只有全屏显示时支持)
"icon": {
"path": "static/xxx.png", // 自定义显示在授权框中的logo仅支持本地图片 默认显示App logo
"width": "60px", //图标宽度 默认值60px
"height": "60px" //图标高度 默认值60px
},
"closeIcon": {
"path": "static/xxx.png", // 自定义显示在授权框中的logo仅支持本地图片 默认显示App logo
"width": "60px", //图标宽度 默认值60px (HBuilderX 4.0支持)
"height": "60px" //图标高度 默认值60px (HBuilderX 4.0支持)
},
"phoneNum": {
"color": "#202020" // 手机号文字颜色 默认值:#202020
},
"slogan": {
"color": "#BBBBBB" // slogan 字体颜色 默认值:#BBBBBB
},
"authButton": {
"normalColor": "#3CB625", // 授权按钮正常状态背景颜色 默认值:#3479f5
"highlightColor": "#2861c5", // 授权按钮按下状态背景颜色 默认值:#2861c5仅ios支持
"disabledColor": "#73aaf5", // 授权按钮不可点击时背景颜色 默认值:#73aaf5仅ios支持
"textColor": "#ffffff", // 授权按钮文字颜色 默认值:#ffffff
"title": "本机号码一键登录", // 授权按钮文案 默认值:“本机号码一键登录”
"borderRadius": "24px" // 授权按钮圆角 默认值:"24px" (按钮高度的一半)
},
"otherLoginButton": {
"visible": true, // 是否显示其他登录按钮默认值true
"normalColor": "", // 其他登录按钮正常状态背景颜色 默认值:透明
"highlightColor": "", // 其他登录按钮按下状态背景颜色 默认值:透明
"textColor": "#656565", // 其他登录按钮文字颜色 默认值:#656565
"title": "其他登录方式", // 其他登录方式按钮文字 默认值:“其他登录方式”
"borderColor": "", //边框颜色 默认值透明仅iOS支持
"borderRadius": "0px" // 其他登录按钮圆角 默认值:"24px" (按钮高度的一半)
},
"privacyTerms": {
"defaultCheckBoxState": true, // 条款勾选框初始状态 默认值: true
"isCenterHint": false, //未勾选服务条款时点击登录按钮的提示是否居中显示 默认值: false (3.7.13+ 版本支持)
"uncheckedImage": "", // 可选 条款勾选框未选中状态图片(仅支持本地图片 建议尺寸 24x24px(3.2.0+ 版本支持)
"checkedImage": "", // 可选 条款勾选框选中状态图片(仅支持本地图片 建议尺寸24x24px(3.2.0+ 版本支持)
"checkBoxSize": 12, // 可选 条款勾选框大小
"textColor": "#BBBBBB", // 文字颜色 默认值:#BBBBBB
"termsColor": "#5496E3", // 协议文字颜色 默认值: #5496E3
"prefix": "我已阅读并同意", // 条款前的文案 默认值:“我已阅读并同意”
"suffix": "并使用本机号码登录", // 条款后的文案 默认值:“并使用本机号码登录”
"privacyItems": [ // 自定义协议条款最大支持2个需要同时设置url和title. 否则不生效
{
"url": "https://", // 点击跳转的协议详情页面
"title": "用户服务协议" // 协议名称
}
]
},
"buttons": { // 自定义页面下方按钮仅全屏模式生效3.1.14+ 版本支持)
"iconWidth": "45px", // 图标宽度(高度等比例缩放) 默认值45px
"list": [{
"provider": "apple",
"iconPath": "/static/apple.png" // 图标路径仅支持本地图片
},
{
"provider": "weixin",
"iconPath": "/static/wechat.png" // 图标路径仅支持本地图片
}
]
}
}
export default customStyle

View File

@ -1457,7 +1457,7 @@
title: res.message,
icon: 'success'
}, {
tab: 5,
tab: 4,
url: goPages
});
}).catch(res => {
@ -1486,7 +1486,7 @@
title: '支付成功',
icon: 'success'
}, {
tab: 5,
tab: 4,
url: url
});
},
@ -1496,7 +1496,7 @@
return that.$util.Tips({
title: '取消支付',
}, {
tab: 5,
tab: 4,
url: url
});
},
@ -1506,7 +1506,7 @@
return that.$util.Tips({
title: '',
}, {
tab: 5,
tab: 4,
url: url
});
},
@ -1564,7 +1564,7 @@
title: '下单成功,请上传支付凭证!'
}, {
tab: 5,
url: "/pages/users/order_list/index?sale_type=" + this.sale_type
url: "/pages/users/order_list/index?sale_type="+ this.sale_type
});
break;
// #ifdef H5

View File

@ -9,9 +9,8 @@
<view class="btn_tab">
<view class="tab_item" :class="{'tab_item_active': sale_type==1}" @click="changeSaleType(1)">
用户订单</view>
<view v-if="(mer_info && mer_info.mer_settlement_agree_status==1)||sale_type==2"
class="tab_item" :class="{'tab_item_active': sale_type==2}" @click="changeSaleType(2)">商户订单
</view>
<view v-if="mer_info.mer_settlement_agree_status||sale_type==2" class="tab_item"
:class="{'tab_item_active': sale_type==2}" @click="changeSaleType(2)">商户订单</view>
</view>
<view class="btn_car" @click="toGwc">
<text class="iconfont icon-gouwuche" style="font-size: 36rpx;"></text>
@ -20,28 +19,23 @@
<view class='nav acea-row row-around new-nav-tab'>
<view class='item' :class='orderStatus==-1 ? "on": ""' @click="statusClick(-1)">
<view>全部</view>
<view class='num'>{{(sale_type==1?orderData.all:orderData.mer_all) || 0}}</view>
<view class='num'>{{orderData.all || 0}}</view>
</view>
<view class='item' :class='orderStatus==0 ? "on": ""' @click="statusClick(0)">
<view>待付款</view>
<view class='num'>{{(sale_type==1?orderData.noPay:orderData.mer_noPay) || 0}}</view>
<view class='num'>{{orderData.noPay || 0}}</view>
</view>
<view class='item' :class='orderStatus==1 ? "on": ""' @click="statusClick(1)">
<view>待发货</view>
<view class='num'>{{(sale_type==1?orderData.noPostage:orderData.mer_noPostage) || 0}}</view>
<view class='num'>{{orderData.noPostage || 0}}</view>
</view>
<view class='item' :class='orderStatus==2 ? "on": ""' @click="statusClick(2)">
<view>待收货</view>
<view class='num' v-if="sale_type == 1">{{(Number(orderData.noDeliver)) || 0}} </view>
<view class='num' v-else>{{( Number(orderData.mer_noDeliver)) || 0}} </view>
<view class='num '>{{orderData.noDeliver || 0}}</view>
</view>
<view class='item' :class='orderStatus==3 ? "on": ""' @click="statusClick(3)">
<view>待评价</view>
<view class='num'>{{(sale_type==1?orderData.noComment:orderData.mer_noComment) || 0}}</view>
</view>
<view class='item' :class='orderStatus==4 ? "on": ""' @click="statusClick(4)">
<view>退款/售后</view>
<view class='num'>{{(sale_type==1?orderData.elseRefund:orderData.mer_elseRefund) || 0}}</view>
<view class='num'>{{orderData.noComment || 0}}</view>
</view>
</view>
</view>
@ -79,12 +73,10 @@
<view class='num'>{{orderData.noComment || 0}}</view>
</view>
</view> -->
<navigator class="search acea-row row-middle"
:url="`/pages/users/order_list/search?sale_type=${sale_type}&status=${orderStatus}`" hover-class="none">
<navigator class="search acea-row row-middle" :url="`/pages/users/order_list/search?sale_type=${sale_type}`" hover-class="none">
<text class="iconfont icon-sousuo"></text>
搜索我的订单
</navigator>
<!--定金预售订单-->
<view v-if="presellProList.length > 0" class="event_container"
:style="{ 'background-image': `url(${domain}/static/images/presell_orderBg.png)`}">
@ -110,19 +102,19 @@
<block v-if="orderStatus == 0">
<view class='item' v-for="(item,index) in orderList" :key="index">
<view @click='goOrderDetails(item.group_order_id)'>
<view v-for="(order,j) in item.orderList" :key="order.order_id+j">
<view class='title acea-row row-between-wrapper'>
<view class="acea-row row-middle left-wrapper">
<text class="iconfont icon-shangjiadingdan"></text>
<view class="store-name line1">{{order.merchant.mer_name}}
</view>
<text class="iconfont icon-xiangyou"></text>
</view>
<view class='t-color'>
{{ order.activity_type === 2 && order.orderProduct[0].cart_info.productPresell.presell_type ==2 ? "待付定金" : "待付款" }}
<view class='title acea-row row-between-wrapper'>
<view class="acea-row row-middle left-wrapper">
<text class="iconfont icon-shangjiadingdan"></text>
<view class="store-name">
<view>{{item.orderList[0].merchant.mer_name}}</view>
</view>
<text class="iconfont icon-xiangyou"></text>
</view>
<view class='t-color'>
{{ item.orderList[0].activity_type === 2 && item.orderList[0].orderProduct[0].cart_info.productPresell.presell_type ==2 ? "待付定金" : "待付款" }}
</view>
</view>
<view v-for="(order,j) in item.orderList" :key="order.order_id+j">
<!--预售-->
<view v-if="order.activity_type === 2">
<block v-for="(goods,g) in order.orderProduct">
@ -215,73 +207,6 @@
</view>
</view>
</block>
<!-- 退款 -->
<block v-else-if="orderStatus == 4">
<view class="goods-wrapper">
<view>
<view class="info-box" v-for="(item,index) in orderList" :key="index">
<view class="title" @click="goMall(item)">
<text class="iconfont icon-shangjiadingdan"></text>
<text v-if="item.merchant" class="txt line1"
style="max-width: 500rpx;">{{item.merchant.mer_name}}</text>
<text class="iconfont icon-xiangyou"></text>
</view>
<view class="product-box">
<view class="product-item" v-for="goods in item.refundProduct"
:key="goods.order_product_id">
<image class="img-box" :src="goods.product.cart_info.product.image" mode="">
</image>
<view class="msg">
<view class="name line1"><text
v-if="goods.product.cart_info.product_type === 2"
class="event_name event_bg">预售</text>{{goods.product.cart_info.product.store_name}}
</view>
<view class="des">{{goods.product.cart_info.productAttr.sku}}</view>
<view class="price">退款{{goods.refund_price}}</view>
<view class="num">x {{goods.refund_num}}</view>
</view>
</view>
</view>
<view class="btn-box" v-if="item.status == 1">
<view class="btn gray" @click="goDetail(item)">查看详情</view>
<view class="btn" @click="goPage(item.refund_order_id)">退回商品</view>
</view>
<view class="btn-box" v-else-if="item.status == -1">
<view class="btn" @click="goDetail(item)">查看详情</view>
<!-- <view class="btn" @click="applyAgain(item)">再次申请</view> -->
</view>
<view class="btn-box" v-else>
<view class="btn gray" v-if="item.status == 3" @click="bindDetele(item,index)">
删除订单</view>
<view class="btn" @click="goDetail(item)">查看详情</view>
</view>
<view class="status">
<!-- 0审核中 1待发货 2待收货 3已退款 -1已拒绝 -->
<block v-if="item.status == 0">
<text class="iconfont icon-shenhezhong1 p-color"></text>
</block>
<block v-if="item.status == 1">
<text class="iconfont icon-daituihuo"></text>
</block>
<block v-if="item.status == 2">
<text class="iconfont icon-tuihuozhong"></text>
</block>
<block v-if="item.status == 3">
<text class="iconfont icon-yituikuan"></text>
</block>
<block v-if="item.status == -1">
<text class="iconfont icon-yijujue1"></text>
</block>
<block v-if="item.status == -2">
<text class="iconfont icon-yiquxiao"></text>
</block>
</view>
</view>
</view>
</view>
</block>
<!-- 待发货 待收货 待评价 已完成 -->
<block v-else>
<view class='item' v-for="(item,index) in orderList" :key="index">
@ -289,8 +214,8 @@
<view class='title acea-row row-between-wrapper'>
<view class="acea-row row-middle left-wrapper" @click.stop="goMall(item)">
<text class="iconfont icon-shangjiadingdan"></text>
<view class="store-name line1">
{{item.merchant.mer_name}}
<view class="store-name">
<view>{{item.merchant.mer_name}}</view>
</view>
<text class="iconfont icon-xiangyou"></text>
</view>
@ -420,7 +345,7 @@
</view>
<!-- <home></home> -->
<payment :payMode='payMode' :pay_close="pay_close" @onChangeFun='onChangeFun' :order_id="pay_order_id"
:totalPrice='totalPrice' :sale_type="sale_type"></payment>
:totalPrice='totalPrice'></payment>
<addInvoicing ref="addInvoicing" @changeInvoiceClose="changeInvoiceClose" :invoice='invoice'></addInvoicing>
@ -478,9 +403,7 @@
groupOrderList,
orderTake,
applyInvoiceApi,
uploadEnvidenceApi,
refundListNew,
refundDel
uploadEnvidenceApi
} from '@/api/order.js';
import {
getUserInfo
@ -576,12 +499,6 @@
add: false,
},
mer_info: {},
refundParam: {
page: 1,
limit: 15,
type: 0,
identity: ''
}
};
},
computed: {
@ -592,22 +509,23 @@
onLoad(options) {
if (options.sale_type) this.sale_type = options.sale_type;
if (options.status) this.orderStatus = options.status;
if (this.isLogin) {
this.page = 1;
this.loadend = false;
this.loading = false;
this.getOrderData();
this.getOrderList();
this.getUserInfo(options);
this.getpreSellOrderList();
} else {
toLogin()
}
if (options.sale_type) {
this.sale_type = options.sale_type
}
let user = this.$store.state.app.userInfo;
if (user.mer_info) this.initMerInfo(user);
if (this.isLogin) {
this.page = 1;
this.loadend = false;
this.loading = false;
this.getOrderData();
this.getOrderList();
this.getUserInfo();
this.getpreSellOrderList();
} else {
toLogin()
}
},
onShow() {
},
onReady: function() {
// #ifdef H5
this.$nextTick(() => {
@ -622,25 +540,8 @@
});
// #endif
},
//
onPullDownRefresh() {
this.loadend = false;
this.loading = false;
this.$set(this, 'orderList', []);
if (this.orderStatus == 4) {
this.refundParam.page = 1;
this.getRefundList();
} else {
this.page = 1;
this.getOrderList();
this.getOrderData();
}
},
methods: {
//
//
handleCopy() {
let that = this;
uni.setClipboardData({
@ -668,8 +569,29 @@
navBack() {
uni.navigateBack();
},
initMerInfo(user) {
this.mer_info = user;
if (this.mer_info.mer_settlement_agree_status) {
this.payMode.forEach(item => {
if (item.value == 'merBalance') {
item.payStatus = 1;
item.number = this.mer_info.mer_money;
}
})
}
},
changeSaleType(type = 1) {
if (type != this.sale_type) {
this.sale_type = type;
this.page = 1;
this.loadend = false;
this.loading = false;
this.getOrderData();
this.getOrderList();
this.getUserInfo();
this.getpreSellOrderList();
}
},
//
goMall(item) {
if (this.hide_mer_status == 0) {
@ -692,34 +614,24 @@
* 获取用户信息
*
*/
getUserInfo: function(options) {
getUserInfo: function() {
let that = this;
getUserInfo().then(res => {
that.payMode[2].number = res.data.now_money;
if (res.data.mer_info) that.initMerInfo(res.data.mer_info, options);
if (res.data.mer_info) that.initMerInfo(res.data.mer_info);
});
},
initMerInfo(user, options) {
this.mer_info = user;
if (user && user.mer_settlement_agree_status) {
this.payMode.forEach(item => {
if (item.value == 'merBalance') {
item.payStatus = 1;
item.number = this.mer_info.mer_money;
}
});
//opentype=2
if (options && options.openType && options.openType == 2) this.changeSaleType(2);
}
},
//
/**
* 关闭支付组件
*
*/
payClose: function() {
this.pay_close = false;
},
//
/**
* 获取订单统计数据
*
*/
getOrderData: function() {
let that = this;
orderData({
@ -728,8 +640,10 @@
that.$set(that, 'orderData', res.data);
})
},
//
/**
* 取消订单
*
*/
cancelOrder: function(index, order_id) {
let that = this;
if (!order_id) return that.$util.Tips({
@ -751,8 +665,10 @@
});
});
},
//
/**
* 打开支付组件
*
*/
goPay: function(pay_price, order_id) {
this.$set(this, 'pay_close', true);
this.order_id = order_id;
@ -778,7 +694,10 @@
});
},
//
/**
* 支付成功回调
*
*/
pay_complete: function() {
this.loadend = false;
this.page = 1;
@ -788,14 +707,17 @@
this.getOrderData();
this.getOrderList();
},
//
/**
* 支付失败回调
*
*/
pay_fail: function() {
this.pay_close = false;
this.pay_order_id = '';
},
//
/**
* 去订单详情
*/
goOrderDetails: function(order_id) {
let self = this
if (!order_id) return that.$util.Tips({
@ -809,13 +731,11 @@
uni.hideLoading();
if (self.orderStatus == 0) {
uni.navigateTo({
url: '/pages/order_details/stay?order_id=' + order_id + '&sale_type=' +
this.sale_type
url: '/pages/order_details/stay?order_id=' + order_id + '&sale_type=' + this.sale_type
})
} else {
uni.navigateTo({
url: '/pages/order_details/index?order_id=' + order_id + '&sale_type=' +
this.sale_type
url: '/pages/order_details/index?order_id=' + order_id + '&sale_type=' + this.sale_type
})
}
}).catch(() => {
@ -834,8 +754,9 @@
}
// #endif
},
//
/**
* 点击去评价
*/
goOrderDetails_Evaluation: function(order_id) {
let self = this
if (!order_id) return that.$util.Tips({
@ -864,105 +785,21 @@
}
// #endif
},
//
/**
* 切换类型
*/
statusClick: function(status) {
if (status == this.orderStatus) return;
this.orderStatus = status;
this.loadend = false;
this.loading = false;
this.page = 1;
this.$set(this, 'orderList', []);
if (status == 4) { //1 2
if (status == this.orderStatus) return;
this.orderStatus = status;
this.refundParam.identity = this.sale_type;
this.refundParam.page = 1;
this.getRefundList();
} else {
if (status == this.orderStatus) return;
this.orderStatus = status;
this.page = 1;
this.getOrderList();
}
this.getOrderList();
},
changeSaleType(type = 1) {
if (this.sale_type == type) return;
this.loadend = false;
this.loading = false;
this.orderList = [];
this.sale_type = type;
if (this.orderStatus == 4) {
this.refundParam.identity = type;
this.refundParam.page = 1;
this.getRefundList();
} else {
this.page = 1;
this.getOrderData();
this.getOrderList();
this.getUserInfo();
this.getpreSellOrderList();
}
},
// 退
getRefundList() {
let that = this;
if (that.loadend) return;
if (that.loading) return;
that.loading = true;
that.loadTitle = "加载更多";
refundListNew(this.refundParam).then(res => {
let list = res.data.list || [];
let loadend = list.length < that.refundParam.limit;
that.orderList = that.refundParam.page == 1 ? list : that.$util.SplitArray(list, that
.orderList);
that.$set(that, 'orderList', that.orderList);
that.getProductCount();
that.loadend = loadend;
that.loading = false;
that.loadTitle = loadend ? "我也是有底线的" : '加载更多';
that.refundParam.page = that.refundParam.page + 1;
that.isReady = true;
uni.stopPullDownRefresh();
}).catch(err => {
that.loading = false;
that.loadTitle = "加载更多";
})
},
//
goDetail(item) {
uni.navigateTo({
url: '/pages/users/refund/detail?id=' + item.refund_order_id
})
},
//
bindDetele(item, index) {
let self = this
uni.showModal({
title: '提示',
content: '确定删除该记录吗?',
success: function(res) {
if (res.confirm) {
refundDel(item.refund_order_id).then(res => {
self.orderList.splice(index, 1)
})
uni.showToast({
title: '删除成功',
icon: 'none'
})
} else if (res.cancel) {
console.log('用户点击取消');
}
}
});
},
//
/**
* 获取订单列表
*/
getOrderList: function() {
let that = this;
if (that.loadend) return;
@ -988,8 +825,7 @@
that.loadend = loadend;
that.loading = false;
that.loadTitle = loadend ? "我也是有底线的" : '加载更多';
that.page = that.page + 1;
uni.stopPullDownRefresh();
that.page = that.page + 1
})
} else {
getOrderList({
@ -1009,7 +845,6 @@
that.loadTitle = loadend ? "我也是有底线的" : '加载更多';
that.page = that.page + 1;
that.isReady = true;
uni.stopPullDownRefresh();
}).catch(err => {
that.loading = false;
that.loadTitle = "加载更多";
@ -1017,8 +852,9 @@
}
}
},
//
/**
* 获取定金预售订单列表
*/
getpreSellOrderList: function() {
let that = this;
getOrderList({
@ -1032,8 +868,9 @@
that.$set(that, 'presellProList', list);
})
},
//
/**
* 获取单个订单商品数量
*/
getProductCount: function() {
if (this.orderStatus !== 0) {
this.orderList.forEach((item, i) => {
@ -1047,8 +884,9 @@
})
}
},
//
/**
* 删除订单
*/
delOrder: function(order_id, index) {
let that = this;
orderDel(order_id).then(res => {
@ -1066,7 +904,6 @@
});
})
},
//
confirmOrder: function(item, index) {
let that = this;
@ -1092,7 +929,6 @@
}
})
},
/*申请开票*/
applyInvoice(order_id) {
let that = this;
@ -1102,13 +938,11 @@
that.$refs.addInvoicing.getInvoiceDefault();
that.$refs.addInvoicing.getInvoiceList();
},
//
changeInvoiceClose: function(data) {
if (data) this.getInvoiceData(data);
this.$set(this.invoice, 'invoice', false);
},
//
getInvoiceData(data) {
let that = this
@ -1124,138 +958,12 @@
}
},
onReachBottom: function() {
if (this.orderStatus == 4)
this.getRefundList()
else
this.getOrderList();
this.getOrderList();
}
}
</script>
<style scoped lang="scss">
.info-box {
position: relative;
margin-top: 12rpx;
background-color: #fff;
.title {
display: flex;
align-items: center;
padding: 0 32rpx;
height: 86rpx;
border-bottom: 1px solid #F0F0F0;
color: #282828;
.icon-shangjiadingdan {
font-size: 32rpx;
}
.txt {
margin: 0 5rpx;
}
.icon-xiangyou {
color: #999;
font-size: 20rpx;
margin-top: 6rpx;
}
}
.product-box {
.product-item {
display: flex;
padding: 25rpx 30rpx;
.img-box {
width: 130rpx;
height: 130rpx;
border-radius: 16rpx;
}
.msg {
position: relative;
display: flex;
flex-direction: column;
justify-content: space-between;
width: 440rpx;
margin-left: 26rpx;
.name {
font-size: 28rpx;
color: #282828;
}
.des {
font-size: 20rpx;
color: #868686;
}
.price {
font-size: 26rpx;
}
.num {
position: absolute;
right: -50rpx;
top: 4rpx;
color: #868686;
font-size: 26rpx;
}
}
}
.event_name {
display: inline-block;
margin-right: 9rpx;
color: #fff;
font-size: 20rpx;
padding: 0 8rpx;
line-height: 30rpx;
text-align: center;
border-radius: 6rpx;
}
}
.btn-box {
display: flex;
justify-content: flex-end;
padding: 0 20rpx 20rpx;
.btn {
width: 176rpx;
height: 60rpx;
line-height: 60rpx;
margin-left: 18rpx;
text-align: center;
background: var(--view-theme);
border-radius: 30rpx;
color: #fff;
font-size: 27rpx;
&.gray {
border: 1px solid #ddd;
background: transparent;
color: #aaa;
}
}
}
.status {
position: absolute;
right: 30rpx;
top: 0;
.iconfont {
font-size: 120rpx;
opacity: .3;
}
.p-color {
color: var(--view-theme);
}
}
}
.popups {
width: 640rpx;
background-color: #fff;
@ -1384,7 +1092,6 @@
}
.store-name {
max-width: 400rpx;
margin: 0 10rpx;
}

View File

@ -4,8 +4,7 @@
<view class='header'>
<view class="search acea-row row-middle">
<text class="iconfont icon-sousuo"></text>
<input v-model="store_name" :focus="focus" confirm-type="search" placeholder="搜索我的订单" class="input"
inputmode="search" @confirm="handleSearch" />
<input v-model="store_name" :focus="focus" confirm-type="search" placeholder="搜索我的订单" class="input" inputmode="search" @confirm="handleSearch" />
</view>
</view>
<view class='list'>
@ -18,155 +17,74 @@
<view class="acea-row row-middle left-wrapper">
{{item.group_order_sn}}
</view>
<view class='t-color'>
{{ item.orderList[0].activity_type === 2 && item.orderList[0].orderProduct[0].cart_info.productPresell.presell_type ==2 ? "待付定金" : "待付款" }}
</view>
<view class='t-color'>{{ item.orderList[0].activity_type === 2 && item.orderList[0].orderProduct[0].cart_info.productPresell.presell_type ==2 ? "待付定金" : "待付款" }}</view>
</view>
<view v-for="(order,j) in item.orderList" :key="order.order_id+j">
<!--预售-->
<view v-if="order.activity_type === 2">
<block v-for="(goods,g) in order.orderProduct">
<view class='item-info acea-row row-between row-top'>
<!--预售-->
<view v-if="order.activity_type === 2">
<block v-for="(goods,g) in order.orderProduct">
<view class='item-info acea-row row-between row-top'>
<view class='pictrue'>
<image
:src='(goods.cart_info.productAttr && goods.cart_info.productAttr.image) || goods.cart_info.product.image'>
</image>
<image :src='(goods.cart_info.productAttr && goods.cart_info.productAttr.image) || goods.cart_info.product.image'></image>
</view>
<view class='text acea-row row-between'>
<view class='name line1'>
<text
class="event_name event_bg">预售</text><text>{{goods.cart_info.product.store_name}}</text>
<text class="event_name event_bg">预售</text><text>{{goods.cart_info.product.store_name}}</text>
<view class="event_ship event_color">发货时间
<!--全款预售-->
<text
v-if="goods.cart_info.productPresell.presell_type === 1">
<text v-if="goods.cart_info.productPresell.presell_type === 1">
{{ goods.cart_info.productPresell.delivery_type === 1 ? '支付成功后' : '预售结束后' }}{{ goods.cart_info.productPresell.delivery_day }}天内
</text>
<!--定金预售-->
<text
v-if="goods.cart_info.productPresell.presell_type === 2">{{ goods.cart_info.productPresell.delivery_type === 1 ? '支付尾款后' : '预售结束后' }}{{ goods.cart_info.productPresell.delivery_day }}天内</text>
<text v-if="goods.cart_info.productPresell.presell_type === 2">{{ goods.cart_info.productPresell.delivery_type === 1 ? '支付尾款后' : '预售结束后' }}{{ goods.cart_info.productPresell.delivery_day }}天内</text>
</view>
</view>
<view class='money'>
<view>{{goods.cart_info.productPresellAttr.presell_price}}
</view>
<view>{{goods.cart_info.productPresellAttr.presell_price}}</view>
<view>x{{goods.product_num}}</view>
</view>
</view>
<view v-if="goods.cart_info.productPresell.presell_type === 2"
class="event_price">
定金待支付 <text class="t-color">{{ order.pay_price }}</text>
尾款待支付 <text
class="t-color">{{ order.presellOrder.pay_price }}</text>
<view v-if="goods.cart_info.productPresell.presell_type === 2" class="event_price">
定金待支付 <text class="t-color">{{ order.pay_price }}</text>
尾款待支付 <text class="t-color">{{ order.presellOrder.pay_price }}</text>
</view>
</view>
</block>
</view>
</block>
</view>
<view v-else>
<block v-for="(goods,g) in order.orderProduct">
<view class='item-info acea-row row-between row-top'>
<view class='pictrue'>
<image
:src='(goods.cart_info.productAttr && goods.cart_info.productAttr.image) || goods.cart_info.product.image'>
</image>
</view>
<view class='text acea-row row-between'>
<view class='name line2'>{{goods.cart_info.product.store_name}}
<view class='item-info acea-row row-between row-top'>
<view class='pictrue'>
<image :src='(goods.cart_info.productAttr && goods.cart_info.productAttr.image) || goods.cart_info.product.image'></image>
</view>
<view class='money' v-if="item.orderList[0].activity_type == 4">
<view v-if="goods.cart_info.activeSku">
{{goods.cart_info.activeSku.active_price}}</view>
<view>x{{goods.product_num}}</view>
<view class='text acea-row row-between'>
<view class='name line2'>{{goods.cart_info.product.store_name}}</view>
<view class='money' v-if="item.orderList[0].activity_type == 4">
<view v-if="goods.cart_info.activeSku">{{goods.cart_info.activeSku.active_price}}</view>
<view>x{{goods.product_num}}</view>
</view>
<view v-else class='money'>
<view>{{goods.cart_info.productAttr.price}}</view>
<view>x{{goods.product_num}}</view>
</view>
</view>
<view v-else class='money'>
<view>{{goods.cart_info.productAttr.price}}</view>
<view>x{{goods.product_num}}</view>
</view>
</view>
</view>
</block>
</view>
</view>
</block>
</view>
</view>
<view class='totalPrice' v-if="item.orderList[0].activity_type !== 2">
{{item.total_num || 0}}件商品总金额
<view class='totalPrice' v-if="item.orderList[0].activity_type !== 2">{{item.total_num || 0}}件商品总金额
<text class='money p-color'>{{item.pay_price}}</text>
</view>
<view class='bottom acea-row row-right row-middle'>
<!-- <view class='bnt cancelBnt' @click.stop='cancelOrder(index,item.group_order_id)'>取消订单</view> -->
<view class='bnt b-color' @click.stop='goPay(item.pay_price,item.group_order_id)'>
立即付款</view>
<!-- <view class='bnt cancelBnt' @click.stop='cancelOrder(index,item.group_order_id)'>取消订单</view> -->
<view class='bnt b-color' @click.stop='goPay(item.pay_price,item.group_order_id)'>立即付款</view>
</view>
</view>
</view>
</block>
<block v-else-if="orderStatus == 4">
<view class="goods-wrapper">
<view>
<view class="info-box" v-for="(item,index) in orderList" :key="index">
<view class="title" @click="goStore(item)">
<text class="iconfont icon-shangjiadingdan"></text>
<text v-if="item.merchant" class="txt">{{item.merchant.mer_name}}</text>
<text class="iconfont icon-xiangyou"></text>
</view>
<view class="product-box">
<view class="product-item" v-for="goods in item.refundProduct"
:key="goods.order_product_id">
<image class="img-box" :src="goods.product.cart_info.product.image" mode="">
</image>
<view class="msg">
<view class="name line1"><text
v-if="goods.product.cart_info.product_type === 2"
class="event_name event_bg">预售</text>{{goods.product.cart_info.product.store_name}}
</view>
<view class="des">{{goods.product.cart_info.productAttr.sku}}</view>
<view class="price">退款{{goods.refund_price}}</view>
<view class="num">x {{goods.refund_num}}</view>
</view>
</view>
</view>
<view class="btn-box" v-if="item.status == 1">
<view class="btn gray" @click="goDetail(item)">查看详情</view>
<view class="btn" @click="goPage(item.refund_order_id)">退回商品</view>
</view>
<view class="btn-box" v-else-if="item.status == -1">
<view class="btn" @click="goDetail(item)">查看详情</view>
<!-- <view class="btn" @click="applyAgain(item)">再次申请</view> -->
</view>
<view class="btn-box" v-else>
<view class="btn gray" v-if="item.status == 3" @click="bindDetele(item,index)">
删除订单</view>
<view class="btn" @click="goDetail(item)">查看详情</view>
</view>
<view class="status">
<!-- 0审核中 1待发货 2待收货 3已退款 -1已拒绝 -->
<block v-if="item.status == 0">
<text class="iconfont icon-shenhezhong1 p-color"></text>
</block>
<block v-if="item.status == 1">
<text class="iconfont icon-daituihuo"></text>
</block>
<block v-if="item.status == 2">
<text class="iconfont icon-tuihuozhong"></text>
</block>
<block v-if="item.status == 3">
<text class="iconfont icon-yituikuan"></text>
</block>
<block v-if="item.status == -1">
<text class="iconfont icon-yijujue1"></text>
</block>
<block v-if="item.status == -2">
<text class="iconfont icon-yiquxiao"></text>
</block>
</view>
</view>
</view>
</view>
</block>
<!-- 待发货 待收货 待评价 已完成 -->
<block v-else>
<view class='item' v-for="(item,index) in orderList" :key="index">
@ -174,9 +92,7 @@
<view class='title acea-row row-between-wrapper'>
<view class="acea-row row-middle left-wrapper" @click.stop="goMall(item)">
<text class="iconfont icon-shangjiadingdan"></text>
<view class="store-name line1" style="max-width: 500rpx;">
{{item.merchant.mer_name}}
</view>
<view class="store-name">{{item.merchant.mer_name}}</view>
<text class="iconfont icon-xiangyou"></text>
</view>
<view v-if="item.status == 0" class='t-color'>待发货</view>
@ -186,30 +102,22 @@
<view v-if="item.status == -1" class='t-color'>已退款</view>
</view>
<view v-if="item.activity_type === 2">
<view class='item-info acea-row row-between row-top'
v-for="(goods,index) in item.orderProduct" :key="index">
<view class='item-info acea-row row-between row-top' v-for="(goods,index) in item.orderProduct" :key="index">
<view class='pictrue'>
<image
:src='(goods.cart_info.productAttr && goods.cart_info.productAttr.image) || goods.cart_info.product.image'>
</image>
<image :src='(goods.cart_info.productAttr && goods.cart_info.productAttr.image) || goods.cart_info.product.image'></image>
</view>
<view class='text acea-row row-between'>
<view class='name '>
<view class='name' :class="item.status === 0 ? 'line1' : 'line2'">
<text
class="event_name event_bg">预售</text><text>{{goods.cart_info.product.store_name}}</text>
<text class="event_name event_bg">预售</text><text>{{goods.cart_info.product.store_name}}</text>
<view v-if="item.status == 0" class="event_ship event_color">发货时间
<!--全款预售-->
<text
v-if="goods.cart_info.productPresell.presell_type === 1">{{ goods.cart_info.productPresell.delivery_type === 1 ? '支付成功后' : '预售结束后' }}{{ goods.cart_info.productPresell.delivery_day }}天内</text>
<text v-if="goods.cart_info.productPresell.presell_type === 1">{{ goods.cart_info.productPresell.delivery_type === 1 ? '支付成功后' : '预售结束后' }}{{ goods.cart_info.productPresell.delivery_day }}天内</text>
<!--定金预售-->
<text
v-if="goods.cart_info.productPresell.presell_type === 2">{{ goods.cart_info.productPresell.delivery_type === 1 ? '支付尾款后' : '预售结束后' }}{{ goods.cart_info.productPresell.delivery_day }}天内</text>
<text v-if="goods.cart_info.productPresell.presell_type === 2">{{ goods.cart_info.productPresell.delivery_type === 1 ? '支付尾款后' : '预售结束后' }}{{ goods.cart_info.productPresell.delivery_day }}天内</text>
</view>
</view>
<view style="margin-top: 10rpx;" class="t-color">
{{goods.is_refund==1?'退款中':goods.is_refund==2?'部分退款':goods.is_refund==3?'全部退款':''}}
</view>
<view style="margin-top: 10rpx;" class="t-color">{{goods.is_refund==1?'退款中':goods.is_refund==2?'部分退款':goods.is_refund==3?'全部退款':''}}</view>
</view>
<view class='money'>
<view>{{goods.cart_info.productPresellAttr.presell_price}}</view>
@ -219,30 +127,23 @@
</view>
</view>
<view v-else>
<view class='item-info acea-row row-between row-top'
v-for="(goods,index) in item.orderProduct" :key="index">
<view class='item-info acea-row row-between row-top' v-for="(goods,index) in item.orderProduct" :key="index">
<view class='pictrue'>
<image
:src='(goods.cart_info.productAttr && goods.cart_info.productAttr.image) || goods.cart_info.product.image'>
</image>
<image :src='(goods.cart_info.productAttr && goods.cart_info.productAttr.image) || goods.cart_info.product.image'></image>
</view>
<view class='text acea-row row-between'>
<view class='name '>
<view class='name line2'>
<text>{{goods.cart_info.product.store_name}}</text>
</view>
<view style="margin-top: 10rpx;" class="t-color">
{{goods.is_refund==1?'退款中':goods.is_refund==2?'部分退款':goods.is_refund==3?'全部退款':''}}
</view>
<view style="margin-top: 10rpx;" class="t-color">{{goods.is_refund==1?'退款中':goods.is_refund==2?'部分退款':goods.is_refund==3?'全部退款':''}}</view>
</view>
<view class='money' v-if="item.activity_type == 3">
<view v-if="goods.cart_info.productAssistAttr">
{{goods.cart_info.productAssistAttr.assist_price}}</view>
<view v-if="goods.cart_info.productAssistAttr">{{goods.cart_info.productAssistAttr.assist_price}}</view>
<view>x{{goods.product_num}}</view>
</view>
<view class='money' v-else-if="item.activity_type == 4">
<view v-if="goods.cart_info.activeSku">
{{goods.cart_info.activeSku.active_price}}</view>
<view v-if="goods.cart_info.activeSku">{{goods.cart_info.activeSku.active_price}}</view>
<view>x{{goods.product_num}}</view>
</view>
<view class='money' v-else>
@ -261,32 +162,23 @@
</view>
<view class='bottom acea-row row-right row-middle'>
<block v-if="item.status == 0 || item.status == 9 || item.status == -1">
<!-- <view class='bnt cancelBnt' @click='goOrderDetails(item.order_id)'>申请退款</view> -->
<!-- <view class='bnt cancelBnt' @click='goOrderDetails(item.order_id)'>申请退款</view> -->
<view class='bnt b-color' @click='goOrderDetails(item.order_id)'>查看详情</view>
</block>
<block v-if="item.status == 1">
<view class='bnt cancelBnt'
v-if="item.delivery_type == 1 || item.delivery_type == 2"
@click='goOrderDetails(item.order_id)'>查看物流</view>
<view class='bnt cancelBnt' v-if="item.delivery_type == 1 || item.delivery_type == 2" @click='goOrderDetails(item.order_id)'>查看物流</view>
<view class='bnt b-color' @tap='confirmOrder(item,index)'>确认收货</view>
</block>
<block v-if="item.status == 2">
<navigator v-if="community_status == 1 && !item.community_id"
:url="'/pages/plantGrass/plant_release/index?order_id='+item.order_id"
class='bnt colorBnt' hover-class="none">
<navigator v-if="community_status == 1 && !item.community_id" :url="'/pages/plantGrass/plant_release/index?order_id='+item.order_id" class='bnt colorBnt' hover-class="none">
<text class="iconfont icon-fabu"></text>
发布种草
</navigator>
<view class='bnt b-color' @click='goOrderDetails_Evaluation(item.order_id)'>去评价
</view>
<view class='bnt b-color' @click='goOrderDetails_Evaluation(item.order_id)'>去评价</view>
</block>
<block v-if="item.status == 3">
<view class='bnt b-color' @click='goOrderDetails(item.order_id)'
v-if="item.activity_type == 2 || item.activity_type == 3 || item.activity_type == 10">
查看详情</view>
<navigator v-if="community_status == 1 && !item.community_id"
:url="'/pages/plantGrass/plant_release/index?order_id='+item.order_id"
class='bnt colorBnt' hover-class="none">
<view class='bnt b-color' @click='goOrderDetails(item.order_id)' v-if="item.activity_type == 2 || item.activity_type == 3 || item.activity_type == 10">查看详情</view>
<navigator v-if="community_status == 1 && !item.community_id" :url="'/pages/plantGrass/plant_release/index?order_id='+item.order_id" class='bnt colorBnt' hover-class="none">
<text class="iconfont icon-fabu"></text>
发布种草
</navigator>
@ -305,8 +197,7 @@
</view>
</view>
<home></home>
<payment :payMode='payMode' :pay_close="pay_close" @onChangeFun='onChangeFun' :order_id="pay_order_id"
:totalPrice='totalPrice'></payment>
<payment :payMode='payMode' :pay_close="pay_close" @onChangeFun='onChangeFun' :order_id="pay_order_id" :totalPrice='totalPrice'></payment>
</view>
</template>
@ -328,27 +219,16 @@
orderDel,
orderPay,
groupOrderList,
orderTake,
refundListNew
orderTake
} from '@/api/order.js';
import {
getUserInfo
} from '@/api/user.js';
import {
openOrderSubscribe
} from '@/utils/SubscribeMessage.js';
import { getUserInfo } from '@/api/user.js';
import { openOrderSubscribe } from '@/utils/SubscribeMessage.js';
import payment from '@/components/payment';
import home from '@/components/home/index.vue';
import {
mapGetters
} from "vuex";
import { mapGetters } from "vuex";
import emptyPage from '@/components/emptyPage.vue'
import {
configMap
} from '@/utils'
import {
toLogin
} from '@/libs/login.js';
import { configMap } from '@/utils'
import { toLogin } from '@/libs/login.js';
export default {
components: {
payment,
@ -360,7 +240,7 @@
loading: false, //
loadend: false, //
loadTitle: '加载更多', //
sale_type: 1,
sale_type: 1,
orderList: [], //
presellProList: [], //
presellOrderCount: 0,
@ -396,34 +276,25 @@
pay_order_id: '',
totalPrice: '0',
isReady: true,
store_name: '',
orderStatus: '',
refundParams: {
page: 1,
limit: 15,
type: 0,
identity: '',
search_info: ''
}
store_name: ''
};
},
computed: {
...mapGetters(['isLogin', 'viewColor']),
...mapGetters(['isLogin','viewColor']),
...configMap(['hide_mer_status', 'community_status', 'alipay_open', 'yue_pay_status']),
},
watch: {
alipay_open(n) {
alipay_open(n){
this.payMode[1].payStatus = n
},
yue_pay_status(n) {
yue_pay_status(n){
this.payMode[2].payStatus = n
}
},
onLoad(options) {
if (options.status) this.orderStatus = options.status;
if (options.sale_type) this.sale_type = options.sale_type;
this.refundParams.identity = options.sale_type;
},
onLoad(options) {
if (options.status) this.orderStatus = options.status;
if (options.sale_type) this.sale_type = options.sale_type;
},
onShow() {
if (this.isLogin) {
this.page = 1;
@ -433,12 +304,16 @@
toLogin()
}
},
onReady(){
},
mounted: function() {
},
methods: {
//
goMall(item) {
if (this.hide_mer_status == 0) {
goMall(item){
if(this.hide_mer_status == 0){
uni.navigateTo({
url: '/pages/store/home/index?id=' + item.mer_id
url:'/pages/store/home/index?id='+item.mer_id
})
}
},
@ -587,15 +462,15 @@
title: '缺少订单号无法查看订单详情和评价'
});
// #ifdef MP
if (self.orderStatus == 0) {
uni.navigateTo({
url: '/pages/order_details/stay?order_id=' + order_id
})
} else {
uni.navigateTo({
url: '/pages/order_details/index?order_id=' + order_id
})
}
if (self.orderStatus == 0) {
uni.navigateTo({
url: '/pages/order_details/stay?order_id=' + order_id
})
} else {
uni.navigateTo({
url: '/pages/order_details/index?order_id=' + order_id
})
}
// #endif
// #ifndef MP
if (self.orderStatus == 0) {
@ -609,62 +484,18 @@
}
// #endif
},
// 退
getRefundList() {
let that = this;
if (that.loadend) return;
if (that.loading) return;
that.loading = true;
that.loadTitle = "加载更多";
refundListNew(this.refundParams).then(res => {
let list = res.data.list || [];
let loadend = list.length < that.limit;
that.orderList = that.page == 1 ? list : that.$util.SplitArray(list, that
.orderList);
that.$set(that, 'orderList', that.orderList);
that.getProductCount();
that.loadend = loadend;
that.loading = false;
that.loadTitle = loadend ? "我也是有底线的" : '加载更多';
that.page = that.page + 1;
that.isReady = true;
uni.stopPullDownRefresh();
}).catch(err => {
that.loading = false;
that.loadTitle = "加载更多";
})
/**
* 切换类型
*/
statusClick: function(status) {
if (status == this.orderStatus) return;
this.orderStatus = status;
this.loadend = false;
this.loading = false;
this.page = 1;
this.$set(this, 'orderList', []);
this.getOrderList();
},
//
goDetail(item) {
uni.navigateTo({
url: '/pages/users/refund/detail?id=' + item.refund_order_id
})
},
//
bindDetele(item, index) {
let self = this
uni.showModal({
title: '提示',
content: '确定删除该记录吗?',
success: function(res) {
if (res.confirm) {
refundDel(item.refund_order_id).then(res => {
self.goodsList.splice(index, 1)
})
uni.showToast({
title: '删除成功',
icon: 'none'
})
} else if (res.cancel) {
console.log('用户点击取消');
}
}
});
},
/**
* 获取订单列表
*/
@ -679,7 +510,7 @@
page: that.page,
limit: that.limit,
store_name: that.store_name,
sale_type: that.sale_type
sale_type: that.sale_type
}).then(res => {
let list = res.data.list || [];
let loadend = list.length < that.limit;
@ -696,24 +527,58 @@
that.loadTitle = "加载更多";
})
},
/**
* 获取定金预售订单列表
*/
getpreSellOrderList: function() {
let that = this;
getOrderList({
status: 10,
page: 1,
limit: 1,
}).then(res => {
let list = res.data.list || [];
that.presellOrderCount = res.data.count;
that.$set(that, 'presellProList', list);
})
},
/**
* 获取单个订单商品数量
*/
getProductCount: function() {
if (this.orderStatus !== 0) {
this.orderList.forEach((item, i) => {
getProductCount: function(){
if(this.orderStatus !== 0){
this.orderList.forEach((item,i) => {
let orderNum = 0
if (item.orderProduct) {
if(item.orderProduct){
item.orderProduct.forEach((val) => {
orderNum += val.product_num
})
this.orderList[i]['orderNum'] = orderNum;
orderNum += val.product_num
})
this.orderList[i]['orderNum']=orderNum;
}
})
}
},
/**
* 删除订单
*/
delOrder: function(order_id, index) {
let that = this;
orderDel(order_id).then(res => {
that.orderList.splice(index, 1);
that.$set(that, 'orderList', that.orderList);
that.$set(that.orderData, 'unpaid_count', that.orderData.unpaid_count - 1);
that.getOrderData();
return that.$util.Tips({
title: '删除成功',
icon: 'success'
});
}).catch(err => {
return that.$util.Tips({
title: err
});
})
},
//
confirmOrder: function(item, index) {
let that = this;
@ -741,7 +606,7 @@
},
handleSearch() {
this.loadend = false;
this.loading = false;
this.page = 1;
this.orderList = [];
if (!this.store_name) {
return this.$util.Tips({
@ -749,196 +614,45 @@
});
return;
}
if (this.orderStatus == 4) {
this.refundParams.search_info = this.store_name;
this.refundParams.page = 1;
this.refundParams.search_info = this.store_name;
this.getRefundList();
} else {
this.page = 1;
this.getOrderList();
}
this.getOrderList();
}
},
onReachBottom: function() {
if (this.orderStatus == 4)
this.getRefundList()
else
this.getOrderList();
this.getOrderList();
},
}
</script>
<style scoped lang="scss">
.info-box {
position: relative;
margin-top: 12rpx;
background-color: #fff;
.title {
display: flex;
align-items: center;
padding: 0 32rpx;
height: 86rpx;
border-bottom: 1px solid #F0F0F0;
color: #282828;
.icon-shangjiadingdan {
font-size: 32rpx;
}
.txt {
margin: 0 5rpx;
}
.icon-xiangyou {
color: #999;
font-size: 20rpx;
margin-top: 6rpx;
}
}
.product-box {
.product-item {
display: flex;
padding: 25rpx 30rpx;
.img-box {
width: 130rpx;
height: 130rpx;
border-radius: 16rpx;
}
.msg {
position: relative;
display: flex;
flex-direction: column;
justify-content: space-between;
width: 440rpx;
margin-left: 26rpx;
.name {
font-size: 28rpx;
color: #282828;
}
.des {
font-size: 20rpx;
color: #868686;
}
.price {
font-size: 26rpx;
}
.num {
position: absolute;
right: -50rpx;
top: 4rpx;
color: #868686;
font-size: 26rpx;
}
}
}
.event_name {
display: inline-block;
margin-right: 9rpx;
color: #fff;
font-size: 20rpx;
padding: 0 8rpx;
line-height: 30rpx;
text-align: center;
border-radius: 6rpx;
}
}
.btn-box {
display: flex;
justify-content: flex-end;
padding: 0 20rpx 20rpx;
.btn {
width: 176rpx;
height: 60rpx;
line-height: 60rpx;
margin-left: 18rpx;
text-align: center;
background: var(--view-theme);
border-radius: 30rpx;
color: #fff;
font-size: 27rpx;
&.gray {
border: 1px solid #ddd;
background: transparent;
color: #aaa;
}
}
}
.status {
position: absolute;
right: 30rpx;
top: 0;
.iconfont {
font-size: 120rpx;
opacity: .3;
}
.p-color {
color: var(--view-theme);
}
}
}
.my-order .header {
padding: 17rpx 30rpx;
background-color: var(--view-theme);
}
.t-color {
color: var(--view-theme);
}
.p-color {
color: var(--view-priceColor);
}
.b-color {
background-color: var(--view-theme);
}
.t-color{color: var(--view-theme);}
.p-color{color: var(--view-priceColor);}
.b-color{background-color:var(--view-theme);}
.my-order .header .picTxt {
height: 190rpx;
}
.my-order .header .picTxt .text {
color: rgba(255, 255, 255, 0.8);
font-size: 26rpx;
}
.my-order .header .picTxt .text .name {
font-size: 34rpx;
font-weight: bold;
color: #fff;
margin-bottom: 20rpx;
}
.my-order .header .picTxt .pictrue {
width: 122rpx;
height: 109rpx;
}
.my-order .header .picTxt .pictrue image {
width: 100%;
height: 100%;
}
.my-order .nav {
background-color: #fff;
width: 690rpx;
@ -946,34 +660,28 @@
border-radius: 16rpx;
margin: -73rpx auto 0 auto;
}
.my-order .nav .item {
text-align: center;
font-size: 26rpx;
color: #282828;
padding: 29rpx 0;
}
.my-order .nav .item.on {
font-weight: bold;
border-bottom: 5rpx solid var(--view-theme);
}
.my-order .nav .item .num {
margin-top: 18rpx;
}
.my-order .list {
width: 690rpx;
margin: 14rpx auto 0 auto;
}
.my-order .list .item {
background-color: #fff;
border-radius: 16rpx;
margin-bottom: 14rpx;
}
.my-order .list .item .title {
height: 84rpx;
padding: 0 30rpx;
@ -985,61 +693,50 @@
.iconfont {
margin-top: 5rpx;
}
.store-name {
margin: 0 10rpx;
}
.icon-xiangyou {
font-size: 20rpx;
}
}
}
.my-order .list .item .title .sign {
font-size: 24rpx;
padding: 0 7rpx;
height: 36rpx;
margin-right: 15rpx;
}
.my-order .list .item .item-info {
padding: 0 30rpx;
margin-top: 22rpx;
}
.my-order .list .item .item-info .pictrue {
width: 120rpx;
height: 120rpx;
}
.my-order .list .item .item-info .pictrue image {
width: 100%;
height: 100%;
border-radius: 6rpx;
}
.my-order .list .item .item-info .text {
width: 486rpx;
font-size: 28rpx;
color: #999;
margin-top: 6rpx;
}
.my-order .list .item .item-info .text .name {
width: 320rpx;
color: #282828;
}
.event_bg {
.event_bg{
background: #FF7F00;
}
.event_color {
.event_color{
color: #FF7F00;
}
.my-order .list .item .event_name {
.my-order .list .item .event_name{
display: inline-block;
margin-right: 9rpx;
color: #fff;
@ -1049,20 +746,16 @@
text-align: center;
border-radius: 6rpx;
}
.my-order .list .item .event_ship {
.my-order .list .item .event_ship{
font-size: 20rpx;
margin-top: 10rpx;
}
.my-order .list .event_price {
.my-order .list .event_price{
margin: 0 0 50rpx 120rpx;
}
.my-order .list .item .item-info .text .money {
text-align: right;
}
.my-order .list .item .totalPrice {
font-size: 26rpx;
color: #282828;
@ -1070,12 +763,10 @@
margin: 27rpx 0 0 30rpx;
padding: 0 30rpx 30rpx 0;
}
.my-order .list .item .totalPrice .money {
font-size: 28rpx;
font-weight: bold;
}
.my-order .list .item .bottom {
height: 107rpx;
padding: 0 30rpx;
@ -1096,41 +787,34 @@
border: 1px solid #ddd;
color: #aaa;
}
.my-order .list .item .bottom .bnt.colorBnt {
border: 1px solid var(--view-theme);
color: var(--view-theme);
}
.my-order .list .item .bottom .bnt .icon-fabu {
.my-order .list .item .bottom .bnt .icon-fabu{
font-size: 26rpx;
margin-right: 10rpx;
}
.my-order .list .item .bottom .bnt~.bnt {
margin-left: 17rpx;
}
.search {
height: 60rpx;
padding: 0 30rpx;
border-radius: 30rpx;
background-color: #FFFFFF;
font-size: 26rpx;
font-size: 26rpx;
.iconfont {
margin-right: 10rpx;
font-size: 26rpx;
color: #999999;
}
.input-placeholder {
font-size: 26rpx;
color: #999999;
}
}
.input {
flex: 1;
}
}
</style>
</style>

View File

@ -61,7 +61,7 @@
</view>
</view>
</view>
<view class="btn-box" @click="$u.throttle(bindComfirm, 1000)">申请退款</view>
<view class="btn-box" @click="bindComfirm">申请退款</view>
<alertBox :msg="msg" v-if="isShowBox" @bindClose="bindClose"></alertBox>
</view>
</template>

View File

@ -15,9 +15,9 @@
</block>
<block v-if="type == 2">
<view class="txt">请等待商家收货并退款</view>
<view class="time">还剩
<countDown :is-day="true" :tip-text="' '" :day-text="'天'" :hour-text="':'" :minute-text="':'"
:second-text="' '" :datatime="datatime"></countDown>
<view class="time">还剩
<countDown :is-day="true" :tip-text="' '" :day-text="'天'" :hour-text="':'" :minute-text="':'" :second-text="' '"
:datatime="datatime"></countDown>
</view>
</block>
<block v-if="type == 3">
@ -59,17 +59,12 @@
<view class="title">退款信息</view>
<view class="product-box">
<view class="product-item" v-for="(item,index) in detail.refundProduct" :key="index">
<image class="img-box" :src="item.product.cart_info.productAttr.image" mode=""
v-if="item.product.cart_info.productAttr.image"></image>
<image class="img-box" :src="item.product.cart_info.productAttr.image" mode="" v-if="item.product.cart_info.productAttr.image"></image>
<image class="img-box" :src="item.product.cart_info.product.image" mode="" v-else></image>
<view class="msg">
<view class="name line1"><text v-if="item.product.cart_info.product_type === 2"
class="event_name event_bg">预售</text>{{item.product.cart_info.product.store_name}}
</view>
<view class="name line1"><text v-if="item.product.cart_info.product_type === 2" class="event_name event_bg">预售</text>{{item.product.cart_info.product.store_name}}</view>
<view class="des">{{item.product.cart_info.productAttr.sku}}</view>
<view class="price">
{{item.product.product_type == 3 ? item.product.cart_info.productAssistAttr.assist_price : item.product.product_type == 4 ? item.product.cart_info.activeSku.active_price : item.product.cart_info.productAttr.price}}
</view>
<view class="price">{{item.product.product_type == 3 ? item.product.cart_info.productAssistAttr.assist_price : item.product.product_type == 4 ? item.product.cart_info.activeSku.active_price : item.product.cart_info.productAttr.price}}</view>
<view class="num">x {{item.refund_num}}</view>
</view>
</view>
@ -81,10 +76,10 @@
<view class="txt flex">
<text>{{detail.refund_order_sn}}</text>
<!-- #ifdef H5 -->
<text class='copy copy-data' :data-clipboard-text="detail.refund_order_sn">复制</text>
<text class='copy copy-data' :data-clipboard-text="detail.refund_order_sn">复制</text>
<!-- #endif -->
<!-- #ifdef MP -->
<text class='copy' @tap='copy'>复制</text>
<text class='copy' @tap='copy'>复制</text>
<!-- #endif -->
</view>
</view>
@ -100,13 +95,6 @@
<text>{{detail.refund_num}}</text>
</view>
</view>
<view class="item">
<view class="label">退款原因</view>
<view class="txt flex">
<text>{{ getRightText(detail.refund_message) }}</text>
</view>
</view>
<view class="item">
<view class="label">申请时间</view>
<view class="txt flex">
@ -128,7 +116,7 @@
</view>
</view>
<view class="btn-wrapper">
<block v-if="type==-1">
<block v-if="type==-1">
<view class="btn" @click="applyAgain(detail)">再次申请</view>
</block>
<block v-else-if="type==1">
@ -160,40 +148,35 @@
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import {
refundDetail,
refundCancelApi
} from '@/api/order.js'
import { refundDetail, refundCancelApi } from '@/api/order.js'
import ClipboardJS from "@/plugin/clipboard/clipboard.js";
import countDown from '@/components/countDown'
import {
mapGetters
} from "vuex";
export default {
import { mapGetters } from "vuex";
export default{
components: {
countDown,
countDown,
},
computed: {
computed:{
...mapGetters(['viewColor']),
},
data() {
return {
type: 0,
refund_order_id: 0,
detail: '',
data(){
return{
type:0,
refund_order_id:0,
detail:'',
datatime: 0
}
},
onLoad(options) {
uni.setNavigationBarTitle({
title: '退款详情'
  title:'退款详情'
})
this.refund_order_id = options.id
this.getDetail()
},
onReady: function() {
// #ifdef H5
this.$nextTick(function() {
this.$nextTick(function() {
const clipboard = new ClipboardJS(".copy-data");
clipboard.on("success", () => {
this.$util.Tips({
@ -203,65 +186,57 @@
});
// #endif
},
methods: {
getRightText(str) {
const index = str.indexOf("@");
if (index !== -1) {
return str.substring(0, index);
} else {
return str
}
},
methods:{
//
call: function(service) {
call: function(service){
let that = this;
if (service) {
if(service){
uni.showModal({
title: '提示',
content: '暂无在线客服,确定拨打客服电话:' + that.detail.merchant.service_phone + '吗?',
content: '暂无在线客服,确定拨打客服电话:'+that.detail.merchant.service_phone+'吗?',
success: function(res) {
if (res.confirm) {
uni.makePhoneCall({
phoneNumber: that.detail.merchant.service_phone,
phoneNumber: that.detail.merchant.service_phone,
});
}
}
})
} else {
}else{
return that.$util.Tips({
title: '暂无可用客服'
})
}
},
//
loookImg(item, index) {
loookImg(item,index){
uni.previewImage({
urls: this.detail.pics,
current: this.detail.pics[index]
});
},
getDetail() {
refundDetail(this.refund_order_id).then(res => {
getDetail(){
refundDetail(this.refund_order_id).then(res=>{
// status 0 1 2 3退 -1
this.type = res.data.status
this.detail = res.data
this.datatime = res.data.auto_refund_time;
})
},
goPage() {
goPage(){
uni.navigateTo({
url: '/pages/users/refund/goods/index?id=' + this.detail.refund_order_id
url:'/pages/users/refund/goods/index?id='+this.detail.refund_order_id
})
},
applyAgain(item) {
applyAgain(item){
uni.navigateTo({
url: `/pages/order_details/index?order_id=${item.refundProduct[0].product.order_id}`
url:`/pages/order_details/index?order_id=${item.refundProduct[0].product.order_id}`
})
},
go() {
go(){
uni.navigateTo({
url: `/pages/users/refund/logistics?orderId=${this.detail.refund_order_id}`
url:`/pages/users/refund/logistics?orderId=${this.detail.refund_order_id}`
})
},
/**
@ -277,30 +252,30 @@
},
// #endif
//
goService() {
goService(){
uni.navigateTo({
url: `/pages/chat/customer_list/chat?mer_id=${this.detail.mer_id}&uid=${this.detail.uid}&refund_order_id=${this.detail.refund_order_id}`
url:`/pages/chat/customer_list/chat?mer_id=${this.detail.mer_id}&uid=${this.detail.uid}&refund_order_id=${this.detail.refund_order_id}`
})
},
//
cancelSales() {
cancelSales(){
let that = this;
uni.showModal({
content: '确定要取消售后?',
success: function(res) {
if (res.confirm) {
refundCancelApi(that.detail.refund_order_id).then(res => {
if (res.status === 200) {
that.$util.Tips({
title: res.message
});
content: '确定要取消售后?',
success: function(res) {
if(res.confirm) {
refundCancelApi(that.detail.refund_order_id).then(res => {
if (res.status === 200) {
that.$util.Tips({
title: res.message
});
that.getDetail();
}
})
} else if (res.cancel) {
console.log('用户点击取消');
}
}
})
} else if(res.cancel) {
console.log('用户点击取消');
}
}
});
},
}
@ -308,251 +283,217 @@
</script>
<style lang="scss">
.refund-detail {
.head {
display: flex;
flex-direction: column;
justify-content: center;
height: 150rpx;
padding: 0 30rpx;
color: #fff;
background-color: #666666;
font-size: 30rpx;
.txt {
font-weight: bold;
}
.time {
margin-top: 10rpx;
font-size: 24rpx;
opacity: .8;
.time {
display: inline-block;
width: 600rpx;
/deep/ .red {
color: #fff;
}
}
}
.refund-detail{
.head{
display: flex;
flex-direction: column;
justify-content: center;
height: 150rpx;
padding: 0 30rpx;
color: #fff;
background-color: #666666;
font-size: 30rpx;
.txt{
font-weight: bold;
}
.info-box {
margin-top: 12rpx;
background-color: #fff;
.title {
padding: 0 32rpx;
line-height: 86rpx;
border-bottom: 1px solid #F0F0F0;
color: #282828;
}
.product-box {
.product-item {
display: flex;
padding: 25rpx 30rpx;
.img-box {
width: 130rpx;
height: 130rpx;
border-radius: 16rpx;
}
.msg {
position: relative;
display: flex;
flex-direction: column;
justify-content: space-between;
width: 440rpx;
margin-left: 26rpx;
.name {
font-size: 28rpx;
color: #282828;
}
.des {
font-size: 20rpx;
color: #868686;
}
.price {
font-size: 26rpx;
color: var(--view-priceColor);
}
.num {
position: absolute;
right: -80rpx;
top: 4rpx;
color: #868686;
font-size: 26rpx;
}
}
}
.event_name {
display: inline-block;
margin-right: 9rpx;
color: #fff;
font-size: 20rpx;
padding: 0 8rpx;
line-height: 30rpx;
text-align: center;
border-radius: 6rpx;
}
}
.event_bg {
background: #FF7F00;
}
.store-info {
padding: 30rpx;
.des {
margin-top: 10rpx;
font-size: 26rpx;
color: #868686;
}
.red-txt {
display: flex;
align-items: center;
margin-top: 10rpx;
color: $theme-color;
font-size: 24rpx;
.iconfont {
font-size: 30rpx;
margin-right: 5rpx;
margin-top: 6rpx;
}
}
}
}
.content {
margin-top: 12rpx;
padding: 30rpx 30rpx 0;
background-color: #FFFFFF;
.item {
display: flex;
justify-content: space-between;
margin-bottom: 30rpx;
.txt {
justify-content: flex-end;
align-items: center;
width: 450rpx;
color: #868686;
text-align: right;
.copy {
display: flex;
align-items: center;
justify-content: center;
width: 80rpx;
height: 34rpx;
margin-left: 20rpx;
border: 1px solid #666666;
border-radius: 17rpx;
font-size: 20rpx;
color: #333;
}
}
&:last-child {
margin-bottom: 0;
}
.upload-img {
display: flex;
flex-wrap: wrap;
margin-top: 20rpx;
.img-item {
position: relative;
width: 156rpx;
height: 156rpx;
margin-right: 23rpx;
margin-top: 20rpx;
&:nth-child(4n) {
margin-right: 0;
}
image {
width: 156rpx;
height: 156rpx;
border-radius: 8rpx;
}
}
}
}
.btn-wrapper {
position: relative;
display: flex;
justify-content: flex-end;
align-items: center;
height: 100rpx;
button {
font-size: 28rpx;
}
.btn {
width: 176rpx;
height: 60rpx;
display: flex;
align-items: center;
justify-content: center;
margin-left: 20rpx;
background: var(--view-theme);
border-radius: 30rpx;
.time{
margin-top: 10rpx;
font-size: 24rpx;
opacity: .8;
.time{
display: inline-block;
width: 600rpx;
/deep/ .red{
color: #fff;
}
.gray {
background: transparent;
border: 1px solid #eee;
color: #AAAAAA;
}
&:after {
content: ' ';
position: absolute;
top: 0;
left: 50%;
width: 690rpx;
height: 1px;
margin-left: -345rpx;
background-color: #f0f0f0;
}
}
}
}
.box {
margin-top: 12rpx;
padding: 25rpx 30rpx;
background-color: #fff;
font-size: 30rpx;
.info-box{
margin-top: 12rpx;
background-color: #fff;
.title{
padding: 0 32rpx;
line-height: 86rpx;
border-bottom: 1px solid #F0F0F0;
color: #282828;
.des {
margin-top: 5rpx;
}
.product-box{
.product-item{
display: flex;
padding: 25rpx 30rpx;
.img-box{
width:130rpx;
height:130rpx;
border-radius:16rpx;
}
.msg{
position: relative;
display: flex;
flex-direction: column;
justify-content: space-between;
width: 440rpx;
margin-left: 26rpx;
.name{
font-size: 28rpx;
color: #282828;
}
.des{
font-size: 20rpx;
color: #868686;
}
.price{
font-size: 26rpx;
color: var(--view-priceColor);
}
.num{
position: absolute;
right: -80rpx;
top: 4rpx;
color: #868686;
font-size: 26rpx;
}
}
}
.event_name{
display: inline-block;
margin-right: 9rpx;
color: #fff;
font-size: 20rpx;
padding: 0 8rpx;
line-height: 30rpx;
text-align: center;
border-radius: 6rpx;
}
}
.event_bg{
background: #FF7F00;
}
.store-info{
padding: 30rpx;
.des{
margin-top: 10rpx;
font-size: 26rpx;
color: #868686;
}
.red-txt{
display: flex;
align-items: center;
margin-top: 10rpx;
color: $theme-color;
font-size: 24rpx;
.iconfont{
font-size: 30rpx;
margin-right: 5rpx;
margin-top: 6rpx;
}
}
}
}
/deep/.styleAll {
color: #fff;
.content{
margin-top: 12rpx;
padding: 30rpx 30rpx 0;
background-color: #FFFFFF;
.item{
display: flex;
justify-content: space-between;
margin-bottom: 30rpx;
.txt{
justify-content: flex-end;
align-items: center;
width: 450rpx;
color: #868686;
text-align: right;
.copy{
display: flex;
align-items: center;
justify-content: center;
width:80rpx;
height:34rpx;
margin-left: 20rpx;
border:1px solid #666666;
border-radius:17rpx;
font-size: 20rpx;
color: #333;
}
}
&:last-child{
margin-bottom: 0;
}
.upload-img{
display: flex;
flex-wrap: wrap;
margin-top: 20rpx;
.img-item{
position: relative;
width: 156rpx;
height: 156rpx;
margin-right: 23rpx;
margin-top: 20rpx;
&:nth-child(4n){
margin-right: 0;
}
image{
width: 156rpx;
height: 156rpx;
border-radius: 8rpx;
}
}
}
}
.btn-wrapper{
position: relative;
display: flex;
justify-content: flex-end;
align-items: center;
height: 100rpx;
button{
font-size: 28rpx;
}
.btn{
width:176rpx;
height:60rpx;
display: flex;
align-items: center;
justify-content: center;
margin-left: 20rpx;
background: var(--view-theme);
border-radius:30rpx;
color: #fff;
}
.gray{
background: transparent;
border: 1px solid #eee;
color: #AAAAAA;
}
&:after{
content:' ';
position: absolute;
top: 0;
left: 50%;
width: 690rpx;
height:1px;
margin-left: -345rpx;
background-color: #f0f0f0;
}
}
}
</style>
.box{
margin-top: 12rpx;
padding:25rpx 30rpx;
background-color: #fff;
font-size: 30rpx;
color: #282828;
.des{
margin-top: 5rpx;
font-size: 26rpx;
color: #868686;
}
}
}
/deep/.styleAll{
color: #fff;
}
</style>

View File

@ -5,42 +5,35 @@
<image :src="login_logo" v-if="login_logo" />
</view>
</view> -->
<view class="whiteBg" style="margin: 0;width: 100%;padding: 50rpx 60rpx;"
:style="{ 'background-image': `url(${domain}/static/images/logo_bgl.png)`}">
<view class="whiteBg" style="margin: 0;width: 100%;padding: 50rpx 60rpx;" :style="{ 'background-image': `url(${domain}/static/images/logo_bgl.png)`}">
<view class="login_title">
<view class="title_h">找回密码</view>
</view>
<form class="list">
<view class="item">
<input type="number" placeholder="输入手机号码" placeholder-class="placeholder" v-model="account"
autocomplete="off" />
<input type="number" placeholder="输入手机号码" placeholder-class="placeholder" v-model="account" autocomplete="off" />
<!-- <input type="text" style="height: 0;opacity: 0"> -->
</view>
<view class="item">
<input type="password" placeholder="填写您的新密码" placeholder-class="placeholder" v-model="password"
autocomplete="off" />
<input type="password" placeholder="填写您的新密码" placeholder-class="placeholder" v-model="password" autocomplete="off" />
</view>
<view class="item">
<input type="password" placeholder="再次输入新密码" placeholder-class="placeholder" v-model="confirm_pwd"
autocomplete="off" />
<input type="password" placeholder="再次输入新密码" placeholder-class="placeholder" v-model="confirm_pwd" autocomplete="off" />
</view>
<view class="item" style="display: flex;justify-content: space-between;">
<input type="number" placeholder="填写验证码" maxlength="4" placeholder-class="placeholder"
class="codeIput" v-model="captcha" autocomplete="off" />
<button class="code" style="color: #fff;" :disabled="disabled"
:class="disabled === true ? 'on' : ''" @click="handleVerify">
<input type="number" placeholder="填写验证码" maxlength="4" placeholder-class="placeholder" class="codeIput" v-model="captcha" autocomplete="off" />
<button class="code" style="color: #fff;" :disabled="disabled" :class="disabled === true ? 'on' : ''" @click="handleVerify">
{{ text }}
</button>
</view>
</form>
<view class="logon" @click="registerReset">确认</view>
<!-- <view class="tip">
<view class="tip">
<text @click="back">立即登录</text>
</view> -->
</view>
</view>
<view class="bottom"></view>
<Verify @success="success" :captchaType="'blockPuzzle'" :imgSize="{ width: '330px', height: '155px' }"
ref="verify"></Verify>
<Verify @success="success" :captchaType="'blockPuzzle'" :imgSize="{ width: '330px', height: '155px' }" ref="verify"></Verify>
</view>
</template>
@ -55,9 +48,7 @@
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
const app = getApp();
import {
mapGetters
} from "vuex";
import { mapGetters} from "vuex";
import sendVerifyCode from "@/mixins/SendVerifyCode";
import {
registerVerify,
@ -65,25 +56,19 @@
getCodeApi,
getCaptcha
} from "@/api/user";
import {
validatorDefaultCatch
} from "@/utils/dialog";
import { validatorDefaultCatch } from "@/utils/dialog";
import attrs, {
required,
alpha_num,
chs_phone
} from "@/utils/validate";
import {
configMap
} from '@/utils';
import {
HTTP_REQUEST_URL
} from '@/config/app';
import Verify from '@/components/verify/verify.vue';
import { configMap } from '@/utils';
import { HTTP_REQUEST_URL } from '@/config/app';
import Verify from '@/components/verify/verify.vue';
export default {
name: "RetrievePassword",
components: {
Verify
components: {
Verify
},
mixins: [sendVerifyCode],
data: function() {
@ -100,14 +85,16 @@
};
},
computed: configMap(['login_logo'], mapGetters(['viewColor'])),
onReady() {},
mounted: function() {},
onReady() {
},
mounted: function() {
},
methods: {
back() {
uni.navigateBack();
},
again() {
this.codeUrl = VUE_APP_API_URL + "/captcha?" + this.keyCode + Date.parse(new Date());
this.codeUrl = VUE_APP_API_URL + "/captcha?" + this.keyCode + Date.parse(new Date());
},
async code(data) {
@ -121,7 +108,7 @@
await registerVerify({
phone: that.account,
type: 'change_pwd',
captchaType: 'blockPuzzle',
captchaType: 'blockPuzzle',
captchaVerification: data.captchaVerification
})
.then(res => {
@ -182,7 +169,7 @@
})
});
},
success(data) {
success(data) {
this.$refs.verify.hide();
this.code(data);
},
@ -193,15 +180,13 @@
};
</script>
<style lang="scss" scoped>
.register {
.register{
background: #ffffff;
height: 100vh;
}
.register .list .item .code {
color: var(--view-theme);
}
.whiteBg .logon {
display: flex;
align-items: center;
@ -209,14 +194,13 @@
width: 100%;
height: 86rpx;
margin-top: 48rpx;
background-color: var(--view-theme);
background-color:var(--view-theme);
border-radius: 120rpx;
color: #FFFFFF;
font-size: 30rpx;
}
.whiteBg {
.whiteBg{
background-repeat: no-repeat;
background-size: 100% auto;
}
</style>
</style>

View File

@ -42,9 +42,7 @@
userOut,
getLogout
} from '@/api/user.js'
import {
mapGetters
} from "vuex";
import { mapGetters } from "vuex";
export default {
name: 'user_about',
data() {
@ -65,7 +63,7 @@
this.setTitle(this.type)
},
methods: {
toCancel() {
toCancel(){
uni.redirectTo({
url: '/pages/users/user_about/index?from=the_cancellation_prompt'
})
@ -79,41 +77,37 @@
mask: true
});
this.moal = false;
(new Promise(call => {
(new Promise(call=>{
userOut().then(res => {
if (res.data.status === 200) {
if(res.data.status === 200){
uni.hideLoading()
call()
} else {
}else{
uni.showModal({
title: '提示',
content: res.message,
success: ({
confirm
}) => {
success: ({confirm}) => {
if (confirm) {
userOut({
key: res.data.result.key
}).then(res => {
userOut({key: res.data.result.key}).then(res => {
uni.hideLoading()
if (res.data.status === 200) {
if(res.data.status === 200){
call()
} else {
}else{
this.$util.Tips({
title: res.message
});
}
})
} else {
}else{
uni.hideLoading()
}
}
});
}
})
})).then(v => {
})).then(v=>{
this.$store.commit("LOGOUT");
setTimeout(() => {
setTimeout(()=>{
uni.reLaunch({
url: '/pages/index/index'
});
@ -139,7 +133,7 @@
this.loaded = false;
cacheInfo(this.type).then(res => {
this.data = res.data[this.type]
if (res.data.title) {
if(res.data.title) {
uni.setNavigationBarTitle({
title: res.data.title
})
@ -187,23 +181,19 @@
padding: 30rpx;
color: #282828;
}
.cancelTxt {
overflow: hidden;
overflow-y: auto;
image {
image{
max-width: 100%;
}
}
.cancel {
position: fixed;
bottom: 60rpx;
left: 0;
z-index: 1;
width: 100%;
.checkbox {
display: flex;
align-items: center;
@ -211,26 +201,21 @@
margin: 0 auto;
font-size: 24rpx;
font-weight: 400;
span {
margin-left: 5rpx;
}
.font {
color: var(--view-theme);
font-style: normal;
}
.iconfont {
font-size: 28rpx;
margin-right: 15rpx;
}
.icon-xuanzhong1 {
.icon-xuanzhong1{
color: var(--view-theme);
}
}
.btn {
width: 690rpx;
height: 90rpx;
@ -246,7 +231,6 @@
}
}
}
.outMoal {
width: 100%;
height: 100%;
@ -258,7 +242,6 @@
display: flex;
align-items: center;
justify-content: center;
.box {
position: fixed;
width: 590rpx;
@ -268,18 +251,15 @@
border-radius: 20rpx;
text-align: center;
padding: 50rpx;
.title {
font-size: 30rpx;
font-weight: 600;
color: #282828;
}
.moalBtn {
margin-top: 43rpx;
display: flex;
justify-content: space-between;
.ok {
width: 234rpx;
height: 66rpx;
@ -289,7 +269,6 @@
line-height: 66rpx;
color: var(--view-theme);
}
.no {
width: 234rpx;
height: 66rpx;
@ -302,4 +281,4 @@
}
}
}
</style>
</style>

File diff suppressed because it is too large Load Diff

View File

@ -246,14 +246,14 @@
*
*/
uploadpic: async function() {
// #ifdef APP-PLUS
let result = await this.$store.dispatch("permission/requestPermissions",
'CAMERA')
if (result !== 1) return;
result = await this.$store.dispatch("permission/requestPermissions",
'READ_EXTERNAL_STORAGE')
if (result !== 1) return;
// #endif
// #ifdef APP-PLUS
let result = await this.$store.dispatch("permission/requestPermissions",
'CAMERA')
if (result !== 1) return;
result = await this.$store.dispatch("permission/requestPermissions",
'READ_EXTERNAL_STORAGE')
if (result !== 1) return;
// #endif
let that = this;
if (that.open_update_info == 0) {
return;
@ -354,7 +354,7 @@
title: '提示',
content: '确认退出登录?',
success: function(res) {
uni.setStorageSync('tabbar_sale_type', 1);
uni.setStorageSync('tabbar_sale_type', 1);
if (res.confirm) {
getLogout()
.then(res => {
@ -677,11 +677,10 @@
width: 690rpx;
height: 90rpx;
border-radius: 45rpx;
margin: 80rpx auto 40rpx auto;
margin: 80rpx auto 0 auto;
color: var(--view-theme);
background-color: #ffffff;
border: 1px solid var(--view-theme);
}
.avatar-box {

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 989 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 984 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -9,19 +9,17 @@
// +----------------------------------------------------------------------
import {
getUserInfo,
Appversion
Appversion
} from "../../api/user.js";
import {
LOGIN_STATUS,
UID,
USER_INFO
USER_INFO
} from '../../config/cache';
import Cache from '../../utils/cache';
// #ifdef APP-PLUS
import Updater from '@/uni_modules/guyue-updater/index';
import {
Toast
} from "../../libs/uniApi.js";
import { Toast } from "../../libs/uniApi.js";
// #endif
@ -30,44 +28,42 @@ const state = {
token: Cache.get(LOGIN_STATUS) || null,
uuid: uni.getStorageSync('uuid') || "",
backgroundColor: "#fff",
userInfo: (typeof Cache.get('USER_INFO') == 'string' ? JSON.parse(Cache.get('USER_INFO')) : Cache.get(
'USER_INFO')) || {},
userInfo: (typeof Cache.get('USER_INFO') == 'string' ? JSON.parse(Cache.get('USER_INFO')) : Cache.get('USER_INFO'))||{},
uid: Cache.get(UID) || null,
globalData: uni.getStorageSync('GLOBAL_DATA') || {},
homeActive: false,
copyPwd: null,
pageFooter: uni.getStorageSync('pageFoot') || {},
pageFooter:uni.getStorageSync('pageFoot') || {},
keyColor: Cache.get('KEY_COLOR') || '_default',
viewColor: Cache.get('VIEW_COLOR') ||
'--view-theme: #E93323;--view-assist:#FF7612;--view-priceColor:#E93323;--view-bgColor:rgba(255, 118, 18,.1);--view-minorColor:rgba(233, 51, 35,.1);--view-bntColor11:#FDA923;--view-bntColor12:#FD6523;--view-bntColor21:#F11B09;--view-bntColor22:#F67A38;',
viewColor: Cache.get('VIEW_COLOR') || '--view-theme: #E93323;--view-assist:#FF7612;--view-priceColor:#E93323;--view-bgColor:rgba(255, 118, 18,.1);--view-minorColor:rgba(233, 51, 35,.1);--view-bntColor11:#FDA923;--view-bntColor12:#FD6523;--view-bntColor21:#F11B09;--view-bntColor22:#F67A38;',
};
const mutations = {
setLocation(state, data) {
state.location = data
Cache.set('LOCATION_DATA', data);
},
setLocation(state, data) {
state.location = data
Cache.set('LOCATION_DATA', data);
},
LOGIN(state, opt) {
state.token = opt.token;
Cache.set(LOGIN_STATUS, opt.token, opt.time);
uni.removeStorageSync('auth_token');
},
SET_USERINFO(state, opt) {
state.userInfo = opt;
Cache.set(USER_INFO, opt);
},
SETUID(state, val) {
SET_USERINFO(state, opt){
state.userInfo = opt;
Cache.set(USER_INFO, opt);
},
SETUID(state,val){
state.uid = val;
Cache.set(UID, val);
},
SETUUID(state, val) {
SETUUID(state,val){
state.uuid = val;
uni.setStorageSync('uuid', val)
},
UPDATE_LOGIN(state, token) {
state.token = token;
},
LOGOUT(state) {
state.token = null;
state.uid = null
@ -103,7 +99,7 @@ const mutations = {
uni.setStorageSync('GLOBAL_DATA', key);
state.globalData = key;
},
FOOT_UPLOAD(state, data) {
FOOT_UPLOAD(state,data){
state.pageFooter = data
}
};
@ -126,77 +122,78 @@ const actions = {
});
},
async INIT_CONFIG({
state,
commit
}, data = false) {
if (data) {
uni.showLoading({
title: '加载中'
})
await uni.$u.sleep(500)
}
// #ifdef APP-PLUS
let os = uni.getSystemInfoSync();
let apptype;
if (os.osName == 'ios') {
apptype = 2
} else {
apptype = 1
}
// console.log({
// version: os.appWgtVersion,
// type: apptype,
// phone_brand:os.brand
// });
Appversion({
version: os.appWgtVersion,
type: apptype,
phone_brand: os.brand
}).then((res) => {
// console.log(res);
if (data) uni.hideLoading()
if (Object.keys(res.data.appInfo).length > 0) {
// if(res.data.appInfo.version) uni.showLoading({
// title: '检查更新中'
// })
// 版本更新
if (compareVersions(res.data.appInfo.version, os.appWgtVersion) == 1) {
try {
let info = res.data.appInfo || {};
let version = {
title: info.title || '发现新版本',
content: info.content || '修复了部分BUG',
versionName: info.version || '1.0.1',
brand: res.data.appInfo.phone_brand,
downUrl: info.dow_url || '',
force: info.force == 1 ? true : false, // 是否强制更新
quiet: info.quiet == 1 ? true : false // 是否静默更新
}
Updater.update(version, res.data.appInfo);
} catch (e) {
console.log(e);
Toast(e)
}
// uni.hideLoading();
} else {
if (data) Toast('已经是最新版本了')
}
} else {
if (data) Toast('已经是最新版本了')
}
}).catch((err) => {
console.log(err);
if (data) uni.hideLoading()
Toast(err.msg || err.message || err)
// console.log(err)
})
// #endif
}
async INIT_CONFIG({
state,
commit
}, data = false) {
if(data) {
uni.showLoading({
title: '加载中'
})
await uni.$u.sleep(500)
}
// #ifdef APP-PLUS
let os = uni.getSystemInfoSync();
let apptype;
if (os.osName == 'ios') {
apptype = 2
} else {
apptype = 1
}
console.log({
version: os.appWgtVersion,
type: apptype,
phone_brand:os.brand
});
Appversion({
version: os.appWgtVersion,
type: apptype,
phone_brand:os.brand
}).then((res) => {
console.log(res);
if(data) uni.hideLoading()
if (Object.keys(res.data.appInfo).length > 0) {
// if(res.data.appInfo.version) uni.showLoading({
// title: '检查更新中'
// })
// 版本更新
if (compareVersions(res.data.appInfo.version, os.appWgtVersion) == 1) {
try {
let info = res.data.appInfo || {};
let version = {
title: info.title || '发现新版本',
content: info.content || '修复了部分BUG',
versionName: info.version || '1.0.1',
brand:res.data.appInfo.phone_brand,
downUrl: info.dow_url || '',
force: info.force == 1 ? true : false, // 是否强制更新
quiet: info.quiet == 1 ? true : false // 是否静默更新
}
Updater.update(version,res.data.appInfo);
} catch (e) {
console.log(e);
Toast(e)
}
// uni.hideLoading();
}
else {
if(data) Toast('已经是最新版本了')
}
} else {
if(data) Toast('已经是最新版本了')
}
}).catch((err) => {
console.log(err);
if(data) uni.hideLoading()
Toast(err.msg||err.message||err)
// console.log(err)
})
// #endif
}
};
function compareVersions(version1, version2) {
@ -219,4 +216,4 @@ export default {
state,
mutations,
actions
};
};

View File

@ -15,7 +15,7 @@
/* 颜色变量 */
/* 行为相关颜色 */
$uni-color-primary: #20B128;
$uni-color-primary: #007aff;
$uni-color-success: #4cd964;
$uni-color-warning: #f0ad4e;
$uni-color-error: #dd524d;

View File

@ -1,35 +0,0 @@
// 下面仅展示客户端使用post方式发送content-type为application/json请求的场景
exports.main = async (event) => {
let body = event.body
if (event.isBase64Encoded) {
body = Buffer.from(body, 'base64')
}
const {
access_token,
openid
} = JSON.parse(body)
if (!access_token || !openid) {
return { // 不建议把完整手机号返回给前端
success: false,
error: {
code: 'params is not fund',
message: '参数错误',
}
}
}
const res = await uniCloud.getPhoneNumber({
provider: 'univerify',
appid: '__UNI__3A527D1', // DCloud appid不同于callFunction方式调用使用云函数Url化需要传递DCloud appid参数
access_token: access_token,
openid: openid
})
console.log(res); // res里包含手机号
return { // 不建议把完整手机号返回给前端
success: true,
info: {
code: 0,
message: '获取手机号成功',
data: res,
}
}
}

View File

@ -1,8 +0,0 @@
{
"name": "oneClickLoginFn",
"dependencies": {},
"extensions": {
"uni-cloud-jql": {},
"uni-cloud-verify": {}
}
}

View File

@ -1,12 +0,0 @@
// 本文件用于使用JQL语法操作项目关联的uniCloud空间的数据库方便开发调试和远程数据库管理
// 编写clientDB的js API也支持常规js语法比如var可以对云数据库进行增删改查操作。不支持uniCloud-db组件写法
// 可以全部运行也可以选中部分代码运行。点击工具栏上的运行按钮或者按下【F5】键运行代码
// 如果文档中存在多条JQL语句只有最后一条语句生效
// 如果混写了普通js最后一条语句需是数据库操作语句
// 此处代码运行不受DB Schema的权限控制移植代码到实际业务中注意在schema中配好permission
// 不支持clientDB的action
// 数据库查询有最大返回条数限制详见https://uniapp.dcloud.net.cn/uniCloud/cf-database.html#limit
// 详细JQL语法请参考https://uniapp.dcloud.net.cn/uniCloud/jql.html
// 下面示例查询uni-id-users表的所有数据
db.collection('uni-id-users').get();

View File

@ -1,6 +0,0 @@
## 0.0.32022-11-11
- 修复 config 方法获取根节点为数组格式配置时错误的转化为了对象的Bug
## 0.0.22021-04-16
- 修改插件package信息
## 0.0.12021-03-15
- 初始化项目

View File

@ -1,81 +0,0 @@
{
"id": "uni-config-center",
"displayName": "uni-config-center",
"version": "0.0.3",
"description": "uniCloud 配置中心",
"keywords": [
"配置",
"配置中心"
],
"repository": "",
"engines": {
"HBuilderX": "^3.1.0"
},
"dcloudext": {
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": "",
"type": "unicloud-template-function"
},
"directories": {
"example": "../../../scripts/dist"
},
"uni_modules": {
"dependencies": [],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
},
"client": {
"App": {
"app-vue": "u",
"app-nvue": "u"
},
"H5-mobile": {
"Safari": "u",
"Android Browser": "u",
"微信浏览器(Android)": "u",
"QQ浏览器(Android)": "u"
},
"H5-pc": {
"Chrome": "u",
"IE": "u",
"Edge": "u",
"Firefox": "u",
"Safari": "u"
},
"小程序": {
"微信": "u",
"阿里": "u",
"百度": "u",
"字节跳动": "u",
"QQ": "u"
},
"快应用": {
"华为": "u",
"联盟": "u"
},
"Vue": {
"vue2": "y",
"vue3": "u"
}
}
}
}
}

View File

@ -1,93 +0,0 @@
# 为什么使用uni-config-center
实际开发中很多插件需要配置文件才可以正常运行,如果每个插件都单独进行配置的话就会产生下面这样的目录结构
```bash
cloudfunctions
└─────common 公共模块
├─plugin-a // 插件A对应的目录
│ ├─index.js
│ ├─config.json // plugin-a对应的配置文件
│ └─other-file.cert // plugin-a依赖的其他文件
└─plugin-b // plugin-b对应的目录
├─index.js
└─config.json // plugin-b对应的配置文件
```
假设插件作者要发布一个项目模板,里面使用了很多需要配置的插件,无论是作者发布还是用户使用都是一个大麻烦。
uni-config-center就是用了统一管理这些配置文件的使用uni-config-center后的目录结构如下
```bash
cloudfunctions
└─────common 公共模块
├─plugin-a // 插件A对应的目录
│ └─index.js
├─plugin-b // plugin-b对应的目录
│ └─index.js
└─uni-config-center
├─index.js // config-center入口文件
├─plugin-a
│ ├─config.json // plugin-a对应的配置文件
│ └─other-file.cert // plugin-a依赖的其他文件
└─plugin-b
└─config.json // plugin-b对应的配置文件
```
使用uni-config-center后的优势
- 配置文件统一管理,分离插件主体和配置信息,更新插件更方便
- 支持对config.json设置schema插件使用者在HBuilderX内编写config.json文件时会有更好的提示后续HBuilderX会提供支持
# 用法
在要使用uni-config-center的公共模块或云函数内引入uni-config-center依赖请参考[使用公共模块](https://uniapp.dcloud.net.cn/uniCloud/cf-common)
```js
const createConfig = require('uni-config-center')
const uniIdConfig = createConfig({
pluginId: 'uni-id', // 插件id
defaultConfig: { // 默认配置
tokenExpiresIn: 7200,
tokenExpiresThreshold: 600,
},
customMerge: function(defaultConfig, userConfig) { // 自定义默认配置和用户配置的合并规则,不设置的情况侠会对默认配置和用户配置进行深度合并
// defaudltConfig 默认配置
// userConfig 用户配置
return Object.assign(defaultConfig, userConfig)
}
})
// 以如下配置为例
// {
// "tokenExpiresIn": 7200,
// "passwordErrorLimit": 6,
// "bindTokenToDevice": false,
// "passwordErrorRetryTime": 3600,
// "app-plus": {
// "tokenExpiresIn": 2592000
// },
// "service": {
// "sms": {
// "codeExpiresIn": 300
// }
// }
// }
// 获取配置
uniIdConfig.config() // 获取全部配置注意uni-config-center内不存在对应插件目录时会返回空对象
uniIdConfig.config('tokenExpiresIn') // 指定键值获取配置返回7200
uniIdConfig.config('service.sms.codeExpiresIn') // 指定键值获取配置返回300
uniIdConfig.config('tokenExpiresThreshold', 600) // 指定键值获取配置如果不存在则取传入的默认值返回600
// 获取文件绝对路径
uniIdConfig.resolve('custom-token.js') // 获取uni-config-center/uni-id/custom-token.js文件的路径
// 引用文件require
uniIDConfig.requireFile('custom-token.js') // 使用require方式引用uni-config-center/uni-id/custom-token.js文件。文件不存在时返回undefined文件内有其他错误导致require失败时会抛出错误。
// 判断是否包含某文件
uniIDConfig.hasFile('custom-token.js') // 配置目录是否包含某文件true: 文件存在false: 文件不存在
```

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
{"name":"uni-config-center","version":"0.0.3","description":"配置中心","main":"index.js","keywords":[],"author":"DCloud","license":"Apache-2.0"}

View File

@ -1,34 +0,0 @@
## 1.0.172024-04-26
- 兼容uni-app-x对客户端uniPlatform的调整uni-app-x内uniPlatform区分app-android、app-ios
## 1.0.162023-04-25
- 新增maxTokenLength配置用于限制数据库用户记录token数组的最大长度
## 1.0.152023-04-06
- 修复部分语言国际化出错的Bug
## 1.0.142023-03-07
- 修复 admin用户包含其他角色时未包含在token的Bug
## 1.0.132022-07-21
- 修复 创建token时未传角色权限信息生成的token不正确的bug
## 1.0.122022-07-15
- 提升与旧版本uni-id的兼容性补充读取配置文件时回退平台app-plus、h5但是仍推荐使用新平台名进行配置app、web
## 1.0.112022-07-14
- 修复 部分情况下报`read property 'reduce' of undefined`的错误
## 1.0.102022-07-11
- 将token存储在用户表的token字段内与旧版本uni-id保持一致
## 1.0.92022-07-01
- checkToken兼容token内未缓存角色权限的情况此时将查库获取角色权限
## 1.0.82022-07-01
- 修复clientDB默认依赖时部分情况下获取不到uni-id配置的Bug
## 1.0.72022-06-30
- 修复config文件不合法时未抛出具体错误的Bug
## 1.0.62022-06-28
- 移除插件内的数据表schema
## 1.0.52022-06-27
- 修复使用多应用配置时报`Cannot read property 'appId' of undefined`的Bug
## 1.0.42022-06-27
- 修复使用自定义token内容功能报错的Bug [详情](https://ask.dcloud.net.cn/question/147945)
## 1.0.22022-06-23
- 对齐旧版本uni-id默认配置
## 1.0.12022-06-22
- 补充对uni-config-center的依赖
## 1.0.02022-06-21
- 提供uni-id token创建、校验、刷新接口简化旧版uni-id公共模块

View File

@ -1,85 +0,0 @@
{
"id": "uni-id-common",
"displayName": "uni-id-common",
"version": "1.0.17",
"description": "包含uni-id token生成、校验、刷新功能的云函数公共模块",
"keywords": [
"uni-id-common",
"uniCloud",
"token",
"权限"
],
"repository": "https://gitcode.net/dcloud/uni-id-common",
"engines": {
"HBuilderX": "^3.1.0"
},
"dcloudext": {
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": "",
"type": "unicloud-template-function"
},
"uni_modules": {
"dependencies": ["uni-config-center"],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y",
"alipay": "n"
},
"client": {
"Vue": {
"vue2": "u",
"vue3": "u"
},
"App": {
"app-vue": "u",
"app-nvue": "u"
},
"H5-mobile": {
"Safari": "u",
"Android Browser": "u",
"微信浏览器(Android)": "u",
"QQ浏览器(Android)": "u"
},
"H5-pc": {
"Chrome": "u",
"IE": "u",
"Edge": "u",
"Firefox": "u",
"Safari": "u"
},
"小程序": {
"微信": "u",
"阿里": "u",
"百度": "u",
"字节跳动": "u",
"QQ": "u",
"钉钉": "u",
"快手": "u",
"飞书": "u",
"京东": "u"
},
"快应用": {
"华为": "u",
"联盟": "u"
}
}
}
}
}

View File

@ -1,3 +0,0 @@
# uni-id-common
文档请参考:[uni-id-common](https://uniapp.dcloud.net.cn/uniCloud/uni-id-common.html)

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
{"name":"uni-id-common","version":"1.0.17","description":"uni-id token生成、校验、刷新","main":"index.js","homepage":"https://uniapp.dcloud.io/uniCloud/uni-id-common.html","repository":{"type":"git","url":"git+https://gitee.com/dcloud/uni-id-common.git"},"author":"DCloud","license":"Apache-2.0","dependencies":{"uni-config-center":"file:../../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center"}}

View File

@ -1,26 +0,0 @@
'use strict';
class BridgeError extends Error {
constructor(code, message) {
super(message)
this._code = code
}
get code() {
return this._code
}
get errCode() {
return this._code
}
get errMsg() {
return this.message
}
}
module.exports = {
BridgeError
}

View File

@ -1,124 +0,0 @@
'use strict';
const {
ProviderType
} = require('./consts.js')
const configCenter = require('uni-config-center')
// 多维数据为兼容uni-id以前版本配置
const OauthConfig = {
'weixin-app': [
['app', 'oauth', 'weixin'],
['app-plus', 'oauth', 'weixin']
],
'weixin-mp': [
['mp-weixin', 'oauth', 'weixin']
],
'weixin-h5': [
['web', 'oauth', 'weixin-h5'],
['h5-weixin', 'oauth', 'weixin'],
['h5', 'oauth', 'weixin']
],
'weixin-web': [
['web', 'oauth', 'weixin-web']
],
'qq-app': [
['app', 'oauth', 'qq'],
['app-plus', 'oauth', 'qq']
],
'qq-mp': [
['mp-qq', 'oauth', 'qq']
]
}
const Support_Platforms = [
ProviderType.WEIXIN_MP,
ProviderType.WEIXIN_H5,
ProviderType.WEIXIN_APP,
ProviderType.WEIXIN_WEB,
ProviderType.QQ_MP,
ProviderType.QQ_APP
]
class ConfigBase {
constructor() {
const uniIdConfigCenter = configCenter({
pluginId: 'uni-id'
})
this._uniIdConfig = uniIdConfigCenter.config()
}
getAppConfig(appid) {
if (Array.isArray(this._uniIdConfig)) {
return this._uniIdConfig.find((item) => {
return (item.dcloudAppid === appid)
})
}
return this._uniIdConfig
}
}
class AppConfig extends ConfigBase {
constructor() {
super()
}
get(appid, platform) {
if (!this.isSupport(platform)) {
return null
}
let appConfig = this.getAppConfig(appid)
if (!appConfig) {
return null
}
return this.getOauthConfig(appConfig, platform)
}
isSupport(platformName) {
return (Support_Platforms.indexOf(platformName) >= 0)
}
getOauthConfig(appConfig, platformName) {
let treePath = OauthConfig[platformName]
let node = this.findNode(appConfig, treePath)
if (node && node.appid && node.appsecret) {
return {
appid: node.appid,
secret: node.appsecret
}
}
return null
}
findNode(treeNode, arrayPath) {
let node = treeNode
for (let treePath of arrayPath) {
for (let name of treePath) {
const currentNode = node[name]
if (currentNode) {
node = currentNode
} else {
node = null
break
}
}
if (node === null) {
node = treeNode
} else {
break
}
}
return node
}
}
module.exports = {
AppConfig
};

View File

@ -1,30 +0,0 @@
'use strict';
const TAG = "UNI_OPEN_BRIDGE"
const HTTP_STATUS = {
SUCCESS: 200
}
const ProviderType = {
WEIXIN_MP: 'weixin-mp',
WEIXIN_H5: 'weixin-h5',
WEIXIN_APP: 'weixin-app',
WEIXIN_WEB: 'weixin-web',
QQ_MP: 'qq-mp',
QQ_APP: 'qq-app'
}
// old
const PlatformType = ProviderType
const ErrorCodeType = {
SYSTEM_ERROR: TAG + "_SYSTEM_ERROR"
}
module.exports = {
HTTP_STATUS,
ProviderType,
PlatformType,
ErrorCodeType
}

View File

@ -1,317 +0,0 @@
'use strict';
const {
PlatformType,
ProviderType,
ErrorCodeType
} = require('./consts.js')
const {
AppConfig
} = require('./config.js')
const {
Storage
} = require('./storage.js')
const {
BridgeError
} = require('./bridge-error.js')
const {
WeixinServer
} = require('./weixin-server.js')
const appConfig = new AppConfig()
class AccessToken extends Storage {
constructor() {
super('access-token', ['provider', 'appid'])
}
async update(key) {
super.update(key)
const result = await this.getByWeixinServer(key)
return this.set(key, result.value, result.duration)
}
async fallback(key) {
return this.getByWeixinServer(key)
}
async getByWeixinServer(key) {
const oauthConfig = appConfig.get(key.dcloudAppid, key.provider)
let methodName
if (key.provider === ProviderType.WEIXIN_MP) {
methodName = 'GetMPAccessTokenData'
} else if (key.provider === ProviderType.WEIXIN_H5) {
methodName = 'GetH5AccessTokenData'
} else {
throw new BridgeError(ErrorCodeType.SYSTEM_ERROR, "provider invalid")
}
const responseData = await WeixinServer[methodName](oauthConfig)
const duration = responseData.expires_in || (60 * 60 * 2)
delete responseData.expires_in
return {
value: responseData,
duration
}
}
}
class UserAccessToken extends Storage {
constructor() {
super('user-access-token', ['provider', 'appid', 'openid'])
}
}
class SessionKey extends Storage {
constructor() {
super('session-key', ['provider', 'appid', 'openid'])
}
}
class Encryptkey extends Storage {
constructor() {
super('encrypt-key', ['provider', 'appid', 'openid'])
}
async update(key) {
super.update(key)
const result = await this.getByWeixinServer(key)
return this.set(key, result.value, result.duration)
}
getKeyString(key) {
return `${super.getKeyString(key)}-${key.version}`
}
getExpiresIn(value) {
if (value <= 0) {
return 60
}
return value
}
async fallback(key) {
return this.getByWeixinServer(key)
}
async getByWeixinServer(key) {
const accessToken = await Factory.Get(AccessToken, key)
const userSession = await Factory.Get(SessionKey, key)
const responseData = await WeixinServer.GetUserEncryptKeyData({
openid: key.openid,
access_token: accessToken.access_token,
session_key: userSession.session_key
})
const keyInfo = responseData.key_info_list.find((item) => {
return item.version === key.version
})
if (!keyInfo) {
throw new BridgeError(ErrorCodeType.SYSTEM_ERROR, 'key version invalid')
}
const value = {
encrypt_key: keyInfo.encrypt_key,
iv: keyInfo.iv
}
return {
value,
duration: keyInfo.expire_in
}
}
}
class Ticket extends Storage {
constructor() {
super('ticket', ['provider', 'appid'])
}
async update(key) {
super.update(key)
const result = await this.getByWeixinServer(key)
return this.set(key, result.value, result.duration)
}
async fallback(key) {
return this.getByWeixinServer(key)
}
async getByWeixinServer(key) {
const accessToken = await Factory.Get(AccessToken, {
dcloudAppid: key.dcloudAppid,
provider: ProviderType.WEIXIN_H5
})
const responseData = await WeixinServer.GetH5TicketData(accessToken)
const duration = responseData.expires_in || (60 * 60 * 2)
delete responseData.expires_in
delete responseData.errcode
delete responseData.errmsg
return {
value: responseData,
duration
}
}
}
const Factory = {
async Get(T, key, fallback) {
Factory.FixOldKey(key)
return Factory.MakeUnique(T).get(key, fallback)
},
async Set(T, key, value, expiresIn) {
Factory.FixOldKey(key)
return Factory.MakeUnique(T).set(key, value, expiresIn)
},
async Remove(T, key) {
Factory.FixOldKey(key)
return Factory.MakeUnique(T).remove(key)
},
async Update(T, key) {
Factory.FixOldKey(key)
return Factory.MakeUnique(T).update(key)
},
FixOldKey(key) {
if (!key.provider) {
key.provider = key.platform
}
const configData = appConfig.get(key.dcloudAppid, key.provider)
if (!configData) {
throw new BridgeError(ErrorCodeType.SYSTEM_ERROR, 'appid or provider invalid')
}
key.appid = configData.appid
},
MakeUnique(T) {
return new T()
}
}
// exports
async function getAccessToken(key, fallback) {
return Factory.Get(AccessToken, key, fallback)
}
async function setAccessToken(key, value, expiresIn) {
return Factory.Set(AccessToken, key, value, expiresIn)
}
async function removeAccessToken(key) {
return Factory.Remove(AccessToken, key)
}
async function updateAccessToken(key) {
return Factory.Update(AccessToken, key)
}
async function getUserAccessToken(key, fallback) {
return Factory.Get(UserAccessToken, key, fallback)
}
async function setUserAccessToken(key, value, expiresIn) {
return Factory.Set(UserAccessToken, key, value, expiresIn)
}
async function removeUserAccessToken(key) {
return Factory.Remove(UserAccessToken, key)
}
async function getSessionKey(key, fallback) {
return Factory.Get(SessionKey, key, fallback)
}
async function setSessionKey(key, value, expiresIn) {
return Factory.Set(SessionKey, key, value, expiresIn)
}
async function removeSessionKey(key) {
return Factory.Remove(SessionKey, key)
}
async function getEncryptKey(key, fallback) {
return Factory.Get(Encryptkey, key, fallback)
}
async function setEncryptKey(key, value, expiresIn) {
return Factory.Set(Encryptkey, key, value, expiresIn)
}
async function removeEncryptKey(key) {
return Factory.Remove(Encryptkey, key)
}
async function updateEncryptKey(key) {
return Factory.Update(Encryptkey, key)
}
async function getTicket(key, fallback) {
return Factory.Get(Ticket, key, fallback)
}
async function setTicket(key, value, expiresIn) {
return Factory.Set(Ticket, key, value, expiresIn)
}
async function removeTicket(key) {
return Factory.Remove(Ticket, key)
}
async function updateTicket(key) {
return Factory.Update(Ticket, key)
}
module.exports = {
getAccessToken,
setAccessToken,
removeAccessToken,
updateAccessToken,
getUserAccessToken,
setUserAccessToken,
removeUserAccessToken,
getSessionKey,
setSessionKey,
removeSessionKey,
getEncryptKey,
setEncryptKey,
removeEncryptKey,
updateEncryptKey,
getTicket,
setTicket,
removeTicket,
updateTicket,
ProviderType,
PlatformType,
WeixinServer,
ErrorCodeType
}

View File

@ -1,15 +0,0 @@
{
"name": "uni-open-bridge-common",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"uni-config-center": "file:../../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center"
}
}

View File

@ -1,111 +0,0 @@
'use strict';
const {
Validator
} = require('./validator.js')
const {
CacheKeyCascade
} = require('./uni-cloud-cache.js')
const {
BridgeError
} = require('./bridge-error.js')
class Storage {
constructor(type, keys) {
this._type = type || null
this._keys = keys || []
}
async get(key, fallback) {
this.validateKey(key)
const result = await this.create(key, fallback).get()
return result.value
}
async set(key, value, expiresIn) {
this.validateKey(key)
this.validateValue(value)
const expires_in = this.getExpiresIn(expiresIn)
if (expires_in !== 0) {
await this.create(key).set(this.getValue(value), expires_in)
}
}
async remove(key) {
this.validateKey(key)
await this.create(key).remove()
}
// virtual
async update(key) {
this.validateKey(key)
}
async ttl(key) {
this.validateKey(key)
// 后续考虑支持
}
async fallback(key) {}
getKeyString(key) {
const keyArray = [Storage.Prefix]
this._keys.forEach((name) => {
keyArray.push(key[name])
})
keyArray.push(this._type)
return keyArray.join(':')
}
getValue(value) {
return value
}
getExpiresIn(value) {
if (value !== undefined) {
return value
}
return -1
}
validateKey(key) {
Validator.Key(this._keys, key)
}
validateValue(value) {
Validator.Value(value)
}
create(key, fallback) {
const keyString = this.getKeyString(key)
const options = {
layers: [{
type: 'database',
key: keyString
}, {
type: 'redis',
key: keyString
}]
}
const _this = this
return new CacheKeyCascade({
...options,
fallback: async function() {
if (fallback) {
return fallback(key)
} else if (_this.fallback) {
return _this.fallback(key)
}
}
})
}
}
Storage.Prefix = "uni-id"
module.exports = {
Storage
};

View File

@ -1,324 +0,0 @@
const db = uniCloud.database()
function getType(value) {
return Object.prototype.toString.call(value).slice(8, -1).toLowerCase()
}
const validator = {
key: function(value) {
const err = new Error('Invalid key')
if (typeof value !== 'string') {
throw err
}
const valueTrim = value.trim()
if (!valueTrim || valueTrim !== value) {
throw err
}
},
value: function(value) {
// 仅作简单校验
const type = getType(value)
const validValueType = ['null', 'number', 'string', 'array', 'object']
if (validValueType.indexOf(type) === -1) {
throw new Error('Invalid value type')
}
},
duration: function(value) {
const err = new Error('Invalid duration')
if (value === undefined) {
return
}
if (typeof value !== 'number' || value === 0) {
throw err
}
}
}
/**
* 入库时 expired 为过期时间对应的时间戳永不过期用-1表示
* 返回结果时 与redis对齐-1表示永不过期-2表示已过期或不存在
*/
class DatabaseCache {
constructor({
collection = 'opendb-open-data'
} = {}) {
this.type = 'db'
this.collection = db.collection(collection)
}
_serializeValue(value) {
return value === undefined ? null : JSON.stringify(value)
}
_deserializeValue(value) {
return value ? JSON.parse(value) : value
}
async set(key, value, duration) {
validator.key(key)
validator.value(value)
validator.duration(duration)
value = this._serializeValue(value)
await this.collection.doc(key).set({
value,
expired: duration && duration !== -1 ? Date.now() + (duration * 1000) : -1
})
}
async _getWithDuration(key) {
const getKeyRes = await this.collection.doc(key).get()
const record = getKeyRes.data[0]
if (!record) {
return {
value: null,
duration: -2
}
}
const value = this._deserializeValue(record.value)
const expired = record.expired
if (expired === -1) {
return {
value,
duration: -1
}
}
const duration = expired - Date.now()
if (duration <= 0) {
await this.remove(key)
return {
value: null,
duration: -2
}
}
return {
value,
duration: Math.floor(duration / 1000)
}
}
async get(key, {
withDuration = true
} = {}) {
const result = await this._getWithDuration(key)
if (!withDuration) {
delete result.duration
}
return result
}
async remove(key) {
await this.collection.doc(key).remove()
}
}
class RedisCache {
constructor() {
this.type = 'redis'
this.redis = uniCloud.redis()
}
_serializeValue(value) {
return value === undefined ? null : JSON.stringify(value)
}
_deserializeValue(value) {
return value ? JSON.parse(value) : value
}
async set(key, value, duration) {
validator.key(key)
validator.value(value)
validator.duration(duration)
value = this._serializeValue(value)
if (!duration || duration === -1) {
await this.redis.set(key, value)
} else {
await this.redis.set(key, value, 'EX', duration)
}
}
async get(key, {
withDuration = false
} = {}) {
let value = await this.redis.get(key)
value = this._deserializeValue(value)
if (!withDuration) {
return {
value
}
}
const durationSecond = await this.redis.ttl(key)
let duration
switch (durationSecond) {
case -1:
duration = -1
break
case -2:
duration = -2
break
default:
duration = durationSecond
break
}
return {
value,
duration
}
}
async remove(key) {
await this.redis.del(key)
}
}
class Cache {
constructor({
type,
collection
} = {}) {
if (type === 'database') {
return new DatabaseCache({
collection
})
} else if (type === 'redis') {
return new RedisCache()
} else {
throw new Error('Invalid cache type')
}
}
}
class CacheKey {
constructor({
type,
collection,
cache,
key,
fallback
} = {}) {
this.cache = cache || new Cache({
type,
collection
})
this.key = key
this.fallback = fallback
}
async set(value, duration) {
await this.cache.set(this.key, value, duration)
}
async setWithSync(value, duration, syncMethod) {
await Promise.all([
this.set(this.key, value, duration),
syncMethod(value, duration)
])
}
async get() {
let {
value,
duration
} = await this.cache.get(this.key)
if (value !== null && value !== undefined) {
return {
value,
duration
}
}
if (!this.fallback) {
return {
value: null,
duration: -2
}
}
const fallbackResult = await this.fallback()
value = fallbackResult.value
duration = fallbackResult.duration
if (value !== null && duration !== undefined) {
await this.cache.set(this.key, value, duration)
}
return {
value,
duration
}
}
async remove() {
await this.cache.remove(this.key)
}
}
class CacheKeyCascade {
constructor({
layers, // [{cache, type, collection, key}] 从低级到高级排序,[DbCacheKey, RedisCacheKey]
fallback
} = {}) {
this.layers = layers
this.cacheLayers = []
let lastCacheKey
for (let i = 0; i < layers.length; i++) {
const {
type,
cache,
collection,
key
} = layers[i]
const lastCacheKeyTemp = lastCacheKey
try {
const currentCacheKey = new CacheKey({
type,
collection,
cache,
key,
fallback: i === 0 ? fallback : function() {
return lastCacheKeyTemp.get()
}
})
this.cacheLayers.push(currentCacheKey)
lastCacheKey = currentCacheKey
} catch (e) {}
}
this.highLevelCache = lastCacheKey
}
async set(value, duration) {
return Promise.all(
this.cacheLayers.map(item => {
return item.set(value, duration)
})
)
}
async setWithSync(value, duration, syncMethod) {
const setPromise = this.cacheLayers.map(item => {
return item.set(value, duration)
})
return Promise.all(
[
...setPromise,
syncMethod(value, duration)
]
)
}
async get() {
return this.highLevelCache.get()
}
async remove() {
await Promise.all(
this.cacheLayers.map(cacheKeyItem => {
return cacheKeyItem.remove()
})
)
}
}
module.exports = {
Cache,
DatabaseCache,
RedisCache,
CacheKey,
CacheKeyCascade
}

View File

@ -1,31 +0,0 @@
const Validator = {
Key(keyArray, parameters) {
for (let i = 0; i < keyArray.length; i++) {
const keyName = keyArray[i]
if (typeof parameters[keyName] !== 'string') {
Validator.ThrowNewError(`Invalid ${keyName}`)
}
if (parameters[keyName].length < 1) {
Validator.ThrowNewError(`Invalid ${keyName}`)
}
}
},
Value(value) {
if (value === undefined) {
Validator.ThrowNewError('Invalid Value')
}
if (typeof value !== 'object') {
Validator.ThrowNewError('Invalid Value Type')
}
},
ThrowNewError(message) {
throw new Error(message)
}
}
module.exports = {
Validator
}

View File

@ -1,203 +0,0 @@
'use strict';
const crypto = require('crypto')
const {
HTTP_STATUS
} = require('./consts.js')
const {
BridgeError
} = require('./bridge-error.js')
class WeixinServer {
constructor(options = {}) {
this._appid = options.appid
this._secret = options.secret
}
getAccessToken() {
return uniCloud.httpclient.request(WeixinServer.AccessToken_Url, {
dataType: 'json',
method: 'POST',
contentType: 'json',
data: {
appid: this._appid,
secret: this._secret,
grant_type: "client_credential"
}
})
}
// 使用客户端获取的 code 从微信服务器换取 openidcode 仅可使用一次
codeToSession(code) {
return uniCloud.httpclient.request(WeixinServer.Code2Session_Url, {
dataType: 'json',
data: {
appid: this._appid,
secret: this._secret,
js_code: code,
grant_type: 'authorization_code'
}
})
}
getUserEncryptKey({
access_token,
openid,
session_key
}) {
console.log(access_token, openid, session_key);
const signature = crypto.createHmac('sha256', session_key).update('').digest('hex')
return uniCloud.httpclient.request(WeixinServer.User_Encrypt_Key_Url, {
dataType: 'json',
method: 'POST',
dataAsQueryString: true,
data: {
access_token,
openid: openid,
signature: signature,
sig_method: 'hmac_sha256'
}
})
}
getH5AccessToken() {
return uniCloud.httpclient.request(WeixinServer.AccessToken_H5_Url, {
dataType: 'json',
method: 'GET',
data: {
appid: this._appid,
secret: this._secret,
grant_type: "client_credential"
}
})
}
getH5Ticket(access_token) {
return uniCloud.httpclient.request(WeixinServer.Ticket_Url, {
dataType: 'json',
dataAsQueryString: true,
method: 'POST',
data: {
access_token
}
})
}
getH5AccessTokenForEip() {
return uniCloud.httpProxyForEip.postForm(WeixinServer.AccessToken_H5_Url, {
appid: this._appid,
secret: this._secret,
grant_type: "client_credential"
}, {
dataType: 'json'
})
}
getH5TicketForEip(access_token) {
return uniCloud.httpProxyForEip.postForm(WeixinServer.Ticket_Url, {
access_token
}, {
dataType: 'json',
dataAsQueryString: true
})
}
}
WeixinServer.AccessToken_Url = 'https://api.weixin.qq.com/cgi-bin/stable_token'
WeixinServer.Code2Session_Url = 'https://api.weixin.qq.com/sns/jscode2session'
WeixinServer.User_Encrypt_Key_Url = 'https://api.weixin.qq.com/wxa/business/getuserencryptkey'
WeixinServer.AccessToken_H5_Url = 'https://api.weixin.qq.com/cgi-bin/token'
WeixinServer.Ticket_Url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi'
WeixinServer.GetMPAccessToken = function(options) {
return new WeixinServer(options).getAccessToken()
}
WeixinServer.GetCodeToSession = function(options) {
return new WeixinServer(options).codeToSession(options.code)
}
WeixinServer.GetUserEncryptKey = function(options) {
return new WeixinServer(options).getUserEncryptKey(options)
}
WeixinServer.GetH5AccessToken = function(options) {
return new WeixinServer(options).getH5AccessToken()
}
WeixinServer.GetH5Ticket = function(options) {
return new WeixinServer(options).getH5Ticket(options.access_token)
}
////////////////////////////////////////////////////////////////
function isAliyun() {
return (uniCloud.getCloudInfos()[0].provider === 'aliyun')
}
WeixinServer.GetResponseData = function(response) {
console.log("WeixinServer::response", response)
if (!(response.status === HTTP_STATUS.SUCCESS || response.statusCodeValue === HTTP_STATUS.SUCCESS)) {
throw new BridgeError(response.status || response.statusCodeValue, response.status || response.statusCodeValue)
}
const responseData = response.data || response.body
if (responseData.errcode !== undefined && responseData.errcode !== 0) {
throw new BridgeError(responseData.errcode, responseData.errmsg)
}
return responseData
}
WeixinServer.GetMPAccessTokenData = async function(options) {
const response = await new WeixinServer(options).getAccessToken()
return WeixinServer.GetResponseData(response)
}
WeixinServer.GetCodeToSessionData = async function(options) {
const response = await new WeixinServer(options).codeToSession(options.code)
return WeixinServer.GetResponseData(response)
}
WeixinServer.GetUserEncryptKeyData = async function(options) {
const response = await new WeixinServer(options).getUserEncryptKey(options)
return WeixinServer.GetResponseData(response)
}
WeixinServer.GetH5AccessTokenData = async function(options) {
const ws = new WeixinServer(options)
let response
if (isAliyun()) {
response = await ws.getH5AccessTokenForEip()
if (typeof response === 'string') {
response = JSON.parse(response)
}
} else {
response = await ws.getH5AccessToken()
}
return WeixinServer.GetResponseData(response)
}
WeixinServer.GetH5TicketData = async function(options) {
const ws = new WeixinServer(options)
let response
if (isAliyun()) {
response = await ws.getH5TicketForEip(options.access_token)
if (typeof response === 'string') {
response = JSON.parse(response)
}
} else {
response = await ws.getH5Ticket(options.access_token)
}
return WeixinServer.GetResponseData(response)
}
module.exports = {
WeixinServer
}

View File

@ -1,29 +0,0 @@
const mixins = {
data() {
return {
wrapHeight: 'auto',
clientY: 0,
maxHeight: 0,
}
},
methods: {
// 移动
onTouchMove(e) {
console.log(e);
const moveDistance = e.changedTouches[0].clientY - this.clientY;
if (moveDistance > 5) {
this.wrapHeight = '352rpx';
} else {
this.wrapHeight = 0;
}
},
// 开始触摸屏幕
onTouchStart(e) {
this.clientY = e.changedTouches[0].clientY;
},
}
}
export default mixins;

View File

@ -1,6 +1,3 @@
import {
Toast
} from "../libs/uniApi";
import {
getGXconfig,
miniapp
@ -35,8 +32,11 @@ function compareVersions(version1, version2) {
const loadMP = async (id) => {
appid = id;
let info = await getGXconfig();
console.log('最新版本', info.data);
// return ;
uni.$emit('showLoading', true, '初始化中');
mp.getUniMPVersion(id, (ret) => {
console.log('当前版本', ret);
let flag;
if (ENV == 'prod') {
flag = false
@ -47,19 +47,18 @@ const loadMP = async (id) => {
true) {
let count = 0;
timer = setInterval(() => {
if (count < 100 && count > 0) uni.$emit('showLoading', true,
`初始化中... ${count}%`)
if (count < 100 && count > 0) uni.$emit('showLoading', true, `初始化中... ${count}%`)
else uni.$emit('showLoading', true, `初始化中... 99%`)
}, 200)
let downloadTask = uni.downloadFile({
url: info.data.version_info?.dow_url,
// url: "https://lihai001.oss-cn-chengdu.aliyuncs.com/attach/36e40202405031202367449.wgt",
success(res) {
wgtFile = res.tempFilePath;
setTimeout(() => {
installMP();
clearInterval(timer);
timer = null;
console.log('初始化完成', wgtFile);
setTimeout(()=>{
installMP();
clearInterval(timer);
timer = null;
}, 700)
},
fail(res) {
@ -84,7 +83,7 @@ const loadMP = async (id) => {
//加载商城小程序
const loadMPx = async (id) => {
appid = id;
let info = await miniapp();
console.log('最新版本', info.data);
@ -104,20 +103,19 @@ const loadMPx = async (id) => {
true) {
let count = 0;
timer = setInterval(() => {
if (count < 100 && count > 0) uni.$emit('showLoading', true,
`初始化中... ${count}%`)
if (count < 100 && count > 0) uni.$emit('showLoading', true, `初始化中... ${count}%`)
else uni.$emit('showLoading', true, `初始化中... 99%`)
}, 200)
let downloadTask = uni.downloadFile({
url: './__UNI__7626C0F.wgt',
url: info.data.appInfo.dow_url,
success(res) {
wgtFile = res.tempFilePath;
console.log('初始化完成', wgtFile);
setTimeout(() => {
installMP();
clearInterval(timer);
timer = null;
setTimeout(()=>{
installMP();
clearInterval(timer);
timer = null;
}, 700)
},
fail(res) {
@ -127,6 +125,7 @@ const loadMPx = async (id) => {
}
});
downloadTask.onProgressUpdate((res) => {
// console.log('初始化进度' + res.progress);
if (res.progress > count) count += 10;
if (count >= 90) {
clearInterval(timer);
@ -142,71 +141,67 @@ const loadMPx = async (id) => {
// 按信息接口加载小程序
const loadMPurl = async (e) => {
appid = e.id;
let FURL = e.url;
let FURL = e.url;
uni.$emit('showLoading', true, `初始化中...`)
uni.request({
url: FURL,
method: 'GET',
success: (fileInfo) => {
mp.getUniMPVersion(appid, (ret) => {
console.log('当前版本', ret);
let flag;
if (ENV == 'prod') {
flag = false
} else {
flag = true
}
if (0 != ret.code || compareVersions(fileInfo.data?.data?.version, ret
.versionInfo.name) == 1 || flag ==
true) {
let count = 0;
timer = setInterval(() => {
if (count < 100 && count > 0) uni.$emit('showLoading', true,
`初始化中... ${count}%`)
else uni.$emit('showLoading', true, `初始化中... 99%`)
}, 200)
let downloadTask = uni.downloadFile({
url: fileInfo.data?.data?.down_url,
success(res) {
wgtFile = res.tempFilePath;
console.log('初始化完成', wgtFile);
setTimeout(() => {
installMP();
clearInterval(timer);
timer = null;
}, 700)
},
fail(res) {
clearInterval(timer);
timer = null;
uni.hideLoading();
}
});
downloadTask.onProgressUpdate((res) => {
// console.log('初始化进度' + res.progress);
if (res.progress > count) count += 10;
if (count >= 90) {
clearInterval(timer);
timer = null;
}
});
} else {
open()
}
});
},
fail: (err) => {
console.log('错误:', err);
}
})
uni.request({
url: FURL,
method: 'GET',
success: (fileInfo) => {
mp.getUniMPVersion(appid, (ret) => {
console.log('当前版本', ret);
let flag;
if (ENV == 'prod') {
flag = false
} else {
flag = true
}
if (0 != ret.code || compareVersions(fileInfo.data?.data?.version, ret.versionInfo.name) == 1 || flag ==
true) {
let count = 0;
timer = setInterval(() => {
if (count < 100 && count > 0) uni.$emit('showLoading', true, `初始化中... ${count}%`)
else uni.$emit('showLoading', true, `初始化中... 99%`)
}, 200)
let downloadTask = uni.downloadFile({
url: fileInfo.data?.data?.down_url,
success(res) {
wgtFile = res.tempFilePath;
console.log('初始化完成', wgtFile);
setTimeout(()=>{
installMP();
clearInterval(timer);
timer = null;
}, 700)
},
fail(res) {
clearInterval(timer);
timer = null;
uni.hideLoading();
}
});
downloadTask.onProgressUpdate((res) => {
// console.log('初始化进度' + res.progress);
if (res.progress > count) count += 10;
if (count >= 90) {
clearInterval(timer);
timer = null;
}
});
} else {
open()
}
});
},
fail:(err)=> {
console.log('错误:', err);
}
})
};
// 商城配置的小程序
const loadAppletMP = async (data) => {
// console.log(data)
// return
appid = data.app_id;
// return ;
uni.$emit('showLoading', true, '初始化中');
@ -217,32 +212,22 @@ const loadAppletMP = async (data) => {
} else {
flag = true
}
if (data.showToast) {
uni.showLoading({
title: '正在加载中...'
});
}
if (0 != ret.code || compareVersions(data.version, ret.versionInfo.name) == 1 || flag ==
true) {
let count = 0;
timer = setInterval(() => {
if (count < 100 && count > 0) uni.$emit('showLoading', true,
`初始化中... ${count}%`)
if (count < 100 && count > 0) uni.$emit('showLoading', true, `初始化中... ${count}%`)
else uni.$emit('showLoading', true, `初始化中... 99%`)
}, 200)
let downloadTask = uni.downloadFile({
url: data.url,
// url: "https://lihai001.oss-cn-chengdu.aliyuncs.com/attach/3ffde202405031254278460.wgt",
success(res) {
wgtFile = res.tempFilePath;
console.log('初始化完成', wgtFile);
setTimeout(() => {
installMP(data);
clearInterval(timer);
timer = null;
setTimeout(()=>{
installMP();
clearInterval(timer);
timer = null;
}, 700)
},
fail(res) {
@ -252,6 +237,7 @@ const loadAppletMP = async (data) => {
}
});
downloadTask.onProgressUpdate((res) => {
// console.log('初始化进度' + res.progress);
if (res.progress > count) count += 10;
if (count >= 90) {
clearInterval(timer);
@ -267,38 +253,39 @@ const loadAppletMP = async (data) => {
// 按远程文件地址加载小程序
const loadMPdns = async (e) => {
appid = e.id;
let FURL = e.url;
let FURL = e.url;
uni.$emit('showLoading', true, `初始化中...`)
let count = 0;
timer = setInterval(() => {
if (count < 100 && count > 0) uni.$emit('showLoading', true, `初始化中... ${count}%`)
else uni.$emit('showLoading', true, `初始化中... 99%`)
}, 200)
let downloadTask = uni.downloadFile({
url: FURL,
success(res) {
wgtFile = res.tempFilePath;
console.log('初始化完成', wgtFile);
setTimeout(() => {
installMP();
clearInterval(timer);
timer = null;
}, 700)
},
fail(res) {
clearInterval(timer);
timer = null;
uni.hideLoading();
}
});
downloadTask.onProgressUpdate((res) => {
if (res.progress > count) count += 10;
if (count >= 90) {
clearInterval(timer);
timer = null;
}
});
let count = 0;
timer = setInterval(() => {
if (count < 100 && count > 0) uni.$emit('showLoading', true, `初始化中... ${count}%`)
else uni.$emit('showLoading', true, `初始化中... 99%`)
}, 200)
let downloadTask = uni.downloadFile({
url: FURL,
success(res) {
wgtFile = res.tempFilePath;
console.log('初始化完成', wgtFile);
setTimeout(()=>{
installMP();
clearInterval(timer);
timer = null;
}, 700)
},
fail(res) {
clearInterval(timer);
timer = null;
uni.hideLoading();
}
});
downloadTask.onProgressUpdate((res) => {
// console.log('初始化进度' + res.progress);
if (res.progress > count) count += 10;
if (count >= 90) {
clearInterval(timer);
timer = null;
}
});
};
// 小程序版本信息
@ -311,19 +298,19 @@ const getVersion = (id) => {
})
}
// 初始化小程序
const installMP = (data) => {
const installMP = () => {
mp.getUniMPVersion(appid, (ret) => {
doInstallMP(data);
doInstallMP();
console.log('getUniMPVersion: ' + JSON.stringify(ret));
});
};
const doInstallMP = (data) => {
const doInstallMP = () => {
mp.installUniMP({
appid: appid,
wgtFile: wgtFile
}, (r) => {
if (0 == r.code) {
open(data);
open();
} else {
uni.hideLoading();
clearInterval(timer);
@ -339,8 +326,7 @@ const doInstallMP = (data) => {
};
const open = (id = null) => {
uni.hideLoading()
uni.$emit('showLoading', false);
uni.$emit('showLoading', false);
let token = uni.getStorageSync('LOGIN_STATUS_TOKEN');
if (!token) return uni.showToast({
icon: 'none',
@ -348,12 +334,12 @@ const open = (id = null) => {
})
let avatar = store?.state?.userInfo?.avatar;
mp.openUniMP({
appid: typeof(id) == 'object' ? appid : (id || appid),
appid: id || appid,
extraData: {
uniMP: true,
token: token,
avatar: avatar,
},
}
}, (ret) => {
uni.hideLoading();
if (0 != ret.code) {
@ -363,16 +349,7 @@ const open = (id = null) => {
showCancel: false
});
}
if (id.type == 2) {
setTimeout(() => {
console.log("发送给小程序的", id)
mp.sendUniMPEvent(appid, 'tocustomlist', id, (ret) => {
console.log("开始发送消息")
});
}, 1000)
}
console.log('openUniMP: ' + JSON.stringify(ret));
});
}
@ -380,9 +357,9 @@ export default {
loadMP,
loadMPurl,
loadMPx,
loadMPdns,
loadMPdns,
installMP,
loadAppletMP,
loadAppletMP,
doInstallMP,
getVersion,
open

View File

@ -3,10 +3,11 @@ import {
uniMPgetLocation,
test
} from "@/utils/uniMPfunction.js"
export const initEvent = (data) => {
console.log(123)
export const initEvent = () => {
mp.onUniMPEventReceive(async (ret) => {
console.log('小程序事件: ', data);
console.log('小程序事件: ', ret);
// 用户如果没有注册商户 从小程序返回 入驻页面
if (ret.event == 'closeAppToOpenShop') {
mp.closeUniMP(ret.fromAppid, (ret) => {
@ -33,6 +34,20 @@ export const initEvent = (data) => {
console.log('获取定位');
let res = await uniMPgetLocation();
console.log(res);
// plus.geolocation.getCurrentPosition(function(position) {
// console.log('经度:' + position.coords.longitude);
// console.log('纬度:' + position.coords.latitude);
// // that.markers[1].latitude = position.coords.longitude;
// // that.markers[1].longitude = position.coords.longitude;
// mp.sendUniMPEvent(
// ret.fromAppid,
// 'getLocation', {...position.coords},
// (ret) => {
// console.log('Host sendEvent: ' + JSON.stringify(ret));
// });
// }, function(error) {
// console.error('获取位置失败:', error.message);
// }, {provider:'gps'});
mp.sendUniMPEvent(
ret.fromAppid,
'getLocation', {
@ -57,10 +72,6 @@ export const initEvent = (data) => {
console.log('Host sendEvent: ' + JSON.stringify(ret));
});
}
if (ret.event == 'log') {
// console.log('2222222')

View File

@ -24,15 +24,6 @@ import permision from "./permission.js"
// #endif
export default {
getDom: (that, selector, fn) => {
that.$nextTick(() => {
const query = uni.createSelectorQuery().in(that);
query.select(selector).boundingClientRect((data) => {
fn && fn(data);
}).exec();
})
},
//复制
uniCopy: ({
content,

View File

@ -8,7 +8,6 @@
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
module.exports = {
publicPath: '/h5',
productionSourceMap: false, // 生产打包时不输出map文件增加打包速度
configureWebpack: config => {
if (process.env.NODE_ENV === 'production') {