feat(router): 更新路由结构并优化页面组件

- 移除经营范围按钮,精简导航栏
- 实现文章标题链接功能,提升用户体验
- 添加商品详情页面包屑导航,支持分类跳转
- 引入配送管理相关页面(区域、接单台、配送员、派单)
- 替换控制台布局为站点头部和底部组件
- 重构商品分类页面,集成CMS导航功能
- 新增文章详情页面,支持多种访问方式
- 删除已迁移的创建应用和空应用页面
- 优化样式和组件导入,提升代码质量
This commit is contained in:
2026-01-29 16:21:22 +08:00
parent 26c236041f
commit 682e264a6f
22 changed files with 1309 additions and 881 deletions

311
app/pages/join/index.vue Normal file
View File

@@ -0,0 +1,311 @@
<template>
<div class="mx-auto max-w-screen-xl px-4 py-12">
<a-typography-title :level="1" class="!mb-2">招商加盟</a-typography-title>
<a-typography-paragraph class="!text-gray-600 !mb-8">
诚邀区域合作伙伴与渠道经销商共同拓展市场我们提供稳定供应链合规资质支持与运营赋能
帮助你更快落地更稳增长
</a-typography-paragraph>
<a-row :gutter="[24, 24]">
<a-col :xs="24" :lg="14">
<a-card title="合作优势">
<a-list size="small" :data-source="advantages">
<template #renderItem="{ item }">
<a-list-item class="list-item">{{ item }}</a-list-item>
</template>
</a-list>
</a-card>
<a-card class="mt-6" title="合作模式">
<a-row :gutter="[16, 16]">
<a-col v-for="mode in modes" :key="mode.title" :xs="24" :md="8">
<div class="mode-card">
<div class="mode-title">{{ mode.title }}</div>
<div class="mode-desc">{{ mode.desc }}</div>
</div>
</a-col>
</a-row>
</a-card>
<a-card class="mt-6" title="扶持政策(示例)">
<a-row :gutter="[16, 16]">
<a-col v-for="s in supports" :key="s.title" :xs="24" :md="12">
<a-statistic :title="s.title" :value="s.value" />
<div class="support-desc">{{ s.desc }}</div>
</a-col>
</a-row>
<a-alert
class="mt-4"
show-icon
type="info"
message="实际政策以对接沟通为准,我们会根据城市、渠道资源与团队情况给出更匹配的方案。"
/>
</a-card>
<a-card class="mt-6" title="加盟流程">
<a-steps :current="0" size="small" direction="vertical">
<a-step title="提交意向" description="填写基本信息、合作类型与所在区域" />
<a-step title="电话沟通" description="了解资源与目标,确认合作方向" />
<a-step title="资质审核" description="身份证明/营业执照/场地等(按合作类型)" />
<a-step title="签约与培训" description="合同签署、产品与运营培训" />
<a-step title="开业/启动" description="物料支持、营销支持与持续复盘" />
</a-steps>
</a-card>
<a-card class="mt-6" title="常见问题">
<a-collapse accordion>
<a-collapse-panel key="q1" header="需要门店吗?">
<a-typography-paragraph class="!mb-0">
不强制可按你的资源选择渠道分销团购/企业客户或门店零售等模式我们会给出落地建议
</a-typography-paragraph>
</a-collapse-panel>
<a-collapse-panel key="q2" header="是否有区域保护?">
<a-typography-paragraph class="!mb-0">
可根据区域与合作层级协商设置原则上以可持续经营避免恶性竞争为目标
</a-typography-paragraph>
</a-collapse-panel>
<a-collapse-panel key="q3" header="多久可以启动?">
<a-typography-paragraph class="!mb-0">
资料齐全且沟通确认后一般 3-7 个工作日可完成签约与基础培训具体以项目复杂度为准
</a-typography-paragraph>
</a-collapse-panel>
</a-collapse>
</a-card>
</a-col>
<a-col :xs="24" :lg="10">
<a-card title="加盟申请">
<a-form ref="formRef" layout="vertical" :model="form" :rules="rules" @finish="onSubmit">
<a-row :gutter="16">
<a-col :xs="24" :md="12">
<a-form-item label="姓名" name="name">
<a-input v-model:value="form.name" placeholder="请填写联系人姓名" />
</a-form-item>
</a-col>
<a-col :xs="24" :md="12">
<a-form-item label="手机号" name="phone">
<a-input v-model:value="form.phone" placeholder="请填写手机号" />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="16">
<a-col :xs="24" :md="12">
<a-form-item label="意向城市" name="city">
<a-input v-model:value="form.city" placeholder="例如:南宁/柳州/桂林" />
</a-form-item>
</a-col>
<a-col :xs="24" :md="12">
<a-form-item label="合作类型" name="cooperationType">
<a-select v-model:value="form.cooperationType" placeholder="请选择">
<a-select-option value="area">区域合伙人</a-select-option>
<a-select-option value="dealer">渠道经销</a-select-option>
<a-select-option value="group">团购/企业客户</a-select-option>
<a-select-option value="store">门店加盟</a-select-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="16">
<a-col :xs="24" :md="12">
<a-form-item label="从业经验" name="experience">
<a-select v-model:value="form.experience" placeholder="请选择">
<a-select-option value="0"></a-select-option>
<a-select-option value="1-3">1-3</a-select-option>
<a-select-option value="3-5">3-5</a-select-option>
<a-select-option value="5+">5年以上</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :xs="24" :md="12">
<a-form-item label="预算范围" name="budget">
<a-select v-model:value="form.budget" placeholder="请选择(可选)" allow-clear>
<a-select-option value="lt3">3万以内</a-select-option>
<a-select-option value="3-10">3-10</a-select-option>
<a-select-option value="10-30">10-30</a-select-option>
<a-select-option value="gt30">30万以上</a-select-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
<a-form-item label="资源/诉求说明" name="need">
<a-textarea
v-model:value="form.need"
:rows="5"
placeholder="例如:已有门店/渠道资源、可覆盖区域、预计月销量、期望合作政策等"
/>
</a-form-item>
<a-space>
<a-button type="primary" html-type="submit" :loading="submitting">提交申请</a-button>
<a-button :disabled="submitting" @click="reset">重置</a-button>
</a-space>
</a-form>
</a-card>
<a-card class="mt-6" title="填写建议">
<a-list size="small" :data-source="tips">
<template #renderItem="{ item }">
<a-list-item>{{ item }}</a-list-item>
</template>
</a-list>
<a-alert class="mt-4" show-icon type="success" message="我们将尽快与你联系沟通合作细节。" />
</a-card>
</a-col>
</a-row>
</div>
</template>
<script setup lang="ts">
import { message } from 'ant-design-vue'
import type { FormInstance } from 'ant-design-vue'
import { addCmsOrder } from '@/api/cms/cmsOrder'
import { usePageSeo } from '@/composables/usePageSeo'
import { COMPANY } from '@/config/company'
usePageSeo({
title: '招商加盟',
description: `${COMPANY.projectName} 招商加盟:区域合伙人、渠道经销、团购/企业客户与门店合作。`,
path: '/join'
})
const advantages = [
'合规资质与经营范围清晰,合作沟通更高效',
'稳定供货与品控管理,支持标准化交付',
'市场物料与活动打法沉淀,降低试错成本',
'培训与运营辅导,帮助门店/渠道快速起量',
'数字化工具支持(选品、下单、对账等)',
'持续复盘与长期支持,陪跑成长'
]
const modes = [
{ title: '区域合伙人', desc: '负责区域招商与渠道拓展,获取更高合作权益与支持。' },
{ title: '渠道经销', desc: '适合批发商/渠道商/社区团购,走量稳定、周转快。' },
{ title: '门店加盟', desc: '适合零售门店,提供选品建议、陈列物料与运营培训。' }
]
const supports = [
{ title: '培训赋能', value: '1v1', desc: '产品知识/动销话术/活动策略与执行清单' },
{ title: '选品建议', value: '定制', desc: '按城市与客群定制类目结构与爆品组合' },
{ title: '运营陪跑', value: '持续', desc: '启动期跟进复盘,关键节点协助优化' },
{ title: '物料支持', value: '可配', desc: '海报、价签、活动页等物料统一输出' }
]
const tips = [
'请尽量写清楚:所在城市/可覆盖区域。',
'说明你的资源:门店数量、渠道类型、团购社群、企业客户等。',
'如果方便,可补充预估销量/团队人数/启动时间。'
]
const form = reactive({
name: '',
phone: '',
city: '',
cooperationType: undefined as undefined | 'area' | 'dealer' | 'group' | 'store',
experience: undefined as undefined | '0' | '1-3' | '3-5' | '5+',
budget: undefined as undefined | 'lt3' | '3-10' | '10-30' | 'gt30',
need: ''
})
const formRef = ref<FormInstance>()
const submitting = ref(false)
const rules = {
name: [{ required: true, message: '请填写姓名' }],
phone: [{ required: true, message: '请填写手机号' }],
city: [{ required: true, message: '请填写意向城市' }],
cooperationType: [{ required: true, message: '请选择合作类型' }],
experience: [{ required: true, message: '请选择从业经验' }],
need: [{ required: true, message: '请填写资源/诉求说明' }]
}
function labelCooperationType(value?: typeof form.cooperationType) {
if (value === 'area') return '区域合伙人'
if (value === 'dealer') return '渠道经销'
if (value === 'group') return '团购/企业客户'
if (value === 'store') return '门店加盟'
return '未选择'
}
function labelBudget(value?: typeof form.budget) {
if (value === 'lt3') return '3万以内'
if (value === '3-10') return '3-10万'
if (value === '10-30') return '10-30万'
if (value === 'gt30') return '30万以上'
return '未填写'
}
async function onSubmit() {
if (submitting.value) return
submitting.value = true
try {
const content = [
`姓名:${form.name || '-'}`,
`手机号:${form.phone || '-'}`,
`意向城市:${form.city || '-'}`,
`合作类型:${labelCooperationType(form.cooperationType)}`,
`从业经验:${form.experience || '-'}`,
`预算范围:${labelBudget(form.budget)}`,
'',
'资源/诉求说明:',
form.need || '-'
].join('\n')
const resMessage = await addCmsOrder({
title: `招商加盟 - ${form.city || ''}${form.name ? `-${form.name}` : ''}`.trim(),
type: 2, // 2 留言
channel: 0, // 0 网站
realName: form.name,
phone: form.phone,
content
})
message.success(resMessage || '已提交,我们会尽快与你联系。')
reset()
} catch (err: unknown) {
const errMsg = err instanceof Error ? err.message : '提交失败,请稍后重试。'
message.error(errMsg)
} finally {
submitting.value = false
}
}
function reset() {
formRef.value?.resetFields()
}
</script>
<style scoped>
.list-item {
padding: 6px 0;
color: rgba(0, 0, 0, 0.75);
line-height: 1.6;
}
.mode-card {
border: 1px solid rgba(0, 0, 0, 0.06);
border-radius: 10px;
padding: 14px;
height: 100%;
background: rgba(0, 0, 0, 0.01);
}
.mode-title {
font-weight: 700;
color: rgba(0, 0, 0, 0.88);
}
.mode-desc {
margin-top: 6px;
color: rgba(0, 0, 0, 0.65);
line-height: 1.6;
}
.support-desc {
margin-top: 6px;
color: rgba(0, 0, 0, 0.65);
line-height: 1.6;
}
</style>