Browse Source

Merge branch 'cpq-dev' of wangfan/adweb3-server into master

chenpeiqing 3 months ago
parent
commit
7890880d7e
16 changed files with 763 additions and 295 deletions
  1. 3 0
      jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/SsrfFileTypeFilter.java
  2. 6 0
      jeecg-module-system/jeecg-system-biz/pom.xml
  3. 127 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/common/service/DomainService.java
  4. 6 5
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/enquiry/service/impl/AdwebEnquiryServiceImpl.java
  5. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/product/service/impl/AdwebProductServiceImpl.java
  6. 162 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/server/controller/AdwebServerController.java
  7. 102 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/server/entity/AdwebServer.java
  8. 14 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/server/mapper/AdwebServerMapper.java
  9. 5 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/server/mapper/xml/AdwebServerMapper.xml
  10. 14 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/server/service/IAdwebServerService.java
  11. 18 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/server/service/impl/AdwebServerServiceImpl.java
  12. 65 6
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/site/controller/WPSiteController.java
  13. 1 42
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/site/entity/AdwebSite.java
  14. 223 234
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/site/service/SelfWebSiteService.java
  15. 2 7
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/site/service/SelfWebSiteServiceCommon.java
  16. 14 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/site/service/SiteManageService.java

+ 3 - 0
jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/SsrfFileTypeFilter.java

@@ -69,6 +69,9 @@ public class SsrfFileTypeFilter {
         FILE_TYPE_WHITE_LIST.add("apk");
         FILE_TYPE_WHITE_LIST.add("wgt");
 
+        // 秘钥文件后缀
+        FILE_TYPE_WHITE_LIST.add("pem");
+        FILE_TYPE_WHITE_LIST.add("cer");
         //设置禁止文件的头部标记
         FILE_TYPE_MAP.put("3c25402070616765206c", "jsp");
         FILE_TYPE_MAP.put("3c3f7068700a0a2f2a2a0a202a205048", "php");

+ 6 - 0
jeecg-module-system/jeecg-system-biz/pom.xml

@@ -113,6 +113,12 @@
             <artifactId>ganymed-ssh2</artifactId>
             <version>262</version>
         </dependency>
+
+        <dependency>
+            <groupId>dnsjava</groupId>
+            <artifactId>dnsjava</artifactId>
+            <version>3.5.2</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 127 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/common/service/DomainService.java

@@ -0,0 +1,127 @@
+package org.jeecg.modules.adweb.common.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.xbill.DNS.CNAMERecord;
+import org.xbill.DNS.Lookup;
+import org.xbill.DNS.Record;
+import org.xbill.DNS.Type;
+
+import java.net.InetAddress;
+import java.util.List;
+
+
+/**
+ * @Author: 汤星鹏
+ * @Description: 域名检测service
+ * @Date: 2025/1/6 9:13
+ */
+@Service
+@Slf4j
+public class DomainService {
+
+    /**
+     * 核实域名是否指向规定cname
+     *
+     * @param cname  网站cname
+     * @param domain 站点域名
+     * @return
+     * @author Cyan -- 2019/12/6 11:47
+     * @Update chenpeiqing -- 2025/1/3 17:53
+     */
+    public Boolean checkDomainIsCname(String cname, String domain) {
+        boolean flag = false;
+        try {
+            Record[] records = null;
+            Lookup lookup = new Lookup(domain, Type.CNAME);
+            lookup.run();
+            //连通并获取结果集
+            if (lookup.getResult() == Lookup.SUCCESSFUL) {
+                records = lookup.getAnswers();
+            } else {
+                //未查到结果
+                log.info("未查询到结果!");
+                return false;
+            }
+            for (Record record : records) {
+                CNAMERecord mx = (CNAMERecord) record;
+                log.info("域名:{}  ", mx.getName());
+                log.info("CNAME: {} ", mx.getTarget().toString());
+                int code = mx.getTarget().toString().indexOf(cname);
+                if (-1 != code) {
+                    flag = true;
+                }
+            }
+        } catch (Exception e) {
+            log.error("核实域名是否指向规定cname: {}", e.getMessage());
+            flag = false;
+        }
+        return flag;
+    }
+
+    /**
+     * 核实域名是否指向规定cname
+     *
+     * @param ip     网站ip
+     * @param domain 站点域名
+     * @return true:域名指向了ip   false:域名没有指向ip
+     * @author Cyan -- 2019/12/6 11:47
+     */
+    public Boolean checkDomainIsIp(String domain, String ip) {
+        Boolean flag = false;
+        try {
+            InetAddress[] addresses = InetAddress.getAllByName(domain);
+            for (int i = 0; i < addresses.length; i++) {
+                String hostAddress = addresses[i].getHostAddress();
+                int code = hostAddress.indexOf(ip);
+                if (-1 != code) {
+                    flag = true;
+                    break;
+                }
+            }
+        } catch (Exception e) {
+            log.error("核实域名是否指向规定cname: {}", e.getMessage());
+            flag = false;
+        }
+        return flag;
+    }
+
+    /**
+     * 核实域名是否指向规定cname或ip
+     *
+     * @param cname  网站cname
+     * @param domain 站点域名
+     * @param ip
+     * @return
+     * @author Cyan -- 2019/12/6 11:47
+     */
+    public Boolean checkDomainIsCnameOrIp(String cname, String domain, String ip) {
+        Boolean flag = false;
+        boolean toCname = checkDomainIsCname(cname, domain);
+        boolean toIP = checkDomainIsIp(domain, ip);
+        //cname或ip  二者有其一指向正确
+        if (toCname || toIP) {
+            flag = true;
+        }
+        return flag;
+    }
+
+    /**
+     * 检验域名以什么开头
+     *
+     * @param domain   域名
+     * @param headStrs 头字符串集合
+     * @return true:是以存在集合中的元素开头   false:不是以存在集合中的元素开头
+     * @author Cyan -- 2019/12/12 9:36
+     */
+    public Boolean checkDomainBegin(String domain, List<String> headStrs) {
+        Boolean flag = false;
+        for (String headStr : headStrs) {
+            if (domain.startsWith(headStr)) {
+                flag = true;
+                break;
+            }
+        }
+        return flag;
+    }
+}

+ 6 - 5
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/enquiry/service/impl/AdwebEnquiryServiceImpl.java

@@ -19,9 +19,9 @@ import org.jeecg.common.constant.WebsocketConst;
 import org.jeecg.common.system.vo.DictModel;
 import org.jeecg.common.system.vo.DictPropertyModel;
 import org.jeecg.common.util.FastJsonUtil;
-import org.jeecg.modules.adweb.common.jedis.ObjectUtil;
 import org.jeecg.modules.adweb.common.constant.NumConstant;
 import org.jeecg.modules.adweb.common.dto.CountryAreaApiDto;
+import org.jeecg.modules.adweb.common.jedis.ObjectUtil;
 import org.jeecg.modules.adweb.common.service.FeishuService;
 import org.jeecg.modules.adweb.common.service.WebSocketService;
 import org.jeecg.modules.adweb.common.util.*;
@@ -195,6 +195,9 @@ public class AdwebEnquiryServiceImpl extends ServiceImpl<AdwebEnquiryMapper, Adw
     @Value("${judge_waste_enquiry.ip.notBlackListDate}")
     private Integer ipNotBlackListDate;
 
+    private static final int USER_EFFECTIVE_ACTIVE = 1;
+    private static final int USER_EFFECTIVE_WAIT_ACTIVE = 2;
+
     @PostConstruct
     public void startEnquiryRedisListener() {
         enquiryRedisService.init();
@@ -308,15 +311,13 @@ public class AdwebEnquiryServiceImpl extends ServiceImpl<AdwebEnquiryMapper, Adw
             log.error("站点为:{},  recordId为:{} 保存询盘到数据库失败,原因是:{}", adwebSite.getName(), enquiryDto.getRecordId(), e.getMessage());
         }
 
-        // 给该站点所属的用户发送消息 // TODO 更改为站内信 和 websocket 通知
+
+        // 站内websocket通知
         AdwebSite targetSite = adwebSiteService.getSiteByCode(target.getSiteCode());
         SysUser sysUser = sysUserService.getUserByName("admin");
         String[] userIds = {targetSite.getUid(), sysUser.getId()};
-
-        // TODO 之后仅对有效询盘进行发送消息通知
         webSocketService.sendMessage(userIds, "询盘通知", "您已经收到询盘,请尽快处理", WebsocketConst.CMD_ENQUIRY);
 
-
         // 发送询盘邮件
         sendValidateEmail(target, adwebSite, principalEmailMap);
     }

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/product/service/impl/AdwebProductServiceImpl.java

@@ -143,7 +143,7 @@ public class AdwebProductServiceImpl extends ServiceImpl<AdwebProductMapper, Adw
                 HttpResponse response = HttpRequest
                         .post(SOHOEB2B_PUSH_PRODUCT_API)
                         .header("Content-Type", "application/json")
-                        .header("Authorization", "f354b8a705c862abeae1f4f96dc55999fb9b3579")
+                        .header("tokenAuth", "f354b8a705c862abeae1f4f96dc55999fb9b3579")
                         .body(params.toString())
                         .execute(true);
 

+ 162 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/server/controller/AdwebServerController.java

@@ -0,0 +1,162 @@
+package org.jeecg.modules.adweb.server.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.adweb.server.entity.AdwebServer;
+import org.jeecg.modules.adweb.server.service.IAdwebServerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import java.util.Arrays;
+
+/**
+ * @Description: wp站点服务器配置信息
+ * @Author: jeecg-boot
+ * @Date: 2025-01-02
+ * @Version: V1.0
+ */
+@Tag(name = "wp站点服务器配置信息")
+@RestController
+@RequestMapping("/adweb/adwebServer")
+@Slf4j
+public class AdwebServerController extends JeecgController<AdwebServer, IAdwebServerService> {
+    @Autowired
+    private IAdwebServerService adwebServerService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param adwebServer
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    //@AutoLog(value = "wp站点服务器配置信息-分页列表查询")
+    @Operation(summary = "wp站点服务器配置信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<AdwebServer>> queryPageList(AdwebServer adwebServer,
+                                                    @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                    @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                    HttpServletRequest req) {
+        QueryWrapper<AdwebServer> queryWrapper = QueryGenerator.initQueryWrapper(adwebServer, req.getParameterMap());
+        Page<AdwebServer> page = new Page<AdwebServer>(pageNo, pageSize);
+        IPage<AdwebServer> pageList = adwebServerService.page(page, queryWrapper);
+        return Result.OK(pageList);
+    }
+
+    /**
+     * 添加
+     *
+     * @param adwebServer
+     * @return
+     */
+    @AutoLog(value = "wp站点服务器配置信息-添加")
+    @Operation(summary = "wp站点服务器配置信息-添加")
+    @PreAuthorize("@jps.requiresPermissions('adweb:adweb_server:add')")
+    @PostMapping(value = "/add")
+    public Result<String> add(@RequestBody AdwebServer adwebServer) {
+        adwebServerService.save(adwebServer);
+        return Result.OK("添加成功!");
+    }
+
+    /**
+     * 编辑
+     *
+     * @param adwebServer
+     * @return
+     */
+    @AutoLog(value = "wp站点服务器配置信息-编辑")
+    @Operation(summary = "wp站点服务器配置信息-编辑")
+    @PreAuthorize("@jps.requiresPermissions('adweb:adweb_server:edit')")
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<String> edit(@RequestBody AdwebServer adwebServer) {
+        adwebServerService.updateById(adwebServer);
+        return Result.OK("编辑成功!");
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "wp站点服务器配置信息-通过id删除")
+    @Operation(summary = "wp站点服务器配置信息-通过id删除")
+    @PreAuthorize("@jps.requiresPermissions('adweb:adweb_server:delete')")
+    @DeleteMapping(value = "/delete")
+    public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
+        adwebServerService.removeById(id);
+        return Result.OK("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "wp站点服务器配置信息-批量删除")
+    @Operation(summary = "wp站点服务器配置信息-批量删除")
+    @PreAuthorize("@jps.requiresPermissions('adweb:adweb_server:deleteBatch')")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.adwebServerService.removeByIds(Arrays.asList(ids.split(",")));
+        return Result.OK("批量删除成功!");
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    //@AutoLog(value = "wp站点服务器配置信息-通过id查询")
+    @Operation(summary = "wp站点服务器配置信息-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<AdwebServer> queryById(@RequestParam(name = "id", required = true) String id) {
+        AdwebServer adwebServer = adwebServerService.getById(id);
+        if (adwebServer == null) {
+            return Result.error("未找到对应数据");
+        }
+        return Result.OK(adwebServer);
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param adwebServer
+     */
+    @PreAuthorize("@jps.requiresPermissions('adweb:adweb_server:exportXls')")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, AdwebServer adwebServer) {
+        return super.exportXls(request, adwebServer, AdwebServer.class, "wp站点服务器配置信息");
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @PreAuthorize("@jps.requiresPermissions('adweb:adweb_server:importExcel')")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, AdwebServer.class);
+    }
+
+}

+ 102 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/server/entity/AdwebServer.java

@@ -0,0 +1,102 @@
+package org.jeecg.modules.adweb.server.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+
+/**
+ * @Description: wp站点服务器配置信息
+ * @Author: jeecg-boot
+ * @Date: 2025-01-02
+ * @Version: V1.0
+ */
+@Data
+@TableName("adweb_server")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description = "wp站点服务器配置信息")
+public class AdwebServer implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @Schema(description = "主键")
+    private java.lang.String id;
+    /**
+     * 创建人
+     */
+    @Schema(description = "创建人")
+    private java.lang.String createBy;
+    /**
+     * 创建日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "创建日期")
+    private java.util.Date createTime;
+    /**
+     * 更新人
+     */
+    @Schema(description = "更新人")
+    private java.lang.String updateBy;
+    /**
+     * 更新日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "更新日期")
+    private java.util.Date updateTime;
+    /**
+     * 服务器IP
+     */
+    @Excel(name = "服务器IP", width = 15)
+    @Schema(description = "服务器IP")
+    private java.lang.String serverIp;
+    /**
+     * 服务器端口
+     */
+    @Excel(name = "服务器端口", width = 15)
+    @Schema(description = "服务器端口")
+    private java.lang.String serverPort;
+    /**
+     * 用户名
+     */
+    @Excel(name = "用户名", width = 15)
+    @Schema(description = "用户名")
+    private java.lang.String userName;
+    /**
+     * 密码
+     */
+    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
+    @Excel(name = "密码", width = 15)
+    @Schema(description = "密码")
+    private java.lang.String serverPassword;
+    /**
+     * 秘钥
+     */
+    @Excel(name = "秘钥", width = 15)
+    @Schema(description = "秘钥")
+    private java.lang.String serverPem;
+    /**
+     * 服务器名称
+     */
+    @Excel(name = "服务器名称", width = 15)
+    @Schema(description = "服务器名称")
+    private java.lang.String serverName;
+
+    @Excel(name = "CNAME记录", width = 15)
+    @Schema(description = "CNAME记录")
+    private java.lang.String cname;
+}

+ 14 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/server/mapper/AdwebServerMapper.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.adweb.server.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.adweb.server.entity.AdwebServer;
+
+/**
+ * @Description: wp站点服务器配置信息
+ * @Author: jeecg-boot
+ * @Date: 2025-01-02
+ * @Version: V1.0
+ */
+public interface AdwebServerMapper extends BaseMapper<AdwebServer> {
+
+}

+ 5 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/server/mapper/xml/AdwebServerMapper.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.adweb.server.mapper.AdwebServerMapper">
+
+</mapper>

+ 14 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/server/service/IAdwebServerService.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.adweb.server.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.adweb.server.entity.AdwebServer;
+
+/**
+ * @Description: wp站点服务器配置信息
+ * @Author: jeecg-boot
+ * @Date: 2025-01-02
+ * @Version: V1.0
+ */
+public interface IAdwebServerService extends IService<AdwebServer> {
+
+}

+ 18 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/server/service/impl/AdwebServerServiceImpl.java

@@ -0,0 +1,18 @@
+package org.jeecg.modules.adweb.server.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.adweb.server.entity.AdwebServer;
+import org.jeecg.modules.adweb.server.mapper.AdwebServerMapper;
+import org.jeecg.modules.adweb.server.service.IAdwebServerService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Description: wp站点服务器配置信息
+ * @Author: jeecg-boot
+ * @Date: 2025-01-02
+ * @Version: V1.0
+ */
+@Service
+public class AdwebServerServiceImpl extends ServiceImpl<AdwebServerMapper, AdwebServer> implements IAdwebServerService {
+
+}

+ 65 - 6
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/site/controller/WPSiteController.java

@@ -9,11 +9,19 @@ import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.config.security.utils.SecureUtil;
+import org.jeecg.modules.adweb.common.service.DomainService;
 import org.jeecg.modules.adweb.common.util.AdwebRedisUtil;
+import org.jeecg.modules.adweb.site.entity.AdwebSite;
 import org.jeecg.modules.adweb.site.service.SelfWebSiteService;
+import org.jeecg.modules.adweb.site.service.SiteManageService;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @autor jerry
  * @date: 2022/1/11 20:45
@@ -29,6 +37,12 @@ public class WPSiteController {
     @Resource
     private AdwebRedisUtil adwebRedisUtil;
 
+    @Resource
+    private SiteManageService siteManageService;
+
+    @Resource
+    private DomainService domainService;
+
     /**
      * 创建站点
      *
@@ -64,15 +78,24 @@ public class WPSiteController {
     }
 
     /**
-     * 发布站点
+     * 发布网站接口
+     * <p>
+     * 该方法通过接收服务器ID、域名和站点代码来申请发布一个网站
+     * 用户通过该接口提交发布申请,实际的发布操作由后台异步处理
      *
-     * @param domain 域名
-     * @param siteId 站点ID
-     * @return
+     * @param request  HttpServletRequest对象,用于获取请求相关信息
+     * @param serverId 服务器ID,标识要发布的服务器
+     * @param domain   域名,标识要发布的网站域名
+     * @param siteCode 站点代码,用于识别和验证要发布的站点
+     * @return 返回一个Result对象,包含发布申请的结果信息
      */
     @RequestMapping("releaseWebsite")
-    public Result<?> releaseWebsite(HttpServletRequest request, String domain, Integer siteId) {
-        return selfWebSiteService.releaseSite(request, domain, siteId);
+    public Result<?> releaseWebsite(HttpServletRequest request, String serverId, String domain, String siteCode) {
+
+        // 站点发布
+        selfWebSiteService.releaseSite(request, serverId, domain, siteCode);
+
+        return Result.OK("申请发布站点成功,请等待发布通知,或者去站点管理查看结果!");
     }
 
     /**
@@ -118,4 +141,40 @@ public class WPSiteController {
         return Result.OK(result);
     }
 
+    @RequestMapping(value = "/check/domain", method = RequestMethod.POST)
+    @ResponseBody
+    public Result<?> checkDomain(HttpServletRequest request, String cname, String ip, String domain) {
+
+        log.info("====== checkDomain cname:{},ip:{},domain:{} ======", cname, ip, domain);
+        if (cname.equalsIgnoreCase(domain) || ip.equalsIgnoreCase(domain)) {
+
+            return new Result<>(100, "请勿提交我们的CNAME或IP");
+        }
+
+        //提交的域名已发布或被他人使用
+        List<AdwebSite> siteList = siteManageService.checkSiteDomainIsExists(domain);
+        log.info("siteList:{}", siteList);
+        if (!siteList.isEmpty()) {
+            return new Result<>(102, "您填写的域名已发布或被他人使用,请勿重复提交!");
+        }
+        //检验域名是否以http开头
+        List<String> headStrs = new ArrayList<>();
+        headStrs.add("http://");
+        headStrs.add("https://");
+        boolean isHttp = domainService.checkDomainBegin(domain, headStrs);
+        //isHttp == true 是以http或https开头 直接返回
+        if (isHttp) {
+            return new Result<>(101, "域名请勿以http://或https://开头");
+        }
+        //检验域名是否指向cname或ip
+        boolean isToCnameOrIp = domainService.checkDomainIsCnameOrIp(cname, domain, ip);
+        if (isToCnameOrIp) {
+            //满足不以http等开头 并且域名指向cname或ip中的一个
+            return Result.ok();
+        } else {
+            //未指向cname或ip任意一个
+            return new Result<>(103, "请确认您的域名已指向CNAME或IP");
+        }
+    }
+
 }

+ 1 - 42
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/site/entity/AdwebSite.java

@@ -63,12 +63,6 @@ public class AdwebSite implements Serializable {
     @Schema(description = "站点域名")
     private java.lang.String domain;
     /**
-     * 站点备注
-     */
-    @Excel(name = "站点备注", width = 15)
-    @Schema(description = "站点备注")
-    private java.lang.String descirbe;
-    /**
      * 测试站点域名
      */
     @Excel(name = "测试站点域名", width = 15)
@@ -80,12 +74,7 @@ public class AdwebSite implements Serializable {
     @Excel(name = "是否有域名", width = 15)
     @Schema(description = "是否有域名")
     private java.lang.Integer isDomain;
-    /**
-     * CNAME记录
-     */
-    @Excel(name = "CNAME记录", width = 15)
-    @Schema(description = "CNAME记录")
-    private java.lang.String cname;
+
     /**
      * 模板code
      */
@@ -165,7 +154,6 @@ public class AdwebSite implements Serializable {
     @Excel(name = "释放人", width = 15)
     @Schema(description = "释放人")
     private java.lang.String releaseUid;
-
     /**
      * 发布正式环境时间(首次发布)
      */
@@ -175,21 +163,11 @@ public class AdwebSite implements Serializable {
     @Schema(description = "发布正式环境时间(首次发布)")
     private java.util.Date issueTime;
     /**
-     * 售后到期时间
-     */
-    @Excel(name = "售后到期时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @Schema(description = "售后到期时间")
-    private java.util.Date aftersaleTime;
-    /**
      * 当日询盘条数
      */
     @Excel(name = "当日询盘条数", width = 15)
     @Schema(description = "当日询盘条数")
     private java.lang.Integer dayEnquiryCount;
-
-
     /**
      * 创建时间
      */
@@ -210,25 +188,6 @@ public class AdwebSite implements Serializable {
     @Schema(description = "languageCode")
     private java.lang.String languageCode;
 
-    /**
-     * 排序
-     */
-    @Excel(name = "排序", width = 15)
-    @Schema(description = "排序")
-    private java.lang.Integer sort;
-    /**
-     * keywordsNum
-     */
-    @Excel(name = "keywordsNum", width = 15)
-    @Schema(description = "keywordsNum")
-    private java.lang.Integer keywordsNum;
-
-    /**
-     * developmentStatus
-     */
-    @Excel(name = "developmentStatus", width = 15)
-    @Schema(description = "developmentStatus")
-    private java.lang.Integer developmentStatus;
 
     /**
      * sys系统创建;manual关联

+ 223 - 234
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/site/service/SelfWebSiteService.java

@@ -8,12 +8,13 @@ import org.apache.commons.lang3.StringUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.WebsocketConst;
 import org.jeecg.common.system.vo.LoginUser;
-import org.jeecg.common.util.UUIDGenerator;
 import org.jeecg.modules.adweb.common.dto.ServerDTO;
 import org.jeecg.modules.adweb.common.service.FeishuService;
 import org.jeecg.modules.adweb.common.service.ShellService;
 import org.jeecg.modules.adweb.common.service.WebSocketService;
 import org.jeecg.modules.adweb.common.util.ShellSSH2Util;
+import org.jeecg.modules.adweb.server.entity.AdwebServer;
+import org.jeecg.modules.adweb.server.service.IAdwebServerService;
 import org.jeecg.modules.adweb.site.constant.WordPressConstants;
 import org.jeecg.modules.adweb.site.entity.AdwebSite;
 import org.jeecg.modules.adweb.system.entity.SysException;
@@ -51,12 +52,8 @@ public class SelfWebSiteService {
     @Resource
     private WebSocketService webSocketService;
 
-
-    @Value(value = "${jeecg.minio.dataPrefix}")
-    private String dataPrefix;
-
-    @Value(value = "${jeecg.minio_us.dataPrefix}")
-    private String usDataPrefix;
+    @Resource
+    private IAdwebServerService serverService;
 
     @Value("${AdwebSiteConnect.host}")
     private String host;
@@ -75,13 +72,17 @@ public class SelfWebSiteService {
 
     private String errorMsg = "";
 
-
     /**
-     * @param tempId 模板ID
-     * @param uid    系统用户信息
-     * @param name   站点名称
-     * @param planId 新建站点绑定的套餐
-     * @return
+     * 创建站点的方法
+     *
+     * @param user          当前登录用户
+     * @param tempId        模板ID
+     * @param uid           用户ID
+     * @param name          站点名称
+     * @param planId        套餐ID
+     * @param sysUser       系统用户
+     * @param giveDay       赠送天数
+     * @param compensateDay 补偿天数
      */
     @Async
     public void createSite(LoginUser user, Long tempId, String uid, String name, String planId, LoginUser sysUser, Integer giveDay, Integer compensateDay) {
@@ -139,6 +140,15 @@ public class SelfWebSiteService {
         }
     }
 
+    /**
+     * 删除指定的广告网站
+     * <p>
+     * 此方法通过执行远程服务器上的Shell脚本来删除广告网站资源,并在删除成功后通知用户
+     * 如果删除失败,会记录错误信息并抛出异常
+     *
+     * @param user      当前操作的用户,用于发送通知
+     * @param adwebSite 要删除的广告网站对象,包含网站代码和域名等信息
+     */
     @Async
     public void removeSite(LoginUser user, AdwebSite adwebSite) {
         try {
@@ -179,6 +189,13 @@ public class SelfWebSiteService {
         }
     }
 
+    /**
+     * 当执行Shell命令失败时调用此方法记录错误信息
+     *
+     * @param cmd       执行的Shell命令,用于标识操作
+     * @param adwebSite 发生错误的广告网站实例,包含站点信息
+     * @param errorMsg  错误信息描述,详细说明执行失败的原因
+     */
     private void exceShellFailed(String cmd, AdwebSite adwebSite, String errorMsg) {
         SysException sysException = new SysException();
 
@@ -190,6 +207,13 @@ public class SelfWebSiteService {
         sysExceptionService.save(sysException);
     }
 
+    /**
+     * 处理临时站点创建失败的逻辑
+     * 当临时站点创建失败时,此方法会被调用,更新站点状态并记录错误信息
+     *
+     * @param adwebSite 代表临时站点的对象,包含站点的相关信息
+     * @param errorMsg  描述创建失败的错误信息
+     */
     private void createSiteFailed(AdwebSite adwebSite, String errorMsg) {
         adwebSite.setStatus(4); // 临时站点创建失败
         siteService.updateById(adwebSite);
@@ -205,222 +229,26 @@ public class SelfWebSiteService {
     }
 
 
-    private void msgSetInSession(HttpServletRequest request, String line) {
-        HttpSession session = request.getSession();
-        if ("CP_TAR_GZ_START".equals(line)) {
-            session.setAttribute("testSiteProcess", "CP_TAR_GZ");
-        }
-        if ("SQL_DUMP_IMPORT_START".equals(line)) {
-            session.setAttribute("testSiteProcess", "SQL_DUMP_IMPORT");
-        }
-        if ("WP_UDONM_START".equals(line)) {
-            session.setAttribute("testSiteProcess", "WP_UDONM");
-        }
-        if ("WP_UDONM_END".equals(line)) {
-            session.setAttribute("testSiteProcess", "SUCCESS");
-        }
-    }
-
-    private void msgSetInSessionProd(HttpServletRequest request, String line) {
-        HttpSession session = request.getSession();
-        if ("wget_tar_start".equals(line)) {
-            session.setAttribute("prodSiteProcess", "wget_tar_start");
-        }
-        if ("wget_sql_start".equals(line)) {
-            session.setAttribute("prodSiteProcess", "wget_sql_start");
-        }
-        if ("start tar zxf".equals(line)) {
-            session.setAttribute("prodSiteProcess", "start tar zxf");
-        }
-        if ("wp_udomain_start".equals(line)) {
-            session.setAttribute("prodSiteProcess", "wp_udomain_start");
-        }
-        if ("wp_udomain_end".equals(line)) {
-            session.setAttribute("prodSiteProcess", "success");
-        }
-    }
-
-
-    /**
-     * 站点启动/停止
-     *
-     * @param sysUser
-     * @param siteId
-     * @param status
-     * @return
-     */
-    public boolean siteStartOrStop(LoginUser sysUser, Integer siteId, Integer status) {
-        AdwebSite adwebSite = siteService.getById(siteId);
-
-        // 获取站点所在生产服务器信息
-        ServerDTO serverInfo = new ServerDTO();
-        boolean flag = false;
-        switch (status) {
-            case 1:
-                flag = startSiteLocal(sysUser, adwebSite);
-                break;
-            case 2:
-                flag = stopSiteLocal(sysUser, adwebSite);
-                break;
-            case 3:
-                flag = startSite(sysUser, adwebSite, serverInfo);
-                break;
-            case 4:
-                flag = stopSite(sysUser, adwebSite, serverInfo);
-                break;
-        }
-        return flag;
-    }
-
     /**
-     * 站点启动脚本调用(未发布)
+     * 发布站点到生产环境
      *
-     * @param sysUser
-     * @param adwebSite
-     * @return
+     * @param request  HTTP请求对象,用于获取会话信息
+     * @param serverId 服务器ID,未在方法体内使用
+     * @param domain   域名,用于站点发布
+     * @param siteCode 站点代码,标识特定的站点
      */
-    private boolean startSiteLocal(LoginUser sysUser, AdwebSite adwebSite) {
-        //站点启动
-        String cmd = "/home/ci-user/shell/start_site " + adwebSite.getCode() + " ";
-        shellService.exceShellByPwd(cmd, host, port, username, password, new ShellSSH2Util.StdoutListener() {
-            @Override
-            public void stdout(String line) {
-                log.info("标准 :" + line);
-                if ("ERROR:FILE_NAME IS EXISTS".equals(line)) {
-                    // TODO ----
-                    log.error("恢复测试站点异常:" + line);
-                }
-            }
-
-            @Override
-            public void stderr(String line) {
-                log.info("错误 :" + line);
-            }
-        });
-        return siteStatusUpdate(sysUser, adwebSite, 0);
-    }
-
-    /**
-     * 站点停止脚本调用(未发布)
-     *
-     * @param sysUser
-     * @param adwebSite
-     * @return
-     */
-    private boolean stopSiteLocal(LoginUser sysUser, AdwebSite adwebSite) {
-        String cmd = "/home/ci-user/shell/stop_site " + adwebSite.getCode() + " ";
-        shellService.exceShellByPwd(cmd, host, port, username, password, new ShellSSH2Util.StdoutListener() {
-            @Override
-            public void stdout(String line) {
-                log.info("标准 :" + line);
-                if ("ERROR:FILE_NAME IS EXISTS".equals(line)) {
-                    // TODO ----
-                    log.error("停止测试站点异常:" + line);
-                }
-            }
-
-            @Override
-            public void stderr(String line) {
-                log.info("错误 :" + line);
-            }
-        });
-        return siteStatusUpdate(sysUser, adwebSite, 3);
-    }
-
-    /**
-     * 站点启动脚本调用(生产环境)
-     *
-     * @param sysUser
-     * @param adwebSite
-     * @return
-     */
-    private boolean startSite(LoginUser sysUser, AdwebSite adwebSite, ServerDTO serverInfo) {
-        //站点启动
-        String cmd = "./shell/start_site " + serverInfo.getIp() + " " + adwebSite.getCode() + " ";
-        shellService.exceShell(cmd, new ShellSSH2Util.StdoutListener() {
-            @Override
-            public void stdout(String line) {
-                log.info("MJJ控制台 :" + line);
-                if ("ERROR:FILE_NAME IS EXISTS".equals(line)) {
-                    // TODO ----
-                    log.error("恢复站点异常:" + line);
-                }
-            }
-
-            @Override
-            public void stderr(String line) {
-                log.info("错误 :" + line);
-            }
-        }, serverInfo);
-        return siteStatusUpdate(sysUser, adwebSite, 0);
-    }
-
-    /**
-     * 站点停止脚本调用(生产环境)
-     *
-     * @param sysUser
-     * @param adwebSite
-     * @return
-     */
-    private boolean stopSite(LoginUser sysUser, AdwebSite adwebSite, ServerDTO serverInfo) {
-        String cmd = "./shell/stop_site " + serverInfo.getIp() + " " + adwebSite.getCode() + " ";
-        shellService.exceShell(cmd, new ShellSSH2Util.StdoutListener() {
-            @Override
-            public void stdout(String line) {
-                log.info("MJJ控制台 :" + line);
-                if ("ERROR:FILE_NAME IS EXISTS".equals(line)) {
-                    // TODO ----
-                    log.error("停止站点异常:" + line);
-                }
-            }
-
-            @Override
-            public void stderr(String line) {
-                log.info("错误 :" + line);
-            }
-        }, serverInfo);
-        return siteStatusUpdate(sysUser, adwebSite, 3);
-    }
-
-
-    /**
-     * 站点状态更改
-     *
-     * @param sysUser
-     * @param adwebSite
-     * @param runStatus
-     * @return
-     */
-    private boolean siteStatusUpdate(LoginUser sysUser, AdwebSite adwebSite, Integer runStatus) {
-        if (runStatus.equals(3)) {
-            adwebSite.setStopTime(new Date());
-            adwebSite.setStopUid(sysUser.getId());
-        }
-        adwebSite.setRunStatus(runStatus);
-        return siteService.updateById(adwebSite);
-    }
-
-
-    /**
-     * 发布站点(生产环境)
-     *
-     * @param domain 新域名
-     * @param siteId 站点ID
-     */
-    public Result<?> releaseSite(HttpServletRequest request, String domain, Integer siteId) {
-        log.info("===== releaseSite domain:{},siteId:{} ====", domain, siteId);
+    @Async
+    public void releaseSite(HttpServletRequest request, String serverId, String domain, String siteCode) {
+        log.info("===== releaseSite domain:{},siteCode:{} ====", domain, siteCode);
         StringBuilder statusSuccess = new StringBuilder();
         StringBuilder statusFail = new StringBuilder();
-        AdwebSite adwebSite = siteService.getById(siteId);
-        String siteToken = UUIDGenerator.generate().toUpperCase();
+        AdwebSite adwebSite = siteService.getSiteByCode(siteCode);
         HttpSession session = request.getSession();
-//        String cmd = " ./shell/auto_website " + serverInfo.getIp() + " " + adwebSite.getCode() + " " + adwebSite.getInCode() + " " + domain + " " + siteToken + " " + tempDomain;
-        if (StringUtils.isEmpty(adwebSite.getDevServerIp())) {
-            return Result.error("该站点的服务器IP没有设置,请设置后在发布上线!");
-        }
-        log.info("===== releaseSite domain:{},siteId:{},getDevServerIp:{} ====", domain, siteId, adwebSite.getDevServerIp());
-        if ((!WordPressConstants.DEV_CI1.equals(adwebSite.getDevServerIp())) && (!WordPressConstants.DEV_CI2.equals(adwebSite.getDevServerIp()))) {
-            return Result.error("该站点的服务器IP设置不正确,请重试!");
+        AdwebServer adwebServer = serverService.getById(serverId);
+
+        if (adwebServer == null) {
+            log.error("发布生产环境时未指定服务器");
+            return;
         }
 
         String usWest118ServerShellPath = "/home/ci-user/shell";
@@ -432,7 +260,7 @@ public class SelfWebSiteService {
             domain = domain.replace("www.", "");
         }
         String dbName = domain.replaceAll("[^a-zA-Z0-9]", "") + "_" + adwebSite.getCode();
-        log.info("===== releaseSite domain:{},siteId:{},originDomain:{},domain:{},dbName:{} ====", domain, siteId, originDomain, domain, dbName);
+        log.info("===== releaseSite domain:{},siteCode:{},originDomain:{},domain:{},dbName:{} ====", domain, siteCode, originDomain, domain, dbName);
 
         String cmd = "";
         if (WordPressConstants.DEV_CI1.equals(adwebSite.getDevServerIp())) {
@@ -441,17 +269,18 @@ public class SelfWebSiteService {
         if (WordPressConstants.DEV_CI2.equals(adwebSite.getDevServerIp())) {
             cmd = "sudo sh " + usWest118ServerShellPath + "/adweb-publish-devci2_http.sh " + adwebSite.getCode() + " " + domain + " " + dbName;
         }
-        log.info("===== releaseSite originDomain:{},domain:{},siteId:{},cmd:{} ====", originDomain, domain, siteId, cmd);
+        log.info("===== releaseSite originDomain:{},domain:{},siteCode:{},cmd:{} ====", originDomain, domain, siteCode, cmd);
 
         if (StringUtils.isEmpty(cmd)) {
             String errorMsg = "网站上线脚本命令获取失败!";
             String title = "网站域名:" + originDomain + " 站点发布失败";
-            String message = "**站点ID:** " + siteId + "\n";
+            String message = "**站点ID:** " + siteCode + "\n";
             message += "**临时域名:** " + adwebSite.getDomainDev() + "\n";
             message += "**服务器IP:** " + adwebSite.getDevServerIp() + "\n";
             message += "**错误原因:** " + errorMsg + "\n";
             sendAdWebV2FeiShuMsg(title, message);
-            return Result.error("该站点的发布上线命令执行失败,请重试!");
+            Result.error("该站点的发布上线命令执行失败,请重试!");
+            return;
         }
 
 //        return false;
@@ -503,11 +332,11 @@ public class SelfWebSiteService {
 //            }
             //正式域名
 
-            log.info("===== releaseSite originDomain:{},domain:{},siteId:{},statusSuccess:{} ====", originDomain, domain, siteId, statusSuccess);
-            log.info("===== releaseSite originDomain:{},domain:{},siteId:{},statusFail:{} ====", originDomain, domain, siteId, statusFail);
+            log.info("===== releaseSite originDomain:{},domain:{},siteId:{},statusSuccess:{} ====", originDomain, domain, siteCode, statusSuccess);
+            log.info("===== releaseSite originDomain:{},domain:{},siteId:{},statusFail:{} ====", originDomain, domain, siteCode, statusFail);
             if (StringUtils.isNotEmpty(statusFail.toString())) {
                 String title = "网站域名:" + originDomain + " 站点发布失败";
-                String message = "**站点ID:** " + siteId + "\n";
+                String message = "**站点ID:** " + siteCode + "\n";
                 message += "**临时域名:** " + adwebSite.getDomainDev() + "\n";
                 message += "**服务器IP:** " + adwebSite.getDevServerIp() + "\n";
                 message += "**错误信息:** " + statusFail.toString() + "\n";
@@ -516,10 +345,10 @@ public class SelfWebSiteService {
                 // 站点发布失败
                 adwebSite.setStatus(6);
                 siteService.updateById(adwebSite);
-                return Result.error("网站发布上线失败!");
+                Result.error("网站发布上线失败!");
             } else {
                 String title = "网站域名:" + originDomain + " 站点发布成功";
-                String message = "**站点ID:** " + siteId + "\n";
+                String message = "**站点ID:** " + siteCode + "\n";
                 message += "**临时域名:** " + adwebSite.getDomainDev() + "\n";
                 message += "**服务器IP:** " + adwebSite.getDevServerIp() + "\n";
                 sendAdWebV2FeiShuMsg(title, message);
@@ -540,14 +369,14 @@ public class SelfWebSiteService {
                 // updateWrapper.set("domain", domain);
                 // seoKeywordsService.update(updateWrapper);
                 session.setAttribute("shellLineModular", "");
-                return Result.OK("网站发布上线成功!");
+                Result.OK("网站发布上线成功!");
             }
         } catch (Exception e) {
             log.error("站点发布失败,退出执行;" + e.getMessage(), e);
             // 站点发布失败
             adwebSite.setStatus(6);
             siteService.updateById(adwebSite);
-            return Result.error("网站发布上线失败!");
+            Result.error("网站发布上线失败!");
         }
     }
 
@@ -629,6 +458,166 @@ public class SelfWebSiteService {
         }
     }
 
+
+    /**
+     * 站点启动/停止
+     *
+     * @param sysUser
+     * @param siteId
+     * @param status
+     * @return
+     */
+    public boolean siteStartOrStop(LoginUser sysUser, Integer siteId, Integer status) {
+        AdwebSite adwebSite = siteService.getById(siteId);
+
+        // 获取站点所在生产服务器信息
+        ServerDTO serverInfo = new ServerDTO();
+        boolean flag = false;
+        switch (status) {
+            case 1:
+                flag = startSiteLocal(sysUser, adwebSite);
+                break;
+            case 2:
+                flag = stopSiteLocal(sysUser, adwebSite);
+                break;
+            case 3:
+                flag = startSite(sysUser, adwebSite, serverInfo);
+                break;
+            case 4:
+                flag = stopSite(sysUser, adwebSite, serverInfo);
+                break;
+        }
+        return flag;
+    }
+
+    /**
+     * 站点启动脚本调用(未发布)
+     *
+     * @param sysUser
+     * @param adwebSite
+     * @return
+     */
+    private boolean startSiteLocal(LoginUser sysUser, AdwebSite adwebSite) {
+        //站点启动
+        String cmd = "/home/ci-user/shell/start_site " + adwebSite.getCode() + " ";
+        shellService.exceShellByPwd(cmd, host, port, username, password, new ShellSSH2Util.StdoutListener() {
+            @Override
+            public void stdout(String line) {
+                log.info("标准 :" + line);
+                if ("ERROR:FILE_NAME IS EXISTS".equals(line)) {
+                    // TODO ----
+                    log.error("恢复测试站点异常:" + line);
+                }
+            }
+
+            @Override
+            public void stderr(String line) {
+                log.info("错误 :" + line);
+            }
+        });
+        return siteStatusUpdate(sysUser, adwebSite, 0);
+    }
+
+    /**
+     * 站点停止脚本调用(未发布)
+     *
+     * @param sysUser
+     * @param adwebSite
+     * @return
+     */
+    private boolean stopSiteLocal(LoginUser sysUser, AdwebSite adwebSite) {
+        String cmd = "/home/ci-user/shell/stop_site " + adwebSite.getCode() + " ";
+        shellService.exceShellByPwd(cmd, host, port, username, password, new ShellSSH2Util.StdoutListener() {
+            @Override
+            public void stdout(String line) {
+                log.info("标准 :" + line);
+                if ("ERROR:FILE_NAME IS EXISTS".equals(line)) {
+                    // TODO ----
+                    log.error("停止测试站点异常:" + line);
+                }
+            }
+
+            @Override
+            public void stderr(String line) {
+                log.info("错误 :" + line);
+            }
+        });
+        return siteStatusUpdate(sysUser, adwebSite, 3);
+    }
+
+    /**
+     * 站点启动脚本调用(生产环境)
+     *
+     * @param sysUser
+     * @param adwebSite
+     * @return
+     */
+    private boolean startSite(LoginUser sysUser, AdwebSite adwebSite, ServerDTO serverInfo) {
+        //站点启动
+        String cmd = "./shell/start_site " + serverInfo.getIp() + " " + adwebSite.getCode() + " ";
+        shellService.exceShell(cmd, new ShellSSH2Util.StdoutListener() {
+            @Override
+            public void stdout(String line) {
+                log.info("MJJ控制台 :" + line);
+                if ("ERROR:FILE_NAME IS EXISTS".equals(line)) {
+                    // TODO ----
+                    log.error("恢复站点异常:" + line);
+                }
+            }
+
+            @Override
+            public void stderr(String line) {
+                log.info("错误 :" + line);
+            }
+        }, serverInfo);
+        return siteStatusUpdate(sysUser, adwebSite, 0);
+    }
+
+    /**
+     * 站点停止脚本调用(生产环境)
+     *
+     * @param sysUser
+     * @param adwebSite
+     * @return
+     */
+    private boolean stopSite(LoginUser sysUser, AdwebSite adwebSite, ServerDTO serverInfo) {
+        String cmd = "./shell/stop_site " + serverInfo.getIp() + " " + adwebSite.getCode() + " ";
+        shellService.exceShell(cmd, new ShellSSH2Util.StdoutListener() {
+            @Override
+            public void stdout(String line) {
+                log.info("MJJ控制台 :" + line);
+                if ("ERROR:FILE_NAME IS EXISTS".equals(line)) {
+                    // TODO ----
+                    log.error("停止站点异常:" + line);
+                }
+            }
+
+            @Override
+            public void stderr(String line) {
+                log.info("错误 :" + line);
+            }
+        }, serverInfo);
+        return siteStatusUpdate(sysUser, adwebSite, 3);
+    }
+
+
+    /**
+     * 站点状态更改
+     *
+     * @param sysUser
+     * @param adwebSite
+     * @param runStatus
+     * @return
+     */
+    private boolean siteStatusUpdate(LoginUser sysUser, AdwebSite adwebSite, Integer runStatus) {
+        if (runStatus.equals(3)) {
+            adwebSite.setStopTime(new Date());
+            adwebSite.setStopUid(sysUser.getId());
+        }
+        adwebSite.setRunStatus(runStatus);
+        return siteService.updateById(adwebSite);
+    }
+
     /**
      * @param msgTitle
      * @param message

+ 2 - 7
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/site/service/SelfWebSiteServiceCommon.java

@@ -17,7 +17,6 @@ import org.jeecg.modules.adweb.subscribePlan.entity.SubscribePlan;
 import org.jeecg.modules.adweb.subscribePlan.service.ISubscribePlanService;
 import org.jeecg.modules.adweb.theme.entity.AdwebTheme;
 import org.jeecg.modules.adweb.theme.service.IAdwebThemeService;
-import org.jeecg.modules.system.service.ISysUserService;
 import org.jeecg.modules.system.service.ISysUserTenantService;
 import org.jeecg.modules.system.vo.SysUserTenantVo;
 import org.springframework.beans.factory.annotation.Value;
@@ -35,8 +34,6 @@ public class SelfWebSiteServiceCommon {
     @Value("${AdwebSiteConnect.tempDomain}")
     private String tempDomain;
 
-    @Value("${AdwebSiteConnect.tempCname}")
-    private String tempCname;
 
     @Value("${serverIp.test}")
     private String newServerIp;
@@ -44,8 +41,6 @@ public class SelfWebSiteServiceCommon {
     @Resource
     private ISiteUserPermissionService siteUserPermissionService;
 
-    @Resource
-    private ISysUserService sysUserService;
 
     @Resource
     private IAdwebSiteService adwebSiteService;
@@ -82,8 +77,7 @@ public class SelfWebSiteServiceCommon {
         AdwebSite adwebSite = new AdwebSite();
         // 有效期  默认当前时间加1年
         Date endTime = DateUtil.addYear(DateUtil.getDate(), 1);
-        //TODO 改为NLB  cName
-        adwebSite.setCname(tempCname);
+
         adwebSite.setUid(uid);
         //站点名称改为创建站点时必填字段
 
@@ -91,6 +85,7 @@ public class SelfWebSiteServiceCommon {
 
         adwebSite.setRunStatus(1);
         adwebSite.setParentCode(adwebTheme.getCode());
+        adwebSite.setTemplateDomain(adwebTheme.getDomain());
         adwebSite.setCreateType("wp");
         adwebSite.setName(name);
         //域名

+ 14 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/site/service/SiteManageService.java

@@ -2,6 +2,7 @@ package org.jeecg.modules.adweb.site.service;
 
 import cn.hutool.core.util.RandomUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -202,4 +203,17 @@ public class SiteManageService {
 //        return commonMapper.getReachStandardDayNum(historyId, commonMapper.getKeywordStandard(siteCode), specifyKeywordNum, longTailKeywordNum);
         return 0;
     }
+
+    /**
+     * 检测网站域名是否存在
+     *
+     * @param domain
+     * @return
+     */
+    public List<AdwebSite> checkSiteDomainIsExists(String domain) {
+        QueryWrapper<AdwebSite> queryWrapper = new QueryWrapper<>();
+        queryWrapper.like("domain", domain);
+        queryWrapper.ne("status", 0);
+        return adwebSiteMapper.selectList(queryWrapper);
+    }
 }