【模版目录】更新移动端源码

This commit is contained in:
吴昊天 2022-11-24 14:37:18 +08:00
parent 5d6017aedd
commit f5a6621d84
23 changed files with 9075 additions and 1152 deletions

1
.gitignore vendored
View File

@ -6,7 +6,6 @@
/crmeb/runtime/log
/crmeb/runtime/session
/crmeb/runtime/temp
/crmeb/public/uploads
/crmeb/app/adminapi/controller/v1/statistic/BalanceStatistic.php
/crmeb/app/adminapi/controller/v1/statistic/OrderStatistic.php
/crmeb/app/adminapi/controller/v1/statistic/ProductStatistic.php

View File

@ -82,7 +82,7 @@
}
},
onShow() {
const queryData = uni.getEnterOptionsSync() // uni-app版本 3.5.1+ 支持
const queryData = uni.getEnterOptionsSync() // uni-app版本 3.5.1+ 支持
if (queryData.query.spread) {
this.$Cache.set('spread', queryData.query.spread);
this.globalData.spid = queryData.query.spread;
@ -120,6 +120,7 @@
// #endif
},
async onLaunch(option) {
uni.hideTabBar()
let that = this;
colorChange('color_change').then(res => {
uni.setStorageSync('is_diy', res.data.is_diy)

View File

@ -1,181 +1,191 @@
<template>
<view class='product-bg'>
<swiper :indicator-dots="indicatorDots" indicator-active-color="var(--view-theme)" :autoplay="autoplay" :circular="circular"
:interval="interval" :duration="duration" @change="change" v-if="isPlay">
<!-- #ifndef APP-PLUS -->
<swiper-item v-if="videoline">
<view class="item">
<view v-show="!controls" style="width:100%;height:100% ">
<video id="myVideo" :src='videoline' objectFit="contain" controls style="width:100%;height:100% "
show-center-play-btn show-mute-btn="true" auto-pause-if-navigate :custom-cache="false" :enable-progress-gesture="false" :poster="imgUrls[0]" @pause="videoPause"></video>
</view>
<view class="poster" v-show="controls">
<image class="image" :src="imgUrls[0]"></image>
</view>
<view class="stop" v-show="controls" @tap="bindPause">
<image class="image" src="../../static/images/stop.png"></image>
</view>
</view>
</swiper-item>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<swiper-item v-if="videoline">
<view class="item">
<view class="poster" v-show="controls">
<image class="image" :src="imgUrls[0]"></image>
</view>
<view class="stop" v-show="controls" @tap="bindPause">
<image class="image" src="../../static/images/stop.png"></image>
</view>
</view>
</swiper-item>
<!-- #endif -->
<block v-for="(item,index) in imgUrls" :key='index'>
<swiper-item v-if="videoline?index>=1:index>=0">
<image :src="item" class="slide-image" />
</swiper-item>
</block>
</swiper>
<!-- #ifdef APP-PLUS -->
<view v-if="!isPlay" style="width: 100%; height: 750rpx;">
<video id="myVideo" :src='videoline' objectFit="cover" controls style="width:100%;height:100% "
show-center-play-btn show-mute-btn="true" autoplay="true" auto-pause-if-navigate :custom-cache="false" :enable-progress-gesture="false" :poster="imgUrls[0]" @pause="videoPause"></video>
</view>
<!-- #endif -->
</view>
</template>
<template>
<view class='product-bg'>
<swiper :indicator-dots="indicatorDots" indicator-active-color="var(--view-theme)" :autoplay="autoplay"
:circular="circular" :interval="interval" :duration="duration" @change="change" v-if="isPlay">
<!-- #ifndef APP-PLUS -->
<swiper-item v-if="videoline">
<view class="item">
<view v-show="!controls" style="width:100%;height:100% ">
<video id="myVideo" :src='videoline' objectFit="contain" controls
style="width:100%;height:100% " show-center-play-btn show-mute-btn="true"
auto-pause-if-navigate :custom-cache="false" :enable-progress-gesture="false"
:poster="imgUrls[0]" @pause="videoPause"></video>
</view>
<view class="poster" v-show="controls">
<image class="image" :src="imgUrls[0]"></image>
</view>
<view class="stop" v-show="controls" @tap="bindPause">
<image class="image" src="../../static/images/stop.png"></image>
</view>
</view>
</swiper-item>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<swiper-item v-if="videoline">
<view class="item">
<view class="poster" v-show="controls">
<image class="image" :src="imgUrls[0]"></image>
</view>
<view class="stop" v-show="controls" @tap="bindPause">
<image class="image" src="../../static/images/stop.png"></image>
</view>
</view>
</swiper-item>
<!-- #endif -->
<block v-for="(item,index) in imgUrls" :key='index'>
<swiper-item v-if="videoline?index>=1:index>=0">
<image :src="item" class="slide-image" />
</swiper-item>
</block>
</swiper>
<!-- #ifdef APP-PLUS -->
<view v-if="!isPlay" style="width: 750rpx; height: 750rpx;">
<video id="myVideo" class="goods-video" :src='videoline' controls show-center-play-btn show-mute-btn="true"
autoplay="true" auto-pause-if-navigate :custom-cache="false" :enable-progress-gesture="false"
:poster="imgUrls[0]" @pause="videoPause"></video>
</view>
<!-- #endif -->
</view>
</template>
<script>
export default {
props: {
imgUrls: {
type: Array,
default: function() {
return [];
}
},
videoline: {
type: String,
value: ""
}
},
data() {
return {
indicatorDots: true,
circular: true,
autoplay: true,
interval: 3000,
duration: 500,
currents: "1",
controls: true,
isPlay: true,
videoContext: ''
};
},
mounted() {
if (this.videoline) {
this.imgUrls.shift()
}
// #ifndef APP-PLUS
this.videoContext = uni.createVideoContext('myVideo', this);
// #endif
},
methods: {
videoPause(e) {
// #ifdef APP-PLUS
this.isPlay = true
this.autoplay = true
// #endif
},
videoIsPause() {
console.log('stop')
this.videoContext.pause();
},
bindPause: function() {
// #ifndef APP-PLUS
this.videoContext.play();
this.$set(this, 'controls', false)
this.autoplay = false
// #endif
// #ifdef APP-PLUS
this.isPlay = false
this.videoContext = uni.createVideoContext('myVideo', this);
this.videoContext.play();
// #endif
},
change: function(e) {
this.$set(this, 'currents', e.detail.current + 1);
}
}
}
</script>
<style scoped lang="scss">
.product-bg {
width: 100%;
height: 750rpx;
position: relative;
}
.product-bg swiper {
width: 100%;
height: 100%;
position: relative;
}
.product-bg .slide-image {
width: 100%;
height: 100%;
}
.product-bg .pages {
position: absolute;
background-color: #fff;
height: 34rpx;
padding: 0 10rpx;
border-radius: 3rpx;
right: 30rpx;
bottom: 30rpx;
line-height: 34rpx;
font-size: 24rpx;
color: #050505;
}
#myVideo {
width: 100%;
height: 100%;
}
<script>
export default {
props: {
imgUrls: {
type: Array,
default: function() {
return [];
}
},
videoline: {
type: String,
value: ""
}
},
data() {
return {
indicatorDots: true,
circular: true,
autoplay: true,
interval: 3000,
duration: 500,
currents: "1",
controls: true,
isPlay:true,
videoContext:''
};
},
mounted() {
if(this.videoline){
this.imgUrls.shift()
}
// #ifndef APP-PLUS
this.videoContext = uni.createVideoContext('myVideo', this);
// #endif
},
methods: {
videoPause(e){
// #ifdef APP-PLUS
this.isPlay= true
this.autoplay = true
// #endif
},
bindPause: function() {
// #ifndef APP-PLUS
this.videoContext.play();
this.$set(this, 'controls', false)
this.autoplay = false
// #endif
// #ifdef APP-PLUS
this.isPlay= false
this.videoContext = uni.createVideoContext('myVideo', this);
this.videoContext.play();
// #endif
},
change: function(e) {
this.$set(this, 'currents', e.detail.current + 1);
}
}
}
</script>
<style scoped lang="scss">
.product-bg {
width: 100%;
height: 750rpx;
position: relative;
}
.product-bg swiper {
.goods-video{
width: 100%;
height: 100%;
position: relative;
}
.product-bg .slide-image {
width: 100%;
height: 100%;
}
.product-bg .pages {
position: absolute;
background-color: #fff;
height: 34rpx;
padding: 0 10rpx;
border-radius: 3rpx;
right: 30rpx;
bottom: 30rpx;
line-height: 34rpx;
font-size: 24rpx;
color: #050505;
}
#myVideo {
width: 100%;
height: 100%
}
.product-bg .item {
position: relative;
width: 100%;
height: 100%;
}
.product-bg .item .poster {
position: absolute;
top: 0;
left: 0;
height: 750rpx;
width: 100%;
z-index: 9;
}
.product-bg .item .poster .image {
width: 100%;
height: 100%;
}
.product-bg .item .stop {
position: absolute;
top: 50%;
left: 50%;
width: 136rpx;
height: 136rpx;
margin-top: -68rpx;
margin-left: -68rpx;
z-index: 9;
}
.product-bg .item .stop .image {
width: 100%;
height: 100%;
}
}
.product-bg .item {
position: relative;
width: 100%;
height: 100%;
}
.product-bg .item .poster {
position: absolute;
top: 0;
left: 0;
height: 750rpx;
width: 100%;
z-index: 9;
}
.product-bg .item .poster .image {
width: 100%;
height: 100%;
}
.product-bg .item .stop {
position: absolute;
top: 50%;
left: 50%;
width: 136rpx;
height: 136rpx;
margin-top: -68rpx;
margin-left: -68rpx;
z-index: 9;
}
.product-bg .item .stop .image {
width: 100%;
height: 100%;
}
</style>

View File

@ -0,0 +1,11 @@
import CryptoJS from './crypto-js.js'
/**
* @word 要加密的内容
* @keyWord String 服务器随机返回的关键字
* */
export function aesEncrypt(word,keyWord="XwKsGlMcdPMEhR1B"){
var key = CryptoJS.enc.Utf8.parse(keyWord);
var srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
return encrypted.toString();
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -3,7 +3,7 @@
"appid" : "__UNI__A3F1ED4",
"description" : "CRMEB标准版",
"versionName" : "4.6.0",
"versionCode" : 461,
"versionCode" : 460,
"transformPx" : false,
/* 5+App特有相关 */
"app-plus" : {

View File

@ -941,7 +941,13 @@
// #endif
}
}
]
],
"plugins": {
"live-player-plugin": {
"version": "1.3.5",
"provider": "wx2b03c6e691cd7370"
}
}
},
{
"root": "pages/goods_details",

View File

@ -161,7 +161,7 @@
import authorize from '@/components/Authorize';
// #endif
import colors from "@/mixins/color";
import Verify from '@/pages/users/components/verify/verify.vue';
import Verify from '@/components/verify/verify.vue';
import sendVerifyCode from "@/mixins/SendVerifyCode";
const app = getApp();
export default {

View File

@ -51,7 +51,7 @@
import {
registerVerify
} from '@/api/user.js'
import Verify from '@/pages/users/components/verify/verify.vue';
import Verify from '@/components/verify/verify.vue';
export default {
name: "Auth",
components: {
@ -288,4 +288,4 @@
}
}
</style>
<!-- #endif -->
<!-- #endif -->

View File

@ -150,11 +150,6 @@
getNav() {
getNavigation().then(res => {
this.newData = res.data
if (this.newData.status && this.newData.status.status) {
uni.hideTabBar()
} else {
uni.showTabBar()
}
})
},
goRouter(item) {

View File

@ -1,9 +1,7 @@
<template>
<view class="product-con" :style="colorStyle">
<skeleton :show="showSkeleton" :isNodes="isNodes" ref="skeleton" loading="chiaroscuro" selector="skeleton"
bgcolor="#FFF"></skeleton>
<view class="product-con skeleton" :style="{ visibility: showSkeleton ? 'hidden' : 'visible' }">
<view class="product-con">
<!-- #ifndef APP-PLUS -->
<view class="navbar" :style="{ height: navH + 'rpx', opacity: opacity }">
@ -47,11 +45,11 @@
<!-- #ifdef APP-PLUS || MP -->
<view class="" :style="'width:100%;' + 'height:'+sysHeight"></view>
<!-- #endif -->
<productConSwiper class="skeleton-rect" :imgUrls="storeInfo.slider_image"
<productConSwiper ref="proSwiper" :imgUrls="storeInfo.slider_image"
:videoline="storeInfo.video_link" @videoPause="videoPause"></productConSwiper>
<view class="wrapper">
<view class="share acea-row row-between row-bottom">
<view class="money font-color skeleton-rect">
<view class="money font-color">
{{$t(`¥`)}}
<text class="num" v-text="storeInfo.price || 0"></text>
<text v-if="storeInfo.spec_type">{{$t(`起`)}}</text>
@ -68,20 +66,20 @@
svip_price_open == 1
" src="../../static/images/svip.gif"></image>
</view>
<view class="iconfont icon-fenxiang skeleton-rect" @click="listenerActionSheet"></view>
<view class="iconfont icon-fenxiang" @click="listenerActionSheet"></view>
</view>
<view class="introduce skeleton-rect" v-text="storeInfo.store_name"></view>
<view class="introduce" v-text="storeInfo.store_name"></view>
<view class="limit_good" v-if="storeInfo.limit_type > 0">
{{storeInfo.limit_type == 1 ? $t(`单次限购`) : $t(`永久限购`)}}{{storeInfo.limit_num}}{{$t(storeInfo.unit_name)}}
</view>
<view class="label acea-row row-between-wrapper" style="padding-bottom: 20rpx">
<view class="skeleton-rect">
<view class="">
{{$t(`划线价`)}} : {{$t(`¥`)}}{{storeInfo.ot_price || 0}}
</view>
<view class="skeleton-rect">{{$t(`库存`)}} : {{storeInfo.stock || 0}}
<view class="">{{$t(`库存`)}} : {{storeInfo.stock || 0}}
{{$t(storeInfo.unit_name) || ''}}
</view>
<view class="skeleton-rect">{{$t(`销量`)}} : {{storeInfo.fsales || 0}}
<view class="">{{$t(`销量`)}} : {{storeInfo.fsales || 0}}
{{$t(storeInfo.unit_name) || ''}}
</view>
</view>
@ -113,7 +111,7 @@
<view class='activity'>赠送 {{storeInfo.give_integral}} 积分</view>
</view>
</view> -->
<view v-if="couponList.length" class="coupon acea-row row-between-wrapper skeleton-rect"
<view v-if="couponList.length" class="coupon acea-row row-between-wrapper"
@click="couponTap" style="margin-top: 0rpx">
<view class="hide line1 acea-row">
{{$t(`优惠券`)}}:
@ -125,7 +123,7 @@
</view>
<view class="iconfont icon-jiantou"></view>
</view>
<view class="coupon acea-row row-between-wrapper skeleton-rect" v-if="activity.length">
<view class="coupon acea-row row-between-wrapper" v-if="activity.length">
<view class="line1 acea-row">
<text>{{$t(`活动`)}}:</text>
<view v-for="(item, index) in activity" :key="index" @click="goActivity(item)">
@ -169,7 +167,7 @@
</view>
</view>
</view>
<view class="attribute acea-row row-between-wrapper skeleton-rect" @click="selecAttr"
<view class="attribute acea-row row-between-wrapper" @click="selecAttr"
v-if="attr.productAttr.length">
<view class="flex">
<view style="display: flex; align-items: center; width: 90%">
@ -190,7 +188,7 @@
</view>
</view>
</view>
<view class="userEvaluation skeleton-rect" id="past1" v-if="replyCount">
<view class="userEvaluation" id="past1" v-if="replyCount">
<view class="title acea-row row-between-wrapper">
<view>{{$t(`用户评价`)}}({{ replyCount }})</view>
<navigator class="praise" hover-class="none"
@ -261,22 +259,22 @@
<view>客服</view>
</button> -->
<navigator hover-class="none" class="item skeleton-rect" open-type="switchTab" url="/pages/index/index">
<navigator hover-class="none" class="item" open-type="switchTab" url="/pages/index/index">
<view class="iconfont icon-shouye6"></view>
<view class="p_center">{{$t(`首页`)}}</view>
</navigator>
<view @click="setCollect" class="item skeleton-rect">
<view @click="setCollect" class="item">
<view class="iconfont icon-shoucang1" v-if="storeInfo.userCollect"></view>
<view class="iconfont icon-shoucang" v-else></view>
<view class="p_center">{{$t(`收藏`)}}</view>
</view>
<view class="animated item skeleton-rect" :class="animated == true ? 'bounceIn' : ''" @click="goCart">
<view class="animated item" :class="animated == true ? 'bounceIn' : ''" @click="goCart">
<view class="iconfont icon-gouwuche1">
<text class="num bg-color" v-if="parseFloat(CartCount) > 0">{{
CartCount || 0
}}</text>
</view>
<view class="p_center skeleton-rect">{{$t(`购物车`)}}</view>
<view class="p_center">{{$t(`购物车`)}}</view>
</view>
<view v-if="a" class="presale">
<view class="acea-row">
@ -301,7 +299,7 @@
</button>
</form>
</view>
<view class="bnt acea-row skeleton-rect" v-else>
<view class="bnt acea-row" v-else>
<form v-if="storeInfo.cart_button" @submit="joinCart" class="joinCart bnts">
<button class="joinCart bnts" form-type="submit">
{{$t(`加入购物车`)}}
@ -831,7 +829,8 @@
that.topArr[index]
);
},
scroll(e) {
scroll(e) {
this.$refs.proSwiper.videoPause()
var that = this,
scrollY = e.detail.scrollTop;
var opacity = scrollY / 200;
@ -1130,9 +1129,6 @@
// #endif
that.DefaultSelect();
that.getCartCount();
setTimeout(() => {
this.showSkeleton = false;
}, 100);
})
.catch((err) => {
//状态异常返回上级页面
@ -1371,6 +1367,7 @@
* 打开属性插件
*/
selecAttr: function() {
this.$refs.proSwiper.videoIsPause()
this.$set(this.attr, "cartAttr", true);
this.$set(this, "isOpen", true);
},
@ -1382,6 +1379,7 @@
if (that.isLogin === false) {
toLogin();
} else {
this.$refs.proSwiper.videoIsPause()
that.getCouponList();
that.$set(that.coupon, "coupon", true);
}
@ -1399,10 +1397,12 @@
if (this.isLogin === false) {
toLogin();
} else {
this.$refs.proSwiper.videoIsPause()
this.goCat();
}
},
goCart() {
uni.switchTab({
url: '/pages/order_addcart/order_addcart'
})
@ -1510,6 +1510,7 @@
if (this.isLogin === false) {
toLogin();
} else {
this.$refs.proSwiper.videoIsPause()
this.goCat(true);
}
},

View File

@ -386,11 +386,6 @@
})
getNavigation().then(res => {
this.newData = res.data
if (this.newData.status && this.newData.status.status) {
uni.hideTabBar()
} else {
uni.showTabBar()
}
})
let routes = getCurrentPages(); // 获取当前打开过的页面路由数组
let curRoute = routes[routes.length - 1].route //获取当前页面路由

View File

@ -2,8 +2,8 @@
<view
v-if="show"
:style="{
width: systemInfo.width * 2 + 'rpx',
height: (systemInfo.height + 100) * 2 + 'rpx',
width: '100vw',
height: '100vh',
backgroundColor: bgcolor,
position: 'absolute',
left: 0,

File diff suppressed because it is too large Load Diff

View File

@ -265,6 +265,7 @@
},
computed: mapGetters(['isLogin']),
onLoad(options) {
uni.hideTabBar()
if (this.is_diy) {
if (uni.getStorageSync('FOOTER_BAR')) {
uni.hideTabBar()
@ -273,11 +274,6 @@
}
getNavigation().then(res => {
this.newData = res.data
if (this.newData.status && this.newData.status.status) {
uni.hideTabBar()
} else {
uni.showTabBar()
}
})
} else {
uni.hideTabBar()

View File

@ -410,7 +410,7 @@
}
},
onLoad(option) {
// uni.hideTabBar()
uni.hideTabBar()
let that = this;
if (this.is_diy) {
if (uni.getStorageSync('FOOTER_BAR')) {
@ -418,11 +418,6 @@
}
getNavigation().then(res => {
this.newData = res.data
if (this.newData.status && this.newData.status.status) {
uni.hideTabBar()
} else {
uni.showTabBar()
}
})
}
// #ifdef MP

View File

@ -14,7 +14,6 @@
<Verify @success="success" :captchaType="'blockPuzzle'" :imgSize="{ width: '330px', height: '155px' }"
ref="verify"></Verify>
</view>
</template>
@ -22,7 +21,7 @@
const app = getApp();
import sendVerifyCode from "@/mixins/SendVerifyCode";
import Routine from '@/libs/routine';
import Verify from './../verify/verify.vue';
import Verify from '@/components/verify/verify.vue';
import Cache from '@/utils/cache';
import {
loginMobile,

View File

@ -129,7 +129,7 @@
// #endif
const BACK_URL = "login_back_url";
import colors from '@/mixins/color.js';
import Verify from '@/pages/users/components/verify/verify.vue';
import Verify from '@/components/verify/verify.vue';
export default {
name: "Login",
components: {
@ -845,4 +845,4 @@
.main-color {
color: var(--view-theme);
}
</style>
</style>

View File

@ -25,7 +25,7 @@
<script>
import sendVerifyCode from "@/mixins/SendVerifyCode";
import Verify from '@/pages/users/components/verify/verify.vue';
import Verify from '@/components/verify/verify.vue';
import {
registerVerify,
bindingUserPhone,

View File

@ -52,7 +52,7 @@
import authorize from '@/components/Authorize';
// #endif
import colors from '@/mixins/color.js';
import Verify from '@/pages/users/components/verify/verify.vue';
import Verify from '@/components/verify/verify.vue';
export default {
mixins: [sendVerifyCode, colors],
components: {
@ -244,4 +244,4 @@
text-align: center;
line-height: 90rpx;
}
</style>
</style>