|
@@ -204,7 +204,7 @@
|
|
<a-select-option
|
|
<a-select-option
|
|
v-for="(item, index) in optimizationOption"
|
|
v-for="(item, index) in optimizationOption"
|
|
:key="index"
|
|
:key="index"
|
|
- :value="item.convert_id "
|
|
|
|
|
|
+ :value="item.convert_id"
|
|
>
|
|
>
|
|
{{ item.external_name }}
|
|
{{ item.external_name }}
|
|
</a-select-option>
|
|
</a-select-option>
|
|
@@ -256,9 +256,26 @@
|
|
<a-radio-button value="NONE">不限</a-radio-button>
|
|
<a-radio-button value="NONE">不限</a-radio-button>
|
|
<a-radio-button value="CITY">按省市</a-radio-button>
|
|
<a-radio-button value="CITY">按省市</a-radio-button>
|
|
<a-radio-button value="COUNTY">按区县</a-radio-button>
|
|
<a-radio-button value="COUNTY">按区县</a-radio-button>
|
|
- <a-radio-button value="BUSINESS_DISTRICT">按商圈</a-radio-button>
|
|
|
|
|
|
+ <!-- <a-radio-button value="BUSINESS_DISTRICT">按商圈</a-radio-button> -->
|
|
</a-radio-group>
|
|
</a-radio-group>
|
|
</a-form-model-item>
|
|
</a-form-model-item>
|
|
|
|
+ <div v-if="configForm.adDistrict === 'CITY'" class="adver-position-radio selected-city-arr">
|
|
|
|
+ <link-multi-select
|
|
|
|
+ title="省份"
|
|
|
|
+ :listArr="listArr"
|
|
|
|
+ :maxLayers="2"
|
|
|
|
+ :listUrl="regionCityListUrl"
|
|
|
|
+ @getSelectedArr="getSelectedCityArr"
|
|
|
|
+ @checkedShowList="handleCheckedShowList"
|
|
|
|
+ >
|
|
|
|
+ </link-multi-select>
|
|
|
|
+ <a-radio-group class="city-arr-radio-group" v-model="configForm.adLocationType">
|
|
|
|
+ <a-radio value="HOME">居住在该地区的用户</a-radio>
|
|
|
|
+ <a-radio value="TRAVEL"> 到该地区旅行的用户</a-radio>
|
|
|
|
+ <a-radio value="ALL">该地区内的所有用户</a-radio>
|
|
|
|
+ <a-radio value="CURRENT">正在该地区的用户</a-radio>
|
|
|
|
+ </a-radio-group>
|
|
|
|
+ </div>
|
|
<a-form-model-item label="性别">
|
|
<a-form-model-item label="性别">
|
|
<a-radio-group v-model="configForm.adGender" button-style="solid">
|
|
<a-radio-group v-model="configForm.adGender" button-style="solid">
|
|
<a-radio-button value="NONE">不限</a-radio-button>
|
|
<a-radio-button value="NONE">不限</a-radio-button>
|
|
@@ -267,14 +284,7 @@
|
|
</a-radio-group>
|
|
</a-radio-group>
|
|
</a-form-model-item>
|
|
</a-form-model-item>
|
|
<a-form-model-item label="年龄">
|
|
<a-form-model-item label="年龄">
|
|
- <a-radio-group v-model="configForm.adAge" button-style="solid">
|
|
|
|
- <a-radio-button value="NONE">不限</a-radio-button>
|
|
|
|
- <a-radio-button value="AGE_BETWEEN_18_23">18-23</a-radio-button>
|
|
|
|
- <a-radio-button value="AGE_BETWEEN_24_30">24-30</a-radio-button>
|
|
|
|
- <a-radio-button value="AGE_BETWEEN_31_40">31-40</a-radio-button>
|
|
|
|
- <a-radio-button value="AGE_BETWEEN_41_49">41-49</a-radio-button>
|
|
|
|
- <a-radio-button value="AGE_ABOVE_50">50+</a-radio-button>
|
|
|
|
- </a-radio-group>
|
|
|
|
|
|
+ <radio-check v-model="configForm.adSelectAge" :options="ageArr" @change="getAgeSelect"></radio-check>
|
|
</a-form-model-item>
|
|
</a-form-model-item>
|
|
<a-form-model-item label="自定义人群">
|
|
<a-form-model-item label="自定义人群">
|
|
<a-radio-group v-model="configForm.adRetargetingTagsInclude" button-style="solid">
|
|
<a-radio-group v-model="configForm.adRetargetingTagsInclude" button-style="solid">
|
|
@@ -504,15 +514,22 @@
|
|
<a-radio-button :value="true">开启智能优选</a-radio-button>
|
|
<a-radio-button :value="true">开启智能优选</a-radio-button>
|
|
<a-radio-button :value="false">关闭智能优选</a-radio-button>
|
|
<a-radio-button :value="false">关闭智能优选</a-radio-button>
|
|
</a-radio-group>
|
|
</a-radio-group>
|
|
|
|
+ <span class="especial-label">*</span>
|
|
</a-form-model-item>
|
|
</a-form-model-item>
|
|
<div class="adver-position-radio">
|
|
<div class="adver-position-radio">
|
|
- <a-form-model-item>
|
|
|
|
- <a-input
|
|
|
|
|
|
+ <a-form-model-item prop="creativeCallToAction">
|
|
|
|
+ <a-select
|
|
class="common-input-long"
|
|
class="common-input-long"
|
|
- placeholder="请输入"
|
|
|
|
v-model="configForm.creativeCallToAction"
|
|
v-model="configForm.creativeCallToAction"
|
|
- allow-clear
|
|
|
|
- />
|
|
|
|
|
|
+ >
|
|
|
|
+ <a-select-option
|
|
|
|
+ v-for="(item, index) in configForm.creativeOptions"
|
|
|
|
+ :key="index + 1"
|
|
|
|
+ :value="item"
|
|
|
|
+ >
|
|
|
|
+ {{ item }}
|
|
|
|
+ </a-select-option>
|
|
|
|
+ </a-select>
|
|
</a-form-model-item>
|
|
</a-form-model-item>
|
|
</div>
|
|
</div>
|
|
<a-form-model-item label="来源" :prop="getSource">
|
|
<a-form-model-item label="来源" :prop="getSource">
|
|
@@ -576,6 +593,8 @@
|
|
<script>
|
|
<script>
|
|
import AcountSearch from '@/views/modules/Statistics/components/Treeselect.vue';
|
|
import AcountSearch from '@/views/modules/Statistics/components/Treeselect.vue';
|
|
import SelectCheckAll from '../../BatchCreate/toutiaoTime';
|
|
import SelectCheckAll from '../../BatchCreate/toutiaoTime';
|
|
|
|
+import radioCheck from '@/components/formComponents/checkBoxGroup';
|
|
|
|
+import linkMultiSelect from '@/views/modules/BatchCreate/linkMultiSelect';
|
|
|
|
|
|
import moment from 'moment';
|
|
import moment from 'moment';
|
|
import BMF from 'browser-md5-file';
|
|
import BMF from 'browser-md5-file';
|
|
@@ -603,7 +622,9 @@ export default {
|
|
},
|
|
},
|
|
components: {
|
|
components: {
|
|
AcountSearch,
|
|
AcountSearch,
|
|
- SelectCheckAll
|
|
|
|
|
|
+ SelectCheckAll,
|
|
|
|
+ radioCheck,
|
|
|
|
+ linkMultiSelect
|
|
},
|
|
},
|
|
data() {
|
|
data() {
|
|
let handleConfirmValue = (rule, value, callback) => {
|
|
let handleConfirmValue = (rule, value, callback) => {
|
|
@@ -622,6 +643,8 @@ export default {
|
|
this.handleExportRules(value, 4, 20, callback);
|
|
this.handleExportRules(value, 4, 20, callback);
|
|
};
|
|
};
|
|
return {
|
|
return {
|
|
|
|
+ listArr: [],
|
|
|
|
+ regionCityListUrl: 'ctop/bytedanceAreaInfo/list',
|
|
defaultAdBudget: '',
|
|
defaultAdBudget: '',
|
|
adBudgetShowTitle: false,
|
|
adBudgetShowTitle: false,
|
|
adBudgetNum: 0,
|
|
adBudgetNum: 0,
|
|
@@ -639,6 +662,32 @@ export default {
|
|
value: 'industryId',
|
|
value: 'industryId',
|
|
children: 'children'
|
|
children: 'children'
|
|
},
|
|
},
|
|
|
|
+ ageArr: [
|
|
|
|
+ {
|
|
|
|
+ value: 'NONE',
|
|
|
|
+ label: '不限'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ value: 'AGE_BETWEEN_18_23',
|
|
|
|
+ label: '18-23岁'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ value: 'AGE_BETWEEN_24_30',
|
|
|
|
+ label: '24-30岁'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ value: 'AGE_BETWEEN_31_40',
|
|
|
|
+ label: '31-40岁'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ value: 'AGE_BETWEEN_41_49',
|
|
|
|
+ label: '41-49岁'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ value: 'AGE_ABOVE_50',
|
|
|
|
+ label: '50岁+'
|
|
|
|
+ }
|
|
|
|
+ ],
|
|
fileList: [],
|
|
fileList: [],
|
|
isCoverImgDiv: false,
|
|
isCoverImgDiv: false,
|
|
imageUrl: '',
|
|
imageUrl: '',
|
|
@@ -697,11 +746,17 @@ export default {
|
|
{required: true, message: '请输入', trigger: 'blur'},
|
|
{required: true, message: '请输入', trigger: 'blur'},
|
|
{min: 1, max: 7, message: '请输入1-7个字', trigger: 'blur'}
|
|
{min: 1, max: 7, message: '请输入1-7个字', trigger: 'blur'}
|
|
],
|
|
],
|
|
|
|
+ creativeCallToAction: [{required: true, message: '请选择', trigger: 'change'}],
|
|
adConvertType: [{required: true, message: '请选择', trigger: 'change'}],
|
|
adConvertType: [{required: true, message: '请选择', trigger: 'change'}],
|
|
adConvertId: [{required: true, message: '请选择', trigger: 'change'}],
|
|
adConvertId: [{required: true, message: '请选择', trigger: 'change'}],
|
|
creativeThirdIndustryIds: [{required: true, message: '请选择', trigger: 'change'}]
|
|
creativeThirdIndustryIds: [{required: true, message: '请选择', trigger: 'change'}]
|
|
},
|
|
},
|
|
configForm: {
|
|
configForm: {
|
|
|
|
+ creativeOptions: [],
|
|
|
|
+ advancedCreativeType: 'ATTACHED_CREATIVE_NONE',
|
|
|
|
+ adLocationType: 'HOME',
|
|
|
|
+ adCity: '',
|
|
|
|
+ adSelectCity: [],
|
|
defaultFormList: [],
|
|
defaultFormList: [],
|
|
productSellingPoints: [], // 商品买点
|
|
productSellingPoints: [], // 商品买点
|
|
adBudgetMode: 'BUDGET_MODE_DAY', // 预算类型
|
|
adBudgetMode: 'BUDGET_MODE_DAY', // 预算类型
|
|
@@ -729,7 +784,8 @@ export default {
|
|
checkboxChangeValue: [], // 广告位置-按照媒体指定位置
|
|
checkboxChangeValue: [], // 广告位置-按照媒体指定位置
|
|
adDistrict: 'NONE', // 定向-区域
|
|
adDistrict: 'NONE', // 定向-区域
|
|
adGender: 'NONE', // 定向-性别
|
|
adGender: 'NONE', // 定向-性别
|
|
- adAge: 'NONE', // 定向-年龄
|
|
|
|
|
|
+ adAge: '', // 定向-年龄
|
|
|
|
+ adSelectAge: ['NONE'],
|
|
adRetargetingTagsInclude: 'NONE', // 定向-自定义
|
|
adRetargetingTagsInclude: 'NONE', // 定向-自定义
|
|
adSuperiorPopularityType: 'NONE', // 定向-媒体定向
|
|
adSuperiorPopularityType: 'NONE', // 定向-媒体定向
|
|
adPlatform: 'NONE', // 定向-平台
|
|
adPlatform: 'NONE', // 定向-平台
|
|
@@ -824,6 +880,7 @@ export default {
|
|
this.handleGetOptimizationObjective(paramsData);
|
|
this.handleGetOptimizationObjective(paramsData);
|
|
}
|
|
}
|
|
this.handleGetCreativeClassification();
|
|
this.handleGetCreativeClassification();
|
|
|
|
+ this.handleGetAdvertiserStrategy();
|
|
}
|
|
}
|
|
},
|
|
},
|
|
mounted() {
|
|
mounted() {
|
|
@@ -839,6 +896,50 @@ export default {
|
|
methods: {
|
|
methods: {
|
|
...mapGetters(['nickname', 'avatar', 'userInfo']),
|
|
...mapGetters(['nickname', 'avatar', 'userInfo']),
|
|
moment,
|
|
moment,
|
|
|
|
+ handleGetAdvertiserStrategy() {
|
|
|
|
+ const params = {
|
|
|
|
+ accountId: this.configForm.accountId,
|
|
|
|
+ landingType: this.configForm.campaignLandingType,
|
|
|
|
+ advancedCreativeType: 'ATTACHED_CREATIVE_NONE'
|
|
|
|
+ };
|
|
|
|
+ getAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/getAdActionText', params)
|
|
|
|
+ .then(result => {
|
|
|
|
+ if (result.code === 0) {
|
|
|
|
+ this.configForm.creativeOptions = result.result;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ this.$message.error(result.message);
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ .catch(error => {
|
|
|
|
+ console.log(error, 'eeee');
|
|
|
|
+ });
|
|
|
|
+ },
|
|
|
|
+ // 获取选中的城市
|
|
|
|
+ getSelectedCityArr(val) {
|
|
|
|
+ setTimeout(() => {
|
|
|
|
+ this.configForm.adSelectCity = val;
|
|
|
|
+ }, 200);
|
|
|
|
+ },
|
|
|
|
+ handleCheckedShowList(val) {
|
|
|
|
+ if (val.length) {
|
|
|
|
+ this.configForm.adSelectCity = val.map(item => item.code);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ this.configForm.adSelectCity = [];
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ getAgeSelect(data) {
|
|
|
|
+ if (data.length > 1 && data.findIndex(item => item === 'NONE') === 0) {
|
|
|
|
+ data.splice(data.findIndex(item => item === 'NONE'), 1);
|
|
|
|
+ }
|
|
|
|
+ else if (data.length > 1 && data.findIndex(item => item === 'NONE') === data.length - 1) {
|
|
|
|
+ data.splice(0, data.length - 1);
|
|
|
|
+ }
|
|
|
|
+ else if (data.length === 0) {
|
|
|
|
+ data.push('NONE');
|
|
|
|
+ }
|
|
|
|
+ },
|
|
handleAdBudgetBlur(e) {
|
|
handleAdBudgetBlur(e) {
|
|
const adBudgetInput = e.target.value;
|
|
const adBudgetInput = e.target.value;
|
|
if (Number(adBudgetInput) >= Number(this.defaultAdBudget) && Number(adBudgetInput) < (Number(this.defaultAdBudget) + 100)) {
|
|
if (Number(adBudgetInput) >= Number(this.defaultAdBudget) && Number(adBudgetInput) < (Number(this.defaultAdBudget) + 100)) {
|
|
@@ -852,7 +953,7 @@ export default {
|
|
}
|
|
}
|
|
},
|
|
},
|
|
handleAccountBudget(e) {
|
|
handleAccountBudget(e) {
|
|
- this.configForm.accountBudget = Number(e.target.value).toFixed(2);
|
|
|
|
|
|
+ this.configForm.accountBudget = Number(Number(e.target.value).toFixed(2));
|
|
},
|
|
},
|
|
handleExportRules(value, min, max, callback) {
|
|
handleExportRules(value, min, max, callback) {
|
|
let cnReg = /([\u4e00-\u9fa5]|[\u3000-\u303F]|[\uFF00-\uFF60])/;
|
|
let cnReg = /([\u4e00-\u9fa5]|[\u3000-\u303F]|[\uFF00-\uFF60])/;
|
|
@@ -980,10 +1081,14 @@ export default {
|
|
this.configForm.adDownloadUrl = detailData.adDownloadUrl || '';
|
|
this.configForm.adDownloadUrl = detailData.adDownloadUrl || '';
|
|
this.configForm.adPackage = detailData.adPackage || '';
|
|
this.configForm.adPackage = detailData.adPackage || '';
|
|
this.configForm.adConvertType = detailData.adConvertType || '';
|
|
this.configForm.adConvertType = detailData.adConvertType || '';
|
|
- this.configForm.adConvertId = detailData.adConvertId || '';
|
|
|
|
this.configForm.adDistrict = detailData.adDistrict || 'NONE';
|
|
this.configForm.adDistrict = detailData.adDistrict || 'NONE';
|
|
|
|
+ setTimeout(() => {
|
|
|
|
+ this.listArr = detailData.adCity.split(',');
|
|
|
|
+ this.configForm.adSelectCity = detailData.adCity.split(',');
|
|
|
|
+ }, 200);
|
|
this.configForm.adGender = detailData.adGender || 'NONE';
|
|
this.configForm.adGender = detailData.adGender || 'NONE';
|
|
- this.configForm.adAge = detailData.adAge || 'NONE';
|
|
|
|
|
|
+ this.configForm.adLocationType = detailData.adLocationType;
|
|
|
|
+ this.configForm.adSelectAge = detailData.adAge.split(',');
|
|
this.configForm.adRetargetingTagsInclude = detailData.adRetargetingTagsInclude;
|
|
this.configForm.adRetargetingTagsInclude = detailData.adRetargetingTagsInclude;
|
|
this.configForm.adSuperiorPopularityType = detailData.adSuperiorPopularityType;
|
|
this.configForm.adSuperiorPopularityType = detailData.adSuperiorPopularityType;
|
|
this.configForm.adPlatform = detailData.adPlatform;
|
|
this.configForm.adPlatform = detailData.adPlatform;
|
|
@@ -1080,6 +1185,9 @@ export default {
|
|
const updateResult = result.result.filter(item => item.external_actions.length > 0);
|
|
const updateResult = result.result.filter(item => item.external_actions.length > 0);
|
|
this.configForm.adConvertType = updateResult[0].convert_type;
|
|
this.configForm.adConvertType = updateResult[0].convert_type;
|
|
this.optimizationOption = updateResult[0].external_actions;
|
|
this.optimizationOption = updateResult[0].external_actions;
|
|
|
|
+ setTimeout(() => {
|
|
|
|
+ this.configForm.adConvertId = detailData.adConvertId;
|
|
|
|
+ }, 300);
|
|
}
|
|
}
|
|
else {
|
|
else {
|
|
this.$message.error(result.message);
|
|
this.$message.error(result.message);
|
|
@@ -1217,7 +1325,8 @@ export default {
|
|
reader.readAsDataURL(img);
|
|
reader.readAsDataURL(img);
|
|
},
|
|
},
|
|
beforeUpload(info) {
|
|
beforeUpload(info) {
|
|
- const isZip = info.type.includes('png') || info.type.includes('jpg');
|
|
|
|
|
|
+ console.log(info, '----info----');
|
|
|
|
+ const isZip = info.type.includes('png') || info.type.includes('jpeg');
|
|
const fileOvesize = info.size > (1024 * 1024);
|
|
const fileOvesize = info.size > (1024 * 1024);
|
|
if (!isZip) {
|
|
if (!isZip) {
|
|
this.$message.error('请上传正确类型的图片');
|
|
this.$message.error('请上传正确类型的图片');
|
|
@@ -1321,6 +1430,12 @@ export default {
|
|
},
|
|
},
|
|
handleRelaxSure() {
|
|
handleRelaxSure() {
|
|
let paramsFormData = this.configForm;
|
|
let paramsFormData = this.configForm;
|
|
|
|
+ if (this.configForm.adDistrict === 'CITY') {
|
|
|
|
+ if (!this.configForm.adSelectCity.length) {
|
|
|
|
+ this.$message.error('请选择省市');
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
if (!this.urlResult) {
|
|
if (!this.urlResult) {
|
|
this.$message.error('请上传图片');
|
|
this.$message.error('请上传图片');
|
|
return;
|
|
return;
|
|
@@ -1365,12 +1480,14 @@ export default {
|
|
else if (paramsFormData.launchTimeInterval === 'a') {
|
|
else if (paramsFormData.launchTimeInterval === 'a') {
|
|
paramsFormData.adScheduleTime = paramsFormData.scheduleTimeData;
|
|
paramsFormData.adScheduleTime = paramsFormData.scheduleTimeData;
|
|
}
|
|
}
|
|
- if (paramsFormData.adAndroidVersion = 'a') {
|
|
|
|
|
|
+ if (paramsFormData.adAndroidVersion === 'a') {
|
|
paramsFormData.adAndroidOsv = paramsFormData.androidChangeValue;
|
|
paramsFormData.adAndroidOsv = paramsFormData.androidChangeValue;
|
|
}
|
|
}
|
|
- else if (paramsFormData.adAndroidVersion = 'NONE') {
|
|
|
|
|
|
+ else {
|
|
paramsFormData.adAndroidOsv = 'NONE';
|
|
paramsFormData.adAndroidOsv = 'NONE';
|
|
}
|
|
}
|
|
|
|
+ paramsFormData.adCity = paramsFormData.adSelectCity.join(',');
|
|
|
|
+ paramsFormData.adAge = paramsFormData.adSelectAge.join(',');
|
|
paramsFormData.productSellingPoints = this.configForm.defaultFormList && this.configForm.defaultFormList.map(item => item.value);
|
|
paramsFormData.productSellingPoints = this.configForm.defaultFormList && this.configForm.defaultFormList.map(item => item.value);
|
|
paramsFormData.creativeThirdIndustryId = paramsFormData.creativeThirdIndustryIds[2];
|
|
paramsFormData.creativeThirdIndustryId = paramsFormData.creativeThirdIndustryIds[2];
|
|
paramsFormData.creativeProductImageCode = this.md5Result;
|
|
paramsFormData.creativeProductImageCode = this.md5Result;
|