liuxiaona před 1 rokem
rodič
revize
6295770c66

+ 23 - 26
src/components/businessMoudle/batchGdt/configArea/basicInfo/components/wildcard.vue

@@ -1,35 +1,32 @@
1 1
 <template>
2
-  <div class="flex-baseline marB15">
3
-    <div class="form-block-item-title" v-if="title && title != ''">{{ title }}</div>
4
-    <div>
5
-      <div class="flex-center" style="flex:1;flex-wrap: wrap;align-items: end;">
6
-        <el-input :class="defaultFlag || errorFlag ? 'error' : ''" type="textarea"
7
-          :style="width ? `width:${width}` : 'width: 600px'" :disabled="disabled" v-model="inputValue"
8
-          :placeholder="placeholder" @input="onChange"></el-input>
9
-        <span class="temp-inlayremark">{{ inputValue.length }}/{{ valueMaxLength }}</span>
10
-      </div>
11
-      <div class="flex-center marT15 marB10">
12
-        <span class="wildcard_label">通配符:</span>
13
-        <template v-for="item in wildcardList.slice(0, 3)">
2
+  <div>
3
+    <div class="flex-center" style="flex:1;flex-wrap: wrap;align-items: end;">
4
+      <el-input :class="defaultFlag || errorFlag ? 'error' : ''" type="textarea"
5
+                :style="width ? `width:${width}` : 'width: 600px'" :disabled="disabled" v-model="inputValue"
6
+                :placeholder="placeholder" @input="onChange"></el-input>
7
+      <span class="temp-inlayremark">{{ inputValue.length }}/{{ valueMaxLength }}</span>
8
+    </div>
9
+    <div class="flex-center marT15 marB10">
10
+      <span class="wildcard_label">通配符:</span>
11
+      <template v-for="item in wildcardList.slice(0, 3)">
14 12
           <span :class="['wildcard', 'wildcard_label', getWildcardList.includes(item) ? 'wildcard_active' : '']" @click="!getWildcardList.includes(item)?onClickTPF(item):''">+ {{ item
15
-          }}</span>
16
-        </template>
17
-        <el-popover placement="top-start" trigger="click">
18
-          <template #reference>
13
+            }}</span>
14
+      </template>
15
+      <el-popover placement="top-start" trigger="click">
16
+        <template #reference>
19 17
             <span class="wildcard_label wildcard flex-center" style="margin-left: 60px;"><el-icon
20 18
                 style="margin-right: 4px;">
21 19
                 <Document />
22 20
               </el-icon>插入更多</span>
23
-          </template>
24
-          <div class="popover_con">
25
-            <div :class="['popover_item', getWildcardList.includes(item) ? 'popover_item_active' : '']"
26
-              v-for="item in wildcardList" @click="getWildcardList.includes(item) ? '' : onClickTPF(item)">{{ item }}</div>
27
-          </div>
28
-        </el-popover>
29
-      </div>
30
-      <p class="hint1" v-if="defaultFlag">取消“时间”类和“标号”类通配符可能导致名称重复,无法提交广告</p>
31
-      <p class="hint2" v-if="errorFlag">{{ inputValue == '' ? '请输入广告名称' : inputValue.length > valueMaxLength ? `请确保广告名称长度不超过${valueMaxLength}个字`: '您可能使用了不支持的通配符,请您确认后再保存' }}</p>
21
+        </template>
22
+        <div class="popover_con">
23
+          <div :class="['popover_item', getWildcardList.includes(item) ? 'popover_item_active' : '']"
24
+               v-for="item in wildcardList" @click="getWildcardList.includes(item) ? '' : onClickTPF(item)">{{ item }}</div>
25
+        </div>
26
+      </el-popover>
32 27
     </div>
28
+    <p class="hint1" v-if="defaultFlag">取消“时间”类和“标号”类通配符可能导致名称重复,无法提交广告</p>
29
+    <p class="hint2" v-if="errorFlag">{{ inputValue == '' ? '请输入广告名称' : inputValue.length > valueMaxLength ? `请确保广告名称长度不超过${valueMaxLength}个字`: '您可能使用了不支持的通配符,请您确认后再保存' }}</p>
33 30
   </div>
34 31
 </template>
35 32
 <script setup lang="ts">
@@ -194,4 +191,4 @@ const areBracketsComplete = (str) => {
194 191
   padding-bottom: 6px;
195 192
 }
196 193
 
197
-</style>
194
+</style>

+ 213 - 0
src/components/businessMoudle/batchGdt/configArea/creativeMaterial/creativeTeam.vue

@@ -0,0 +1,213 @@
1
+<template>
2
+  <div class="TeamContent_box">
3
+    <div class="con_header">
4
+      <div class="typeBorlineBox">
5
+        <div class="item" v-for="item in typeList.list" :key="item.key" :class="item.key == typeAc ? 'itemAc' : ''" @click="switchTypeItem(item.key)">
6
+          <div>{{item.name}} ({{item.num||0}}/1) </div>
7
+<!--          <div class="borLine"></div>-->
8
+        </div>
9
+      </div>
10
+      <el-button type="primary" class="lMarauto">添加素材</el-button>
11
+    </div>
12
+
13
+    <div class="con_body">
14
+      <div class="videoBox" v-if="typeAc=='video'">
15
+        <div class="uploadBox">
16
+          <!--        <input type="file" ref="fileRef" class="uploadIpt" name="file"
17
+                         multiple @change.prevent="handleFileChange" accept="png,jpg,jpeg,gif,mp4,mpeg,3pg,avi,mov">-->
18
+          <div class="iconBox">
19
+            <el-icon size="24" color="#999"><i-ep-Plus/></el-icon>
20
+          </div>
21
+
22
+          <div class="replaceBtn flex" v-if="false">
23
+            <el-button type="primary" style="margin: 0 auto">替换素材</el-button>
24
+            <el-button type="primary" style="margin: 0 auto">删除</el-button>
25
+          </div>
26
+        </div>
27
+        <div class="tipsBox">
28
+          尺寸:{{video_tips.width}}px * {{video_tips.height}}px (推荐) ,
29
+          格式: <span v-for="i in video_tips.file_format">{{i.split('_')[2]}} /</span> ,
30
+          小于{{video_tips.file_size}}MB ,
31
+          播放时长 {{video_tips.min_duration}} - {{video_tips.max_duration}} s
32
+        </div>
33
+      </div>
34
+
35
+      <div class="imageBox" v-if="typeAc=='cover'">
36
+        <div class="uploadBox">
37
+          <!--        <input type="file" ref="fileRef" class="uploadIpt" name="file"
38
+                         multiple @change.prevent="handleFileChange" accept="png,jpg,jpeg,gif,mp4,mpeg,3pg,avi,mov">-->
39
+          <div class="iconBox">
40
+            <el-icon size="24" color="#999"><i-ep-Plus/></el-icon>
41
+          </div>
42
+
43
+          <div class="replaceBtn flex" v-if="false">
44
+            <el-button type="primary" style="margin: 0 auto">替换素材</el-button>
45
+            <el-button type="primary" style="margin: 0 auto">删除</el-button>
46
+          </div>
47
+        </div>
48
+        <div class="tipsBox">
49
+          尺寸:{{image_tips.width}}px * {{image_tips.height}}px (推荐) ,
50
+          格式: <span v-for="i in image_tips.file_format">{{i.split('_')[2]}} /</span> ,
51
+          小于{{image_tips.file_size}}KB
52
+        </div>
53
+      </div>
54
+    </div>
55
+  </div>
56
+</template>
57
+<script setup lang="ts">
58
+import {getCurrentInstance, markRaw, nextTick, onMounted, reactive, ref} from "vue";
59
+import {fillZero, getCookie} from '@/common/common'
60
+import {publicSwitchType} from "@/components/businessMoudle/switchType";
61
+import {ElMessage} from "element-plus";
62
+
63
+const { proxy } = getCurrentInstance() as any;
64
+// 全局方法定义
65
+const NumberHandle = proxy.$NumberHandle
66
+
67
+const props = withDefaults(defineProps<{
68
+  ITEM:any,
69
+  video_tips:any,
70
+  image_tips:any,
71
+}>(), {
72
+  ITEM:{},
73
+  video_tips:{},
74
+  image_tips:{},
75
+})
76
+
77
+// 类型切换公共ts
78
+const typeListParams = reactive([
79
+  {name:'视频',key:'video'},
80
+  {name:'封面',key:'cover'},
81
+])
82
+const {
83
+  typeAc,
84
+  typeList,
85
+  switchTypeItem
86
+} = publicSwitchType(typeListParams)
87
+
88
+
89
+const handleFileChange = async (e:Event)=>{
90
+  // if(!CataRef.value!.idVal){
91
+  //   ElMessage.error('请先选择目录!')
92
+  //   fileRef.value!.value = ''
93
+  //   return
94
+  // }else if(!ideaManRef.value!.value){
95
+  //   ElMessage.error('请先选择创意人!')
96
+  //   fileRef.value!.value = ''
97
+  //   return
98
+  // }else if(!designerRef.value!.value){
99
+  //   ElMessage.error('请先选择设计师!')
100
+  //   fileRef.value!.value = ''
101
+  //   return
102
+  // }
103
+  // const target:any = e.target as HTMLInputElement
104
+  // if(target.files){
105
+  //   for (let i = 0; i < target.files.length; i++) {
106
+  //     let obj: any = target.files[i]
107
+  //     tableInfo.tableList.push({
108
+  //       oss_url: '',
109
+  //       name: obj.name.replace(('.'+obj.type.split('/')[1]),""),
110
+  //       mtype: obj.type,
111
+  //       file_size: obj.size,
112
+  //       tagList: tagRef.value!.pageInfo.valNameList,
113
+  //       idea_man_name: pageInfo.createrList[pageInfo.createrList.findIndex(n => n.id == ideaManRef.value!.value)].username,
114
+  //       designer_name: pageInfo.editorList[pageInfo.editorList.findIndex(n => n.id == designerRef.value!.value)].username,
115
+  //       status: 0
116
+  //     })
117
+  //   }
118
+  // }
119
+  // const files:any = target.files// 注意这里取得的是一个类数组
120
+  // if(files){
121
+  //   // 取得文件
122
+  //   Array.from(files).forEach((item:any)=>{
123
+  //     const formData = new FormData()
124
+  //     // 在这里做一些上传文件前的校验,比如文件格式,大小等,
125
+  //     // 不符合要求的话就不在继续发送请求
126
+  //
127
+  //     let admin_idPara:any = getCookie("admin_id")
128
+  //     let ttlPara:any = Number(getCookie("ttl"))
129
+  //     let signPara:any = getCookie("sign")
130
+  //     formData.append('material_file',item)
131
+  //     formData.append('admin_id',admin_idPara)
132
+  //     formData.append('ttl',ttlPara)
133
+  //     formData.append('sign',signPara)
134
+  //     fileUpload_check(formData)
135
+  //   })
136
+  // }
137
+}
138
+
139
+
140
+onMounted(()=>{
141
+  nextTick(()=>{
142
+
143
+  })
144
+})
145
+</script>
146
+<style lang="scss" scoped>
147
+.TeamContent_box{
148
+  .item{
149
+    font-size: 14px;
150
+  }
151
+  .con_header{
152
+    display: flex;
153
+    align-items: center;
154
+    padding: 8px 24px;
155
+    border-top: 1px solid #ebeef5;
156
+    border-bottom: 1px solid #ebeef5;
157
+  }
158
+  .con_body{
159
+    padding: 24px;
160
+    .uploadBox{
161
+      position: relative;
162
+      border: 1px solid #ebeef5;
163
+      width: 176px;
164
+      height: 124px;
165
+      .iconBox{
166
+        position: absolute;
167
+        top: 50%;
168
+        left: 50%;
169
+        margin-top: -12px;
170
+        margin-left: -12px;
171
+      }
172
+      .img{
173
+        width: 176px;
174
+        height: 124px;
175
+        position: absolute;
176
+        top: 0;
177
+        left: 0;
178
+        z-index: 1;
179
+      }
180
+      .replaceBtn{
181
+        width: 176px;
182
+        height: 124px;
183
+        position: absolute;
184
+        top: 0;
185
+        left: 0;
186
+        background-color: rgba(0,0,0,.2);
187
+        opacity: 0;
188
+        z-index: 2;
189
+      }
190
+      .uploadIpt{
191
+        width: 176px;
192
+        height: 124px;
193
+        &:hover{
194
+          cursor: pointer;
195
+        }
196
+      }
197
+      &:hover{
198
+        border: 1px solid #3173FF;
199
+        color: #3173FF;
200
+        cursor: pointer;
201
+        .replaceBtn{
202
+          opacity: 1;
203
+        }
204
+      }
205
+    }
206
+    .tipsBox{
207
+      color: #808695;
208
+      font-size: 12px;
209
+      margin-top: 10px;
210
+    }
211
+  }
212
+}
213
+</style>

+ 265 - 0
src/components/businessMoudle/batchGdt/configArea/creativeMaterial/index.vue

@@ -0,0 +1,265 @@
1
+<template>
2
+  <Dialog
3
+      :dialogVisible="dialogShow"
4
+      @confirm="confirmEvent"
5
+      @close="dialogShow = false"
6
+      :closeOnModal="false"
7
+      width="1000px"
8
+      height="calc(100vh - 190px)"
9
+      top="8px"
10
+      dialog-title="创意素材">
11
+    <template v-slot:content>
12
+      <RadioGroup :id="pageInfo.radioId" :radioList="coverRadioList.list"
13
+      :echoVal="coverRadioList.radioVal"
14
+      :title="coverRadioList.name"
15
+      @returnEvent="val=>{coverRadioList.radioVal = val}"></RadioGroup>
16
+      <RadioGroup :id="pageInfo.radioId" :radioList="videoRadioList.list"
17
+                  :echoVal="videoRadioList.radioVal"
18
+                  :title="videoRadioList.name"
19
+                  :haveNotes="videoRadioList.haveNotes"
20
+                  @returnEvent="val=>{videoRadioList.radioVal = val}"></RadioGroup>
21
+
22
+      <div class="titleBox flex borCon">
23
+        <div class="title">创意内容</div>
24
+        <div class="smallTitle lMar20">创意组数量: {{}}组</div>
25
+        <div class="lMarauto">
26
+          <el-button type="primary">批量添加视频</el-button>
27
+          <el-button type="primary">批量添加封面</el-button>
28
+          <el-button type="primary">一键指定封面</el-button>
29
+          <el-button type="primary">一键测新</el-button>
30
+        </div>
31
+      </div>
32
+
33
+      <div class="content">
34
+        <template v-for="(item,idx) in pageInfo.creativeTeamList">
35
+          <div class="flex tMar10" style="align-items: flex-start">
36
+            <div class="TeamBox">
37
+              <div class="TeamTitle flex">
38
+                <div>创意组{{fillZero(idx+1)}}</div>
39
+                <div class="lMarauto">
40
+                  <el-icon :size="14" color="#999" class="pointer"><i-ep-CaretBottom /></el-icon>
41
+                  <el-icon :size="14" color="red" class="lMar10 pointer" @click="deleItemEvent(item)"><i-ep-CircleClose /></el-icon>
42
+                </div>
43
+              </div>
44
+              <div class="TeamContent">
45
+                <CreativeTeam :ITEM="item" :video_tips="pageInfo.video_restriction" :image_tips="pageInfo.image_restriction"></CreativeTeam>
46
+              </div>
47
+            </div>
48
+
49
+            <Tooltip notes="复制创意组" colorCss="c-theme" :slotFalg="true">
50
+              <template v-slot:content>
51
+                <div class="iconBox" @click="copyItemEvent(item)">
52
+                  <el-icon :size="14" color="#3173FF"><i-ep-DocumentCopy /></el-icon>
53
+                </div>
54
+              </template>
55
+            </Tooltip>
56
+          </div>
57
+        </template>
58
+        <div class="addItem" @click="addItemEvent">添加创意组</div>
59
+      </div>
60
+
61
+
62
+    </template>
63
+  </Dialog>
64
+</template>
65
+<script setup lang="ts">
66
+import RadioGroup from '@/components/businessMoudle/batchGdt/configArea/directPacket/common/radioGroup.vue'
67
+import CreativeTeam from '@/components/businessMoudle/batchGdt/configArea/creativeMaterial/creativeTeam.vue'
68
+import Tooltip from '@/components/capsulationMoudle/_tooltip.vue'
69
+import {getCurrentInstance, nextTick, onMounted, reactive, ref} from "vue";
70
+import {reactiveTableAndAny} from "@/api/ApiModel";
71
+import Dialog from '@/components/capsulationMoudle/_dialog.vue'
72
+import {fillZero} from '@/common/common'
73
+import {ElMessage} from "element-plus";
74
+import _ from "lodash";
75
+
76
+
77
+const { proxy } = getCurrentInstance() as any;
78
+// 全局方法定义
79
+const NumberHandle = proxy.$NumberHandle
80
+
81
+const emit = defineEmits<{
82
+  (event: "assignEvent", val: any): void; //赋值
83
+}>();
84
+
85
+// const props = withDefaults(defineProps<{
86
+//
87
+// }>(), {
88
+//
89
+// })
90
+
91
+interface radioFace{
92
+  value:number,
93
+  name:string,
94
+  EgName:string,
95
+  radioVal:string,
96
+  list:Array[]
97
+}
98
+
99
+const coverRadioList = ref<radioFace>({
100
+  value:1,
101
+  name:'自动生成封面',
102
+  EgName:'cover',
103
+  radioVal:'On',
104
+  haveNotes:true,
105
+  list:[
106
+    {name:'不开启',value:'Pause'},
107
+    {name:'开启',value:'On'},
108
+  ]
109
+})
110
+const videoRadioList = ref<radioFace>({
111
+  value:1,
112
+  name:'保存至视频号',
113
+  EgName:'video',
114
+  radioVal:'Pause',
115
+  haveNotes:true,
116
+  list:[
117
+    {name:'不开启',value:'Pause'},
118
+    {name:'开启',value:'On',notes:'开启后将同步上传至视频号动态、且广告投放期间浮层卡片可见'},
119
+  ]
120
+})
121
+
122
+
123
+//页面数据
124
+const pageInfo = reactive<reactiveTableAndAny>({
125
+  radioId:0,
126
+  creativeTeamList:[{
127
+    id:0,
128
+  }],
129
+  video_restriction: {
130
+    "width": 0,
131
+    "height": 0,
132
+    "min_width": 640,
133
+    "min_height": 360,
134
+    "ratio_width": 16,
135
+    "ratio_height": 9,
136
+    "file_size": 102400,
137
+    "file_format": [
138
+      "MEDIA_TYPE_MP4",
139
+      "MEDIA_TYPE_MOV",
140
+      "MEDIA_TYPE_AVI"
141
+    ],
142
+    "min_duration": 5,
143
+    "max_duration": 60
144
+  },
145
+  image_restriction:{
146
+    "width": 80,
147
+    "height": 80,
148
+    "file_size": 20,
149
+    "file_format": [
150
+      "IMAGE_TYPE_JPG",
151
+      "IMAGE_TYPE_PNG"
152
+    ]
153
+  }
154
+})
155
+
156
+//添加创意组
157
+const addItemEvent = () => {
158
+  let arr:any = pageInfo.creativeTeamList
159
+  let _id:number = arr[arr.length-1].id
160
+  arr.push({
161
+    id:_id+1
162
+  })
163
+}
164
+//删除创意组
165
+const deleItemEvent = (item:any) => {
166
+  let arr:any = pageInfo.creativeTeamList
167
+  if(arr&&arr.length==1){
168
+    ElMessage.error('至少保留1个创意组!')
169
+    return
170
+  }
171
+  let idx:number = arr.findIndex(n=>n.id== item.id)
172
+  arr.splice(idx,1)
173
+}
174
+//复制创意组
175
+const copyItemEvent = (item:any) => {
176
+  let arr:any = pageInfo.creativeTeamList
177
+  let idx:number = arr.findIndex(n=>n.id== item.id)
178
+  let _id:number = arr[arr.length-1].id
179
+  let obj:any = _.cloneDeep(arr[idx])
180
+  obj.id = _id+1
181
+  arr.push(obj)
182
+}
183
+
184
+
185
+const loading = ref<boolean>(false)
186
+//确定按钮
187
+const confirmEvent = () => {
188
+
189
+}
190
+
191
+// 切换显隐
192
+const dialogShow = ref<boolean>(true)
193
+const switchShow = (val:boolean)=>{
194
+  dialogShow.value = val
195
+  if(val){
196
+
197
+  }
198
+}
199
+
200
+
201
+// 父组件共享值
202
+defineExpose({
203
+  switchShow
204
+});
205
+
206
+</script>
207
+<style lang="scss" scoped>
208
+@import "src/assets/style/batchGdt.scss";
209
+.marPad{
210
+  margin: 8px 24px;
211
+}
212
+.borCon{
213
+  border: 1px solid #ebeef5;
214
+  border-radius: 4px;
215
+  color: #161E46;
216
+  padding: 8px 24px;
217
+}
218
+.titleBox{
219
+  .title{
220
+    font-weight: 600;
221
+  }
222
+  .smallTitle{
223
+    font-size: 12px;
224
+  }
225
+}
226
+.content{
227
+  .TeamBox{
228
+    flex: 1;
229
+    flex-shrink: 0;
230
+    border: 1px solid #ebeef5;
231
+    border-radius: 4px;
232
+    color: #161E46;
233
+    .TeamTitle{
234
+      padding: 8px 24px;
235
+      background-color: #fafafa;
236
+      line-height: 32px;
237
+    }
238
+    .TeamContent{
239
+      background-color: #fff;
240
+      width: 100%;
241
+    }
242
+
243
+  }
244
+  .iconBox{
245
+    padding: 6px 8px;
246
+    margin-left: 8px;
247
+    width: 32px;
248
+    cursor: pointer;
249
+    border: 1px solid #ebeef5;
250
+    border-radius: 4px;
251
+  }
252
+  .addItem{
253
+    padding: 8px 24px;
254
+    line-height: 24px;
255
+    background-color: #fafafa;
256
+    text-align: center;
257
+    width: calc(100% - 32px - 8px);
258
+    margin-top: 20px;
259
+    cursor: pointer;
260
+    &:hover{
261
+      font-weight: 600;
262
+    }
263
+  }
264
+}
265
+</style>

+ 92 - 0
src/components/businessMoudle/batchGdt/configArea/creativeMaterial/libraryDialog.vue

@@ -0,0 +1,92 @@
1
+<template>
2
+  <el-dialog
3
+      :model-value="dialogShow"
4
+      top="8px"
5
+      append-to-body
6
+      :width="width"
7
+      @close="dialogShow = false"
8
+      :modal="true"
9
+      :show-close="false"
10
+      :close-on-click-modal="false"
11
+      :close-on-press-escape="false"
12
+      :destroy-on-close="false"
13
+      draggable>
14
+    <template #header="{ close }">
15
+      <div class="flex_between">
16
+        <div class="c-0F161E f18 f-wei-600">{{dialogTitle}}</div>
17
+      </div>
18
+    </template>
19
+    <div class="container" :style="{ maxHeight: height , minHeight:minheight }" v-loading="loading">
20
+      <slot name="content"></slot>
21
+    </div>
22
+    <template #footer>
23
+      <div class="dialog-footer">
24
+        <div>
25
+          <span>已选素材: {{}} / {{}}</span>
26
+        </div>
27
+
28
+        <div class="lMarauto">
29
+          <Tooltip notes="复制创意组" colorCss="c-theme" :slotFalg="true">
30
+            <template v-slot:content>
31
+              <div class="flex">
32
+                找不到素材?点这里
33
+                <el-icon size="14" class="f14 pointer"><i-ep-QuestionFilled/></el-icon>
34
+              </div>
35
+            </template>
36
+          </Tooltip>
37
+          <el-button plain @click="cancelEVent" size="default">取消</el-button>
38
+          <el-button type="primary" plain @click="submitEVent" size="default" class="lMar10">提交</el-button>
39
+        </div>
40
+      </div>
41
+    </template>
42
+  </el-dialog>
43
+</template>
44
+<script setup lang="ts">
45
+import {getCurrentInstance, nextTick, onMounted, reactive, ref} from "vue";
46
+import Tooltip from '@/components/capsulationMoudle/_tooltip.vue'
47
+
48
+const { proxy } = getCurrentInstance() as any;
49
+// 全局方法定义
50
+const NumberHandle = proxy.$NumberHandle
51
+
52
+
53
+// 切换显隐
54
+const dialogShow = ref<boolean>(false)
55
+
56
+//提交
57
+const submitEVent = () => {
58
+
59
+}
60
+//取消
61
+const cancelEVent = () => {
62
+  dialogShow.value = false
63
+}
64
+//账号列表
65
+// const init = async (page?:any,pageSize?:any) => {
66
+//   tableListRef.value!.loading = true
67
+//   const paramsModel = reactive<expertParam>({})
68
+//   let res:any = await proxy.$http.get(Api.expert_living,paramsModel)
69
+//   tableListRef.value!.loading = false
70
+//   if(res&&res.errNo=='0'){
71
+//     let resNew:any = res.rst
72
+//     tableInfo.tableList = resNew.data
73
+//     total.value = resNew.pageInfo.totalNum
74
+//   }else{
75
+//     ElMessage.error(res.errMsg)
76
+//   }
77
+// }
78
+
79
+
80
+onMounted(()=>{
81
+  nextTick(()=>{
82
+
83
+  })
84
+})
85
+</script>
86
+<style lang="scss" scoped>
87
+.dialog-footer{
88
+  display: flex;
89
+  align-items: center;
90
+  padding: 16px 32px 16px 24px;
91
+}
92
+</style>

+ 3 - 2
src/components/businessMoudle/batchGdt/configArea/directPacket/common/radioGroup.vue

@@ -12,9 +12,10 @@
12 12
             <Tooltip v-if="toolTipsVal" :notes="toolTipsVal" effect="light" popperClass="wid400"/>
13 13
           </div>
14 14
           <div class="tips" v-if="haveNotes">
15
-            <el-icon :size="14" color="#FF9B48"><i-ep-WarningFilled /></el-icon>
16 15
             <template  v-for="item in radioList">
17
-              <span v-if="item.notes && (item.value==value)">{{item.notes}}</span>
16
+              <span class="flex" v-if="item.notes && (item.value==value)">
17
+                <el-icon :size="14" color="#FF9B48"><i-ep-WarningFilled /></el-icon>{{item.notes}}
18
+              </span>
18 19
             </template>
19 20
           </div>
20 21
         </div>

+ 1 - 0
src/components/businessMoudle/batchGdt/configArea/directPacket/index.vue

@@ -3,6 +3,7 @@
3 3
       :dialogVisible="dialogShow"
4 4
       @confirm="confirmEvent"
5 5
       @close="dialogShow = false"
6
+      :closeOnModal="false"
6 7
       width="1000px"
7 8
       height="calc(100vh - 190px)"
8 9
       top="8px"

+ 1 - 0
src/components/businessMoudle/batchGdt/configArea/directPacket/newDirecPacket.vue

@@ -3,6 +3,7 @@
3 3
       :dialogVisible="dialogShow"
4 4
       @confirm="confirmEvent"
5 5
       @close="dialogShow = false"
6
+      :closeOnModal="false"
6 7
       width="1100px"
7 8
       height="calc(100vh - 190px)"
8 9
       top="8px"

+ 25 - 13
src/components/businessMoudle/batchGdt/configArea/index.vue

@@ -38,14 +38,16 @@
38 38
               <div class="showInfoArea">
39 39
                 <div class="noData" v-if="!sub.haveContent">暂无数据</div>
40 40
                 <!-- 定向包展示 -->
41
-                <template  v-if="sub.name == '定向包'">
41
+                <template v-if="sub.name == '定向包'">
42 42
                   <DirectPacketExhibition :showFlag="sub.haveContent" ref="DirectPacketExhibitionRef" @updateHaveContent="updateHaveContent"></DirectPacketExhibition>
43 43
                 </template>
44 44
                 <div v-if="sub.name == '广告基本信息'">
45 45
                     <template v-for="(item) in basicInfoData.copywriting">
46 46
                       <div class="bMar8 lH16 c-515a6e">{{ item }}</div>
47 47
                     </template>
48
-                  </div>
48
+                </div>
49
+                <template v-if="sub.name == '创意素材'">
50
+                </template>
49 51
               </div>
50 52
               <div class="btn" @click="openDialogEvent(sub)">{{sub.haveContent ? '编辑' : '添加'}}</div>
51 53
             </div>
@@ -73,6 +75,8 @@
73 75
 
74 76
   <!--规则配置-->
75 77
   <RuleConfig ref="RuleConfigRef" @ExposeEvent="val=>pageInfo.RuleConfigObj = val"></RuleConfig>
78
+  <!--  创意素材-->
79
+  <CreativeMaterial ref="CreativeMaterialRef"></CreativeMaterial>
76 80
 
77 81
   <!-- 广告基本信息 -->
78 82
   <BasicInfo :visible="basicInfoData.visible" :dataFillBack="basicInfoData.fillBack" @close="basicInfoClose"></BasicInfo>
@@ -91,6 +95,7 @@ import {adqParam, reactiveTableAndAny, ruleConfig} from "@/api/ApiModel";
91 95
 import Select from '@/components/capsulationMoudle/_select.vue'
92 96
 import DirectPacketExhibition from '@/components/businessMoudle/batchGdt/configArea/directPacket/echoIndex.vue'
93 97
 import RuleConfig from '@/components/businessMoudle/batchGdt/configArea/ruleConfig/index.vue'
98
+import CreativeMaterial from '@/components/businessMoudle/batchGdt/configArea/creativeMaterial/index.vue'
94 99
 import {Api} from "@/api/api";
95 100
 import {ElMessage} from "element-plus";
96 101
 import {deepCopy} from "@/common/common";
@@ -199,6 +204,9 @@ const openRuleConfig = () => {
199 204
     RuleConfigRef.value!.switchShow(true)
200 205
   })
201 206
 }
207
+//创意素材
208
+const CreativeMaterialRef = ref<{switchShow:(val:boolean)=>void}>()
209
+
202 210
 
203 211
 // 定向包
204 212
 const DirectPacketExhibitionRef = ref<{get_echoAcId:()=>void,showDirectPacket:()=>void,clearDirectContent:()=>void}>()
@@ -209,17 +217,21 @@ const openDialogEvent = (sub:any) => {
209 217
     ElMessage.error('请选择媒体账户!')
210 218
     return
211 219
   }
212
-  if(sub.name == '定向包'){
213
-    nextTick(()=>{
214
-      DirectPacketExhibitionRef.value![0].showDirectPacket()
215
-      if(sub.haveContent){
216
-        DirectPacketExhibitionRef.value![0].get_echoAcId()
217
-      }
218
-    })
219
-  }
220
-  if(sub.name == '广告基本信息'){
221
-    basicInfoData.visible = true;
222
-  }
220
+
221
+  nextTick(()=>{
222
+    if(sub.name == '定向包'){
223
+        DirectPacketExhibitionRef.value![0].showDirectPacket()
224
+        if(sub.haveContent){
225
+          DirectPacketExhibitionRef.value![0].get_echoAcId()
226
+        }
227
+    }
228
+    if(sub.name == '创意素材'){
229
+      CreativeMaterialRef.value!.switchShow(true)
230
+    }
231
+    if(sub.name == '广告基本信息'){
232
+      basicInfoData.visible = true;
233
+    }
234
+  })
223 235
 }
224 236
 
225 237
 

+ 5 - 1
src/components/capsulationMoudle/_dialog.vue

@@ -8,6 +8,8 @@
8 8
       @close="closeEVent"
9 9
       :modal="haveModal"
10 10
       :show-close="false"
11
+      :close-on-click-modal="closeOnModal"
12
+      :close-on-press-escape="closeOnModal"
11 13
       :destroy-on-close="destroyOnCloseFlag"
12 14
       draggable>
13 15
     <template #header="{ close }">
@@ -52,6 +54,7 @@ const props = withDefaults(defineProps<{
52 54
   haveModal?: boolean,
53 55
   destroyOnCloseFlag?: boolean,
54 56
   propsClass?: string,
57
+  closeOnModal?: boolean,
55 58
 }>(), {
56 59
   dialogTitle: '提示',
57 60
   width: '60%',
@@ -64,7 +67,8 @@ const props = withDefaults(defineProps<{
64 67
   dialogVisible: false,
65 68
   loading: false,
66 69
   top: '15vh',
67
-  propsClass:''
70
+  propsClass:'',
71
+  closeOnModal:true
68 72
 })
69 73
 
70 74
 const closeEVent = () => {

+ 7 - 3
src/components/capsulationMoudle/_tooltip.vue

@@ -1,6 +1,8 @@
1 1
 <template>
2
-  <el-tooltip :effect="effect" raw-content :content="notes" >
3
-    <i-ep-QuestionFilled class="lMar5  f14 pointer" :class="colorCss"/>
2
+  <el-tooltip :effect="effect" raw-content >
3
+    <template #content>{{notes}}</template>
4
+    <template v-if="slotFalg"><slot name="content"></slot></template>
5
+    <i-ep-QuestionFilled v-if="!slotFalg" class="lMar5  f14 pointer" :class="colorCss"/>
4 6
   </el-tooltip>
5 7
 </template>
6 8
 <script lang="ts" setup>
@@ -8,9 +10,11 @@ const props = withDefaults(defineProps<{
8 10
   notes?: string,
9 11
   colorCss?: string,
10 12
   effect?: string,
13
+  slotFalg?:boolean
11 14
 }>(), {
12 15
   notes: '',
13 16
   colorCss: 'c-999',
14
-  effect: 'dark',
17
+  effect: 'light',
18
+  slotFalg:false
15 19
 })
16 20
 </script>