zhangqin пре 1 недеља
родитељ
комит
9e71dce5de
27 измењених фајлова са 816 додато и 19 уклоњено
  1. 5 6
      fs-ad-new-api/src/main/java/com/fs/app/controller/LandingPageController.java
  2. 103 0
      fs-company/src/main/java/com/fs/company/controller/newAdv/AdvChannelController.java
  3. 58 0
      fs-company/src/main/java/com/fs/company/controller/newAdv/AdvProjectController.java
  4. 16 11
      fs-company/src/main/java/com/fs/company/controller/newAdv/LandingPageTemplateController.java
  5. 64 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwGroupActualController.java
  6. 60 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwGroupLiveCodeController.java
  7. 54 0
      fs-service/src/main/java/com/fs/newAdv/domain/AdvChannelEntity.java
  8. 45 0
      fs-service/src/main/java/com/fs/newAdv/domain/AdvProjectEntity.java
  9. 2 1
      fs-service/src/main/java/com/fs/newAdv/domain/Site.java
  10. 5 0
      fs-service/src/main/java/com/fs/newAdv/domain/SiteStatistics.java
  11. 21 0
      fs-service/src/main/java/com/fs/newAdv/dto/req/ChannelSaveBatchReq.java
  12. 18 0
      fs-service/src/main/java/com/fs/newAdv/mapper/AdvChannelMapper.java
  13. 18 0
      fs-service/src/main/java/com/fs/newAdv/mapper/AdvProjectMapper.java
  14. 16 0
      fs-service/src/main/java/com/fs/newAdv/service/IAdvChannelService.java
  15. 16 0
      fs-service/src/main/java/com/fs/newAdv/service/IAdvProjectService.java
  16. 7 0
      fs-service/src/main/java/com/fs/newAdv/service/ISiteService.java
  17. 20 0
      fs-service/src/main/java/com/fs/newAdv/service/impl/AdvChannelServiceImpl.java
  18. 20 0
      fs-service/src/main/java/com/fs/newAdv/service/impl/AdvProjectServiceImpl.java
  19. 7 1
      fs-service/src/main/java/com/fs/newAdv/service/impl/SiteServiceImpl.java
  20. 74 0
      fs-service/src/main/java/com/fs/qw/domain/QwGroupActual.java
  21. 75 0
      fs-service/src/main/java/com/fs/qw/domain/QwGroupLiveCode.java
  22. 18 0
      fs-service/src/main/java/com/fs/qw/mapper/QwGroupActualMapper.java
  23. 18 0
      fs-service/src/main/java/com/fs/qw/mapper/QwGroupLiveCodeMapper.java
  24. 17 0
      fs-service/src/main/java/com/fs/qw/service/IQwGroupActualService.java
  25. 17 0
      fs-service/src/main/java/com/fs/qw/service/IQwGroupLiveCodeService.java
  26. 22 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwGroupActualServiceImpl.java
  27. 20 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwGroupLiveCodeServiceImpl.java

+ 5 - 6
fs-ad-new-api/src/main/java/com/fs/app/controller/LandingPageController.java

@@ -30,14 +30,13 @@ public class LandingPageController {
     /**
      * 落地页访问
      */
-    @GetMapping("/home")
+    @PostMapping("/home")
     public Result<LandingIndexRes> track(
-            @RequestParam Map<String, String> allParams,
-            @Valid @RequestBody LandingIndexReq req) {
-        log.info("落地页访问追踪:req={},params={}", req, allParams);
-        Long siteId = Long.valueOf(allParams.get("site_id"));
+            @RequestBody LandingIndexReq req) {
+        log.info("落地页访问追踪:req={}", req);
+        Long siteId = Long.valueOf(req.getAllParams().get("siteId"));
         // 保存落地页访问记录
-        facadeService.saveLandingIndexTrace(siteId, allParams);
+        facadeService.saveLandingIndexTrace(siteId, req.getAllParams());
         // 查询落地页模板
         return Result.success(facadeService.getLandingIndexBySiteId(siteId));
     }

+ 103 - 0
fs-company/src/main/java/com/fs/company/controller/newAdv/AdvChannelController.java

@@ -0,0 +1,103 @@
+package com.fs.company.controller.newAdv;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fs.common.result.Result;
+import com.fs.newAdv.domain.AdvChannelEntity;
+import com.fs.newAdv.dto.req.ChannelSaveBatchReq;
+import com.fs.newAdv.service.IAdvChannelService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 广告渠道表 前端控制器
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-27
+ */
+@RestController
+@RequestMapping("/channel")
+public class AdvChannelController {
+
+    @Autowired
+    private IAdvChannelService advChannelService;
+
+    /**
+     * 分页查询渠道
+     */
+    @GetMapping("/page")
+    public Result<IPage<AdvChannelEntity>> page(
+            @RequestParam(defaultValue = "1") Long pageNum,
+            @RequestParam(defaultValue = "10") Long pageSize,
+            @RequestParam(required = false) String channelName,
+            @RequestParam(required = false) Long parentId) {
+
+        Page<AdvChannelEntity> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<AdvChannelEntity> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(StrUtil.isNotBlank(channelName), AdvChannelEntity::getChannelName, channelName);
+        wrapper.eq(ObjectUtil.isNotEmpty(parentId), AdvChannelEntity::getParentId, parentId);
+        wrapper.ne(ObjectUtil.isEmpty(parentId), AdvChannelEntity::getParentId, 0);
+        wrapper.orderByDesc(AdvChannelEntity::getCreateTime);
+        IPage<AdvChannelEntity> result = advChannelService.page(page, wrapper);
+        return Result.success(result);
+    }
+
+    /**
+     * 创建渠道/修改渠道
+     */
+    @PostMapping("/addOrUpdate")
+    public Result<Void> create(@RequestBody AdvChannelEntity advertiser) {
+        boolean success = false;
+        if (advertiser.getId() != null) {
+            success = advChannelService.updateById(advertiser);
+        } else {
+            success = advChannelService.save(advertiser);
+        }
+        return success ? Result.success() : Result.error("创建失败");
+    }
+
+    /**
+     * 批量新增
+     */
+    @PostMapping("/saveBatch")
+    public Result<Void> saveBatch(@RequestBody ChannelSaveBatchReq saveBatch) {
+        // 参数验证
+        int num = saveBatch.getNum();
+        if (num <= 0 || num > 10000) {
+            return Result.error("批量数量必须在1-10000之间");
+        }
+
+        String channelName = saveBatch.getChannelName();
+        if (StrUtil.isBlank(channelName)) {
+            return Result.error("渠道名称不能为空");
+        }
+
+        List<AdvChannelEntity> list = new ArrayList<>(num);
+        Integer start = saveBatch.getStart();
+        Long parentId = saveBatch.getParentId();
+
+        for (int i = 0; i < num; i++) {
+            AdvChannelEntity entity = new AdvChannelEntity();
+            entity.setChannelName(new StringBuilder()
+                    .append(channelName)
+                    .append("-")
+                    .append(start++)
+                    .toString());
+            entity.setParentId(parentId);
+            list.add(entity);
+        }
+        try {
+            return advChannelService.saveBatch(list) ? Result.success() : Result.error("创建失败");
+        } catch (Exception e) {
+            return Result.error("批量创建失败:" + e.getMessage());
+        }
+    }
+}

+ 58 - 0
fs-company/src/main/java/com/fs/company/controller/newAdv/AdvProjectController.java

@@ -0,0 +1,58 @@
+package com.fs.company.controller.newAdv;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fs.common.result.Result;
+import com.fs.newAdv.domain.AdvProjectEntity;
+import com.fs.newAdv.service.IAdvProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-27
+ */
+@RestController
+@RequestMapping("/project")
+public class AdvProjectController {
+
+    @Autowired
+    private IAdvProjectService advProjectService;
+
+    /**
+     * 分页查询渠道
+     */
+    @GetMapping("/page")
+    public Result<IPage<AdvProjectEntity>> page(
+            @RequestParam(defaultValue = "1") Long pageNum,
+            @RequestParam(defaultValue = "10") Long pageSize,
+            @RequestParam(required = false) String projectName) {
+        Page<AdvProjectEntity> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<AdvProjectEntity> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(StrUtil.isNotBlank(projectName), AdvProjectEntity::getProjectName, projectName);
+        wrapper.orderByDesc(AdvProjectEntity::getCreateTime);
+        IPage<AdvProjectEntity> result = advProjectService.page(page, wrapper);
+        return Result.success(result);
+    }
+
+    /**
+     * 创建渠道/修改渠道
+     */
+    @PostMapping("/add")
+    public Result<Void> create(@RequestBody @Validated AdvProjectEntity advertiser) {
+        boolean success = false;
+        if (advertiser.getId() != null) {
+            success = advProjectService.updateById(advertiser);
+        } else {
+            success = advProjectService.save(advertiser);
+        }
+        return success ? Result.success() : Result.error("创建失败");
+    }
+}

+ 16 - 11
fs-company/src/main/java/com/fs/company/controller/newAdv/LandingPageTemplateController.java

@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fs.common.result.Result;
@@ -20,12 +21,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import java.time.LocalDateTime;
 import java.util.Map;
 import java.util.Objects;
-import java.util.stream.Collectors;
 
 /**
  * 投放页面模板Controller
@@ -108,22 +107,28 @@ public class LandingPageTemplateController {
     public Result<Void> create(@RequestBody @Validated LandingPageTemplate request) {
         log.info("新增模板 | templateName={}, templateType={}",
                 request.getTemplateName(), request.getTemplateType());
-        // 验证JSON格式
-        if (StrUtil.isNotBlank(request.getTemplateData())) {
-            try {
-                JSONUtil.parseObj(request.getTemplateData());
-            } catch (Exception e) {
-                return Result.error("模板数据格式不正确,必须是有效的JSON");
-            }
-        }
         boolean success = templateService.save(request);
         if (!success) {
             return Result.error("新增模板失败");
         }
-
         return Result.success();
     }
 
+    /**
+     * 启停模板
+     *
+     * @return 操作结果
+     */
+    @PostMapping("/enable/{id}")
+    public Result<Void> create(@PathVariable String id, @RequestParam(required = false) Integer status) {
+        if (status == 0 && siteService.findByTemplateId(id)) {
+            return Result.error("该模板正在被使用中,请先停用");
+        }
+        templateService.update(new LambdaUpdateWrapper<LandingPageTemplate>()
+                .eq(LandingPageTemplate::getId, id)
+                .set(LandingPageTemplate::getStatus, status));
+        return Result.success();
+    }
 
     /**
      * 落地页访问

+ 64 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwGroupActualController.java

@@ -0,0 +1,64 @@
+package com.fs.company.controller.qw;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fs.common.result.Result;
+import com.fs.qw.domain.QwGroupActual;
+import com.fs.qw.domain.QwGroupLiveCode;
+import com.fs.qw.service.IQwGroupActualService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 群活码实际二维码表 前端控制器
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-28
+ */
+@RestController
+@RequestMapping("/qwGroupActual")
+public class QwGroupActualController {
+    @Autowired
+    private IQwGroupActualService qwGroupActualService;
+
+    /**
+     * 分页查询渠道
+     */
+    @GetMapping("/page")
+    public Result<IPage<QwGroupActual>> page(
+            @RequestParam(defaultValue = "1") Long pageNum,
+            @RequestParam(defaultValue = "10") Long pageSize,
+            @RequestParam(required = false) String status,
+            @RequestParam(required = false) String groupName,
+            @RequestParam(required = false) Long liveCodeId
+    ) {
+        Page<QwGroupActual> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<QwGroupActual> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(StrUtil.isNotBlank(groupName), QwGroupActual::getGroupName, groupName);
+        wrapper.eq(StrUtil.isNotBlank(status), QwGroupActual::getStatus, status);
+        wrapper.eq(ObjectUtil.isNotEmpty(liveCodeId), QwGroupActual::getLiveCodeId, liveCodeId);
+        wrapper.orderByDesc(QwGroupActual::getCreateTime);
+        IPage<QwGroupActual> result = qwGroupActualService.page(page, wrapper);
+        return Result.success(result);
+    }
+
+    /**
+     * 创建群活码/修改群活码
+     */
+    @PostMapping("/addOrUpdate")
+    public Result<Void> create(@RequestBody @Validated QwGroupActual qwGroupLiveCode) {
+        boolean success = false;
+        if (qwGroupLiveCode.getId() != null) {
+            success = qwGroupActualService.updateById(qwGroupLiveCode);
+        } else {
+            success = qwGroupActualService.save(qwGroupLiveCode);
+        }
+        return success ? Result.success() : Result.error("创建失败");
+    }
+}

+ 60 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwGroupLiveCodeController.java

@@ -0,0 +1,60 @@
+package com.fs.company.controller.qw;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fs.common.result.Result;
+import com.fs.qw.domain.QwGroupLiveCode;
+import com.fs.qw.service.IQwGroupLiveCodeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 群活码 前端控制器
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-28
+ */
+@RestController
+@RequestMapping("/qwGroupLiveCode")
+public class QwGroupLiveCodeController {
+    @Autowired
+    private IQwGroupLiveCodeService qwGroupLiveCodeService;
+
+    /**
+     * 分页查询渠道
+     */
+    @GetMapping("/page")
+    public Result<IPage<QwGroupLiveCode>> page(
+            @RequestParam(defaultValue = "1") Long pageNum,
+            @RequestParam(defaultValue = "10") Long pageSize,
+            @RequestParam(required = false) String status,
+            @RequestParam(required = false) String groupName
+    ) {
+        Page<QwGroupLiveCode> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<QwGroupLiveCode> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(StrUtil.isNotBlank(groupName), QwGroupLiveCode::getGroupName, groupName);
+        wrapper.like(StrUtil.isNotBlank(status), QwGroupLiveCode::getStatus, status);
+        wrapper.orderByDesc(QwGroupLiveCode::getCreateTime);
+        IPage<QwGroupLiveCode> result = qwGroupLiveCodeService.page(page, wrapper);
+        return Result.success(result);
+    }
+
+    /**
+     * 创建群活码/修改群活码
+     */
+    @PostMapping("/addOrUpdate")
+    public Result<Void> create(@RequestBody @Validated QwGroupLiveCode qwGroupLiveCode) {
+        boolean success = false;
+        if (qwGroupLiveCode.getId() != null) {
+            success = qwGroupLiveCodeService.updateById(qwGroupLiveCode);
+        } else {
+            success = qwGroupLiveCodeService.save(qwGroupLiveCode);
+        }
+        return success ? Result.success() : Result.error("创建失败");
+    }
+}

+ 54 - 0
fs-service/src/main/java/com/fs/newAdv/domain/AdvChannelEntity.java

@@ -0,0 +1,54 @@
+package com.fs.newAdv.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 广告渠道表
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-27
+ */
+@Getter
+@Setter
+@TableName("adv_channel")
+@ApiModel(value = "AdvChannelEntity对象", description = "广告渠道表")
+public class AdvChannelEntity extends Model<AdvChannelEntity> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("渠道名称/分组名称")
+    @TableField("channel_name")
+    private String channelName;
+
+    @ApiModelProperty("父id")
+    @TableField("parent_id")
+    private Long parentId;
+
+    @TableField(value = "create_time", strategy = FieldStrategy.NOT_NULL)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    @TableField(value = "update_time", strategy = FieldStrategy.NOT_NULL)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+}

+ 45 - 0
fs-service/src/main/java/com/fs/newAdv/domain/AdvProjectEntity.java

@@ -0,0 +1,45 @@
+package com.fs.newAdv.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-27
+ */
+@Getter
+@Setter
+@TableName("adv_project")
+@ApiModel(value = "AdvProjectEntity对象", description = "")
+public class AdvProjectEntity extends Model<AdvProjectEntity> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("项目名称")
+    @TableField("project_name")
+    private String projectName;
+
+    @TableField(value = "create_time", strategy = FieldStrategy.NOT_NULL)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+}

+ 2 - 1
fs-service/src/main/java/com/fs/newAdv/domain/Site.java

@@ -29,7 +29,8 @@ public class Site implements Serializable {
      * 站点名称
      */
     private String siteName;
-
+    private Long channelId;
+    private String channelName;
     /**
      * 投放类型 1线上 2线下
      */

+ 5 - 0
fs-service/src/main/java/com/fs/newAdv/domain/SiteStatistics.java

@@ -31,6 +31,11 @@ public class SiteStatistics implements Serializable {
      */
     private Long siteId;
 
+    /**
+     * 站点名称
+     */
+    private String siteName;
+
     /**
      * ROI
      */

+ 21 - 0
fs-service/src/main/java/com/fs/newAdv/dto/req/ChannelSaveBatchReq.java

@@ -0,0 +1,21 @@
+package com.fs.newAdv.dto.req;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ChannelSaveBatchReq implements Serializable {
+    @ApiModelProperty("渠道名称/分组名称")
+    private String channelName;
+
+    @ApiModelProperty("父id")
+    private Long parentId;
+
+    @ApiModelProperty("复制数量")
+    private Integer num;
+
+    @ApiModelProperty("起始编号")
+    private Integer start;
+}

+ 18 - 0
fs-service/src/main/java/com/fs/newAdv/mapper/AdvChannelMapper.java

@@ -0,0 +1,18 @@
+package com.fs.newAdv.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.newAdv.domain.AdvChannelEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 广告渠道表 Mapper 接口
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-27
+ */
+@Mapper
+public interface AdvChannelMapper extends BaseMapper<AdvChannelEntity> {
+
+}

+ 18 - 0
fs-service/src/main/java/com/fs/newAdv/mapper/AdvProjectMapper.java

@@ -0,0 +1,18 @@
+package com.fs.newAdv.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.newAdv.domain.AdvProjectEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-27
+ */
+@Mapper
+public interface AdvProjectMapper extends BaseMapper<AdvProjectEntity> {
+
+}

+ 16 - 0
fs-service/src/main/java/com/fs/newAdv/service/IAdvChannelService.java

@@ -0,0 +1,16 @@
+package com.fs.newAdv.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.newAdv.domain.AdvChannelEntity;
+
+/**
+ * <p>
+ * 广告渠道表 服务类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-27
+ */
+public interface IAdvChannelService extends IService<AdvChannelEntity> {
+
+}

+ 16 - 0
fs-service/src/main/java/com/fs/newAdv/service/IAdvProjectService.java

@@ -0,0 +1,16 @@
+package com.fs.newAdv.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.newAdv.domain.AdvProjectEntity;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-27
+ */
+public interface IAdvProjectService extends IService<AdvProjectEntity> {
+
+}

+ 7 - 0
fs-service/src/main/java/com/fs/newAdv/service/ISiteService.java

@@ -22,5 +22,12 @@ public interface ISiteService extends IService<Site> {
      * 查询启用的站点
      */
     List<Site> selectEnabledSite();
+
+    /**
+     * 根据模板查询站点
+     * @param id
+     * @return
+     */
+    boolean findByTemplateId(String id);
 }
 

+ 20 - 0
fs-service/src/main/java/com/fs/newAdv/service/impl/AdvChannelServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fs.newAdv.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.newAdv.domain.AdvChannelEntity;
+import com.fs.newAdv.mapper.AdvChannelMapper;
+import com.fs.newAdv.service.IAdvChannelService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 广告渠道表 服务实现类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-27
+ */
+@Service
+public class AdvChannelServiceImpl extends ServiceImpl<AdvChannelMapper, AdvChannelEntity> implements IAdvChannelService {
+
+}

+ 20 - 0
fs-service/src/main/java/com/fs/newAdv/service/impl/AdvProjectServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fs.newAdv.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.newAdv.domain.AdvProjectEntity;
+import com.fs.newAdv.mapper.AdvProjectMapper;
+import com.fs.newAdv.service.IAdvProjectService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-27
+ */
+@Service
+public class AdvProjectServiceImpl extends ServiceImpl<AdvProjectMapper, AdvProjectEntity> implements IAdvProjectService {
+
+}

+ 7 - 1
fs-service/src/main/java/com/fs/newAdv/service/impl/SiteServiceImpl.java

@@ -25,7 +25,7 @@ public class SiteServiceImpl extends ServiceImpl<SiteMapper, Site> implements IS
     @Transactional(rollbackFor = Exception.class)
     public void createSite(Site site) {
         this.save(site);
-        site.setSiteUrl("https://" + site.getLaunchDomain() + "/landing/index.html/?siteId=" + site.getId());
+        site.setSiteUrl("https://" + site.getLaunchDomain() + "/#/pages/index/index?siteId=" + site.getId());
         this.updateById(site);
     }
 
@@ -34,5 +34,11 @@ public class SiteServiceImpl extends ServiceImpl<SiteMapper, Site> implements IS
         return this.list(new LambdaQueryWrapper<Site>()
                 .eq(Site::getStatus, 0));
     }
+
+    @Override
+    public boolean findByTemplateId(String id) {
+        return !this.list(new LambdaQueryWrapper<Site>()
+                .eq(Site::getLaunchPageId, id)).isEmpty();
+    }
 }
 

+ 74 - 0
fs-service/src/main/java/com/fs/qw/domain/QwGroupActual.java

@@ -0,0 +1,74 @@
+package com.fs.qw.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 群活码实际二维码表
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-28
+ */
+@Getter
+@Setter
+@TableName("qw_group_actual")
+@ApiModel(value = "QwGroupActual对象", description = "群活码实际二维码表")
+public class QwGroupActual extends Model<QwGroupActual> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId("id")
+    private Long id;
+
+    @ApiModelProperty("活码id")
+    @TableField("live_code_id")
+    private Long liveCodeId;
+
+    @ApiModelProperty("实际群二维码")
+    @TableField("group_url")
+    private String groupUrl;
+
+    @ApiModelProperty("实际群名称")
+    @TableField("group_name")
+    private String groupName;
+
+    @ApiModelProperty("扫码上限")
+    @TableField("limit_num")
+    private String limitNum;
+
+    @ApiModelProperty("分配数")
+    @TableField("assign_num")
+    private Integer assignNum;
+
+    @ApiModelProperty("有效期")
+    @TableField("efficient_time")
+    private LocalDateTime efficientTime;
+
+    @ApiModelProperty("是否启用 1是 0否")
+    @TableField("status")
+    private String status;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+}

+ 75 - 0
fs-service/src/main/java/com/fs/qw/domain/QwGroupLiveCode.java

@@ -0,0 +1,75 @@
+package com.fs.qw.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 群活码
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-28
+ */
+@Getter
+@Setter
+@TableName("qw_group_live_code")
+@ApiModel(value = "QwGroupLiveCode对象", description = "群活码")
+public class QwGroupLiveCode extends Model<QwGroupLiveCode> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("活码名称")
+    @TableField("group_name")
+    private String groupName;
+
+    @ApiModelProperty("实际二维码数量")
+    @TableField("qrcode_num")
+    private Integer qrcodeNum;
+
+    @ApiModelProperty("今日加群数")
+    @TableField("to_day_num")
+    private Integer toDayNum;
+
+    @ApiModelProperty("累积加群数")
+    @TableField("count_num")
+    private Long countNum;
+
+    @ApiModelProperty("项目名称")
+    @TableField("project_name")
+    private String projectName;
+
+    @ApiModelProperty("项目id")
+    @TableField("project_id")
+    private Long projectId;
+
+    @ApiModelProperty("是否启用 1是 0否")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+}

+ 18 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwGroupActualMapper.java

@@ -0,0 +1,18 @@
+package com.fs.qw.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.qw.domain.QwGroupActual;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 群活码实际二维码表 Mapper 接口
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-28
+ */
+@Mapper
+public interface QwGroupActualMapper extends BaseMapper<QwGroupActual> {
+
+}

+ 18 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwGroupLiveCodeMapper.java

@@ -0,0 +1,18 @@
+package com.fs.qw.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.qw.domain.QwGroupLiveCode;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 群活码 Mapper 接口
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-28
+ */
+@Mapper
+public interface QwGroupLiveCodeMapper extends BaseMapper<QwGroupLiveCode> {
+
+}

+ 17 - 0
fs-service/src/main/java/com/fs/qw/service/IQwGroupActualService.java

@@ -0,0 +1,17 @@
+package com.fs.qw.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.qw.domain.QwGroupActual;
+
+
+/**
+ * <p>
+ * 群活码实际二维码表 服务类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-28
+ */
+public interface IQwGroupActualService extends IService<QwGroupActual> {
+
+}

+ 17 - 0
fs-service/src/main/java/com/fs/qw/service/IQwGroupLiveCodeService.java

@@ -0,0 +1,17 @@
+package com.fs.qw.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.qw.domain.QwGroupLiveCode;
+
+
+/**
+ * <p>
+ * 群活码 服务类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-28
+ */
+public interface IQwGroupLiveCodeService extends IService<QwGroupLiveCode> {
+
+}

+ 22 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwGroupActualServiceImpl.java

@@ -0,0 +1,22 @@
+package com.fs.qw.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import com.fs.qw.domain.QwGroupActual;
+import com.fs.qw.mapper.QwGroupActualMapper;
+
+import com.fs.qw.service.IQwGroupActualService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 群活码实际二维码表 服务实现类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-28
+ */
+@Service
+public class QwGroupActualServiceImpl extends ServiceImpl<QwGroupActualMapper, QwGroupActual> implements IQwGroupActualService {
+
+}

+ 20 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwGroupLiveCodeServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fs.qw.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.qw.domain.QwGroupLiveCode;
+import com.fs.qw.mapper.QwGroupLiveCodeMapper;
+import com.fs.qw.service.IQwGroupLiveCodeService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 群活码 服务实现类
+ * </p>
+ *
+ * @author zhangqin
+ * @since 2025-11-28
+ */
+@Service
+public class QwGroupLiveCodeServiceImpl extends ServiceImpl<QwGroupLiveCodeMapper, QwGroupLiveCode> implements IQwGroupLiveCodeService {
+
+}