This commit is contained in:
aaron 2025-03-30 20:56:02 +08:00
parent 15a6ed7252
commit 5c70929173
5 changed files with 467 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 842 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -6,6 +6,8 @@ import './assets/main.css'
import ElementPlus from 'element-plus' import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css' import 'element-plus/dist/index.css'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs' import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
// 引入Element Plus图标
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
// 配置axios默认请求路径 // 配置axios默认请求路径
axios.defaults.baseURL = import.meta.env.VITE_API_BASE_URL || '/api' axios.defaults.baseURL = import.meta.env.VITE_API_BASE_URL || '/api'
@ -15,6 +17,12 @@ app.use(router)
app.use(ElementPlus, { app.use(ElementPlus, {
locale: zhCn, locale: zhCn,
}) })
// 注册所有图标
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component)
}
app.mount('#app') app.mount('#app')
// 检测小程序环境并注入全局方法 // 检测小程序环境并注入全局方法

View File

@ -11,6 +11,7 @@ import SystemHealth from '../components/SystemHealth.vue'
import PdfViewer from '../components/PdfViewer.vue' import PdfViewer from '../components/PdfViewer.vue'
import MarkdownViewer from '../components/MarkdownViewer.vue' import MarkdownViewer from '../components/MarkdownViewer.vue'
import PlatformOrderPage from '../views/PlatformOrderPage.vue' import PlatformOrderPage from '../views/PlatformOrderPage.vue'
import InviteFriendPage from '../views/InviteFriend/InviteFriendPage.vue'
const routes = [ const routes = [
{ {
@ -113,6 +114,15 @@ const routes = [
title: '平台订单列表', title: '平台订单列表',
requiresAuth: true requiresAuth: true
} }
},
{
path: '/invite',
name: 'InviteFriend',
component: InviteFriendPage,
meta: {
title: '邀请好友送积分',
requiresAuth: false
}
} }
] ]

View File

@ -0,0 +1,449 @@
<template>
<div class="invite-container">
<!-- 顶部标题区域 -->
<div class="invite-header">
<div class="header-image">
<img src="../../assets/images/logo_bee@3x.png" alt="蜂快到家" class="logo-image" />
</div>
<div class="header-title">
<img src="../../assets/images/share_title.png" alt="邀请好友 送积分福利" class="title-image" />
</div>
</div>
<!-- 邀请卡片 -->
<div class="invite-card">
<!-- 奖励规则 -->
<div class="reward-rules">
<h2 class="section-title">奖励规则</h2>
<div class="rule-item">
<div class="rule-icon">
<el-icon><Medal /></el-icon>
</div>
<div class="rule-content">
<h3>好友首单奖励</h3>
<p>好友注册并完成首单您将获得 <span class="highlight">5积分</span> 奖励</p>
</div>
</div>
<div class="rule-item">
<div class="rule-icon">
<el-icon><ShoppingCart /></el-icon>
</div>
<div class="rule-content">
<h3>好友后续订单</h3>
<p>好友每完成后续订单您将获得 <span class="highlight">1积分</span> 奖励</p>
</div>
</div>
</div>
<!-- 分割线 -->
<div class="divider">
<span class="divider-text">积分说明</span>
</div>
<!-- 积分使用说明 -->
<div class="points-usage">
<div class="usage-item">
<div class="usage-icon">
<el-icon><Coin /></el-icon>
</div>
<div class="usage-content">
<p>积分可用于抵扣配送费<span class="highlight">10积分=1</span></p>
</div>
</div>
<div class="usage-item">
<div class="usage-icon">
<el-icon><Timer /></el-icon>
</div>
<div class="usage-content">
<p>积分长期有效无需担心过期</p>
</div>
</div>
</div>
<!-- 邀请朋友按钮 -->
<div class="invite-action">
<button class="btn-invite" @click="handleInvite">
<el-icon style="margin-right: 5px;"><Share /></el-icon>
</button>
</div>
<!-- 邀请步骤 -->
<div class="invite-steps">
<h3 class="steps-title">邀请步骤</h3>
<div class="step-list">
<div class="step-item">
<div class="step-number">1</div>
<div class="step-desc">点击邀请按钮</div>
</div>
<div class="step-arrow"></div>
<div class="step-item">
<div class="step-number">2</div>
<div class="step-desc">分享给好友</div>
</div>
<div class="step-arrow"></div>
<div class="step-item">
<div class="step-number">3</div>
<div class="step-desc">好友下单完成</div>
</div>
<div class="step-arrow"></div>
<div class="step-item">
<div class="step-number">4</div>
<div class="step-desc">获得积分奖励</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import { useRoute } from 'vue-router'
export default {
name: 'InviteFriendPage',
setup() {
//
const route = useRoute()
// code
const userCode = ref('')
//
const inviteLink = ref('https://beefast.cn/invite?code=ABC123')
//
const isMiniProgram = ref(false)
onMounted(() => {
//
checkMiniProgramEnvironment()
// URLuser_code
userCode.value = route.query.user_code || 'ABC123'
//
inviteLink.value = `https://beefast.cn/invite?code=${userCode.value}`
})
//
const checkMiniProgramEnvironment = () => {
const userAgent = navigator.userAgent.toLowerCase()
isMiniProgram.value = /miniprogram/.test(userAgent) || window.__wxjs_environment === 'miniprogram'
console.log('Is Mini Program:', isMiniProgram.value)
}
//
const handleInvite = () => {
// API
if (window.wx && window.wx.miniProgram) {
shareToWxMiniProgram()
} else {
//
ElMessage({
message: '请在微信小程序中使用此功能',
type: 'info',
duration: 3000
})
}
}
// 使API
const shareToWxMiniProgram = () => {
if (window.wx && window.wx.miniProgram) {
try {
window.wx.miniProgram.shareAppMessage({
title: '先领券|再下单|免费配送',
imageUrl: 'https://dman-1311994147.cos.ap-chengdu.myqcloud.com/uploads/1/WechatIMG6617_bdd56586-85ab-491c-ad34-74a0b1916d1f.jpg', //
path: `/pages/help/index/index?shared_user_code=${userCode.value}`, //
success: function() {
ElMessage({
message: '分享成功',
type: 'success',
duration: 3000
})
},
fail: function() {
ElMessage({
message: '分享失败',
type: 'error',
duration: 3000
})
}
})
} catch (error) {
console.error('分享出错:', error)
ElMessage({
message: '分享功能出错',
type: 'error',
duration: 3000
})
}
}
}
return {
handleInvite,
isMiniProgram,
userCode
}
}
}
</script>
<style scoped>
/* 主容器样式 */
.invite-container {
padding: 50px 20px;
max-width: 100%;
min-height: 100vh;
background: #EDB500;
color: #333;
font-family: 'PingFang SC', 'Helvetica Neue', Arial, sans-serif;
}
/* 顶部标题区域 */
.invite-header {
text-align: center;
margin-bottom: 35px;
}
.header-image {
margin-bottom: 10px;
display: flex;
justify-content: center;
}
.logo-image {
width: 80px;
height: 80px;
object-fit: cover;
object-position: center;
padding: 10px;
}
.header-title {
display: flex;
justify-content: center;
}
.title-image {
max-width: 80%;
height: auto;
}
/* 邀请卡片 */
.invite-card {
background-color: #FFFFFF;
border-radius: 12px;
padding: 20px;
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
margin-bottom: 20px;
}
/* 奖励规则 */
.section-title {
font-size: 18px;
color: #EDB500;
margin-top: 0;
margin-bottom: 15px;
position: relative;
padding-left: 15px;
}
.section-title::before {
content: '';
position: absolute;
left: 0;
top: 6px;
height: 16px;
width: 4px;
background-color: #EDB500;
border-radius: 2px;
}
.rule-item {
display: flex;
align-items: flex-start;
margin-bottom: 15px;
}
.rule-icon {
width: 40px;
height: 40px;
background-color: #FFF3D9;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
margin-right: 15px;
flex-shrink: 0;
color: #EDB500;
font-size: 20px;
}
.rule-content h3 {
font-size: 16px;
font-weight: 600;
margin: 0 0 5px 0;
}
.rule-content p {
font-size: 14px;
color: #666;
margin: 0;
}
.highlight {
color: #EDB500;
font-weight: bold;
}
/* 分割线 */
.divider {
display: flex;
align-items: center;
margin: 20px 0;
}
.divider::before,
.divider::after {
content: '';
flex: 1;
height: 1px;
background-color: #ECECEC;
}
.divider-text {
padding: 0 15px;
font-size: 14px;
color: #999;
}
/* 积分使用说明 */
.usage-item {
display: flex;
align-items: center;
margin-bottom: 15px;
}
.usage-icon {
width: 32px;
height: 32px;
background-color: #FFF3D9;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
margin-right: 15px;
flex-shrink: 0;
color: #EDB500;
font-size: 16px;
}
.usage-content p {
font-size: 14px;
color: #666;
margin: 0;
}
/* 邀请按钮 */
.invite-action {
margin: 25px 0;
text-align: center;
}
.btn-invite {
border-radius: 30px;
background: linear-gradient(180deg, #FFDE71 0%, #FFC300 100%);
box-shadow: 0px 3px 6px 2px rgba(0, 0, 0, 0.08);
color: #FFF;
border: none;
padding: 12px 30px;
font-family: PingFang SC;
font-size: 18px;
font-weight: 600;
line-height: 18px;
letter-spacing: normal;
color: #000000;
border-radius: 25px;
cursor: pointer;
box-shadow: 0 4px 8px rgba(255, 107, 0, 0.3);
transition: all 0.3s;
outline: none;
display: inline-flex;
align-items: center;
justify-content: center;
width: 80%;
}
.btn-invite i {
margin-right: 8px;
}
.btn-invite:active {
transform: translateY(2px);
box-shadow: 0 2px 4px rgba(255, 107, 0, 0.3);
}
/* 邀请步骤 */
.invite-steps {
margin-top: 20px;
background-color: #FFF9E6;
border-radius: 8px;
padding: 15px;
}
.steps-title {
font-size: 16px;
margin-top: 0;
margin-bottom: 15px;
color: #EDB500;
text-align: center;
}
.step-list {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
}
.step-item {
display: flex;
flex-direction: column;
align-items: center;
width: 60px;
}
.step-number {
width: 28px;
height: 28px;
background-color: #EDB500;
color: white;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
font-weight: bold;
margin-bottom: 5px;
}
.step-desc {
font-size: 12px;
text-align: center;
color: #666;
white-space: nowrap;
}
.step-arrow {
color: #EDB500;
font-size: 16px;
font-weight: bold;
display: flex;
align-items: center;
height: 28px;
margin-bottom: 24px;
}
</style>