优化新版私域引流

This commit is contained in:
gyq
2025-12-15 17:41:50 +08:00
parent 7322bc0d0d
commit a20379890e

View File

@@ -1,366 +1,432 @@
<template>
<view class="boxconstant min-page">
<view class="bg-fff u-flex u-m-b-32 top">
<image
style="width: 60rpx; height: 60rpx"
src="/pageMarket/static/images/cost.png"
></image>
<view class="u-flex-1 u-flex u-p-l-24">
<view class="u-font-28 u-flex-1 u-p-r-4">
<view class="color-333 font-bold">私域引流</view>
<view class="color-666 u-m-t-4 u-font-24"
>可设置用户下单后展示的群二维码</view
>
</view>
<up-switch
v-model="form.isEnable"
size="18"
:active-value="1"
:inactive-value="0"
></up-switch>
</view>
</view>
<view class="boxconstantbox">
<view class="boxconstantbox_one"> 可使用类型 </view>
<view class="u-m-t-16">
<my-dine-types v-model="form.useType"></my-dine-types>
</view>
</view>
<view class="boxconstant min-page">
<view class="bg-fff u-flex u-m-b-32 top">
<image style="width: 60rpx; height: 60rpx" src="/pageMarket/static/images/cost.png"></image>
<view class="u-flex-1 u-flex u-p-l-24">
<view class="u-font-28 u-flex-1 u-p-r-4">
<view class="color-333 font-bold">私域引流</view>
<view class="color-666 u-m-t-4 u-font-24">可设置用户下单后展示的群二维码</view>
</view>
<!-- <up-switch v-model="form.isEnable" size="18" :active-value="1" :inactive-value="0"></up-switch> -->
</view>
</view>
<view class="boxconstantbox" style="padding: 32rpx 0">
<view class="u-flex u-row-between x-padding">
<view class="boxconstantbox_one">群二维码</view>
<button class="upload" @click="uploadImage">上传</button>
</view>
<view class="u-m-t-24 u-flex u-row-center">
<view class="code" @click="uploadImage">
<up-icon name="plus" v-if="!form.qrCode" size="20" color="#999"></up-icon>
<image v-else style="width: 260rpx; height: 260rpx" :src="form.qrCode" mode="scaleToFill" />
</view>
</view>
<view class="u-m-t-32">
<up-line></up-line>
</view>
<view class="u-m-t-32 u-font-28 x-padding">
<view class="boxconstantbox_one u-m-b-24">模块标题</view>
<up-input placeholderClass="u-font-28" v-model="form.title" :maxlength="20" placeholder="请输入模块标题"></up-input>
</view>
<view class="u-m-t-32">
<up-line></up-line>
</view>
<view class="u-m-t-32 u-font-28 x-padding">
<view class="boxconstantbox_one u-m-b-24">模块提示语</view>
<up-input placeholderClass="u-font-28" v-model="defaultNote" :maxlength="20" placeholder="请输入模块提示语" disabled></up-input>
</view>
<view class="u-m-t-32">
<up-line></up-line>
</view>
<view class="u-m-t-32 u-font-28 x-padding">
<view class="boxconstantbox_one u-m-b-24">模块内容</view>
<up-textarea type="textarea" :maxlength="50" placeholderClass="u-font-28" v-model="form.content" placeholder="请输入模块内容"></up-textarea>
</view>
<view class="u-m-t-32">
<up-line></up-line>
</view>
<view class="u-m-t-32 u-font-28 x-padding">
<view class="boxconstantbox_one u-m-b-24">支付完成弹窗</view>
<u-switch :active-value="1" :inactive-value="0" v-model="form.orderEnable"></u-switch>
</view>
<view class="boxconstantbox">
<view class="boxconstantbox_one">可使用类型</view>
<view class="u-m-t-16">
<my-dine-types v-model="form.orderType"></my-dine-types>
</view>
</view>
<view class="u-m-t-32 u-font-28 x-padding">
<view class="boxconstantbox_one u-m-b-24">首页弹窗</view>
<u-switch :active-value="1" :inactive-value="0" v-model="form.homeEnable"></u-switch>
</view>
<view class="boxconstantbox">
<view class="boxconstantbox_one">可使用类型</view>
<view class="u-m-t-16">
<u-radio-group v-model="form.homeType">
<u-radio name="only" label="仅显示1次"></u-radio>
<u-radio name="day" label="每天显示1次"></u-radio>
<u-radio name="every" label="每次达成触发条件都显示"></u-radio>
</u-radio-group>
</view>
</view>
<view class="x-padding u-m-t-32">
<button class="preview" @click="showPreview = true">预览</button>
</view>
</view>
<up-popup :show="showPreview" mode="center" round="16rpx" closeOnClickOverlay @close="showPreview = false" :safeAreaInsetBottom="false">
<!-- <view class="preview-box">
<view class="u-flex" style="align-items: stretch">
<view class="u-flex-1 u-p-r-24 u-flex u-flex-col" style="align-items: start; justify-content: space-between">
<view>
<view class="u-font-28 font-bold color-333">{{ form.title }}</view>
<view class="u-m-t-16 u-font-24 color-666">{{ form.content }}</view>
</view>
<view class="boxconstantbox" style="padding: 32rpx 0">
<view class="u-flex u-row-between x-padding">
<view class="boxconstantbox_one"> 群二维码</view>
<button class="upload" @click="uploadImage">上传</button>
</view>
<view class="u-m-t-24 u-flex u-row-center">
<view class="code" @click="uploadImage">
<up-icon
name="plus"
v-if="!form.qrCode"
size="20"
color="#999"
></up-icon>
<image
v-else
style="width: 260rpx; height: 260rpx"
:src="form.qrCode"
mode="scaleToFill"
/>
</view>
</view>
<view class="u-m-t-32">
<up-line ></up-line>
</view>
<view class="u-m-t-32 u-font-28 x-padding">
<view class="boxconstantbox_one u-m-b-24"> 模块标题 </view>
<up-input
placeholderClass="u-font-28"
v-model="form.title"
:maxlength="20"
placeholder="请输入模块标题"
></up-input>
</view>
<view class="u-m-t-32">
<up-line ></up-line>
</view>
<view class="u-m-t-32 u-font-28 x-padding">
<view class="boxconstantbox_one u-m-b-24"> 模块提示语</view>
<up-input
placeholderClass="u-font-28"
v-model="form.note"
:maxlength="20"
placeholder="请输入模块提示语"
></up-input>
</view>
<view class="u-m-t-32">
<up-line ></up-line>
</view>
<view class="u-m-t-32 u-font-28 x-padding">
<view class="boxconstantbox_one u-m-b-24"> 模块内容</view>
<up-textarea
type="textarea"
:maxlength="50"
placeholderClass="u-font-28"
v-model="form.content"
placeholder="请输入模块内容"
></up-textarea>
</view>
<view class="u-m-t-32">
<up-line ></up-line>
</view>
<view class="x-padding u-m-t-32">
<button class="preview" @click="showPreview = true">预览</button>
</view>
</view>
<up-popup
:show="showPreview"
mode="center"
round="16rpx"
closeOnClickOverlay
@close="showPreview = false"
:safeAreaInsetBottom="false"
>
<view class="preview-box">
<view class="u-flex" style="align-items: stretch">
<view
class="u-flex-1 u-p-r-24 u-flex u-flex-col"
style="align-items: start; justify-content: space-between"
>
<view>
<view class="u-font-28 font-bold color-333">{{
form.title
}}</view>
<view class="u-m-t-16 u-font-24 color-666">{{
form.content
}}</view>
</view>
<view class="color-999 u-font-24 u-m-t-16">{{ form.note }}</view>
</view>
<image
:src="form.qrCode"
style="width: 240rpx; height: 240rpx"
mode="scaleToFill"
></image>
</view>
</view>
</up-popup>
<my-bottom-btn-group
@cancel="cancel"
@save="editFreeDing"
></my-bottom-btn-group>
</view>
<view class="color-999 u-font-24 u-m-t-16">{{ form.note }}</view>
</view>
<image :src="form.qrCode" style="width: 240rpx; height: 240rpx" mode="scaleToFill"></image>
</view>
</view> -->
<view class="new_preview">
<view class="header">{{ shopInfo.shopName }}</view>
<view class="content">
<view class="title">{{ form.title }}</view>
<view class="img_wrap">
<image class="img" :src="form.qrCode"></image>
</view>
<view class="intro">
{{ form.content }}
</view>
<view class="foot">
{{ form.note }}
</view>
</view>
<view class="close" @click="showPreview = false">
<u-icon name="close" color="#fff" size="14"></u-icon>
</view>
</view>
</up-popup>
<my-bottom-btn-group @cancel="cancel" @save="editFreeDing"></my-bottom-btn-group>
</view>
</template>
<script setup>
import { onShow, onLoad } from "@dcloudio/uni-app";
import { reactive, ref, watch } from "vue";
import { uploadFile } from "@/http/api/index.js";
import { onShow, onLoad } from '@dcloudio/uni-app';
import { reactive, ref, watch } from 'vue';
import { uploadFile } from '@/http/api/index.js';
import { getConfig, update } from '@/http/api/market/drainageConfig.js';
const shopInfo = ref('');
import { getConfig, update } from "@/http/api/market/drainageConfig.js";
const showPreview = ref(false);
const defaultNote = ref('如果长按不能识别,可截图或保存二维码图片至相册,通过微信扫码入群');
const form = reactive({
content: "",
isEnable: 0,
note: "长按识别,微信内扫一扫加好友",
qrCode: "",
title: "扫码进取,优惠多多",
useType: [],
});
onLoad(() => {
// uni.$utils.inputReg.bind()()
});
onShow(() => {
getlist();
id: '',
orderType: [], // 订单页显示类型: 堂食 dine-in 外带 take-out 外卖 take-away
homeType: '', // 首页显示类型only 仅显示 1 次day 每天显示一次every 每次进入小程序
qrCode: '',
title: '',
content: '', //
note: defaultNote.value,
orderEnable: 1, // 订单页是否开启
homeEnable: 1 // 首页是否开启
});
/**
* 获取配置信息
*/
const getlist = async () => {
let res = await getConfig();
res.useType = res.useType || [];
res.note=res.note||"长按识别,微信内扫一扫加好友"
res.title=res.title||"扫码进取,优惠多多"
Object.assign(form, res);
const getConfigAjax = async () => {
let res = await getConfig();
res.useType = res.useType || [];
res.note = res.note || '长按识别,微信内扫一扫加好友';
res.title = res.title || '扫码进取,优惠多多';
Object.assign(form, res);
};
/**
* 修改配置信息
*/
const editFreeDing = async () => {
if(form.useType.length == 0){
return uni.showToast({
icon: "none",
title: "请选择可使用类型",
});
}
if (!form.qrCode) {
return uni.showToast({
icon: "none",
title: "请上传群二维码",
});
}
if (!form.title) {
return uni.showToast({
icon: "none",
title: "请输入模块标题",
});
}
let res = await update(form);
uni.showToast({
title: "保存成功",
});
Object.assign(form, res);
setTimeout(() => {
uni.navigateBack();
}, 1500);
if (form.orderEnable == 1 && form.orderType.length == 0) {
return uni.showToast({
icon: 'none',
title: '请选择可使用类型'
});
}
if (!form.qrCode) {
return uni.showToast({
icon: 'none',
title: '请上传群二维码'
});
}
if (!form.title) {
return uni.showToast({
icon: 'none',
title: '请输入模块标题'
});
}
if (form.homeEnable == 1 && form.homeType.length == 0) {
return uni.showToast({
icon: 'none',
title: '请选择首页显示类型'
});
}
form.note = defaultNote.value;
let res = await update(form);
uni.showToast({
title: '保存成功'
});
Object.assign(form, res);
setTimeout(() => {
uni.navigateBack();
}, 1500);
};
function uploadImage() {
uni.chooseImage({
count: 1,
success: (res) => {
console.log(res);
uploadFile(res.tempFiles[0]).then((res) => {
if (res) {
form.qrCode = res;
} else {
uni.showToast({
icon: "none",
title: "上传失败",
});
}
});
},
});
uni.chooseImage({
count: 1,
success: (res) => {
console.log(res);
uploadFile(res.tempFiles[0]).then((res) => {
if (res) {
form.qrCode = res;
} else {
uni.showToast({
icon: 'none',
title: '上传失败'
});
}
});
}
});
}
function cancel() {
uni.navigateBack();
uni.navigateBack();
}
onLoad(() => {
shopInfo.value = uni.getStorageSync('shopInfo');
// uni.$utils.inputReg.bind()()
});
onShow(() => {
getConfigAjax();
});
</script>
<style lang="scss" scoped>
.x-padding {
padding-left: 28rpx;
padding-right: 28rpx;
padding-left: 28rpx;
padding-right: 28rpx;
}
.boxconstant {
padding: 32rpx 28rpx;
padding: 32rpx 28rpx;
background: #f7f7f7;
.boxconstantbox {
padding: 32rpx 24rpx;
border-radius: 16rpx;
margin-top: 32rpx;
width: 100%;
background: #ffffff;
.boxconstantbox {
padding: 32rpx 24rpx;
border-radius: 16rpx;
margin-top: 32rpx;
width: 100%;
background: #ffffff;
.boxconstantbox_one {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: bold;
font-size: 28rpx;
color: #333333;
}
.boxconstantbox_one {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: bold;
font-size: 28rpx;
color: #333333;
}
.boxconstantbox_tow {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 28rpx;
color: #333333;
// display: flex;
// justify-content: flex-start;
// align-items: center;
// flex-wrap: wrap;
// align-content: flex-start;
.text {
display: inline-flex;
text-align: center;
margin: 0 12rpx;
width: 118rpx;
height: 48rpx;
line-height: 48rpx;
background: #ffffff;
border-radius: 8rpx 8rpx 8rpx 8rpx;
border: 2rpx solid #e5e5e5;
}
}
}
.boxconstantbox_tow {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 28rpx;
color: #333333;
// display: flex;
// justify-content: flex-start;
// align-items: center;
// flex-wrap: wrap;
// align-content: flex-start;
.text {
display: inline-flex;
text-align: center;
margin: 0 12rpx;
width: 118rpx;
height: 48rpx;
line-height: 48rpx;
background: #ffffff;
border-radius: 8rpx 8rpx 8rpx 8rpx;
border: 2rpx solid #e5e5e5;
}
}
}
.oneboxconstant {
margin-top: 32rpx;
width: 100%;
background: #ffffff;
border-radius: 12rpx 12rpx 12rpx 12rpx;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
padding: 32rpx 24rpx;
.oneboxconstant {
margin-top: 32rpx;
width: 100%;
background: #ffffff;
border-radius: 12rpx 12rpx 12rpx 12rpx;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
padding: 32rpx 24rpx;
.oneboxconstant_one {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 28rpx;
color: #333333;
}
}
.oneboxconstant_one {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 28rpx;
color: #333333;
}
}
.save {
margin: 100rpx auto 50rpx auto;
width: 530rpx;
height: 80rpx;
background: #318afe;
border-radius: 56rpx 56rpx 56rpx 56rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 32rpx;
color: #ffffff;
line-height: 80rpx;
text-align: center;
}
.save {
margin: 100rpx auto 50rpx auto;
width: 530rpx;
height: 80rpx;
background: #318afe;
border-radius: 56rpx 56rpx 56rpx 56rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 32rpx;
color: #ffffff;
line-height: 80rpx;
text-align: center;
}
}
.top {
padding: 24rpx 20rpx 28rpx 28rpx;
padding: 24rpx 20rpx 28rpx 28rpx;
}
.number-box {
width: 260rpx;
font-size: 28rpx;
padding: 10rpx 26rpx;
border-radius: 6rpx 0 0 6rpx;
border-top: 2rpx solid #d9d9d9;
border-bottom: 2rpx solid #d9d9d9;
border-left: 2rpx solid #d9d9d9;
background: #fff;
width: 260rpx;
font-size: 28rpx;
padding: 10rpx 26rpx;
border-radius: 6rpx 0 0 6rpx;
border-top: 2rpx solid #d9d9d9;
border-bottom: 2rpx solid #d9d9d9;
border-left: 2rpx solid #d9d9d9;
background: #fff;
}
.bei {
display: flex;
padding: 10rpx 38rpx;
align-items: center;
border-radius: 0 6rpx 6rpx 0;
border: 2rpx solid #d9d9d9;
background: #f7f7fa;
font-size: 28rpx;
color: #999999;
display: flex;
padding: 10rpx 38rpx;
align-items: center;
border-radius: 0 6rpx 6rpx 0;
border: 2rpx solid #d9d9d9;
background: #f7f7fa;
font-size: 28rpx;
color: #999999;
}
.upload {
padding: 8rpx 32rpx;
border-radius: 60rpx;
background: $my-main-color;
font-size: 28rpx;
color: #ffffff;
line-height: 40rpx;
margin: 0;
padding: 8rpx 32rpx;
border-radius: 60rpx;
background: $my-main-color;
font-size: 28rpx;
color: #ffffff;
line-height: 40rpx;
margin: 0;
}
.code {
display: flex;
width: 264rpx;
height: 264rpx;
padding: 108rpx;
justify-content: center;
align-items: center;
gap: 20rpx;
border: 3rpx dashed #d9d9d9;
background: #fff;
padding: 2rpx;
display: flex;
width: 264rpx;
height: 264rpx;
padding: 108rpx;
justify-content: center;
align-items: center;
gap: 20rpx;
border: 3rpx dashed #d9d9d9;
background: #fff;
padding: 2rpx;
}
.preview {
padding: 8rpx 32rpx;
border-radius: 12rpx;
background: $my-main-color;
color: #ffffff;
font-size: 28rpx;
font-weight: 400;
line-height: 40rpx;
padding: 8rpx 32rpx;
border-radius: 12rpx;
background: $my-main-color;
color: #ffffff;
font-size: 28rpx;
font-weight: 400;
line-height: 40rpx;
}
.preview-box {
width: 700rpx;
padding: 32rpx 28rpx;
width: 700rpx;
padding: 32rpx 28rpx;
}
</style>
.new_preview {
--bg: #3f3b37;
--color: #f6dfc4;
--borderColor: #f6dfc45b;
width: 90vw;
background-color: var(--bg);
border-radius: 4px;
position: relative;
.close {
--size: 70upx;
width: var(--size);
height: var(--size);
border-radius: 50%;
background-color: var(--bg);
display: flex;
align-items: center;
justify-content: center;
position: absolute;
bottom: calc(var(--size) * -1 - 20upx);
left: 50%;
margin-left: calc(var(--size) / 2 * -1);
}
.header {
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
color: var(--color);
height: 50px;
border-bottom: 1px dashed var(--borderColor);
}
.content {
padding-bottom: 14px;
.title {
font-size: 14px;
color: var(--color);
height: 50px;
display: flex;
align-items: center;
justify-content: center;
}
.img_wrap {
display: flex;
justify-content: center;
.img {
--size: 220px;
width: var(--size);
height: var(--size);
border-radius: 4px;
}
}
.intro {
height: 40px;
font-size: 14px;
color: var(--color);
display: flex;
align-items: center;
justify-content: center;
padding: 0 14px;
}
.foot {
height: 40px;
color: var(--borderColor);
font-size: 14px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 14px;
text-align: center;
}
}
}
</style>