Compare commits

..

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

71 changed files with 2623 additions and 7252 deletions
App.vue
api
components
orderGoods
productWindow
recommend
config
manifest.jsonpages.json
pages
chat/customer_list
cloud_warehouse
gather
goods_details
helpPeople
index
store
applicationRecord
settled
user
users
whole_sale
static/images
store/modules
uni.scss
uniCloud-aliyun
cloudfunctions/oneClickLoginFn
database
uni_modules
uni-config-center
changelog.mdpackage.jsonreadme.md
uniCloud/cloudfunctions/common/uni-config-center
uni-id-common
changelog.mdpackage.jsonreadme.md
uniCloud/cloudfunctions/common/uni-id-common
uni-open-bridge-common/uniCloud/cloudfunctions/common/uni-open-bridge-common
utils

20
App.vue

@ -13,7 +13,6 @@
initEvent
} from "@/utils/uniMPevent.js";
let jpushModule = uni.requireNativePlugin("JG-JPush");
import uniMP from '@/utils/uniMP.js';
// #endif
import {
checkLogin
@ -116,7 +115,8 @@
let messageID = result.messageID
let title = result.title
let content = result.content
let extras = result.extras.type
let extras = result.extras
if (result.extras.type == 'ORDER_CREATE' && result.extras.mp3.length > 0) {
if (result.extras.mp3[0] == '微信') this.audioTeam.push('/static/audio/wechat.MP3')
if (result.extras.mp3[0] == '支付宝') this.audioTeam.push('/static/audio/pay.MP3')
@ -147,21 +147,11 @@
// this.audioTeam.push(result.extras.type);
// }
}
console.log("收到消息")
console.log(result)
//
if (notificationEventType == 'notificationOpened') {
if (result.extras.type == 2) {
let data = result.extras.group_data
data.route = result.extras.route
data.type = 2
uniMP.loadAppletMP(data)
} else {
uni.navigateTo({
url: result.extras.route
})
}
uni.navigateTo({
url: result.extras.route
})
}
})

@ -28,11 +28,6 @@ export function getProductParmas(id, data) {
noAuth: true
});
}
export function getUnimpInfo() {
return request.get('intention/publish');
}
/**
* 获取店铺推荐商品
* @param int id
@ -572,17 +567,6 @@ export function getParmasValue(id) {
noAuth: true
});
}
/**
* 获取参数值列表
* @param int id
*
*/
export function getIntention(uid) {
return request.get(`intention/info/${uid}`);
}
/**
* 到货通知
*
@ -684,12 +668,4 @@ export function getVillageInfo(data) {
return requestb.get(`shop_call/getVillageCompany`, data, {
noAuth: true
});
}
/*
获取店铺资质
*/
export function consultApi(data) {
return request.post(`service/consult`, data)
}

@ -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);
}
/**
* 提现银行/提现最低金额

@ -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>

@ -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>

@ -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) {
@ -311,7 +288,7 @@
display: flex;
justify-content: space-between;
align-items: center;
margin: 0 -20rpx 10rpx;
margin: 0 -20rpx 30rpx;
padding-top: 20rpx;
.tabs-item {
@ -363,6 +340,10 @@
}
.information {
// display: flex;
// justify-content: space-between;
// margin-bottom: 20rpx;
.nav-item {
width: 227rpx;
overflow: hidden;
@ -408,11 +389,6 @@
}
}
.loading-flex {
width: auto !important;
margin-right: 10rpx;
}
.pictrue {
display: flex;
flex-direction: column;

@ -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':

@ -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.52",
"versionCode" : 2052,
"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
}
}
}
}

@ -19,33 +19,7 @@
"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 //
}
}
}, {
@ -61,21 +35,8 @@
"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)"
}
}]
}
"backgroundColorTop": "#40AE36",
"backgroundTextStyle": "light"
}
}, {
"path": "pages/order_addcart/order_addcart",
@ -95,22 +56,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"
}
},
{
@ -870,14 +816,7 @@
"path": "settled/index",
"style": {
"navigationBarTitleText": "商家入驻",
"navigationStyle": "custom",
"enablePullDownRefresh": false
}
},
{
"path": "settled/index1",
"style": {
"navigationBarTitleText": "商家入驻"
"navigationStyle": "custom"
}
},
{

@ -841,8 +841,7 @@
import {
getProductDetail,
getPresellProductDetail,
getStoreDetail,
consultApi
getStoreDetail
} from "@/api/store";
import {
getCombinationDetail
@ -1450,10 +1449,6 @@
this.height();
},
sendProduct() {
consultApi({
user_id: this.toUid,
product_id: this.productId
})
if (this.presellId || this.combinationId) {
if (this.presellId) {
this.sendMsg(this.presellId, 7);

@ -312,7 +312,7 @@
<view>
<!-- 流水瀑布 -->
<WaterfallsFlow :wfList='hostProduct' @itemTap="goDetail" :type="0" />
<loadmore :type="isLoading" style="padding: 12rpx 0;"></loadmore>
<loadmore :type="isLoading" style="background-color: #fff;padding: 12rpx 0;"></loadmore>
</view>
</scroll-view>
</view>

@ -114,7 +114,7 @@
</view>
</view>
</view>
<loadmore :type="isLoading" style="padding: 12rpx 0;"></loadmore>
<loadmore :type="isLoading" style="background-color: #fff;padding: 12rpx 0;"></loadmore>
</scroll-view>
</view>

@ -70,7 +70,7 @@
<view>
<!-- 流水瀑布 -->
<WaterfallsFlow :wfList='hostProduct' @itemTap="goDetail" :type="0" />
<loadmore :type="isLoading" style="padding: 12rpx 0;"></loadmore>
<loadmore :type="isLoading" style="background-color: #fff;padding: 12rpx 0;"></loadmore>
</view>
</scroll-view>
</view>

@ -175,18 +175,19 @@
</view>
</view>
</view>
<view class="title-img">
<image src="https://lihai001.oss-cn-chengdu.aliyuncs.com/def/807b8202403111125379295.webp" mode=""></image>
</view>
<view class="business com special_work" v-if="jurisdiction == false">
<view class="content">
<block v-if="nowMenuList.length > 0">
<u-transition v-for="(item, index) in nowMenuList" :key="item.name" show>
<view class="examine" @click.stop="editFlag ? removeMenu(item) : clickMenu(item)"
@longpress="editFlag = true">
<image class="icon_img gatherDiver" :src="item.pic" mode="aspectFit">
<image class="icon_img" :src="item.pic" mode="aspectFit">
</image>
<!-- <u-icon v-if="editFlag" class="icon" name="minus-circle-fill" color="red"></u-icon> -->
<view v-if="editFlag" class="icon" style="background-color: red;">删除</view>
<text class="text">{{ item.name }}</text>
</view>
@ -212,7 +213,6 @@
<u-transition v-for="(item, index) in AllMenuList" :key="item.name" show>
<view class="examine" @click.stop="pushMenu(item)">
<image class="icon_img" :src="item.pic" mode="aspectFit"> </image>
<!-- <u-icon class="icon" name="plus-circle-fill"></u-icon> -->
<view class="icon">添加</view>
<text class="text">{{ item.name }}</text>
</view>
@ -248,9 +248,6 @@
} from "@/api/public";
// #ifdef APP-PLUS
import uniMP from '@/utils/uniMP.js';
import {
isNewMer
} from '@/api/user.js';
// #endif
export default {
@ -259,8 +256,6 @@
},
data() {
return {
subNVue: null,
elInfo: '',
imgUrls: [{
img: 'https://lihai001.oss-cn-chengdu.aliyuncs.com/def/e2f0520240203154207556.png'
}],
@ -296,23 +291,13 @@
computed: {
...mapGetters(['userInfo', 'location', 'isLogin'])
},
created() {},
onLoad() {
this.subNVue = uni.getSubNVueById('concat')
let that = this
uni.$on('diverGatherSubEmit', function(data) {
that.clickMenu(that.nowMenuList[0])
})
},
onShow() {
let that = this
this.street = this.$store.state.storage.address.townName;
this.getNav();
if (this.isLogin) {
this.emptyText = '暂无可用应用'
this.jurisdiction = false
this.initAllAppLet(true);
this.initAllAppLet();
} else {
this.emptyText = '请登录'
this.jurisdiction = true
@ -328,38 +313,13 @@
menu = [];
}
this.nowMenuList = menu;
// #ifdef APP-PLUS
if (Boolean(this.userInfo.service?.mer_id)) {
isNewMer(this.userInfo.uid, this.userInfo.service?.mer_id).then(
res => {
if (res.data == 'true') {
setTimeout(() => {
const query = uni.createSelectorQuery().in(this);
query
.select(".gatherDiver")
.boundingClientRect((data) => {
let info = JSON.stringify(data)
that.elInfo = data
that.openDiver()
})
.exec();
}, 500)
}
})
}
// #endif
},
onPullDownRefresh() {
this.getUserInfo()
uni.stopPullDownRefresh()
},
beforeDestroy() {},
onReady() {
// #ifdef APP-PLUS
// #endif
},
mounted() {},
// #ifdef APP-PLUS
onPageScroll(e) {
const scrollTop = e.scrollTop;
@ -386,9 +346,15 @@
}
},
methods: {
openDiver() {
this.subNVue.show('zoom-out', 300)
uni.$emit('diverGatherEmit', this.elInfo);
/**
* 获取个人用户信息
*/
getUserInfo: function() {
let that = this;
getUserInfo().then(res => {
showTab(res.data);
this.userInfo = res.data;
});
},
changeSwiper(e) {
if (e.length > 0 && e[1].value) {
@ -464,13 +430,13 @@
}
})
},
initAllAppLet(flag) {
initAllAppLet() {
applet().then(res => {
this.AllMenuList = res.data;
this.initMenu(flag);
this.initMenu();
this.showControllerAllLet();
}).catch(e => {
// console.log(e);
console.log(e);
})
},
//
@ -484,7 +450,7 @@
}
},
//
initMenu(flag = false) {
initMenu() {
let nowMenu = uni.getStorageSync('gatherMenuList');
try {
let list = JSON.parse(nowMenu || '[]');
@ -494,12 +460,8 @@
if (list.find(t => t.name == item.name)?.name != item.name) all.push(item);
else now.push(item)
})
if (flag && !now.length) {
this.$set(now, 0, all[0])
}
this.AllMenuList = all;
this.nowMenuList = now;
} catch (e) {
this.nowMenuList = [];
}
@ -528,6 +490,7 @@
},
getUniMp(data) {
let that = this;
// #ifdef APP-PLUS
if (data.version) return uniMP.loadAppletMP(data);
else switch (data.type) {
@ -547,6 +510,14 @@
return;
// #endif
// #ifdef H5
// if (type == 2) {
// this.navigator(`/pages/moreProject/moreProject`);
// } else {
// uni.showToast({
// icon: 'none',
// title: 'H5'
// })
// }
uni.showToast({
icon: 'none',
title: 'H5不支持打开小程序'
@ -555,6 +526,7 @@
},
navigator(url, t) {
// if (this.userInfoData.is_wsxx === 0 && t != '') return Toast("");
uni.navigateTo({
url: url
})
@ -562,8 +534,6 @@
getUserInfo: function() {
let that = this;
getUserInfo().then(res => {
showTab(res.data);
that.userInfo = res.data;
that.userInfoData = res.data;
that.$store.commit('SET_USERINFO', res.data);
// console.log(res.data.service);

@ -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>

@ -336,14 +336,13 @@
</view>
<view v-if="description.content && description.content.image" class="pictures">
<view class="" v-for="(item,index) in description.content.image" :key="index">
<view style="position: relative;" v-if='videoTypeList.includes(getSuffix(item))'
@click="navGoPlay(item)">
<view style="position: relative;"
v-if='videoTypeList.includes(getSuffix(item))' @click="navGoPlay(item)">
<!-- #ifdef APP-PLUS -->
<image :src="item+coverUrl" mode="widthFix"
style="background-color: #fff;width: 100vw;" />
<!-- <image class="image-play-icon" src="/static/images/stop.png"> -->
<u--image class="image-play-icon" src="/static/images/stop.png"
width="100rpx" height="100rpx"></u--image>
<u--image class="image-play-icon" src="/static/images/stop.png" width="100rpx" height="100rpx" ></u--image>
</image>
<!-- #endif -->
<!-- #ifndef APP-PLUS -->

@ -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
})

@ -11,8 +11,7 @@
<!-- #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>
<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'">
@ -45,7 +44,7 @@
<!-- 首发新品 -->
<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]">
@ -110,7 +109,7 @@
<!-- 首发新品 -->
<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]">
@ -281,7 +280,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 +297,7 @@
var statusBarHeight = uni.getSystemInfoSync().statusBarHeight + 'px';
let app = getApp();
import {
getUserInfo,
isNewMer
getUserInfo
} from '@/api/user.js';
import {
getDiy,
@ -452,8 +450,6 @@
},
data() {
return {
subNvue: null,
diverFlag: true,
domain: HTTP_REQUEST_URL,
couponTypeMsg: {
10: '通用券',
@ -547,8 +543,7 @@
preview: false,
isSupport: true,
isIndexClick: true,
scrollTop: 0,
tabScroll: 0
scrollTop: 0
};
},
@ -620,11 +615,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 +633,14 @@
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;
that.isIntegral = uni.getStorageSync('isIntegral')
// #ifdef APP-PLUS
if (that.appUpdate.openUpgrade == '1') {
@ -694,48 +688,7 @@
}, 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 +748,7 @@
},
bindHeighta(data) {
// #ifdef APP-PLUS
// this.sortMpTop = data.top + data.height;
this.sortMpTop = data.top + data.height;
// #endif
},
//
@ -1073,12 +1026,8 @@
showTab(res.data);
that.userInfo = res.data;
this.$store.commit('SET_USERINFO', res.data);
// #ifdef APP
this.openListGoodsDiver()
// #endif
});
},
// 访
setVisit() {
setVisit({
@ -1112,7 +1061,6 @@
self.sortMarTop = 10;
}
},
//
get_product_list: function() {
let that = this;
@ -1133,10 +1081,10 @@
that.loadTitle = '加载更多';
});
},
//
/**
* 点击组件选项卡
*/
changeRecommedTab(e) {
let that = this;
this.hotPage = 1;
this.hotScroll = true;
this.hostIndex = e - 1;
@ -1144,14 +1092,11 @@
hostList[e - 1] = [];
this.$set(this, 'hostProduct', hostList);
this.loadGoods(e);
uni.pageScrollTo({
scrollTop: that.$refs.recommendRef.tabsTop,
duration: 200
})
},
loadGoods(e = 1) {
console.log(e);
this.$nextTick(() => {
if (e == 1) return this.get_host_product(0);
if (e == 2) return this.get_host_home({
@ -1165,12 +1110,12 @@
}, 3);
})
},
//
/**
* 获取我的推荐
*/
get_host_product: function(e = 0) {
let that = this;
let num = that.hotLimit;
if (!that.hotScroll) return;
if (that.hotLoading[e]) return;
@ -1180,25 +1125,24 @@
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;
@ -1247,13 +1191,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 +1239,6 @@
});
}
},
//#ifdef H5
ShareInfo(datas) {
let data = this.storeInfo;
@ -1333,7 +1274,6 @@
this.domHeight = res[0].height;
})
},
//
onReachBottom() {
if (this.recommend_switch == 1 && this.navIndex == 0) {
@ -1345,7 +1285,7 @@
this.get_product_list();
}
}
}
},
};
</script>
<style>

@ -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>

@ -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>

@ -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>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -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>
@ -333,11 +333,9 @@
},
data() {
return {
elInfo: '',
//#ifdef H5
isWeixin: this.$wechat.isWeixin(),
//#endif
subNvue: '',
domain: HTTP_REQUEST_URL,
showSkeleton: true, //
isNodes: 0, //,
@ -462,9 +460,6 @@
},
onLoad() {
// #ifdef APP-PLUS
uni.$on('offuserSubnvue', () => {
this.subNvue.hide('slide-out-right');
})
this.appVersion = 'V ' + uni.getSystemInfoSync().appWgtVersion;
// #endif
// #ifdef H5
@ -473,52 +468,12 @@
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
@ -541,16 +496,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()

@ -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>

@ -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>

@ -1,120 +1,117 @@
<template>
<view :style="viewColor">
<view class="register absolute" v-if="!auth_token">
<!-- <view class="login" style="background-size: 100% 100%;background-repeat: no-repeat;"> -->
<view class="login">
<view class="shading">
<view class="pictrue acea-row row-center-wrapper" style="background-color: transparent !important;">
<div :style="viewColor">
<div class="register absolute" v-if="!auth_token">
<div class="login" style="background-size: 100% 100%;background-repeat: no-repeat;">
<div class="shading">
<div class="pictrue acea-row row-center-wrapper" style="background-color: transparent !important;">
<image src="@/static/images/logo1.png" />
</view>
</view>
<view class="" style="margin-top: 10rpx;" v-if='formItem==2'>
<view style="text-align: center;font-size: 36rpx;color: #20B128;font-weight: 700;">
重置密码
</view>
<view style="text-align: center;color: #BCBCBC;font-size: 24rpx;margin-top: 10rpx;">
请输入手机号码和验证码找回密码重置
</view>
</view>
<view class="whiteBg" v-if="formItem == 0">
<view class="logon" style="display: flex;align-items: center;justify-content: center;"
</div>
</div>
<div class="whiteBg" v-if="formItem == 0">
<div class="logon" style="display: flex;align-items: center;justify-content: center;"
@click="wxLogin">
<u-icon name="weixin-fill" color="#fff" size="30"></u-icon> 微信一键登录
</view>
</div>
<view class="protocol acea-row row-between-wrapper">
<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>
</checkbox-group>
</view>
</view>
<view class="whiteBg" v-else-if="formItem === 1">
<view class="title acea-row row-center-wrapper">
<view class="item" :class="current === index ? 'on' : ''" v-for="(item, index) in navList"
</div>
</div>
<div class="whiteBg" v-else-if="formItem === 1" style="po">
<div class="title acea-row row-center-wrapper">
<div class="item" :class="current === index ? 'on' : ''" v-for="(item, index) in navList"
@click="navTap(index)" :key="index">
{{ item }}
</view>
</view>
<view class="list" :hidden="current !== 1">
</div>
</div>
<div class="list" :hidden="current !== 1">
<form @submit.prevent="submit">
<view class="item">
<view class="acea-row row-middle">
<div class="item">
<div class="acea-row row-middle">
<image src="/static/images/phone_1.png"></image>
<input type="number" placeholder="输入账号" placeholder-class="placeholder"
v-model="account" required />
</view>
</view>
<view class="item">
<view class="acea-row row-middle">
<image v-if="type1" @click="type1=false" src="/static/images/eye.png"></image>
<image v-else @click="type1=true" src="/static/images/offeye.png"></image>
<input style="border: none; outline:none;outline:0" :type="type1?'password':'input'"
placeholder="填写登录密码" placeholder-class="placeholder" v-model="password"
required />
<button class="code" @click="formItem=2">
忘记密码
</button>
</view>
</view>
</div>
</div>
<div class="item">
<div class="acea-row row-middle">
<image src="/static/images/code_2.png"></image>
<input type="password" placeholder="填写登录密码" placeholder-class="placeholder"
v-model="password" required />
</div>
</div>
</form>
</view>
<view class="list" :hidden="current !== 0">
<view class="item">
<view class="acea-row row-middle">
<div class="tip">
<!-- <span @click="formItem = 2" class="font-color-red">立即注册</span> -->
<span> </span>
<navigator class="forgetPwd" hover-class="none" url="/pages/users/retrievePassword/index">
忘记密码
</navigator>
</div>
</div>
<div class="list" :hidden="current !== 0">
<div class="item">
<div class="acea-row row-middle">
<image src="/static/images/phone_1.png"></image>
<input type="number" placeholder="输入手机号码" placeholder-class="placeholder"
v-model="account" />
</view>
</view>
<view class="item">
<view class="acea-row row-middle">
</div>
</div>
<div class="item">
<div class="acea-row row-middle">
<image src="/static/images/code_2.png"></image>
<input type="number" placeholder="填写验证码" placeholder-class="placeholder"
class="codeIput" v-model="captcha" maxlength="4" />
<button class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''"
@click="handleVerify">
{{ text }}
</button>
</view>
</view>
<view class="item" v-if="isShowCode">
<view class="acea-row row-middle">
</div>
</div>
<div class="item" v-if="isShowCode">
<div class="acea-row row-middle">
<image src="/static/images/code_2.png"></image>
<input type="number" placeholder="填写验证码" placeholder-class="placeholder"
class="codeIput" v-model="codeVal" maxlength="4" />
<view class="code" @click="getcaptcha">
<div class="code" @click="getcaptcha">
<image class="code-img" style="width: 100%;height: 100%;" :src="codeUrl" />
</view>
</view>
</view>
</view>
</div>
</div>
</div>
</div>
<view class="logon" @click="loginMobile" :hidden="current !== 0">登录</view>
<view class="logon" @click="submit" :hidden="current === 0">账号登录</view>
<view class="protocol acea-row row-between-wrapper">
<div class="logon" @click="loginMobile" :hidden="current !== 0">登录</div>
<div class="logon" @click="submit" :hidden="current === 0">登录</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>
</checkbox-group>
</view>
</view>
<view class="whiteBg" style="margin-top: 0;" v-else-if='formItem==2'>
<view class="list">
<view class="item">
<view class="acea-row row-middle">
</div>
</div>
<div class="whiteBg" v-else>
<div class="title">注册账号</div>
<div class="list">
<div class="item">
<div class="acea-row row-middle">
<image src="/static/images/phone_1.png"></image>
<input type="number" placeholder="输入手机号码" placeholder-class="placeholder"
v-model="account" />
</view>
</view>
<view class="item">
<view class="acea-row row-middle">
</div>
</div>
<div class="item">
<div class="acea-row row-middle">
<image src="/static/images/code_2.png"></image>
<input type="number" placeholder="填写验证码" maxLength='4' placeholder-class="placeholder"
class="codeIput" v-model="captcha" />
@ -123,64 +120,49 @@
@click="handleVerify">
{{ text }}
</button>
</view>
</view>
<view class="item">
<view class="acea-row row-middle">
<image v-if="type2" @click="type2=false" src="/static/images/eye.png"></image>
<image v-else @click="type2=true" src="/static/images/offeye.png"></image>
<input :type="type2?'password':'input'" placeholder="请输入新密码"
placeholder-class="placeholder" style="border: none; outline:none;outline:0"
</div>
</div>
<div class="item">
<div class="acea-row row-middle">
<image src="/static/images/code_1.png"></image>
<input type="password" placeholder="填写您的登录密码" placeholder-class="placeholder"
v-model="password" />
</view>
</view>
<view class="item">
<view class="acea-row row-middle">
<image v-if="type3" @click="type3=false" src="/static/images/eye.png"></image>
<image v-else @click="type3=true" src="/static/images/offeye.png"></image>
<input :type="type3?'password':'input'" placeholder="请再次输入密码"
placeholder-class="placeholder" style="border: none; outline:none;outline:0"
v-model="confirm_pwd" />
</view>
</view>
</div>
</div>
<view class="item" v-if="isShowCode">
<view class="acea-row row-middle">
<div class="item" v-if="isShowCode">
<div class="acea-row row-middle">
<image src="/static/images/code_2.png"></image>
<input type="number" placeholder="填写验证码" maxlength="4" placeholder-class="placeholder"
class="codeIput" v-model="codeVal" />
<view class="code" @click="getcaptcha">
<div class="code" @click="getcaptcha">
<image class="code-img" style="width: 100%;height: 100%;" :src="codeUrl" />
</view>
</view>
</view>
</view>
<view class="logon" @click="registerReset">完成并登录</view>
<view class="protocol acea-row row-between-wrapper">
</div>
</div>
</div>
</div>
<div class="tip">
<div>
已有账号?
<span @click="formItem = 1" class="font-color-red">去登录</span>
</div>
</div>
<div class="logon" @click="register">注册</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>
</checkbox-group>
</view>
</view>
<view class="footer-btn" v-if="formItem==2">
<view class="login-type-btn" :class="{actLoginType:formItem==0}" style="margin-right: 70rpx;">
<text v-if='formItem == 1||formItem==2' @click="formItem = 0">微信快捷登录</text>
<text v-else @click="appOneClcik">本机一键登录</text>
</view>
<view class="login-type-btn" :class="{actLoginType:formItem==1}">
<text v-if='formItem == 0 ||formItem==2' @click="formItem = 1">更多登录方式</text>
<text v-else @click="appOneClcik">本机一键登录</text>
</view>
</view>
</view>
<view class="bottom"></view>
</div>
</div>
</div>
<div class="bottom"></div>
<view class="settlementAgreement" v-if="showAgreement">
<view class="setAgCount">
<i class="icon iconfont icon-cha" @click="showAgreement = false"></i>
<view class="title">用户协议与隐私政策</view>
<div class="title">用户协议与隐私政策</div>
<view class="content">
<jyf-parser :html="agreement" ref="article" :tag-style="tagStyle"></jyf-parser>
</view>
@ -188,18 +170,13 @@
</view>
<!-- #ifdef APP-PLUS -->
<view class="footer-btns" v-if="formItem !=2">
<view class="login-type-btn" :class="{actLoginType:formItem==0}" style="margin-right: 70rpx;">
<text v-if='formItem == 1||formItem==2' @click="formItem = 0">微信快捷登录</text>
<text v-else @click="appOneClcik">本机一键登录</text>
</view>
<view class="login-type-btn" :class="{actLoginType:formItem==1}">
<text v-if='formItem == 0 ||formItem==2' @click="formItem = 1">更多登录方式</text>
<text v-else @click="appOneClcik">本机一键登录</text>
</view>
</view>
<div class="protocol acea-row row-between-wrapper"
style="position: fixed; bottom: 160rpx;left: 50%;transform: translate(-50%);">
<text class="protocol_text" v-if="formItem==0" @click="formItem = 1 ">其他方式登录</text>
<text class="protocol_text" v-else @click="formItem = 0 ">微信快捷登录</text>
</div>
<!-- #endif -->
</view>
</div>
<form report-submit='true' v-if="auth_token">
<view class="ChangePassword">
<view class="title">
@ -238,57 +215,14 @@
<button form-type="submit" @click="auth_token = ''" class="confirmBnt back">返回</button>
</view>
</form>
<!-- <view class="copyright" @click="goCopyUrl">
{{ copyright.status == -1 ? `${copyright.year} ${copyright.url}` : copyright.Copyright }}
</view> -->
<Verify @success="success" :captchaType="'blockPuzzle'" :imgSize="{ width: '330px', height: '155px' }"
ref="verify"></Verify>
<!-- tips弹窗 -->
<u-overlay :show="showTips">
<view class="tips">
<view class="" style="font-size: 32rpx;">
温馨提示
</view>
<block v-if="tispTile=='密码错误'">
<view class="">
{{tipsErr}}
</view>
<view class="" style="display: flex;">
<view style="width: 236rpx;height: 84rpx;margin-right:38rpx;">
<u-button plain text="找回密码" @tap="showTips=false,formItem=2"></u-button>
</view>
<view style="width: 236rpx;height: 84rpx;">
<u-button color="#46BF6F" text="重新输入" @tap="showTips=false"></u-button>
</view>
</view>
</block>
<block v-else-if="tispTile=='验证码错误'">
<view class="">
验证码错误请重新收入
</view>
<view class="" style="display: flex;">
<u-button color="#46BF6F" text="确定" @tap="showTips=false"></u-button>
</view>
</block>
<block v-else-if="tispTile=='密码不一致'">
<view class="">
两次输入的密码不一致请重新输入
</view>
<view class="" style="display: flex;">
<u-button color="#46BF6F" text="确定" @tap="showTips=false"></u-button>
</view>
</block>
<block v-else>
<view class="">
{{tispTile}}
</view>
<view class="" style="display: flex;width: 236rpx;">
<u-button color="#46BF6F" text="确定" @tap="showTips=false"></u-button>
</view>
</block>
</view>
</u-overlay>
<!-- tips结束 -->
</view>
</div>
</template>
<script>
// +----------------------------------------------------------------------
@ -312,9 +246,7 @@
getCaptcha,
getAgreementApi,
appleLogin,
loginMpPhone,
registerForget,
phonelogin
loginMpPhone
} from "@/api/user";
// #ifdef APP-PLUS
import {
@ -356,7 +288,6 @@
} from "../../../libs/uniApi";
const BACK_URL = "login_back_url";
// #ifdef APP-PLUS
import oneClickStyle from "./oneClickStyle.js"
var jpushModule = uni.requireNativePlugin("JG-JPush");
// #endif
export default {
@ -368,17 +299,10 @@
},
data: function() {
return {
type1: true,
type2: true,
type3: true,
tipsErr: "",
tispTile: '密码错误',
showTips: false,
navList: ["快速登录", "账号登录"],
current: 0,
account: "",
password: "",
confirm_pwd: "",
captcha: "",
// #ifdef APP-PLUS
formItem: 0,
@ -413,8 +337,6 @@
formItem: function(nval, oVal) {
if (nval == 1) {
this.type = 'login'
} else if (nval == 2) {
this.type = 'change_pwd'
} else {
this.type = 'register'
}
@ -449,18 +371,9 @@
// #endif
},
methods: {
showTipsFn(text, err) {
this.showTips = true
this.tispTile = text
this.tipsErr = err || ''
},
navgo(url) {
uni.navigateTo({
url
})
},
// #ifdef MP
getPhoneNumber(e) {
let that = this;
loginMpPhone({
iv: e.detail.iv,
@ -806,7 +719,6 @@
});
});
},
//
async loginMobile() {
let that = this;
if (!that.account) return that.$util.Tips({
@ -880,7 +792,9 @@
});
})
.catch(res => {
that.showTipsFn(res)
that.$util.Tips({
title: res
});
});
},
async register() {
@ -948,90 +862,6 @@
});
})
.catch(res => {
console.log(res, 'res')
that.showTipsFn('密码错误', res)
});
},
async weixinMerge() {
let that = this;
if (!that.account) return that.$util.Tips({
title: '请输入手机号码'
});
if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
title: '请输入正确的手机号码'
});
if (!that.captcha) return that.$util.Tips({
title: '请输入验证码'
});
if (!/^[\w\d]+$/i.test(that.captcha)) return that.$util.Tips({
title: '请输入正确的验证码'
});
if (!that.password) return that.$util.Tips({
title: '请输入密码'
});
if (!/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$/i.test(that.password)) return that.$util.Tips({
title: '请输入6-16位字母加数字组合'
});
if (!that.isAgree) return that.$util.Tips({
title: '请勾选用户协议与隐私政策'
});
console.log('绑定前', {
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
});
userMerge({
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 => {
console.log(res);
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);
const backUrl = that.$Cache.get('login_back_url_weixin') || that.$Cache.get(BACK_URL) ||
"/pages/index/index";
that.$Cache.clear(BACK_URL);
that.$Cache.clear('login_back_url_weixin');
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'
}
uni[method]({
url: backUrl,
success: () => {
this.auth_token = ''
}
});
})
.catch(res => {
console.log('error', err);
that.$util.Tips({
title: res
});
@ -1133,7 +963,7 @@
// if (that.formItem == 2) that.type = "register";
await registerVerify({
phone: that.account,
type: that.type,
type: 'login',
key: that.keyCode,
// code: that.codeVal,
toke: data.token,
@ -1152,38 +982,6 @@
});
});
},
async registerReset() {
var that = this;
if (!that.account) return that.$util.Tips({
title: '请填写手机号码'
});
if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
title: '请输入正确的手机号码'
});
if (that.password == '123456') return that.$util.Tips({
title: '您输入的密码过于简单'
});
if (that.password != that.confirm_pwd) return that.$util.Tips({
title: '两次密码不一致'
});
if (!that.captcha) return that.$util.Tips({
title: '请填写验证码'
});
registerForget({
phone: that.account,
sms_code: that.captcha,
pwd: that.password,
confirm_pwd: that.confirm_pwd
})
.then(res => {
that.submitSuccess(res.data)
})
.catch(res => {
that.$util.Tips({
title: res
})
});
},
getcaptcha() {
let that = this
getCaptcha().then(data => {
@ -1202,8 +1000,6 @@
}
return url
},
//
async submit() {
let that = this;
if (!that.account) return that.$util.Tips({
@ -1229,61 +1025,54 @@
}).then(({
data
}) => {
this.submitSuccess(data)
console.log(data)
this.checkOpenId(data.user)
const backUrl = that.$Cache.get('login_back_url_weixin') || that.$Cache.get(BACK_URL) ||
"/pages/index/index";
that.$store.commit("LOGIN", {
'token': data.token,
'time': data.exp
});
that.$store.commit("SETUID", data.user.uid);
that.$store.commit('UPDATE_USERINFO', data.user);
if (data.is_new_user && !that.$Cache.get('login_back_url_weixin')) {
return uni.navigateTo({
url: '/pages/helpPeople/helpPeople'
})
}
that.$Cache.clear(BACK_URL);
that.$Cache.clear('login_back_url_weixin');
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(e => {
that.showTipsFn("密码错误", e)
console.log(e)
that.$util.Tips({
title: e
});
});
},
//
submitSuccess(data) {
console.log(data, 'hanshu')
let that = this
this.checkOpenId(data.user)
let backUrl = that.$Cache.get('login_back_url_weixin') || that.$Cache.get(BACK_URL) ||
"/pages/index/index";
that.$store.commit("LOGIN", {
'token': data.token,
'time': data.exp
});
that.$store.commit("SETUID", data.user.uid);
that.$store.commit('UPDATE_USERINFO', data.user);
if (data.is_new_user && !that.$Cache.get('login_back_url_weixin')) {
return uni.navigateTo({
url: '/pages/helpPeople/helpPeople'
})
}
that.$Cache.clear(BACK_URL);
that.$Cache.clear('login_back_url_weixin');
let method
let indexPat = ['/pages/index/index', '/pages/order_addcart/order_addcart',
'/pages/goods_cate/goods_cate',
'/pages/user/index'
]
// #ifdef H5
backUrl = backUrl.replace('/h5', '')
// #endif
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
});
},
getVersion() {
getVersion().then(data => {
this.copyright = data.data;
@ -1355,66 +1144,13 @@
})
// #endif
},
// app
appOneClcik() {
let that = this
uni.preLogin({
provider: 'univerify',
success() {
console.log("当前环境支持一键登录")
uni.login({
provider: 'univerify',
univerifyStyle: oneClickStyle,
success(res) {
console.log(res, 'res')
phonelogin({
access_token: res.authResult.access_token,
openid: res.authResult.openid,
auth_token: that.auth_token,
user_type: 'app'
}).then(res => {
uni.closeAuthView()
that.submitSuccess(res.data)
}).catch(err => {
uni.closeAuthView()
that.$util.Tips({
title: '登录失败,请稍后再试'
});
})
// uniCloud.callFunction({
// name: 'oneClickLoginFn',
// data: {
// 'access_token': res.authResult
// .access_token,
// 'openid': res.authResult.openid
// }
// }).then(res => {
// console.log(res, 'res')
// }).catch(err => {
// console.log(err, 'ererre')
// })
},
fail(res) { //
console.log(res.errCode)
console.log(res.errMsg)
}
})
},
fail(res) {
that.$util.Tips({
title: '当前环境不支持一键登录'
});
}
})
}
}
};
</script>
<style lang="scss" scoped>
page {
background-color: white !important;
background-color: #fff !important;
}
/deep/uni-checkbox .uni-checkbox-input {
@ -1795,62 +1531,4 @@
font-size: 20rpx;
}
}
.footer-btns {
position: absolute;
bottom: 100rpx;
left: 50%;
transform: translate(-50%);
display: flex;
justify-content: space-between;
width: 750rpx !important;
padding: 0 112rpx;
.login-type-btn {
padding: 12rpx 30rpx;
border-radius: 32rpx;
background-color: #F6F6F6
}
.actLoginType {
color: #20B128;
background-color: #E8F7E9;
}
}
.footer-btn {
display: flex;
background-color: white;
width: 750rpx !important;
padding: 0 112rpx 50rpx 112rpx;
margin-top: 30rpx 0 30rpx 0;
.login-type-btn {
padding: 12rpx 30rpx;
border-radius: 32rpx;
background-color: #F6F6F6
}
.actLoginType {
color: #20B128;
background-color: #E8F7E9;
}
}
.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>

@ -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

@ -603,9 +603,6 @@
} else {
toLogin()
}
if (options.sale_type) {
this.sale_type = options.sale_type
}
},
onReady: function() {
@ -891,8 +888,7 @@
this.loadend = false;
this.loading = false;
this.orderList = [];
this.sale_type = type;
this.$set(this, 'orderList', []);
if (this.orderStatus == 4) {
this.refundParam.identity = type;
@ -905,6 +901,7 @@
this.getUserInfo();
this.getpreSellOrderList();
}
this.sale_type = type;
},
// 退

@ -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>

@ -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>

@ -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>

@ -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 {

@ -195,7 +195,8 @@
</view>
</view>
<loadmore :type="isLoading" v-if="isLoading || hostProduct.length > 0" style="padding: 12rpx 0;">
<loadmore :type="isLoading" v-if="isLoading || hostProduct.length > 0"
style="background-color: #fff;padding: 12rpx 0;">
</loadmore>
<view class='pictrue' v-if="!isLoading && hostProduct.length == 0">
<image :src="`${domain}/static/images/noCart.png`"></image>

Binary file not shown.

Before

(image error) Size: 166 KiB

Binary file not shown.

Before

(image error) Size: 1.6 KiB

Binary file not shown.

Before

(image error) Size: 989 B

Binary file not shown.

Before

(image error) Size: 2.2 KiB

Binary file not shown.

Before

(image error) Size: 2.2 KiB

Binary file not shown.

Before

(image error) Size: 984 B

Binary file not shown.

Before

(image error) Size: 13 KiB

Binary file not shown.

Before

(image error) Size: 1.5 KiB

Binary file not shown.

Before

(image error) Size: 1.4 KiB

Binary file not shown.

Before

(image error) Size: 1.4 KiB

Binary file not shown.

Before

(image error) Size: 1.0 KiB

@ -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
};
};

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

@ -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,
}
}
}

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

@ -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();

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

@ -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"
}
}
}
}
}

@ -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

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

@ -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公共模块

@ -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"
}
}
}
}
}

@ -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

@ -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"}}

@ -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
}

@ -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
};

@ -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
}

@ -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
}

@ -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"
}
}

@ -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
};

@ -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
}

@ -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
}

@ -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
}

@ -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,13 @@ 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,
},
// path: '/pages/index/index?unimp=true'
}, (ret) => {
uni.hideLoading();
if (0 != ret.code) {
@ -363,16 +350,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 +358,9 @@ export default {
loadMP,
loadMPurl,
loadMPx,
loadMPdns,
loadMPdns,
installMP,
loadAppletMP,
loadAppletMP,
doInstallMP,
getVersion,
open

@ -4,9 +4,10 @@ import {
test
} from "@/utils/uniMPfunction.js"
export const initEvent = (data) => {
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')