Selaa lähdekoodia

coding:投流页面

zhangqin 1 viikko sitten
vanhempi
commit
5d7f48be7a

+ 7 - 7
src/api/adv/advertiser.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 分页查询广告商列表
 export function pageAdvertiser(query) {
   return request({
-    url: '/advertiser/page',
+    url: '/adv/advertiser/page',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function pageAdvertiser(query) {
 // 根据ID查询广告商详情
 export function getAdvertiser(id) {
   return request({
-    url: '/advertiser/' + id,
+    url: '/adv/advertiser/' + id,
     method: 'get'
   })
 }
@@ -20,7 +20,7 @@ export function getAdvertiser(id) {
 // 创建广告商
 export function addAdvertiser(data) {
   return request({
-    url: '/advertiser',
+    url: '/adv/advertiser',
     method: 'post',
     data: data
   })
@@ -29,7 +29,7 @@ export function addAdvertiser(data) {
 // 更新广告商
 export function updateAdvertiser(id, data) {
   return request({
-    url: '/advertiser/' + id,
+    url: '/adv/advertiser/' + id,
     method: 'put',
     data: data
   })
@@ -38,7 +38,7 @@ export function updateAdvertiser(id, data) {
 // 删除广告商
 export function delAdvertiser(id) {
   return request({
-    url: '/advertiser/' + id,
+    url: '/adv/advertiser/' + id,
     method: 'delete'
   })
 }
@@ -46,7 +46,7 @@ export function delAdvertiser(id) {
 // 批量删除广告商
 export function batchDelAdvertiser(ids) {
   return request({
-    url: '/advertiser/batch',
+    url: '/adv/advertiser/batch',
     method: 'delete',
     data: ids
   })
@@ -55,7 +55,7 @@ export function batchDelAdvertiser(ids) {
 // 启用/停用广告商
 export function enableAdvertiser(id) {
   return request({
-    url: '/advertiser/enable/' + id,
+    url: '/adv/advertiser/enable/' + id,
     method: 'post'
   })
 }

+ 8 - 8
src/api/adv/callbackAccount.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 分页查询回传账号列表
 export function pageCallbackAccount(query) {
   return request({
-    url: '/callback-account/page',
+    url: '/adv/callback-account/page',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function pageCallbackAccount(query) {
 // 根据ID查询回传账号详情
 export function getCallbackAccount(id) {
   return request({
-    url: '/callback-account/' + id,
+    url: '/adv/callback-account/' + id,
     method: 'get'
   })
 }
@@ -20,7 +20,7 @@ export function getCallbackAccount(id) {
 // 创建回传账号
 export function addCallbackAccount(data) {
   return request({
-    url: '/callback-account',
+    url: '/adv/callback-account',
     method: 'post',
     data: data
   })
@@ -29,7 +29,7 @@ export function addCallbackAccount(data) {
 // 更新回传账号
 export function updateCallbackAccount(id, data) {
   return request({
-    url: '/callback-account/' + id,
+    url: '/adv/callback-account/' + id,
     method: 'put',
     data: data
   })
@@ -38,7 +38,7 @@ export function updateCallbackAccount(id, data) {
 // 删除回传账号
 export function delCallbackAccount(id) {
   return request({
-    url: '/callback-account/' + id,
+    url: '/adv/callback-account/' + id,
     method: 'delete'
   })
 }
@@ -46,7 +46,7 @@ export function delCallbackAccount(id) {
 // 批量删除回传账号
 export function batchDelCallbackAccount(ids) {
   return request({
-    url: '/callback-account/batch',
+    url: '/adv/callback-account/batch',
     method: 'delete',
     data: ids
   })
@@ -55,7 +55,7 @@ export function batchDelCallbackAccount(ids) {
 // 查询事件类型
 export function queryEventType(advertiserId) {
   return request({
-    url: '/callback-account/queryEventType/' + advertiserId,
+    url: '/adv/callback-account/queryEventType/' + advertiserId,
     method: 'post'
   })
 }
@@ -63,7 +63,7 @@ export function queryEventType(advertiserId) {
 // 保存转换事件
 export function saveEventType(id, data) {
   return request({
-    url: '/callback-account/saveEventType/' + id,
+    url: '/adv/callback-account/saveEventType/' + id,
     method: 'post',
     data: data
   })

+ 3 - 3
src/api/adv/channel.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询分组列表
 export function pageProject(data) {
   return request({
-    url: '/channel/page',
+    url: '/adv/channel/page',
     method: 'get',
     params: data
   })
@@ -13,7 +13,7 @@ export function pageProject(data) {
 // 新增或更新渠道
 export function addOrUpdateChannel(data) {
   return request({
-    url: '/channel/addOrUpdate',
+    url: '/adv/channel/addOrUpdate',
     method: 'post',
     data: data
   })
@@ -22,7 +22,7 @@ export function addOrUpdateChannel(data) {
 // 批量复制渠道
 export function saveBatchChannel(data) {
   return request({
-    url: '/channel/saveBatch',
+    url: '/adv/channel/saveBatch',
     method: 'post',
     data: data
   })

+ 18 - 0
src/api/adv/configuration.js

@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 查询配置详情
+export function getConfigDetail() {
+    return request({
+        url: '/adv/config/detail',
+        method: 'get'
+    })
+}
+
+// 新增或修改配置
+export function addOrUpdateConfig(data) {
+    return request({
+        url: '/adv/config/addOrUpdate',
+        method: 'post',
+        data: data
+    })
+}

+ 1 - 1
src/api/adv/conversionLog.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 分页查询回传事件列表
 export function pageConversionLog(query) {
   return request({
-    url: '/conversion-log/page',
+    url: '/adv/conversion-log/page',
     method: 'get',
     params: query
   })

+ 7 - 7
src/api/adv/domain.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 分页查询域名列表
 export function pageDomain(query) {
   return request({
-    url: '/domains/page',
+    url: '/adv/domains/page',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function pageDomain(query) {
 // 根据ID查询域名详情
 export function getDomain(id) {
   return request({
-    url: '/domains/' + id,
+    url: '/adv/domains/' + id,
     method: 'get'
   })
 }
@@ -20,7 +20,7 @@ export function getDomain(id) {
 // 新增域名
 export function addDomain(data) {
   return request({
-    url: '/domains',
+    url: '/adv/domains',
     method: 'post',
     data: data
   })
@@ -29,7 +29,7 @@ export function addDomain(data) {
 // 更新域名
 export function updateDomain(id, data) {
   return request({
-    url: '/domains/' + id,
+    url: '/adv/domains/' + id,
     method: 'put',
     data: data
   })
@@ -38,7 +38,7 @@ export function updateDomain(id, data) {
 // 删除域名
 export function delDomain(id) {
   return request({
-    url: '/domains/' + id,
+    url: '/adv/domains/' + id,
     method: 'delete'
   })
 }
@@ -46,7 +46,7 @@ export function delDomain(id) {
 // 批量删除域名
 export function batchDelDomain(ids) {
   return request({
-    url: '/domains/batch',
+    url: '/adv/domains/batch',
     method: 'delete',
     data: ids
   })
@@ -55,7 +55,7 @@ export function batchDelDomain(ids) {
 // 启用/禁用域名
 export function updateDomainStatus(id, status) {
   return request({
-    url: '/domains/' + id + '/status',
+    url: '/adv/domains/' + id + '/status',
     method: 'put',
     params: { status }
   })

+ 8 - 8
src/api/adv/landingPageTemplate.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 分页查询模板列表
 export function pageTemplate(query) {
   return request({
-    url: '/landing-page-templates/page',
+    url: '/adv/landing-page-templates/page',
     method: 'get',
     params: query
   })
@@ -14,7 +14,7 @@ export function pageTemplate(query) {
 // 根据ID查询模板详情
 export function getTemplate(id) {
   return request({
-    url: '/landing-page-templates/' + id,
+    url: '/adv/landing-page-templates/' + id,
     method: 'get'
   })
 }
@@ -22,7 +22,7 @@ export function getTemplate(id) {
 // 新增模板
 export function addTemplate(data) {
   return request({
-    url: '/landing-page-templates',
+    url: '/adv/landing-page-templates',
     method: 'post',
     data: data
   })
@@ -31,7 +31,7 @@ export function addTemplate(data) {
 // 更新模板
 export function updateTemplate(id, data) {
   return request({
-    url: '/landing-page-templates/' + id,
+    url: '/adv/landing-page-templates/' + id,
     method: 'put',
     data: data
   })
@@ -40,7 +40,7 @@ export function updateTemplate(id, data) {
 // 删除模板
 export function delTemplate(id) {
   return request({
-    url: '/landing-page-templates/' + id,
+    url: '/adv/landing-page-templates/' + id,
     method: 'delete'
   })
 }
@@ -48,7 +48,7 @@ export function delTemplate(id) {
 // 批量删除模板
 export function batchDelTemplate(ids) {
   return request({
-    url: '/landing-page-templates/batch',
+    url: '/adv/landing-page-templates/batch',
     method: 'delete',
     data: ids
   })
@@ -57,7 +57,7 @@ export function batchDelTemplate(ids) {
 // 启用/禁用模板
 export function updateTemplateStatus(id, status) {
   return request({
-    url: '/landing-page-templates/enable/' +id ,
+    url: '/adv/landing-page-templates/enable/' + id,
     method: 'post',
     params: { status }
   })
@@ -66,7 +66,7 @@ export function updateTemplateStatus(id, status) {
 // 复制模板
 export function copyTemplate(id) {
   return request({
-    url: '/landing-page-templates/' + id + '/copy',
+    url: '/adv/landing-page-templates/' + id + '/copy',
     method: 'post'
   })
 }

+ 2 - 2
src/api/adv/project.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询项目列表
 export function pageProject(data) {
   return request({
-    url: '/project/page',
+    url: '/adv/project/page',
     method: 'get',
     params: data
   })
@@ -12,7 +12,7 @@ export function pageProject(data) {
 // 新增项目
 export function addProject(data) {
   return request({
-    url: '/project/add',
+    url: '/adv/project/add',
     method: 'post',
     data: data
   })

+ 6 - 6
src/api/adv/promotionAccount.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 分页查询推广账号列表
 export function pagePromotionAccount(query) {
   return request({
-    url: '/promotion-account/page',
+    url: '/adv/promotion-account/page',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function pagePromotionAccount(query) {
 // 根据ID查询推广账号详情
 export function getPromotionAccount(id) {
   return request({
-    url: '/promotion-account/' + id,
+    url: '/adv/promotion-account/' + id,
     method: 'get'
   })
 }
@@ -20,7 +20,7 @@ export function getPromotionAccount(id) {
 // 创建推广账号
 export function addPromotionAccount(data) {
   return request({
-    url: '/promotion-account',
+    url: '/adv/promotion-account',
     method: 'post',
     data: data
   })
@@ -29,7 +29,7 @@ export function addPromotionAccount(data) {
 // 更新推广账号
 export function updatePromotionAccount(id, data) {
   return request({
-    url: '/promotion-account/' + id,
+    url: '/adv/promotion-account/' + id,
     method: 'put',
     data: data
   })
@@ -38,7 +38,7 @@ export function updatePromotionAccount(id, data) {
 // 删除推广账号
 export function delPromotionAccount(id) {
   return request({
-    url: '/promotion-account/' + id,
+    url: '/adv/promotion-account/' + id,
     method: 'delete'
   })
 }
@@ -46,7 +46,7 @@ export function delPromotionAccount(id) {
 // 批量删除推广账号
 export function batchDelPromotionAccount(ids) {
   return request({
-    url: '/promotion-account/batch',
+    url: '/adv/promotion-account/batch',
     method: 'delete',
     data: ids
   })

+ 7 - 7
src/api/adv/site.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询站点列表
 export function listSite() {
   return request({
-    url: '/site/list',
+    url: '/adv/site/list',
     method: 'get'
   })
 }
@@ -11,7 +11,7 @@ export function listSite() {
 // 查询站点详情
 export function getSite(id) {
   return request({
-    url: '/site/' + id,
+    url: '/adv/site/' + id,
     method: 'get'
   })
 }
@@ -19,7 +19,7 @@ export function getSite(id) {
 // 创建站点
 export function addSite(data) {
   return request({
-    url: '/site',
+    url: '/adv/site',
     method: 'post',
     data: data
   })
@@ -28,7 +28,7 @@ export function addSite(data) {
 // 更新站点
 export function updateSite(id, data) {
   return request({
-    url: '/site/' + id,
+    url: '/adv/site/' + id,
     method: 'put',
     data: data
   })
@@ -37,7 +37,7 @@ export function updateSite(id, data) {
 // 删除站点
 export function delSite(id) {
   return request({
-    url: '/site/' + id,
+    url: '/adv/site/' + id,
     method: 'delete'
   })
 }
@@ -45,7 +45,7 @@ export function delSite(id) {
 // 查询站点统计数据
 export function getSiteStatistics(id) {
   return request({
-    url: '/site/' + id + '/statistics',
+    url: '/adv/site/' + id + '/statistics',
     method: 'get'
   })
 }
@@ -53,7 +53,7 @@ export function getSiteStatistics(id) {
 // 启用/停用站点
 export function enableSite(id) {
   return request({
-    url: '/site/enable/' + id,
+    url: '/adv/site/enable/' + id,
     method: 'post'
   })
 }

+ 4 - 4
src/api/adv/siteStatistics.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询站点统计列表
 export function pageSiteStatistics(query) {
   return request({
-    url: '/site-statistics/page',
+    url: '/adv/site-statistics/page',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function pageSiteStatistics(query) {
 // 查询站点统计详情
 export function getSiteStatistics(id) {
   return request({
-    url: '/site-statistics/' + id,
+    url: '/adv/site-statistics/' + id,
     method: 'get'
   })
 }
@@ -20,7 +20,7 @@ export function getSiteStatistics(id) {
 // 根据站点ID查询统计
 export function getSiteStatisticsBySiteId(siteId) {
   return request({
-    url: '/site-statistics/site/' + siteId,
+    url: '/adv/site-statistics/site/' + siteId,
     method: 'get'
   })
 }
@@ -28,7 +28,7 @@ export function getSiteStatisticsBySiteId(siteId) {
 // 刷新站点统计数据
 export function refreshSiteStatistics(siteId) {
   return request({
-    url: '/site-statistics/refresh/' + siteId,
+    url: '/adv/site-statistics/refresh/' + siteId,
     method: 'post'
   })
 }

+ 4 - 4
src/api/adv/trackingLink.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 分页查询监测链接列表
 export function pageTrackingLink(query) {
   return request({
-    url: '/tracking-link/page',
+    url: '/adv/tracking-link/page',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function pageTrackingLink(query) {
 // 查询所有监测链接列表(不分页)
 export function listTrackingLink(query) {
   return request({
-    url: '/tracking-link/list',
+    url: '/adv/tracking-link/list',
     method: 'get',
     params: query
   })
@@ -21,7 +21,7 @@ export function listTrackingLink(query) {
 // 根据ID查询监测链接详情
 export function getTrackingLink(id) {
   return request({
-    url: '/tracking-link/' + id,
+    url: '/adv/tracking-link/' + id,
     method: 'get'
   })
 }
@@ -29,7 +29,7 @@ export function getTrackingLink(id) {
 // 根据广告商ID查询监测链接列表
 export function getTrackingLinkByAdvertiser(advertiserId) {
   return request({
-    url: '/tracking-link/advertiser/' + advertiserId,
+    url: '/adv/tracking-link/advertiser/' + advertiserId,
     method: 'get'
   })
 }

+ 269 - 0
src/views/adv/configuration/index.vue

@@ -0,0 +1,269 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!-- 站点重复报名设置 -->
+      <el-col :span="8">
+        <el-card shadow="hover" class="box-card" @click.native="openDialog('duplicate')">
+          <div slot="header" class="clearfix">
+            <span>站点重复报名设置</span>
+            <el-button style="float: right; padding: 3px 0" type="text">设置</el-button>
+          </div>
+          <div class="card-content">
+            <i class="el-icon-document-copy card-icon"></i>
+            <p class="card-desc">配置学员报名规则及重复报名限制天数</p>
+          </div>
+        </el-card>
+      </el-col>
+
+      <!-- 全局熟客设置 -->
+      <el-col :span="8">
+        <el-card shadow="hover" class="box-card" @click.native="openDialog('regular')">
+          <div slot="header" class="clearfix">
+            <span>全局熟客设置</span>
+            <el-button style="float: right; padding: 3px 0" type="text">设置</el-button>
+          </div>
+          <div class="card-content">
+            <i class="el-icon-user-solid card-icon"></i>
+            <p class="card-desc">配置全局熟客判断及小程序授权熟客逻辑</p>
+          </div>
+        </el-card>
+      </el-col>
+
+      <!-- 重复回传设置 -->
+      <el-col :span="8">
+        <el-card shadow="hover" class="box-card" @click.native="openDialog('repeat')">
+          <div slot="header" class="clearfix">
+            <span>重复回传设置</span>
+            <el-button style="float: right; padding: 3px 0" type="text">设置</el-button>
+          </div>
+          <div class="card-content">
+            <i class="el-icon-refresh card-icon"></i>
+            <p class="card-desc">配置线索去重策略及回传过滤规则</p>
+          </div>
+        </el-card>
+      </el-col>
+    </el-row>
+
+    <!-- 弹窗1: 站点重复报名设置 -->
+    <el-dialog title="站点重复报名设置" :visible.sync="dialogs.duplicate" width="600px" append-to-body>
+      <el-form ref="duplicateForm" :model="form.duplicateRegistrationSettings" label-width="120px">
+        <el-form-item label="报名逻辑">
+          <el-radio-group v-model="form.duplicateRegistrationSettings.signUpLogic">
+            <el-radio :label="1">学员可正常报名</el-radio>
+            <el-radio :label="2">学员不可重复报名</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="处理逻辑" v-if="form.duplicateRegistrationSettings.signUpLogic === 2">
+          <div>
+            客户站点报名后的
+            <el-input-number v-model="form.duplicateRegistrationSettings.day" :min="1" :max="9999" size="small" style="width: 100px; margin: 0 5px;" />
+            天内,不可重复报名相同项目站点
+          </div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitConfig">确 定</el-button>
+        <el-button @click="dialogs.duplicate = false">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 弹窗2: 全局熟客设置 -->
+    <el-dialog title="全局熟客设置" :visible.sync="dialogs.regular" width="650px" append-to-body>
+      <el-form ref="regularForm" :model="form.regularCustomerSettings" label-width="200px">
+        <el-form-item label="全局熟客开关">
+          <el-switch
+            v-model="form.regularCustomerSettings.repeatSwitch"
+            :active-value="1"
+            :inactive-value="2"
+            active-text="开启"
+            inactive-text="关闭">
+          </el-switch>
+          <div class="form-tip">开启后,客户“站点投放报名”或“在线客服留言”时,将分配当前名片跟进人的二维码。特殊的,站点投放配置个微群活码或客服码,则在此模式下无法实现全局熟客,将按照分配规则进行分配出码</div>
+        </el-form-item>
+        <el-form-item label="小程序/加粉站点熟客判断">
+          <el-switch
+            v-model="form.regularCustomerSettings.authSwitch"
+            :active-value="1"
+            :inactive-value="2"
+            active-text="开启"
+            inactive-text="关闭">
+          </el-switch>
+          <div class="form-tip">小程序表单站点/加粉类站点可支持在微信授权后,根据微信身份判断熟客</div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitConfig">确 定</el-button>
+        <el-button @click="dialogs.regular = false">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 弹窗3: 重复回传设置 -->
+    <el-dialog title="重复回传设置" :visible.sync="dialogs.repeat" width="600px" append-to-body>
+      <el-form ref="repeatForm" :model="form.repeatPostbackSettings" label-width="140px">
+        <el-form-item label="重复回传过滤">
+          <el-switch
+            v-model="form.repeatPostbackSettings.filter"
+            :active-value="1"
+            :inactive-value="2"
+            active-text="开启"
+            inactive-text="关闭">
+          </el-switch>
+          <div class="form-tip">开启后,若投放站点获取的线索与系统中已有客户重复,系统将不针对该线索进行回传。</div>
+        </el-form-item>
+        <el-form-item label="过滤方式" v-if="form.repeatPostbackSettings.filter === 1">
+          <el-radio-group v-model="form.repeatPostbackSettings.method">
+            <el-radio :label="1">按行为过滤</el-radio>
+            <el-radio :label="2">按手机号过滤</el-radio>
+          </el-radio-group>
+          <div class="form-tip" v-if="form.repeatPostbackSettings.method === 1">若同一个客户在不同站点,重复触发相同行为事件,则不会向广告商回传</div>
+          <div class="form-tip" v-if="form.repeatPostbackSettings.method === 2">若同一个客户在不同站点,重复提交相同手机号,则不会向广告商回传</div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitConfig">确 定</el-button>
+        <el-button @click="dialogs.repeat = false">取 消</el-button>
+      </div>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import { getConfigDetail, addOrUpdateConfig } from "@/api/adv/configuration";
+
+export default {
+  name: "AdvConfiguration",
+  data() {
+    return {
+      // 弹窗控制
+      dialogs: {
+        duplicate: false,
+        regular: false,
+        repeat: false
+      },
+      // 完整表单数据
+      form: {
+        duplicateRegistrationSettings: {
+          signUpLogic: 1,
+          day: undefined
+        },
+        regularCustomerSettings: {
+          repeatSwitch: 2,
+          authSwitch: 2
+        },
+        repeatPostbackSettings: {
+          filter: 2,
+          method: 1
+        }
+      }
+    };
+  },
+  created() {
+    this.getDetail();
+  },
+  methods: {
+    /** 获取配置详情 */
+    getDetail() {
+      getConfigDetail().then(response => {
+        if (response.data) {
+          // 合并数据,防止后端返回null导致结构丢失
+          const data = response.data;
+          if (data.duplicateRegistrationSettings) {
+            this.form.duplicateRegistrationSettings = { ...this.form.duplicateRegistrationSettings, ...data.duplicateRegistrationSettings };
+          }
+          if (data.regularCustomerSettings) {
+            this.form.regularCustomerSettings = { ...this.form.regularCustomerSettings, ...data.regularCustomerSettings };
+          }
+          if (data.repeatPostbackSettings) {
+            this.form.repeatPostbackSettings = { ...this.form.repeatPostbackSettings, ...data.repeatPostbackSettings };
+          }
+        }
+      });
+    },
+    /** 打开弹窗 */
+    openDialog(type) {
+      if (this.dialogs.hasOwnProperty(type)) {
+        this.dialogs[type] = true;
+      }
+    },
+    /** 提交保存 */
+    submitConfig() {
+      const loading = this.$loading({
+        lock: true,
+        text: '保存中...',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      });
+      
+      addOrUpdateConfig(this.form).then(response => {
+        loading.close();
+        // 根据要求:返回1成功,0失败
+        // 通常 axios拦截器已处理code!=200的情况,但这里根据描述 data=1 成功
+        if (response.code === 200) {
+          if (response.data === 1 || response.data === '1' || response.data === true) {
+            this.$message.success("保存成功");
+            this.dialogs.duplicate = false;
+            this.dialogs.regular = false;
+            this.dialogs.repeat = false;
+            this.getDetail(); // 刷新数据
+          } else {
+            this.$message.error("保存失败");
+          }
+        } else {
+            this.$message.error(response.msg || "保存失败");
+        }
+      }).catch(() => {
+        loading.close();
+      });
+    }
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.app-container {
+  padding: 20px;
+  background-color: #f0f2f5;
+  min-height: calc(100vh - 84px);
+}
+
+.box-card {
+  cursor: pointer;
+  height: 220px;
+  transition: all 0.3s;
+  
+  &:hover {
+    transform: translateY(-5px);
+    box-shadow: 0 12px 20px rgba(0, 0, 0, 0.1);
+  }
+
+  .card-content {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    height: 120px;
+    
+    .card-icon {
+      font-size: 48px;
+      color: #409EFF;
+      margin-bottom: 20px;
+    }
+    
+    .card-desc {
+      color: #909399;
+      font-size: 14px;
+      text-align: center;
+      line-height: 1.5;
+      padding: 0 10px;
+    }
+  }
+}
+
+.form-tip {
+  font-size: 12px;
+  color: #909399;
+  line-height: 1.5;
+  margin-top: 5px;
+}
+</style>

+ 10 - 10
src/views/adv/landingPageTemplate/index.vue

@@ -291,17 +291,17 @@ export default {
       });
     },
     /** 复制按钮操作 */
+    /** 复制按钮操作 */
     handleCopy(row) {
-      this.$confirm('是否确认复制"' + row.templateName + '"模板?', "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "info"
-      }).then(() => {
-        return copyTemplate(row.id);
-      }).then(() => {
-        this.getList();
-        this.msgSuccess("复制成功");
-      }).catch(function() {});
+      this.reset();
+      const id = row.id;
+      getTemplate(id).then(response => {
+        this.form = response.data;
+        this.form.id = undefined;
+        this.form.templateName = this.form.templateName + "_副本";
+        this.open = true;
+        this.title = "复制并添加模板";
+      });
     },
     /** 提交按钮 */
     submitForm() {