商家邀请按钮覆盖文字、顶部文字按钮排列

This commit is contained in:
丁杰 2026-04-10 12:08:20 +08:00
parent fcf1a4ed5e
commit 1ed3b8eec4
8 changed files with 1248 additions and 1175 deletions

View File

@ -138,6 +138,8 @@ export default {
font-size: 30rpx; font-size: 30rpx;
color: var(--inactive-color); color: var(--inactive-color);
transition: color 0.2s; transition: color 0.2s;
white-space: nowrap;
} }
/* 激活色使用CSS变量 --active-color */ /* 激活色使用CSS变量 --active-color */

View File

@ -937,6 +937,12 @@
"style": { "style": {
"navigationStyle": "custom" "navigationStyle": "custom"
} }
},
{
"path": "pages/shop/skill-detail",
"style": {
"navigationBarTitleText": "拍摄技巧"
}
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,434 +1,450 @@
<template> <template>
<view class="container"> <view class="container">
<custom-navbar title="店铺视频" :leftImg="'/static/images/back.png'" :showUser="true" backgroundColor="#fff" <custom-navbar :title="pagestitle" :leftImg="'/static/images/back.png'" :showUser="true" backgroundColor="#fff"
titleColor="#000" borderBottom="none"></custom-navbar> titleColor="#000" borderBottom="none"></custom-navbar>
<view class="container-titles flex-row-center-between"> <view class="container-titles flex-row-center-between">
<view class="titles-left"> <view class="titles-left">
<view class="titles-bar"></view> <view class="titles-bar"></view>
<text class="titles-title">我的资料</text> <text class="titles-title">我的资料</text>
</view> </view>
<view class="titles-right"> <view class="titles-right" @click="todetail">
<text class="titles-text">展示位置及拍摄技巧</text> <text class="titles-text">展示位置及拍摄技巧</text>
<image src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/b153e8d5-37b1-4205-a4a1-9f6603f30c2a.png" mode="widthFix" style="width: 24rpx;margin-top: 2rpx;margin-left: 6rpx;"></image> <image
</view> src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/b153e8d5-37b1-4205-a4a1-9f6603f30c2a.png"
</view> mode="widthFix" style="width: 24rpx;margin-top: 4rpx;margin-left: 6rpx;"></image>
<view class="container-card" v-for="(item,index) in cardList[type]" :key="index"> </view>
<view class="card-header flex-row-center-between"> </view>
<text class="card-title">{{ item.title }}</text> <view class="container-card" v-for="(item,index) in cardList[type]" :key="index">
<view class="card-header-right" @click="goList(item.id)"> <view class="card-header flex-row-center-between">
<text class="card-header-right-text">查看全部</text> <text class="card-title">{{ item.title }}</text>
<image class="card-header-right-img" src="/static/images/icons/right_gray14.png"></image> <view class="card-header-right" @click="goList(item.id)">
</view> <text class="card-header-right-text">查看全部</text>
</view> <image class="card-header-right-img" src="/static/images/icons/right_gray14.png"></image>
<view class="card-content flex-row-center" v-if="type==1"> </view>
<view class="content-default" @click="goAdd(item.id)" </view>
v-if="!(item.id == 1 && imgVideoList[item.id] && imgVideoList[item.id].length)"> <view class="card-content flex-row-center" v-if="type==1">
<image class="content-default-img" src="/static/images/icons/addPhoto.png"></image> <view class="content-default" @click="goAdd(item.id)"
<text class="content-default-text">添加照片</text> v-if="!(item.id == 1 && imgVideoList[item.id] && imgVideoList[item.id].length)">
</view> <image class="content-default-img" src="/static/images/icons/addPhoto.png"></image>
<view class="content-photo" v-for="(item2,index2) in imgVideoList[item.id]" :key="index2" <text class="content-default-text">添加照片</text>
v-if="imgVideoList[item.id]" @click="goAdd(item.id,item2)"> </view>
<image class="content-photo-img" mode="aspectFill" :src="getItem(item2).url"></image> <view class="content-photo" v-for="(item2,index2) in imgVideoList[item.id]" :key="index2"
<view class="content-photo-title"> v-if="imgVideoList[item.id]" @click="goAdd(item.id,item2)">
{{ getItem(item2).name }} <image class="content-photo-img" mode="aspectFill" :src="getItem(item2).url"></image>
</view> <view class="content-photo-title">
<view class="content-photo-mask" v-if="item2.apply_state==1"> {{ getItem(item2).name }}
<image class="photo-mask-img" mode="aspectFill" src="/static/images/icons/time.png"></image> </view>
<text class="photo-mask-text">审核中</text> <view class="content-photo-mask" v-if="item2.apply_state==1">
</view> <image class="photo-mask-img" mode="aspectFill" src="/static/images/icons/time.png"></image>
<view class="content-photo-mask" v-if="item2.apply_state==3"> <text class="photo-mask-text">审核中</text>
<image class="photo-mask-img" mode="aspectFill" src="/static/images/icons/close2.png"></image> </view>
<view class="photo-mask-text">已驳回</view> <view class="content-photo-mask" v-if="item2.apply_state==3">
</view> <image class="photo-mask-img" mode="aspectFill" src="/static/images/icons/close2.png"></image>
</view> <view class="photo-mask-text">已驳回</view>
</view> </view>
<view class="card-content flex-row-center" v-else> </view>
<view class="content-default content-default2" @click="goAdd(item.id)" </view>
v-if="!(item.id == 1 && imgVideoList[item.id] && imgVideoList[item.id].length)"> <view class="card-content flex-row-center" v-else>
<image class="content-default-img" src="/static/images/icons/addPhoto.png"></image> <view class="content-default content-default2" @click="goAdd(item.id)"
<text class="content-default-text">添加视频</text> v-if="!(item.id == 1 && imgVideoList[item.id] && imgVideoList[item.id].length)">
</view> <image class="content-default-img" src="/static/images/icons/addPhoto.png"></image>
<view class="content-photo content-video" v-for="(item2,index2) in imgVideoList[item.id]" :key="index2" <text class="content-default-text">添加视频</text>
v-if="imgVideoList[item.id]" @click="goAdd(item.id,item2)"> </view>
<image class="content-photo-video" mode="aspectFill" :src="getItem(item2).url"></image> <view class="content-photo content-video" v-for="(item2,index2) in imgVideoList[item.id]" :key="index2"
<view class="content-photo-title"> v-if="imgVideoList[item.id]" @click="goAdd(item.id,item2)">
{{ getItem(item2).name }} <image class="content-photo-video" mode="aspectFill" :src="getItem(item2).url"></image>
</view> <view class="content-photo-title">
<view class="content-photo-play"> {{ getItem(item2).name }}
<image class="content-photo-play-img" mode="aspectFill" src="/static/images/icons/play.png"> </view>
</image> <view class="content-photo-play">
</view> <image class="content-photo-play-img" mode="aspectFill" src="/static/images/icons/play.png">
</image>
<!-- <video class="content-photo-video" loop="true" :controls="false" :autoplay="true" :muted="true" </view>
:src="item2.url || item2.auth_url">
</video> --> <!-- <video class="content-photo-video" loop="true" :controls="false" :autoplay="true" :muted="true"
<view class="content-photo-mask" v-if="item2.apply_state==1"> :src="item2.url || item2.auth_url">
<image class="photo-mask-img" mode="aspectFill" src="/static/images/icons/time.png"></image> </video> -->
<view class="photo-mask-text">审核中</view> <view class="content-photo-mask" v-if="item2.apply_state==1">
</view> <image class="photo-mask-img" mode="aspectFill" src="/static/images/icons/time.png"></image>
<view class="content-photo-mask" v-if="item2.apply_state==3"> <view class="photo-mask-text">审核中</view>
<image class="photo-mask-img" mode="aspectFill" src="/static/images/icons/close2.png"></image> </view>
<view class="photo-mask-text">已驳回</view> <view class="content-photo-mask" v-if="item2.apply_state==3">
</view> <image class="photo-mask-img" mode="aspectFill" src="/static/images/icons/close2.png"></image>
</view> <view class="photo-mask-text">已驳回</view>
</view> </view>
</view> </view>
</view>
</view> </view>
</template>
</view>
<script> </template>
import request from "@/utils/request";
export default { <script>
data() { import request from "@/utils/request";
return { export default {
cardList: { data() {
1: [{ return {
title: "店铺主图", cardList: {
id: 1 1: [{
}, title: "店铺主图",
{ id: 1
title: "环境图片", },
id: 2 {
}, title: "环境图片",
{ id: 2
title: "作品展示", },
id: 3 {
}, title: "作品展示",
{ id: 3
title: "其他", },
id: 4 {
} title: "其他",
], id: 4
2: [{ }
title: "店铺主视频", ],
id: 1 2: [{
}, title: "店铺主视频",
{ id: 1
title: "其他", },
id: 4 {
} title: "其他",
], id: 4
}, }
imgVideoList: { ],
},
}, imgVideoList: {
type: 2, //1 2
} },
}, type: 2, //1 2
async onShow() { pagestitle: '店铺图片'
await this.getList() }
}, },
async onLoad(options) { async onShow() {
if (options.type) { await this.getList()
this.type = options.type },
} async onLoad(options) {
}, console.log(options, 'options');
methods: { if (options.type) {
getItem(item) { this.type = options.type
let obj = { if (this.type == 1) {
name: "", this.pagestitle = '店铺图片'
url: "" } else {
} this.pagestitle = "店铺视频"
if (item.apply_state == 1) { }
obj.url = item.auth_url }
obj.name = item.auth_name },
} else { methods: {
obj.url = item.url || item.auth_url todetail() {
obj.name = item.name || item.auth_name console.log('详情');
}
if (item.type == 2) {
obj.url = obj.url + `?x-oss-process=video/snapshot,t_1000,m_fast,f_jpg,w_600,ar_auto`
}
return obj
},
goList(id) {
console.log(id,'ididididididi');
uni.navigateTo({ uni.navigateTo({
url: `/pages/shop/photoAlbum/videoList?id=${id}&type=${this.type}` url:'/pages/shop/skill-detail'
}); })
// let urls = [] },
// this.imgVideoList[id].forEach(item=>{ getItem(item) {
// urls.push(item.auth_url) let obj = {
// }) name: "",
// console.log(111111,urls) url: ""
// uni.navigateTo({ }
// url: `/pages/album/list?urls=${encodeURIComponent(JSON.stringify(urls))}` if (item.apply_state == 1) {
// }); obj.url = item.auth_url
}, obj.name = item.auth_name
goAdd(id, item) { } else {
if (this.type == 1) { obj.url = item.url || item.auth_url
if ( this.imgVideoList[id] && this.imgVideoList[id].length >= 21) { obj.name = item.name || item.auth_name
uni.showToast({ }
title: '最多上传20张图片', if (item.type == 2) {
icon: 'none', obj.url = obj.url + `?x-oss-process=video/snapshot,t_1000,m_fast,f_jpg,w_600,ar_auto`
duration: 2000 }
}); return obj
return },
} goList(id) {
} else if (this.type == 2) { console.log(id, 'ididididididi');
if ( this.imgVideoList[id] && this.imgVideoList[id].length >= 10) { uni.navigateTo({
uni.showToast({ url: `/pages/shop/photoAlbum/videoList?id=${id}&type=${this.type}`
title: '最多上传10张视频', });
icon: 'none', // let urls = []
duration: 2000 // this.imgVideoList[id].forEach(item=>{
}); // urls.push(item.auth_url)
return // })
} // console.log(111111,urls)
} // uni.navigateTo({
// 1. id // url: `/pages/album/list?urls=${encodeURIComponent(JSON.stringify(urls))}`
if (!id) { // });
uni.showToast({ },
title: '参数异常,无法上传', goAdd(id, item) {
icon: 'none', if (this.type == 1) {
duration: 2000 if (this.imgVideoList[id] && this.imgVideoList[id].length >= 21) {
}); uni.showToast({
return; title: '最多上传20张图片',
} icon: 'none',
duration: 2000
// // 2. auth_url });
// if (item && item.auth_url) { return
// uni.showToast({ }
// title: '', } else if (this.type == 2) {
// icon: 'none', if (this.imgVideoList[id] && this.imgVideoList[id].length >= 10) {
// duration: 2000 uni.showToast({
// }); title: '最多上个10张视频',
// return icon: 'none',
// } duration: 2000
});
// 3. id + item return
// uni-app/ JSON.stringify }
let url = `/pages/shop/photoAlbum/addPhoto?id=${id}&type=${this.type}`; }
// itemitemid // 1. id
if (item) { if (!id) {
url += `&item=${encodeURIComponent(JSON.stringify(item))}`; uni.showToast({
} title: '参数异常,无法上传',
icon: 'none',
// 4. duration: 2000
uni.navigateTo({ });
url: url return;
}); }
},
async getList() { // // 2. auth_url
try { // if (item && item.auth_url) {
const res = await request.post("/sj/imgVideo/list", { // uni.showToast({
type: this.type // title: '',
}); // icon: 'none',
// imgVideoList // duration: 2000
this.imgVideoList = res.data?.list?.[this.type] || {}; // });
// res.data.list[this.type]id // return
// this.imgVideoList = res.data?.list?.[this.type] || {}; // }
} catch (err) {
// imgVideoList // 3. id + item
console.error("获取图片/视频列表失败:", err); // uni-app/ JSON.stringify
this.imgVideoList = {}; let url = `/pages/shop/photoAlbum/addPhoto?id=${id}&type=${this.type}`;
} // itemitemid
} if (item) {
} url += `&item=${encodeURIComponent(JSON.stringify(item))}`;
} }
</script>
// 4.
<style lang="less"> uni.navigateTo({
.container { url: url
.container-titles { });
margin: 30rpx 30rpx 20rpx 23rpx; },
async getList() {
.titles-left { try {
display: flex; const res = await request.post("/sj/imgVideo/list", {
align-items: center; type: this.type
});
.titles-bar { // imgVideoList
width: 6rpx; this.imgVideoList = res.data?.list?.[this.type] || {};
height: 30rpx; // res.data.list[this.type]id
background-color: #E8101E; // this.imgVideoList = res.data?.list?.[this.type] || {};
margin-right: 10rpx; } catch (err) {
border-radius: 5rpx; // imgVideoList
} console.error("获取图片/视频列表失败:", err);
this.imgVideoList = {};
.titles-title { }
font-family: PingFangSC, PingFang SC; }
font-weight: 500; }
font-size: 32rpx; }
color: #1D2129; </script>
line-height: 48rpx;
text-align: left; <style lang="less">
font-style: normal; .container {
} .container-titles {
} margin: 30rpx 30rpx 20rpx 23rpx;
.titles-right { .titles-left {
display: flex; display: flex;
.titles-text { align-items: center;
font-family: PingFangSC, PingFang SC;
font-weight: 400; .titles-bar {
font-size: 24rpx; width: 6rpx;
color: #986E4A; height: 30rpx;
line-height: 33rpx; background-color: #E8101E;
text-align: left; margin-right: 10rpx;
font-style: normal; border-radius: 5rpx;
} }
}
} .titles-title {
font-family: PingFangSC, PingFang SC;
.container-card { font-weight: 500;
border-radius: 20rpx; font-size: 32rpx;
margin: 20rpx; color: #1D2129;
padding: 20rpx 20rpx 30rpx 20rpx; line-height: 48rpx;
background: #fff; text-align: left;
font-style: normal;
.card-header { }
margin-bottom: 20rpx; }
.card-title { .titles-right {
font-weight: 500; display: flex;
font-size: 28rpx;
color: #1D2129; .titles-text {
line-height: 48rpx; font-family: PingFangSC, PingFang SC;
text-align: left; font-weight: 400;
font-style: normal; font-size: 24rpx;
} color: #986E4A;
line-height: 33rpx;
.card-header-right { text-align: left;
.card-header-right-text { font-style: normal;
font-weight: 400; }
font-size: 22rpx; }
color: #999999; }
line-height: 30rpx;
text-align: left; .container-card {
font-style: normal; border-radius: 20rpx;
} margin: 20rpx;
padding: 20rpx 20rpx 30rpx 20rpx;
.card-header-right-img { background: #fff;
width: 8rpx;
height: 16rpx; .card-header {
margin-left: 7rpx; margin-bottom: 20rpx;
}
} .card-title {
} font-weight: 500;
font-size: 28rpx;
.card-content { color: #1D2129;
gap: 14rpx; line-height: 48rpx;
flex-wrap: wrap; text-align: left;
font-style: normal;
.content-default { }
width: 214rpx;
height: 214rpx; .card-header-right {
background: #F5F5F5; .card-header-right-text {
border-radius: 20rpx; font-weight: 400;
display: flex; font-size: 22rpx;
flex-direction: column; color: #999999;
align-items: center; line-height: 30rpx;
justify-content: center; text-align: left;
font-style: normal;
}
.content-default-img {
width: 42rpx; .card-header-right-img {
height: 35rpx; width: 8rpx;
margin-bottom: 8rpx; height: 16rpx;
} margin-left: 7rpx;
}
.content-default-text { }
font-weight: 400; }
font-size: 22rpx;
color: #666666; .card-content {
line-height: 30rpx; gap: 14rpx;
text-align: left; flex-wrap: wrap;
font-style: normal;
display: block; .content-default {
} width: 214rpx;
} height: 214rpx;
background: #F5F5F5;
.content-default2 { border-radius: 20rpx;
width: 328rpx; display: flex;
height: 186rpx; flex-direction: column;
background: #F5F5F5; align-items: center;
border-radius: 17rpx; justify-content: center;
}
.content-photo { .content-default-img {
box-sizing: border-box; width: 42rpx;
width: 214rpx; height: 35rpx;
height: 214rpx; margin-bottom: 8rpx;
border-radius: 20rpx; }
position: relative;
overflow: hidden; .content-default-text {
font-weight: 400;
.content-photo-img { font-size: 22rpx;
width: 214rpx; color: #666666;
height: 214rpx; line-height: 30rpx;
border-radius: 20rpx; text-align: left;
} font-style: normal;
display: block;
.content-photo-video { }
width: 328rpx; }
height: 186rpx;
border-radius: 20rpx; .content-default2 {
} width: 328rpx;
height: 186rpx;
.content-photo-title { background: #F5F5F5;
background: rgba(51, 51, 51, 0.6); border-radius: 17rpx;
padding: 6rpx 0 4rpx 0; }
position: absolute;
left: 0; .content-photo {
right: 0; box-sizing: border-box;
bottom: 0; width: 214rpx;
font-weight: 400; height: 214rpx;
font-size: 15rpx; border-radius: 20rpx;
color: #CACACA; position: relative;
line-height: 21rpx; overflow: hidden;
text-align: center;
font-style: normal; .content-photo-img {
} width: 214rpx;
height: 214rpx;
.content-photo-play { border-radius: 20rpx;
width: 25rpx; }
height: 25rpx;
position: absolute; .content-photo-video {
right: 10rpx; width: 328rpx;
top: 6rpx; height: 186rpx;
border-radius: 20rpx;
.content-photo-play-img { }
width: 25rpx;
height: 25rpx; .content-photo-title {
} background: rgba(51, 51, 51, 0.6);
} padding: 6rpx 0 4rpx 0;
position: absolute;
.content-photo-mask { left: 0;
position: absolute; right: 0;
left: 0; bottom: 0;
right: 0; font-weight: 400;
top: 0; font-size: 15rpx;
bottom: 0; color: #CACACA;
background: rgba(0, 0, 0, 0.3); line-height: 21rpx;
display: flex; text-align: center;
align-items: center; font-style: normal;
justify-content: center; }
flex-direction: column;
border-radius: 20rpx; .content-photo-play {
width: 25rpx;
.photo-mask-img { height: 25rpx;
width: 36rpx; position: absolute;
height: 36rpx; right: 10rpx;
margin-bottom: 8rpx; top: 6rpx;
}
.content-photo-play-img {
.photo-mask-text { width: 25rpx;
font-weight: 400; height: 25rpx;
font-size: 24rpx; }
color: #FFFFFF; }
line-height: 33rpx;
text-align: left; .content-photo-mask {
font-style: normal; position: absolute;
} left: 0;
} right: 0;
} top: 0;
bottom: 0;
.content-video { background: rgba(0, 0, 0, 0.3);
width: 328rpx; display: flex;
height: 186rpx; align-items: center;
} justify-content: center;
} flex-direction: column;
border-radius: 20rpx;
}
} .photo-mask-img {
width: 36rpx;
height: 36rpx;
margin-bottom: 8rpx;
}
.photo-mask-text {
font-weight: 400;
font-size: 24rpx;
color: #FFFFFF;
line-height: 33rpx;
text-align: left;
font-style: normal;
}
}
}
.content-video {
width: 328rpx;
height: 186rpx;
}
}
}
}
</style> </style>

View File

@ -183,7 +183,7 @@
} else if (this.type == 2) { } else if (this.type == 2) {
if (this.imgVideoList.length >= 10) { if (this.imgVideoList.length >= 10) {
uni.showToast({ uni.showToast({
title: '最多上传10张视频', title: '最多上10个视频',
icon: 'none', icon: 'none',
duration: 2000 duration: 2000
}); });

View File

@ -0,0 +1,26 @@
<template>
<view>
</view>
</template>
<script>
import request from "@/utils/request";
export default {
data() {
return {
}
},
onLoad() {
},
methods: {
}
}
</script>
<style>
</style>

View File

@ -12,7 +12,7 @@
<searchBox placeholder="请输入员工手机号" class="searchBox" v-model="queryData.phone" bgClor="transparent" @confirm="search" <searchBox placeholder="请输入员工手机号" class="searchBox" v-model="queryData.phone" bgClor="transparent" @confirm="search"
@search="search"> @search="search">
</searchBox> </searchBox>
<scroll-view scroll-y :style="{ height:`calc(100vh - ${statusBarHeight + 200}rpx)`} "> <scroll-view :style="{ height:`calc(100vh - ${statusBarHeight + 200}rpx)`} ">
<view class="page-container" v-if="sryDetail && sryDetail.id"> <view class="page-container" v-if="sryDetail && sryDetail.id">
<!-- 个人信息栏 --> <!-- 个人信息栏 -->
<view class="user-info"> <view class="user-info">
@ -75,6 +75,7 @@
<view class="agreement-footer" @click="sjinvitesyr" v-if="sryDetail && sryDetail.id && sryDetail.bind_state!=1"> <view class="agreement-footer" @click="sjinvitesyr" v-if="sryDetail && sryDetail.id && sryDetail.bind_state!=1">
<view class="agreement-btn">邀请员工</view> <view class="agreement-btn">邀请员工</view>
</view> </view>
<!-- <view class="" style="height: 98rpx;background-color: aquamarine;"></view> -->
</scroll-view> </scroll-view>
</view> </view>
</template> </template>
@ -428,7 +429,6 @@
right: 0; right: 0;
bottom: 0; bottom: 0;
background-color: #ffffff; background-color: #ffffff;
.agreement-btn { .agreement-btn {
width: 710rpx; width: 710rpx;
height: 98rpx; height: 98rpx;

View File

@ -69,7 +69,7 @@
if (options.syrid) { if (options.syrid) {
this.sjservers(Number(options.syrid)); this.sjservers(Number(options.syrid));
} else { } else {
this.serviceList = this.$store.state.sjServiceList; this.serviceList = JSON.parse(JSON.stringify(this.$store.state.sjServiceList))
} }
this.sjfirstclass(); this.sjfirstclass();
}, },
@ -80,8 +80,10 @@
}, },
methods: { methods: {
changeType(item){ changeType(item){
if(this.isBack==0){ if(this.isBack==0){
item.is_choice = !item.is_choice item.is_choice = !item.is_choice
console.log(this.$store.state.sjServiceList,'this.$store.state.sjServiceList');
} }
}, },