Просмотр исходного кода

修改批量创建头条广告创意信息逻辑

syh 5 лет назад
Родитель
Сommit
6691fa6ceb
19 измененных файлов с 1028 добавлено и 19 удалено
  1. 20 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceTemplateController.java
  2. 257 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedanceUrlInfoController.java
  3. 9 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceDeliveryTargetTemplate.java
  4. 78 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceUrlInfo.java
  5. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/BytedanceUrlInfoMapper.java
  6. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/BytedanceUrlInfoMapper.xml
  7. 1 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IByteDanceAdvertisePlanService.java
  8. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedanceAdvertisePlanTemplateService.java
  9. 2 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedanceDeliveryTargetTemplateService.java
  10. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedanceUrlInfoService.java
  11. 22 5
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceAdvertisePlanServiceImpl.java
  12. 6 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceCreativeServiceImpl.java
  13. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceAdvertisePlanTemplateServiceImpl.java
  14. 30 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceDeliveryTargetTemplateServiceImpl.java
  15. 58 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceUrlInfoServiceImpl.java
  16. 5 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/FileInfoServiceImpl.java
  17. 193 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceUrlInfoList.vue
  18. 149 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceUrlInfoModal.vue
  19. 156 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceUrlInfoModal__Style#Drawer.vue

+ 20 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceTemplateController.java

@@ -58,6 +58,10 @@ public class ByteDanceTemplateController {
         return deliveryTargetTemplateService.insertTemplate(template);
     }
 
+    @GetMapping("deliveryTarget/get")
+    public Map<String, Object> diliverytargetTemplateGet(Long targetId) {
+        return deliveryTargetTemplateService.get(targetId);
+    }
     /**
      * 广告创意创建
      *
@@ -104,6 +108,20 @@ public class ByteDanceTemplateController {
     }
 
     /**
+     * 链接信息
+     *
+     * @param urlInfo
+     * @param req
+     * @return
+     */
+    @PostMapping("link/insert")
+    public Map<String, Object> linkInsert(@RequestBody BytedanceUrlInfo urlInfo, HttpServletRequest req) {
+        return urlInfoService.insertLink(urlInfo);
+    }
+
+    @Autowired
+    private IBytedanceUrlInfoService urlInfoService;
+    /**
      * 广告计划模板
      *  方法废弃
      * @param template
@@ -174,8 +192,8 @@ public class ByteDanceTemplateController {
      * @return 查询计划可用转化id
      */
     @GetMapping(value = "convert/list")
-    public Map<String, Object> convertPageList(Long accountId, String packageName) {
-        return planService.getAdConvertList(accountId, packageName);
+    public Map<String, Object> convertPageList(Long accountId, Long targetId) {
+        return planService.getAdConvertList(accountId, targetId);
     }
 
     /**

+ 257 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedanceUrlInfoController.java

@@ -0,0 +1,257 @@
+package org.jeecg.modules.ctop.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.ctop.entity.BytedanceUrlInfo;
+import org.jeecg.modules.ctop.service.IBytedanceUrlInfoService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * @Description: 今日头条链接信息
+ * @Author: jeecg-boot
+ * @Date: 2019-08-06
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "今日头条链接信息")
+@RestController
+@RequestMapping("/ctop/bytedanceUrlInfo")
+public class BytedanceUrlInfoController {
+    @Autowired
+    private IBytedanceUrlInfoService bytedanceUrlInfoService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param bytedanceUrlInfo
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "今日头条链接信息-分页列表查询")
+    @ApiOperation(value = "今日头条链接信息-分页列表查询", notes = "今日头条链接信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<BytedanceUrlInfo>> queryPageList(BytedanceUrlInfo bytedanceUrlInfo,
+                                                         @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                         @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                         HttpServletRequest req) {
+        Result<IPage<BytedanceUrlInfo>> result = new Result<>();
+        QueryWrapper<BytedanceUrlInfo> queryWrapper = QueryGenerator.initQueryWrapper(bytedanceUrlInfo, req.getParameterMap());
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        queryWrapper.eq("advertiser_id", user.getId());
+        Page<BytedanceUrlInfo> page = new Page<>(pageNo, pageSize);
+        IPage<BytedanceUrlInfo> pageList = bytedanceUrlInfoService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param bytedanceUrlInfo
+     * @return
+     */
+    @AutoLog(value = "今日头条链接信息-添加")
+    @ApiOperation(value = "今日头条链接信息-添加", notes = "今日头条链接信息-添加")
+    @PostMapping(value = "/add")
+    public Result<BytedanceUrlInfo> add(@RequestBody BytedanceUrlInfo bytedanceUrlInfo) {
+        Result<BytedanceUrlInfo> result = new Result<BytedanceUrlInfo>();
+        try {
+            bytedanceUrlInfoService.save(bytedanceUrlInfo);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param bytedanceUrlInfo
+     * @return
+     */
+    @AutoLog(value = "今日头条链接信息-编辑")
+    @ApiOperation(value = "今日头条链接信息-编辑", notes = "今日头条链接信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<BytedanceUrlInfo> edit(@RequestBody BytedanceUrlInfo bytedanceUrlInfo) {
+        Result<BytedanceUrlInfo> result = new Result<BytedanceUrlInfo>();
+        BytedanceUrlInfo bytedanceUrlInfoEntity = bytedanceUrlInfoService.getById(bytedanceUrlInfo.getId());
+        if (bytedanceUrlInfoEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = bytedanceUrlInfoService.updateById(bytedanceUrlInfo);
+            //TODO 返回false说明什么?
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "今日头条链接信息-通过id删除")
+    @ApiOperation(value = "今日头条链接信息-通过id删除", notes = "今日头条链接信息-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            bytedanceUrlInfoService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "今日头条链接信息-批量删除")
+    @ApiOperation(value = "今日头条链接信息-批量删除", notes = "今日头条链接信息-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<BytedanceUrlInfo> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<BytedanceUrlInfo> result = new Result<BytedanceUrlInfo>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.bytedanceUrlInfoService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "今日头条链接信息-通过id查询")
+    @ApiOperation(value = "今日头条链接信息-通过id查询", notes = "今日头条链接信息-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<BytedanceUrlInfo> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<BytedanceUrlInfo> result = new Result<BytedanceUrlInfo>();
+        BytedanceUrlInfo bytedanceUrlInfo = bytedanceUrlInfoService.getById(id);
+        if (bytedanceUrlInfo == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(bytedanceUrlInfo);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<BytedanceUrlInfo> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                BytedanceUrlInfo bytedanceUrlInfo = JSON.parseObject(deString, BytedanceUrlInfo.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(bytedanceUrlInfo, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<BytedanceUrlInfo> pageList = bytedanceUrlInfoService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "今日头条链接信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, BytedanceUrlInfo.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("今日头条链接信息列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();// 获取上传文件对象
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<BytedanceUrlInfo> listBytedanceUrlInfos = ExcelImportUtil.importExcel(file.getInputStream(), BytedanceUrlInfo.class, params);
+                bytedanceUrlInfoService.saveBatch(listBytedanceUrlInfos);
+                return Result.ok("文件导入成功!数据行数:" + listBytedanceUrlInfos.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

+ 9 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceDeliveryTargetTemplate.java

@@ -49,6 +49,12 @@ public class BytedanceDeliveryTargetTemplate {
     @Excel(name = "投放范围", width = 15)
     @ApiModelProperty(value = "delivery_range")
     private String deliveryRange;
+    /**
+     * 投放范围
+     */
+    @Excel(name = "应用下载类型", width = 32)
+    @ApiModelProperty(value = "download_mode")
+    private String downloadMode;
 
     /**
      * 模板名称
@@ -128,4 +134,7 @@ public class BytedanceDeliveryTargetTemplate {
      */
     @ApiModelProperty(value = "updateTime")
     private Date updateTime;
+
+    @TableField(exist = false)
+    private Long urlId;
 }

+ 78 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceUrlInfo.java

@@ -0,0 +1,78 @@
+package org.jeecg.modules.ctop.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * @Description: 今日头条链接信息
+ * @Author: jeecg-boot
+ * @Date: 2019-08-06
+ * @Version: V1.0
+ */
+@Data
+@TableName("ctop_bytedance_url_info")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_bytedance_url_info对象", description = "今日头条链接信息")
+public class BytedanceUrlInfo {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * advertiserId
+     */
+    @Excel(name = "advertiserId", width = 15)
+    @ApiModelProperty(value = "advertiserId")
+    private String advertiserId;
+    /**
+     * 描述信息
+     */
+    @Excel(name = "名称", width = 15)
+    @ApiModelProperty(value = "描述信息")
+    private String name;
+    /**
+     * 链接地址
+     */
+    @Excel(name = "链接地址", width = 15)
+    @ApiModelProperty(value = "链接地址")
+    private String url;
+    /**
+     * 应用包名
+     */
+    @Excel(name = "应用包名", width = 15)
+    @ApiModelProperty(value = "应用包名")
+    private String packageName;
+    /**
+     * 链接类型
+     */
+    @Excel(name = "链接类型", width = 15)
+    @ApiModelProperty(value = "链接类型")
+    private String type;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

+ 17 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/BytedanceUrlInfoMapper.java

@@ -0,0 +1,17 @@
+package org.jeecg.modules.ctop.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.ctop.entity.BytedanceUrlInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 今日头条链接信息
+ * @Author: jeecg-boot
+ * @Date: 2019-08-06
+ * @Version: V1.0
+ */
+public interface BytedanceUrlInfoMapper extends BaseMapper<BytedanceUrlInfo> {
+
+}

+ 5 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/BytedanceUrlInfoMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.ctop.mapper.BytedanceUrlInfoMapper">
+
+</mapper>

+ 1 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IByteDanceAdvertisePlanService.java

@@ -1,10 +1,7 @@
 package org.jeecg.modules.ctop.service;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.ctop.entity.ByteDanceAdvertisePlan;
 import com.baomidou.mybatisplus.extension.service.IService;
-import org.jeecg.modules.ctop.entity.ByteDanceCampaign;
 import org.jeecg.modules.ctop.entity.CTopOauthToken;
 
 import java.util.Map;
@@ -19,5 +16,5 @@ public interface IByteDanceAdvertisePlanService extends IService<ByteDanceAdvert
 
     Map<String, Object> advertiserPlanCreate(CTopOauthToken token, Long campaignId, String dataString);
 
-    Map<String, Object> getAdConvertList(Long accountId, String packageName);
+    Map<String, Object> getAdConvertList(Long accountId, Long targetId);
 }

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedanceAdvertisePlanTemplateService.java

@@ -15,5 +15,5 @@ public interface IBytedanceAdvertisePlanTemplateService extends IService<Bytedan
 
     Map<String, Object> insertTemplate(BytedanceAdvertisePlanTemplate template, String accountId);
 
-    Map<String, Object> planCreate(Long campaignId, String getAccountId, String deliveryRange, Long userorentationId, Long budgetId, Long deliverytargetId, String getName);
+    Map<String, Object> planCreate(Long campaignId, String getAccountId, String deliveryRange, Long userorentationId, Long budgetId, Long deliverytargetId, String getName, String convertId);
 }

+ 2 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedanceDeliveryTargetTemplateService.java

@@ -22,4 +22,6 @@ public interface IBytedanceDeliveryTargetTemplateService extends IService<Byteda
     Result<IPage<BytedanceDeliveryTargetTemplate>> getList(BytedanceDeliveryTargetTemplate template, Integer pageNo, Integer pageSize, HttpServletRequest req);
 
     JSONObject getSiteList(Long accountId);
+
+    Map<String, Object> get(Long targetId);
 }

+ 17 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedanceUrlInfoService.java

@@ -0,0 +1,17 @@
+package org.jeecg.modules.ctop.service;
+
+import org.jeecg.modules.ctop.entity.BytedanceUrlInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.Map;
+
+/**
+ * @Description: 今日头条链接信息
+ * @Author: jeecg-boot
+ * @Date: 2019-08-06
+ * @Version: V1.0
+ */
+public interface IBytedanceUrlInfoService extends IService<BytedanceUrlInfo> {
+
+    Map<String, Object> insertLink(BytedanceUrlInfo urlInfo);
+}

+ 22 - 5
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceAdvertisePlanServiceImpl.java

@@ -1,7 +1,6 @@
 package org.jeecg.modules.ctop.service.impl;
 
 import cn.com.ctop.common.utils.PropertiesUtils;
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import org.apache.http.client.ClientProtocolException;
 import org.apache.http.client.methods.CloseableHttpResponse;
@@ -12,8 +11,10 @@ import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.jeecg.modules.ctop.entity.ByteDanceAdvertisePlan;
+import org.jeecg.modules.ctop.entity.BytedanceDeliveryTargetTemplate;
 import org.jeecg.modules.ctop.entity.CTopOauthToken;
 import org.jeecg.modules.ctop.mapper.ByteDanceAdvertisePlanMapper;
+import org.jeecg.modules.ctop.mapper.BytedanceDeliveryTargetTemplateMapper;
 import org.jeecg.modules.ctop.service.IByteDanceAdvertisePlanService;
 import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
 import org.slf4j.Logger;
@@ -59,18 +60,23 @@ public class ByteDanceAdvertisePlanServiceImpl extends ServiceImpl<ByteDanceAdve
         Long adId = dataObject.getLong("ad_id");
         ByteDanceAdvertisePlan plan = new ByteDanceAdvertisePlan(token.getAdvertiserId(), adId, data);
         planMapper.insert(plan);
+        resultMap.put("planId", adId);
         resultMap.put("code", 0);
         resultMap.put("message", "广告计划创建成功");
         return resultMap;
     }
 
     @Override
-    public Map<String, Object> getAdConvertList(Long accountId, String packageName) {
+    public Map<String, Object> getAdConvertList(Long accountId, Long targetId) {
         CTopOauthToken token = tokenService.getOAuthTokenByAccountId(accountId + "");
-        return getAdConvert(token, packageName);
+        BytedanceDeliveryTargetTemplate targetTemplate = deliveryTargetTemplateMapper.selectById(targetId);
+        return getAdConvert(token, targetTemplate);
     }
 
-    public JSONObject getAdConvert(CTopOauthToken token, String packageName) {
+    @Autowired
+    private BytedanceDeliveryTargetTemplateMapper deliveryTargetTemplateMapper;
+
+    public JSONObject getAdConvert(CTopOauthToken token, BytedanceDeliveryTargetTemplate targetTemplate) {
         String access_token = token.getAccessToken();
         final Long advertiser_id = token.getAccountId();
         // 请求地址
@@ -80,9 +86,20 @@ public class ByteDanceAdvertisePlanServiceImpl extends ServiceImpl<ByteDanceAdve
         Map data = new HashMap() {
             {
                 put("advertiser_id", advertiser_id);
-                put("package_name", packageName);
             }
         };
+        if (targetTemplate.getDownloadType().equals("EXTERNAL_URL")) {//落地页
+            data.put("external_url", targetTemplate.getDownloadUrl());
+        }
+        if (targetTemplate.getDownloadType().equals("DOWNLOAD_URL")) {//落地页
+            if (targetTemplate.getDownloadMode().equals("ios")) {
+                data.put("download_url", targetTemplate.getDownloadUrl());
+            }
+            if (targetTemplate.getDownloadMode().equals("android")) {
+                data.put("package_name", targetTemplate.getPackageName());
+            }
+        }
+
 
         // 构造请求
         HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {

+ 6 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceCreativeServiceImpl.java

@@ -49,6 +49,7 @@ public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeM
         data.put("advertiser_id", token.getAccountId());
         data.put("ad_id", adId);
         JSONObject result = createCreative(data, token.getAccessToken());
+        System.out.println("创意返回数据:" + result.toJSONString());
         Integer code = result.getInteger("code");
         String message = result.getString("message");
         if (null == code || code != 0) {
@@ -83,6 +84,7 @@ public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeM
         Long userorentationId = template.getLong("userorentationId");
         Long budgetId = template.getLong("budgetId");
         Long deliverytargetId = template.getLong("deliverytargetId");
+        Long convertId = template.getLong("convertId");
         Integer iteratorNum = template.getInteger("iteratorNum");
 
         JSONArray groupImageArray = null;
@@ -103,12 +105,12 @@ public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeM
                 }
                 Long campaignId = (Long) campaignResult.get("campaignId");
                 //2:创建广告计划
-                Map<String, Object> planResult = planTemplateService.planCreate(campaignId, getAccountId, deliveryRange, userorentationId, budgetId, deliverytargetId, getName);
-                createSuccess = (Boolean) planResult.get("success");
-                if (null == createSuccess || !createSuccess) {
+                Map<String, Object> planResult = planTemplateService.planCreate(campaignId, getAccountId, deliveryRange, userorentationId, budgetId, deliverytargetId, getName, convertId + "");
+                Integer code = (Integer) planResult.get("code");
+                if (null == code || code != 0) {
                     return planResult;
                 }
-                Long planId = (Long) campaignResult.get("planId");
+                Long planId = (Long) planResult.get("planId");
                 //3:创建广告创意
                 JSONObject data = new JSONObject();
                 data.put("ad_id", planId);

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceAdvertisePlanTemplateServiceImpl.java

@@ -46,7 +46,7 @@ public class BytedanceAdvertisePlanTemplateServiceImpl extends ServiceImpl<Byted
      * @return
      */
     @Override
-    public Map<String, Object> planCreate(Long campaignId, String getAccountId, String deliveryRange, Long userorentationId, Long budgetId, Long deliverytargetId, String getName) {
+    public Map<String, Object> planCreate(Long campaignId, String getAccountId, String deliveryRange, Long userorentationId, Long budgetId, Long deliverytargetId, String getName, String convertId) {
         CTopOauthToken token = tokenService.getOAuthTokenByAccountId(getAccountId);
         ByteDanceBudgetTemplate budgetTemplate = budgetTemplateMapper.selectById(budgetId);
         BytedanceDeliveryTargetTemplate deliveryTargetTemplate = deliveryTargetTemplateMapper.selectById(deliverytargetId);
@@ -85,7 +85,7 @@ public class BytedanceAdvertisePlanTemplateServiceImpl extends ServiceImpl<Byted
         data.put("budget", budgetTemplate.getBudgetPrice());//需要大于bid
         //转化出价(ocpm请填写 cpa_bid)
         data.put("cpa_bid", budgetTemplate.getBudgetPrice());
-        data.put("convert_id", 92029616038L);
+        data.put("convert_id", convertId);
         //广告投放时间类型
         data.put("schedule_type", budgetTemplate.getFlowDateType());
         //广告投放开始时间

+ 30 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceDeliveryTargetTemplateServiceImpl.java

@@ -19,8 +19,10 @@ import org.jeecg.common.util.ResultMapUtils;
 import org.jeecg.common.util.StatusCode;
 import org.jeecg.modules.ctop.entity.ByteDanceCampaignTemplate;
 import org.jeecg.modules.ctop.entity.BytedanceDeliveryTargetTemplate;
+import org.jeecg.modules.ctop.entity.BytedanceUrlInfo;
 import org.jeecg.modules.ctop.entity.CTopOauthToken;
 import org.jeecg.modules.ctop.mapper.BytedanceDeliveryTargetTemplateMapper;
+import org.jeecg.modules.ctop.mapper.BytedanceUrlInfoMapper;
 import org.jeecg.modules.ctop.service.IBytedanceDeliveryTargetTemplateService;
 import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -67,12 +69,23 @@ public class BytedanceDeliveryTargetTemplateServiceImpl extends ServiceImpl<Byte
         }
         LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         template.setAdvertiserId(user.getId());
+        BytedanceUrlInfo urlInfo = urlInfoMapper.selectById(template.getUrlId());
+        //落地页
+        if (null != urlInfo.getType() && urlInfo.getType().equals("page")) {
+            template.setExternalUrl(urlInfo.getUrl());
+        } else {
+            template.setDownloadUrl(urlInfo.getUrl());
+            template.setPackageName(urlInfo.getPackageName());
+        }
         template.setStatus(1);
         this.saveOrUpdate(template);
         ResultMapUtils.setResultMap(resultMap, StatusCode.COMMON_SUCCESS.getCode());
         return resultMap;
     }
 
+    @Autowired
+    BytedanceUrlInfoMapper urlInfoMapper;
+
     @Override
     public Result<IPage<BytedanceDeliveryTargetTemplate>> getList(BytedanceDeliveryTargetTemplate template, Integer pageNo, Integer pageSize, HttpServletRequest req) {
         Result<IPage<BytedanceDeliveryTargetTemplate>> result = new Result<>();
@@ -92,6 +105,23 @@ public class BytedanceDeliveryTargetTemplateServiceImpl extends ServiceImpl<Byte
         return null;
     }
 
+    @Override
+    public Map<String, Object> get(Long targetId) {
+        Map<String, Object> result = new HashMap<>();
+        if (null == targetId || targetId == 0) {
+            ResultMapUtils.setResultMap(result, StatusCode.COMMON_PARAM_ERROR.getCode());
+            return result;
+        }
+        BytedanceDeliveryTargetTemplate template = this.getById(targetId);
+        if (null == template) {
+            ResultMapUtils.setResultMap(result, StatusCode.COMMON_PARAM_ERROR.getCode());
+            return result;
+        }
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS.getCode());
+        result.put("data", template);
+        return result;
+    }
+
     public JSONObject getSite() {
         String access_token = "xxx";
         final Long advertiser_id = 0L;

+ 58 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceUrlInfoServiceImpl.java

@@ -0,0 +1,58 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.ResultMapUtils;
+import org.jeecg.common.util.StatusCode;
+import org.jeecg.modules.ctop.entity.BytedanceDeliveryTargetTemplate;
+import org.jeecg.modules.ctop.entity.BytedanceUrlInfo;
+import org.jeecg.modules.ctop.mapper.BytedanceUrlInfoMapper;
+import org.jeecg.modules.ctop.service.IBytedanceUrlInfoService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Description: 今日头条链接信息
+ * @Author: jeecg-boot
+ * @Date: 2019-08-06
+ * @Version: V1.0
+ */
+@Service
+public class BytedanceUrlInfoServiceImpl extends ServiceImpl<BytedanceUrlInfoMapper, BytedanceUrlInfo> implements IBytedanceUrlInfoService {
+
+    @Override
+    public Map<String, Object> insertLink(BytedanceUrlInfo template) {
+        Map<String, Object> resultMap = new HashMap<>();
+        Long id = template.getId();
+        String name = template.getName();
+        if (null == name || "".equals(name.trim())) {
+            ResultMapUtils.setResultMap(resultMap, StatusCode.TEMPLATE_NAME_IS_NULL.getCode());
+            return resultMap;
+        }
+        String urlType = template.getType();
+        if (null != urlType && urlType.equals("落地页")) {
+            template.setPackageName(null);
+        }
+        QueryWrapper<BytedanceUrlInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("name", template.getName());
+        if (null != id && id != 0) {
+            queryWrapper.ne("id", id);
+        }
+        BytedanceUrlInfo templateExist = getOne(queryWrapper);
+        if (null != templateExist) {
+            ResultMapUtils.setResultMap(resultMap, StatusCode.TEMPLATE_NAME_HAS_EXIST.getCode());
+            return resultMap;
+        }
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        template.setAdvertiserId(user.getId());
+//        template.setStatus(1);
+        this.saveOrUpdate(template);
+        ResultMapUtils.setResultMap(resultMap, StatusCode.COMMON_SUCCESS.getCode());
+        return resultMap;
+    }
+}

+ 5 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/FileInfoServiceImpl.java

@@ -28,6 +28,7 @@ import org.jeecg.modules.ctop.entity.*;
 import org.jeecg.modules.ctop.mapper.ByteDanceImageInfoMapper;
 import org.jeecg.modules.ctop.mapper.ByteDanceVideoInfoMapper;
 import org.jeecg.modules.ctop.mapper.FileInfoMapper;
+import org.jeecg.modules.ctop.service.IByteDanceImageInfoService;
 import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
 import org.jeecg.modules.ctop.service.IFileInfoService;
 import org.jeecg.modules.system.entity.SysCategory;
@@ -127,7 +128,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         }
         JSONObject data = resultObject.getJSONObject("data");
         ByteDanceImageInfo imageInfo = new ByteDanceImageInfo(data, token);
-        imageInfoMapper.insert(imageInfo);
+        imageInfoService.saveOrUpdate(imageInfo);
         ResultMapUtils.setResultMap(resultMap, StatusCode.COMMON_SUCCESS.getCode());
         JSONArray array = new JSONArray();
         array.add(imageInfo.getId());
@@ -135,6 +136,9 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         return resultMap;
     }
 
+    @Autowired
+    private IByteDanceImageInfoService imageInfoService;
+
     @Override
     public Map<String, Object> getIndustryList(String accountId, Integer level) {
         Map<String, Object> resultMap = new HashMap<>();

+ 193 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceUrlInfoList.vue

@@ -0,0 +1,193 @@
+<template>
+    <a-card :bordered="false">
+
+        <!-- 查询区域 -->
+        <div class="table-page-search-wrapper">
+            <a-form layout="inline">
+                <a-row :gutter="24">
+
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="advertiserId">
+                            <a-input placeholder="请输入advertiserId" v-model="queryParam.advertiserId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="描述信息">
+                            <a-input placeholder="请输入描述信息" v-model="queryParam.desc"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="链接地址">
+                                <a-input placeholder="请输入链接地址" v-model="queryParam.url"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="应用包名">
+                                <a-input placeholder="请输入应用包名" v-model="queryParam.packageName"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="链接类型">
+                                <a-input placeholder="请输入链接类型" v-model="queryParam.type"></a-input>
+                            </a-form-item>
+                        </a-col>
+                    </template>
+                    <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+                    </a-col>
+
+                </a-row>
+            </a-form>
+        </div>
+
+        <!-- 操作按钮区域 -->
+        <div class="table-operator">
+            <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+            <a-button type="primary" icon="download" @click="handleExportXls('今日头条链接信息')">导出</a-button>
+            <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
+                      :action="importExcelUrl" @change="handleImportExcel">
+                <a-button type="primary" icon="import">导入</a-button>
+            </a-upload>
+            <a-dropdown v-if="selectedRowKeys.length > 0">
+                <a-menu slot="overlay">
+                    <a-menu-item key="1" @click="batchDel">
+                        <a-icon type="delete"/>
+                        删除
+                    </a-menu-item>
+                </a-menu>
+                <a-button style="margin-left: 8px"> 批量操作
+                    <a-icon type="down"/>
+                </a-button>
+            </a-dropdown>
+        </div>
+
+        <!-- table区域-begin -->
+        <div>
+            <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+                <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
+                selectedRowKeys.length }}</a>项
+                <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+            </div>
+
+            <a-table
+                    ref="table"
+                    size="middle"
+                    bordered
+                    rowKey="id"
+                    :columns="columns"
+                    :dataSource="dataSource"
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                    @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+            </a-table>
+        </div>
+        <!-- table区域-end -->
+
+        <!-- 表单区域 -->
+        <bytedanceUrlInfo-modal ref="modalForm" @ok="modalFormOk"></bytedanceUrlInfo-modal>
+    </a-card>
+</template>
+
+<script>
+    import BytedanceUrlInfoModal from './modules/BytedanceUrlInfoModal'
+    import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+    export default {
+        name: "BytedanceUrlInfoList",
+        mixins: [JeecgListMixin],
+        components: {
+            BytedanceUrlInfoModal
+        },
+        data() {
+            return {
+                description: '今日头条链接信息管理页面',
+                // 表头
+                columns: [
+                    {
+                        title: '#',
+                        dataIndex: '',
+                        key: 'rowIndex',
+                        width: 60,
+                        align: "center",
+                        customRender: function (t, r, index) {
+                            return parseInt(index) + 1;
+                        }
+                    },
+                    {
+                        title: 'advertiserId',
+                        align: "center",
+                        dataIndex: 'advertiserId'
+                    },
+                    {
+                        title: '描述信息',
+                        align: "center",
+                        dataIndex: 'desc'
+                    },
+                    {
+                        title: '链接地址',
+                        align: "center",
+                        dataIndex: 'url'
+                    },
+                    {
+                        title: '应用包名',
+                        align: "center",
+                        dataIndex: 'packageName'
+                    },
+                    {
+                        title: '链接类型',
+                        align: "center",
+                        dataIndex: 'type'
+                    },
+                    {
+                        title: '操作',
+                        dataIndex: 'action',
+                        align: "center",
+                        scopedSlots: {customRender: 'action'},
+                    }
+                ],
+                url: {
+                    list: "/ctop/bytedanceUrlInfo/list",
+                    delete: "/ctop/bytedanceUrlInfo/delete",
+                    deleteBatch: "/ctop/bytedanceUrlInfo/deleteBatch",
+                    exportXlsUrl: "ctop/bytedanceUrlInfo/exportXls",
+                    importExcelUrl: "ctop/bytedanceUrlInfo/importExcel",
+                },
+            }
+        },
+        computed: {
+            importExcelUrl: function () {
+                return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+            }
+        },
+        methods: {}
+    }
+</script>
+<style scoped>
+    @import '~@assets/less/common.less'
+</style>

+ 149 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceUrlInfoModal.vue

@@ -0,0 +1,149 @@
+<template>
+    <a-modal
+            :title="title"
+            :width="800"
+            :visible="visible"
+            :confirmLoading="confirmLoading"
+            @ok="handleOk"
+            @cancel="handleCancel"
+            cancelText="关闭">
+
+        <a-spin :spinning="confirmLoading">
+            <a-form :form="form">
+
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="advertiserId">
+                    <a-input placeholder="请输入advertiserId"
+                             v-decorator="['advertiserId', validatorRules.advertiserId ]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="描述信息">
+                    <a-input placeholder="请输入描述信息" v-decorator="['desc', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="链接地址">
+                    <a-input placeholder="请输入链接地址" v-decorator="['url', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="应用包名">
+                    <a-input placeholder="请输入应用包名" v-decorator="['packageName', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="链接类型">
+                    <a-input placeholder="请输入链接类型" v-decorator="['type', {}]"/>
+                </a-form-item>
+
+            </a-form>
+        </a-spin>
+    </a-modal>
+</template>
+
+<script>
+    import {httpAction} from '@/api/manage'
+    import pick from 'lodash.pick'
+    import moment from "moment"
+
+    export default {
+        name: "BytedanceUrlInfoModal",
+        data() {
+            return {
+                title: "操作",
+                visible: false,
+                model: {},
+                labelCol: {
+                    xs: {span: 24},
+                    sm: {span: 5},
+                },
+                wrapperCol: {
+                    xs: {span: 24},
+                    sm: {span: 16},
+                },
+
+                confirmLoading: false,
+                form: this.$form.createForm(this),
+                validatorRules: {
+                    advertiserId: {rules: [{required: true, message: '请输入advertiserId!'}]},
+                },
+                url: {
+                    add: "/ctop/bytedanceUrlInfo/add",
+                    edit: "/ctop/bytedanceUrlInfo/edit",
+                },
+            }
+        },
+        created() {
+        },
+        methods: {
+            add() {
+                this.edit({});
+            },
+            edit(record) {
+                this.form.resetFields();
+                this.model = Object.assign({}, record);
+                this.visible = true;
+                this.$nextTick(() => {
+                    this.form.setFieldsValue(pick(this.model, 'advertiserId', 'desc', 'url', 'packageName', 'type'))
+                    //时间格式化
+                });
+
+            },
+            close() {
+                this.$emit('close');
+                this.visible = false;
+            },
+            handleOk() {
+                const that = this;
+                // 触发表单验证
+                this.form.validateFields((err, values) => {
+                    if (!err) {
+                        that.confirmLoading = true;
+                        let httpurl = '';
+                        let method = '';
+                        if (!this.model.id) {
+                            httpurl += this.url.add;
+                            method = 'post';
+                        } else {
+                            httpurl += this.url.edit;
+                            method = 'put';
+                        }
+                        let formData = Object.assign(this.model, values);
+                        //时间格式化
+
+                        console.log(formData)
+                        httpAction(httpurl, formData, method).then((res) => {
+                            if (res.success) {
+                                that.$message.success(res.message);
+                                that.$emit('ok');
+                            } else {
+                                that.$message.warning(res.message);
+                            }
+                        }).finally(() => {
+                            that.confirmLoading = false;
+                            that.close();
+                        })
+
+
+                    }
+                })
+            },
+            handleCancel() {
+                this.close()
+            },
+
+
+        }
+    }
+</script>
+
+<style lang="less" scoped>
+
+</style>

+ 156 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceUrlInfoModal__Style#Drawer.vue

@@ -0,0 +1,156 @@
+<template>
+    <a-drawer
+            :title="title"
+            :width="800"
+            placement="right"
+            :closable="false"
+            @close="close"
+            :visible="visible"
+    >
+
+        <a-spin :spinning="confirmLoading">
+            <a-form :form="form">
+
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="advertiserId">
+                    <a-input placeholder="请输入advertiserId"
+                             v-decorator="['advertiserId', validatorRules.advertiserId ]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="描述信息">
+                    <a-input placeholder="请输入描述信息" v-decorator="['desc', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="链接地址">
+                    <a-input placeholder="请输入链接地址" v-decorator="['url', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="应用包名">
+                    <a-input placeholder="请输入应用包名" v-decorator="['packageName', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="链接类型">
+                    <a-input placeholder="请输入链接类型" v-decorator="['type', {}]"/>
+                </a-form-item>
+
+            </a-form>
+        </a-spin>
+        <a-button type="primary" @click="handleOk">确定</a-button>
+        <a-button type="primary" @click="handleCancel">取消</a-button>
+    </a-drawer>
+</template>
+
+<script>
+    import {httpAction} from '@/api/manage'
+    import pick from 'lodash.pick'
+    import moment from "moment"
+
+    export default {
+        name: "BytedanceUrlInfoModal",
+        data() {
+            return {
+                title: "操作",
+                visible: false,
+                model: {},
+                labelCol: {
+                    xs: {span: 24},
+                    sm: {span: 5},
+                },
+                wrapperCol: {
+                    xs: {span: 24},
+                    sm: {span: 16},
+                },
+
+                confirmLoading: false,
+                form: this.$form.createForm(this),
+                validatorRules: {
+                    advertiserId: {rules: [{required: true, message: '请输入advertiserId!'}]},
+                },
+                url: {
+                    add: "/ctop/bytedanceUrlInfo/add",
+                    edit: "/ctop/bytedanceUrlInfo/edit",
+                },
+            }
+        },
+        created() {
+        },
+        methods: {
+            add() {
+                this.edit({});
+            },
+            edit(record) {
+                this.form.resetFields();
+                this.model = Object.assign({}, record);
+                this.visible = true;
+                this.$nextTick(() => {
+                    this.form.setFieldsValue(pick(this.model, 'advertiserId', 'desc', 'url', 'packageName', 'type'))
+                    //时间格式化
+                });
+
+            },
+            close() {
+                this.$emit('close');
+                this.visible = false;
+            },
+            handleOk() {
+                const that = this;
+                // 触发表单验证
+                this.form.validateFields((err, values) => {
+                    if (!err) {
+                        that.confirmLoading = true;
+                        let httpurl = '';
+                        let method = '';
+                        if (!this.model.id) {
+                            httpurl += this.url.add;
+                            method = 'post';
+                        } else {
+                            httpurl += this.url.edit;
+                            method = 'put';
+                        }
+                        let formData = Object.assign(this.model, values);
+                        //时间格式化
+
+                        console.log(formData)
+                        httpAction(httpurl, formData, method).then((res) => {
+                            if (res.success) {
+                                that.$message.success(res.message);
+                                that.$emit('ok');
+                            } else {
+                                that.$message.warning(res.message);
+                            }
+                        }).finally(() => {
+                            that.confirmLoading = false;
+                            that.close();
+                        })
+
+
+                    }
+                })
+            },
+            handleCancel() {
+                this.close()
+            },
+
+
+        }
+    }
+</script>
+
+<style lang="less" scoped>
+    /** Button按钮间距 */
+    .ant-btn {
+        margin-left: 30px;
+        margin-bottom: 30px;
+        float: right;
+    }
+</style>