Browse Source

新增爬虫管理

Peach 2 years ago
parent
commit
e47210bf77

+ 5 - 5
guanshi-admin/src/main/resources/application.yml

@@ -58,10 +58,10 @@ spring:
       # 从库数据源
       # 从库数据源
       slave:
       slave:
         # 从数据源开关/默认关闭
         # 从数据源开关/默认关闭
-        enabled: false
-        url:
-        username:
-        password:
+        enabled: true
+        url: jdbc:mysql://118.25.195.98:3306/crawler?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
+        username: guanshi
+        password: GSmysql2019*
       # 初始连接数
       # 初始连接数
       initialSize: 5
       initialSize: 5
       # 最小连接池数量
       # 最小连接池数量
@@ -188,7 +188,7 @@ xss:
   # 过滤开关
   # 过滤开关
   enabled: true
   enabled: true
   # 排除链接(多个用逗号分隔)
   # 排除链接(多个用逗号分隔)
-  excludes: /system/notice/*,/system/info/*,/website/news/*
+  excludes: /system/notice/*,/system/info/*,/website/news/*,/system/gc/*
   # 匹配链接
   # 匹配链接
   urlPatterns: /system/*,/monitor/*,/tool/*
   urlPatterns: /system/*,/monitor/*,/tool/*
 
 

+ 22 - 0
guanshi-system/src/gcMenu.sql

@@ -0,0 +1,22 @@
+-- 菜单 SQL
+insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('招标网工程类爬虫', '2000', '1', '/system/gc', 'C', '0', 'system:gc:view', '#', 'admin', sysdate(), '', null, '招标网工程类爬虫菜单');
+
+-- 按钮父菜单ID
+SELECT @parentId := LAST_INSERT_ID();
+
+-- 按钮 SQL
+insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('招标网工程类爬虫查询', @parentId, '1',  '#',  'F', '0', 'system:gc:list',         '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('招标网工程类爬虫新增', @parentId, '2',  '#',  'F', '0', 'system:gc:add',          '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('招标网工程类爬虫修改', @parentId, '3',  '#',  'F', '0', 'system:gc:edit',         '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('招标网工程类爬虫删除', @parentId, '4',  '#',  'F', '0', 'system:gc:remove',       '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('招标网工程类爬虫导出', @parentId, '5',  '#',  'F', '0', 'system:gc:export',       '#', 'admin', sysdate(), '', null, '');

+ 45 - 0
guanshi-system/src/main/java/com/ruoyi/system/controller/RestZbGcController.java

@@ -0,0 +1,45 @@
+package com.ruoyi.system.controller;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.system.service.impl.ZbGcServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/website/gc")
+public class RestZbGcController {
+
+    @Autowired
+    ZbGcServiceImpl zbGcService;
+
+
+    @GetMapping("/selectAllSumPriceByMon")
+    public AjaxResult selectAllSumPriceByMon(){
+
+        return AjaxResult.success(zbGcService.selectAllSumPriceByMon());
+    }
+
+    @GetMapping("/getAllCount")
+    public AjaxResult getAllCount(){
+
+        return AjaxResult.success(zbGcService.getAllCount());
+    }
+
+    @GetMapping("/getCleanCake")
+    public AjaxResult getCleanCake(){
+
+        return AjaxResult.success(zbGcService.getCleanCake());
+    }
+    @GetMapping("/getTypeByMon")
+    public AjaxResult getTypeByMon(){
+        return AjaxResult.success(zbGcService.getTypeByMon());
+    }
+
+    @GetMapping("/getCountByDepType")
+    public AjaxResult getCountByDepType(){
+        return AjaxResult.success(zbGcService.getCountByDepType());
+    }
+}

+ 127 - 0
guanshi-system/src/main/java/com/ruoyi/system/controller/ZbGcController.java

@@ -0,0 +1,127 @@
+package com.ruoyi.system.controller;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.ZbGc;
+import com.ruoyi.system.service.IZbGcService;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 招标网工程类爬虫Controller
+ * 
+ * @author peach
+ * @date 2022-05-18
+ */
+@Controller
+@RequestMapping("/system/gc")
+public class ZbGcController extends BaseController
+{
+    private String prefix = "system/gc";
+
+    @Autowired
+    private IZbGcService zbGcService;
+
+    @RequiresPermissions("system:gc:view")
+    @GetMapping()
+    public String gc()
+    {
+        return prefix + "/gc";
+    }
+
+    /**
+     * 查询招标网工程类爬虫列表
+     */
+    @RequiresPermissions("system:gc:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(ZbGc zbGc)
+    {
+        startPage();
+        List<ZbGc> list = zbGcService.selectZbGcList(zbGc);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出招标网工程类爬虫列表
+     */
+    @RequiresPermissions("system:gc:export")
+    @Log(title = "招标网工程类爬虫", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(ZbGc zbGc)
+    {
+        List<ZbGc> list = zbGcService.selectZbGcList(zbGc);
+        ExcelUtil<ZbGc> util = new ExcelUtil<ZbGc>(ZbGc.class);
+        return util.exportExcel(list, "招标网工程类爬虫数据");
+    }
+
+    /**
+     * 新增招标网工程类爬虫
+     */
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存招标网工程类爬虫
+     */
+    @RequiresPermissions("system:gc:add")
+    @Log(title = "招标网工程类爬虫", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(ZbGc zbGc)
+    {
+        return toAjax(zbGcService.insertZbGc(zbGc));
+    }
+
+    /**
+     * 修改招标网工程类爬虫
+     */
+    @RequiresPermissions("system:gc:edit")
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") Long id, ModelMap mmap)
+    {
+        ZbGc zbGc = zbGcService.selectZbGcById(id);
+        mmap.put("zbGc", zbGc);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存招标网工程类爬虫
+     */
+    @RequiresPermissions("system:gc:edit")
+    @Log(title = "招标网工程类爬虫", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(ZbGc zbGc)
+    {
+        return toAjax(zbGcService.updateZbGc(zbGc));
+    }
+
+    /**
+     * 删除招标网工程类爬虫
+     */
+    @RequiresPermissions("system:gc:remove")
+    @Log(title = "招标网工程类爬虫", businessType = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(zbGcService.deleteZbGcByIds(ids));
+    }
+}

+ 221 - 0
guanshi-system/src/main/java/com/ruoyi/system/domain/ZbGc.java

@@ -0,0 +1,221 @@
+package com.ruoyi.system.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 招标网工程类爬虫对象 zb_gc
+ * 
+ * @author peach
+ * @date 2022-05-18
+ */
+public class ZbGc extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 招标id */
+    private Long id;
+
+    /** 标题 */
+    @Excel(name = "标题")
+    private String title;
+
+    /** 招标省市 */
+    @Excel(name = "招标省市")
+    private String addr;
+
+    /** 标文规范 */
+    @Excel(name = "标文规范")
+    private String rule;
+
+    /** 发布时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "发布时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date time;
+
+    /** 转载信息 */
+    @Excel(name = "转载信息")
+    private String other;
+
+    /** 标书类型 */
+    @Excel(name = "标书类型")
+    private String type;
+
+    /** 文章详情地址 */
+    @Excel(name = "文章详情地址")
+    private String url;
+
+    /** 检索关键词 */
+    @Excel(name = "检索关键词")
+    private String searchKey;
+
+    /** 部门类型 */
+    private Integer depType;
+
+    /** 部门名称 */
+    @Excel(name = "部门名称")
+    private String dep;
+
+    /** 招标价格 */
+    @Excel(name = "招标价格")
+    private BigDecimal price;
+
+    /** 标书详细内容 */
+    @Excel(name = "标书详细内容")
+    private String word;
+
+    /**  */
+    private Integer regex;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setTitle(String title) 
+    {
+        this.title = title;
+    }
+
+    public String getTitle() 
+    {
+        return title;
+    }
+    public void setAddr(String addr) 
+    {
+        this.addr = addr;
+    }
+
+    public String getAddr() 
+    {
+        return addr;
+    }
+    public void setRule(String rule) 
+    {
+        this.rule = rule;
+    }
+
+    public String getRule() 
+    {
+        return rule;
+    }
+    public void setTime(Date time) 
+    {
+        this.time = time;
+    }
+
+    public Date getTime() 
+    {
+        return time;
+    }
+    public void setOther(String other) 
+    {
+        this.other = other;
+    }
+
+    public String getOther() 
+    {
+        return other;
+    }
+    public void setType(String type) 
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+    public void setUrl(String url) 
+    {
+        this.url = url;
+    }
+
+    public String getUrl() 
+    {
+        return url;
+    }
+    public void setSearchKey(String searchKey) 
+    {
+        this.searchKey = searchKey;
+    }
+
+    public String getSearchKey() 
+    {
+        return searchKey;
+    }
+    public void setDepType(Integer depType) 
+    {
+        this.depType = depType;
+    }
+
+    public Integer getDepType() 
+    {
+        return depType;
+    }
+    public void setDep(String dep) 
+    {
+        this.dep = dep;
+    }
+
+    public String getDep() 
+    {
+        return dep;
+    }
+    public void setPrice(BigDecimal price) 
+    {
+        this.price = price;
+    }
+
+    public BigDecimal getPrice() 
+    {
+        return price;
+    }
+    public void setWord(String word) 
+    {
+        this.word = word;
+    }
+
+    public String getWord() 
+    {
+        return word;
+    }
+    public void setRegex(Integer regex) 
+    {
+        this.regex = regex;
+    }
+
+    public Integer getRegex() 
+    {
+        return regex;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("title", getTitle())
+            .append("addr", getAddr())
+            .append("rule", getRule())
+            .append("time", getTime())
+            .append("other", getOther())
+            .append("type", getType())
+            .append("url", getUrl())
+            .append("searchKey", getSearchKey())
+            .append("depType", getDepType())
+            .append("dep", getDep())
+            .append("price", getPrice())
+            .append("word", getWord())
+            .append("regex", getRegex())
+            .toString();
+    }
+}

+ 158 - 0
guanshi-system/src/main/java/com/ruoyi/system/mapper/ZbGcMapper.java

@@ -0,0 +1,158 @@
+package com.ruoyi.system.mapper;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+import com.ruoyi.system.domain.ZbGc;
+
+/**
+ * 招标网工程类爬虫Mapper接口
+ * 
+ * @author peach
+ * @date 2022-05-18
+ */
+public interface ZbGcMapper 
+{
+
+
+    /**
+     * 查询招标网工程类爬虫总数
+     *
+     * @return 招标网工程类爬虫总数
+     */
+    public Integer selectAllCount();
+
+
+    /**
+     * 查询招标网工程类爬虫未处理总数
+     *
+     * @return 招标网工程类爬虫未处理总数
+     */
+    public Integer selectAllIsNull();
+
+
+    /**
+     * 按照标书类型查询清洗失败招标网工程类爬虫总数
+     *
+     * @return 分类招标网工程类爬虫数
+     */
+    public List<Map<String,Integer>> selectAllNotDoneByType();
+
+
+    /**
+     * 按照标书类型查询招标网工程类爬虫总数
+     *
+     * @return 分类招标网工程类爬虫数
+     */
+    public List<Map<String,Integer>> selectAllDoneByType();
+
+
+    /**
+     * 查询招标网工程类爬虫中标金额总数
+     *
+     * @return 招标网工程类爬虫中标金额总数
+     */
+    public BigDecimal selectAllSumPrice();
+
+
+    /**
+     * 按月份查询招标网工程类爬虫中标总数
+     *
+     * @return 招标网工程类爬虫中标总数
+     */
+    public List<Map<String,Integer>> selectAllCountJGByMon();
+
+
+    /**
+     * 按月份查询招标网工程类爬虫公告标总数
+     *
+     * @return 招标网工程类爬虫公告总数
+     */
+    public List<Map<String,Integer>> selectAllCountGGByMon();
+
+
+    public List<Map<String,Integer>> selectAllZBCountByDepDateOne();
+
+    public List<Map<String,Integer>> selectAllZBCountByDepDateTwo();
+
+
+    /**
+     * 按月份查询招标网工程类爬虫中标金额总数
+     *
+     * @return 招标网工程类爬虫中标金额总数
+     */
+    public List<Map<String,BigDecimal>> selectAllSumPriceByMon();
+
+
+    /**
+     * 按部门查询招标网工程类中标结果公示爬虫中标总数
+     *
+     * @return 中标结果公示爬虫中标总数
+     */
+    public List<Map<String,Integer>> selectAllJGCountByDep();
+
+
+    /**
+     * 按部门查询招标网工程类招标公告爬虫中标总数
+     *
+     * @return 招标公告爬虫中标总数
+     */
+    public List<Map<String,Integer>> selectAllZBCountByDep();
+
+
+
+
+
+
+
+
+
+    /**
+     * 查询招标网工程类爬虫
+     * 
+     * @param id 招标网工程类爬虫主键
+     * @return 招标网工程类爬虫
+     */
+    public ZbGc selectZbGcById(Long id);
+
+    /**
+     * 查询招标网工程类爬虫列表
+     * 
+     * @param zbGc 招标网工程类爬虫
+     * @return 招标网工程类爬虫集合
+     */
+    public List<ZbGc> selectZbGcList(ZbGc zbGc);
+
+    /**
+     * 新增招标网工程类爬虫
+     * 
+     * @param zbGc 招标网工程类爬虫
+     * @return 结果
+     */
+    public int insertZbGc(ZbGc zbGc);
+
+    /**
+     * 修改招标网工程类爬虫
+     * 
+     * @param zbGc 招标网工程类爬虫
+     * @return 结果
+     */
+    public int updateZbGc(ZbGc zbGc);
+
+    /**
+     * 删除招标网工程类爬虫
+     * 
+     * @param id 招标网工程类爬虫主键
+     * @return 结果
+     */
+    public int deleteZbGcById(Long id);
+
+    /**
+     * 批量删除招标网工程类爬虫
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteZbGcByIds(String[] ids);
+}

+ 83 - 0
guanshi-system/src/main/java/com/ruoyi/system/service/IZbGcService.java

@@ -0,0 +1,83 @@
+package com.ruoyi.system.service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+import com.ruoyi.system.domain.ZbGc;
+
+/**
+ * 招标网工程类爬虫Service接口
+ * 
+ * @author peach
+ * @date 2022-05-18
+ */
+public interface IZbGcService 
+{
+
+
+
+    /**
+     * 按月份查询招标网工程类爬虫中标金额总数
+     *
+     * @return 招标网工程类爬虫中标金额总数
+     */
+    public List<Map<String,BigDecimal>> selectAllSumPriceByMon();
+
+    public Map<String,Integer> getAllCount();
+
+    public List<Map<String,Integer>> getCleanCake();
+
+    public  Map<String,List<Map<String, Integer>>> getCountByDepType();
+
+    public  Map<String,List<Map<String, Integer>>> getTypeByMon();
+
+
+    /**
+     * 查询招标网工程类爬虫
+     * 
+     * @param id 招标网工程类爬虫主键
+     * @return 招标网工程类爬虫
+     */
+    public ZbGc selectZbGcById(Long id);
+
+    /**
+     * 查询招标网工程类爬虫列表
+     * 
+     * @param zbGc 招标网工程类爬虫
+     * @return 招标网工程类爬虫集合
+     */
+    public List<ZbGc> selectZbGcList(ZbGc zbGc);
+
+    /**
+     * 新增招标网工程类爬虫
+     * 
+     * @param zbGc 招标网工程类爬虫
+     * @return 结果
+     */
+    public int insertZbGc(ZbGc zbGc);
+
+    /**
+     * 修改招标网工程类爬虫
+     * 
+     * @param zbGc 招标网工程类爬虫
+     * @return 结果
+     */
+    public int updateZbGc(ZbGc zbGc);
+
+    /**
+     * 批量删除招标网工程类爬虫
+     * 
+     * @param ids 需要删除的招标网工程类爬虫主键集合
+     * @return 结果
+     */
+    public int deleteZbGcByIds(String ids);
+
+    /**
+     * 删除招标网工程类爬虫信息
+     * 
+     * @param id 招标网工程类爬虫主键
+     * @return 结果
+     */
+    public int deleteZbGcById(Long id);
+}

+ 149 - 0
guanshi-system/src/main/java/com/ruoyi/system/service/impl/ZbGcServiceImpl.java

@@ -0,0 +1,149 @@
+package com.ruoyi.system.service.impl;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.ruoyi.common.annotation.DataSource;
+import com.ruoyi.common.enums.DataSourceType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.ZbGcMapper;
+import com.ruoyi.system.domain.ZbGc;
+import com.ruoyi.system.service.IZbGcService;
+import com.ruoyi.common.core.text.Convert;
+
+/**
+ * 招标网工程类爬虫Service业务层处理
+ * 
+ * @author peach
+ * @date 2022-05-18
+ */
+@Service
+@DataSource(value = DataSourceType.SLAVE)
+public class ZbGcServiceImpl implements IZbGcService 
+{
+    @Autowired
+    private ZbGcMapper zbGcMapper;
+
+
+    @Override
+    public List<Map<String,BigDecimal>> selectAllSumPriceByMon() {
+        return zbGcMapper.selectAllSumPriceByMon();
+    }
+
+    @Override
+    public Map<String,Integer> getAllCount() {
+        HashMap<String,Integer> hashMap=new HashMap();
+        hashMap.put("clean",zbGcMapper.selectAllCount());
+        hashMap.put("noClean", zbGcMapper.selectAllIsNull());
+
+        return hashMap;
+    }
+
+    @Override
+    public List<Map<String, Integer>> getCleanCake() {
+        List<Map<String, Integer>> list=new ArrayList<>();
+      for (Map<String, Integer> zb:zbGcMapper.selectAllDoneByType()){
+          list.add(zb);
+      }
+
+        for (Map<String, Integer> zb:zbGcMapper.selectAllNotDoneByType()){
+            list.add(zb);
+        }
+
+        return list;
+
+    }
+
+    @Override
+    public Map<String,List<Map<String, Integer>>> getCountByDepType() {
+        Map<String,List<Map<String, Integer>>> map=new HashMap<>();
+        map.put("gs",zbGcMapper.selectAllZBCountByDepDateOne());
+        map.put("dw",zbGcMapper.selectAllZBCountByDepDateTwo());
+        return map;
+    }
+
+    @Override
+    public Map<String,List<Map<String, Integer>>> getTypeByMon() {
+        Map<String,List<Map<String, Integer>>> map=new HashMap<>();
+        map.put("gg",zbGcMapper.selectAllCountGGByMon());
+        map.put("jg",zbGcMapper.selectAllCountJGByMon());
+        return map;
+    }
+
+
+    /**
+     * 查询招标网工程类爬虫
+     * 
+     * @param id 招标网工程类爬虫主键
+     * @return 招标网工程类爬虫
+     */
+    @Override
+    public ZbGc selectZbGcById(Long id)
+    {
+        return zbGcMapper.selectZbGcById(id);
+    }
+
+    /**
+     * 查询招标网工程类爬虫列表
+     * 
+     * @param zbGc 招标网工程类爬虫
+     * @return 招标网工程类爬虫
+     */
+    @Override
+    public List<ZbGc> selectZbGcList(ZbGc zbGc)
+    {
+        return zbGcMapper.selectZbGcList(zbGc);
+    }
+
+    /**
+     * 新增招标网工程类爬虫
+     * 
+     * @param zbGc 招标网工程类爬虫
+     * @return 结果
+     */
+    @Override
+    public int insertZbGc(ZbGc zbGc)
+    {
+        return zbGcMapper.insertZbGc(zbGc);
+    }
+
+    /**
+     * 修改招标网工程类爬虫
+     * 
+     * @param zbGc 招标网工程类爬虫
+     * @return 结果
+     */
+    @Override
+    public int updateZbGc(ZbGc zbGc)
+    {
+        return zbGcMapper.updateZbGc(zbGc);
+    }
+
+    /**
+     * 批量删除招标网工程类爬虫
+     * 
+     * @param ids 需要删除的招标网工程类爬虫主键
+     * @return 结果
+     */
+    @Override
+    public int deleteZbGcByIds(String ids)
+    {
+        return zbGcMapper.deleteZbGcByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 删除招标网工程类爬虫信息
+     * 
+     * @param id 招标网工程类爬虫主键
+     * @return 结果
+     */
+    @Override
+    public int deleteZbGcById(Long id)
+    {
+        return zbGcMapper.deleteZbGcById(id);
+    }
+}

+ 166 - 0
guanshi-system/src/main/resources/mapper/system/ZbGcMapper.xml

@@ -0,0 +1,166 @@
+<?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="com.ruoyi.system.mapper.ZbGcMapper">
+    
+    <resultMap type="ZbGc" id="ZbGcResult">
+        <result property="id"    column="id"    />
+        <result property="title"    column="title"    />
+        <result property="addr"    column="addr"    />
+        <result property="rule"    column="rule"    />
+        <result property="time"    column="time"    />
+        <result property="other"    column="other"    />
+        <result property="type"    column="type"    />
+        <result property="url"    column="url"    />
+        <result property="searchKey"    column="search_key"    />
+        <result property="depType"    column="dep_type"    />
+        <result property="dep"    column="dep"    />
+        <result property="price"    column="price"    />
+        <result property="word"    column="word"    />
+        <result property="regex"    column="regex"    />
+    </resultMap>
+
+    <sql id="selectZbGcVo">
+        select id, title, addr, rule, time, other, type, url, search_key, dep_type, dep, price, word, regex from zb_gc
+    </sql>
+
+    <select id="selectZbGcList" parameterType="ZbGc" resultMap="ZbGcResult">
+        <include refid="selectZbGcVo"/>
+        <where>  
+            <if test="title != null  and title != ''"> and title = #{title}</if>
+            <if test="addr != null  and addr != ''"> and addr = #{addr}</if>
+            <if test="rule != null  and rule != ''"> and rule = #{rule}</if>
+            <if test="params.beginTime != null and params.beginTime != '' and params.endTime != null and params.endTime != ''"> and time between #{params.beginTime} and #{params.endTime}</if>
+            <if test="other != null  and other != ''"> and other = #{other}</if>
+            <if test="type != null  and type != ''"> and type = #{type}</if>
+            <if test="url != null  and url != ''"> and url = #{url}</if>
+            <if test="searchKey != null  and searchKey != ''"> and search_key = #{searchKey}</if>
+            <if test="depType != null "> and dep_type = #{depType}</if>
+            <if test="dep != null  and dep != ''"> and dep = #{dep}</if>
+            <if test="price != null "> and price = #{price}</if>
+            <if test="word != null  and word != ''"> and word like concat('%', #{word}, '%')</if>
+            <if test="regex != null "> and regex = #{regex}</if>
+        </where>
+    </select>
+
+    <select id="selectAllCount" resultType="Integer" >
+        SELECT count(id) as 'count' FROM zb_gc
+    </select>
+
+    <select id="selectAllIsNull"  resultType="Integer">
+        SELECT count(id) as 'count' FROM zb_gc WHERE regex=-1
+    </select>
+
+    <select id="selectAllNotDoneByType"  resultType="Map">
+        SELECT type,count(id) as 'count' FROM zb_gc WHERE regex is not null and regex =-1 GROUP BY type
+    </select>
+
+    <select id="selectAllDoneByType"  resultType="Map">
+        SELECT type,count(id) as 'count' FROM zb_gc WHERE regex is not null  GROUP BY type
+    </select>
+
+    <select id="selectAllSumPrice" resultType="BigDecimal">
+        SELECT sum(price) as 'sum' FROM zb_gc WHERE regex =1 and type='中标结果公示'
+    </select>
+
+    <select id="selectAllCountJGByMon" resultType="Map">
+        select DATE_FORMAT(time,'%Y-%m') as 'mon',count(id) as 'count' from zb_gc  WHERE regex =1 and type='中标结果公示' and time>'2021-06'  group by DATE_FORMAT(time,'%Y-%m')
+    </select>
+
+    <select id="selectAllCountGGByMon" resultType="Map">
+        select DATE_FORMAT(time,'%Y-%m') as 'mon',count(id) as 'count' from zb_gc WHERE regex =1 and type='招标公告'  and time>'2021-06' group by DATE_FORMAT(time,'%Y-%m')
+    </select>
+
+
+    <select id="selectAllSumPriceByMon" resultType="map">
+        select DATE_FORMAT(time,'%Y-%m') as 'mon',COALESCE(sum(price),0) as 'price' from zb_gc WHERE regex =1 and type='中标结果公示'  group by DATE_FORMAT(time,'%Y-%m')
+    </select>
+
+    <select id="selectAllJGCountByDep" resultType="Map">
+        SELECT dep_type,count(id) as 'count' FROM zb_gc WHERE regex=1 and type='中标结果公示'  GROUP BY dep_type
+    </select>
+
+    <select id="selectAllZBCountByDep" resultType="map">
+        SELECT dep_type,count(id) as 'count' FROM zb_gc WHERE regex=1 and type='招标公告'  GROUP BY dep_type
+    </select>
+
+    <select id="selectAllZBCountByDepDateOne" resultType="map">
+        select DATE_FORMAT(time,'%Y-%m') as 'mon',count(id) as 'count' from zb_gc WHERE regex =1 and type='招标公告' and time>'2021-06' and dep_type=1   group by DATE_FORMAT(time,'%Y-%m')
+    </select>
+
+    <select id="selectAllZBCountByDepDateTwo" resultType="map">
+        select DATE_FORMAT(time,'%Y-%m') as 'mon',count(id) as 'count' from zb_gc WHERE regex =1 and type='招标公告' and time>'2021-06' and dep_type=2   group by DATE_FORMAT(time,'%Y-%m')
+    </select>
+
+    <select id="selectZbGcById" parameterType="Long" resultMap="ZbGcResult">
+        <include refid="selectZbGcVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertZbGc" parameterType="ZbGc" useGeneratedKeys="true" keyProperty="id">
+        insert into zb_gc
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="title != null">title,</if>
+            <if test="addr != null">addr,</if>
+            <if test="rule != null">rule,</if>
+            <if test="time != null">time,</if>
+            <if test="other != null">other,</if>
+            <if test="type != null">type,</if>
+            <if test="url != null">url,</if>
+            <if test="searchKey != null">search_key,</if>
+            <if test="depType != null">dep_type,</if>
+            <if test="dep != null">dep,</if>
+            <if test="price != null">price,</if>
+            <if test="word != null">word,</if>
+            <if test="regex != null">regex,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="title != null">#{title},</if>
+            <if test="addr != null">#{addr},</if>
+            <if test="rule != null">#{rule},</if>
+            <if test="time != null">#{time},</if>
+            <if test="other != null">#{other},</if>
+            <if test="type != null">#{type},</if>
+            <if test="url != null">#{url},</if>
+            <if test="searchKey != null">#{searchKey},</if>
+            <if test="depType != null">#{depType},</if>
+            <if test="dep != null">#{dep},</if>
+            <if test="price != null">#{price},</if>
+            <if test="word != null">#{word},</if>
+            <if test="regex != null">#{regex},</if>
+         </trim>
+    </insert>
+
+    <update id="updateZbGc" parameterType="ZbGc">
+        update zb_gc
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="title != null">title = #{title},</if>
+            <if test="addr != null">addr = #{addr},</if>
+            <if test="rule != null">rule = #{rule},</if>
+            <if test="time != null">time = #{time},</if>
+            <if test="other != null">other = #{other},</if>
+            <if test="type != null">type = #{type},</if>
+            <if test="url != null">url = #{url},</if>
+            <if test="searchKey != null">search_key = #{searchKey},</if>
+            <if test="depType != null">dep_type = #{depType},</if>
+            <if test="dep != null">dep = #{dep},</if>
+            <if test="price != null">price = #{price},</if>
+            <if test="word != null">word = #{word},</if>
+            <if test="regex != null">regex = #{regex},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteZbGcById" parameterType="Long">
+        delete from zb_gc where id = #{id}
+    </delete>
+
+    <delete id="deleteZbGcByIds" parameterType="String">
+        delete from zb_gc where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>

+ 151 - 0
guanshi-system/src/main/resources/templates/system/gc/add.html

@@ -0,0 +1,151 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增招标网工程类爬虫')" />
+    <th:block th:include="include :: datetimepicker-css" />
+    <th:block th:include="include :: summernote-css" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-gc-add">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">标题:</label>
+                <div class="col-sm-8">
+                    <input name="title" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">招标省市:</label>
+                <div class="col-sm-8">
+                    <input name="addr" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">标文规范:</label>
+                <div class="col-sm-8">
+                    <input name="rule" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">发布时间:</label>
+                <div class="col-sm-8">
+                    <div class="input-group date">
+                        <input name="time" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                        <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                    </div>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">转载信息:</label>
+                <div class="col-sm-8">
+                    <input name="other" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">标书类型:</label>
+                <div class="col-sm-8">
+                    <select name="type" class="form-control m-b" th:with="type=${@dict.getType('gc_type')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">文章详情地址:</label>
+                <div class="col-sm-8">
+                    <input name="url" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">检索关键词:</label>
+                <div class="col-sm-8">
+                    <input name="searchKey" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">部门类型:</label>
+                <div class="col-sm-8">
+                    <select name="depType" class="form-control m-b" th:with="type=${@dict.getType('gc_dep')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">部门名称:</label>
+                <div class="col-sm-8">
+                    <input name="dep" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">招标价格:</label>
+                <div class="col-sm-8">
+                    <input name="price" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">标书详细内容:</label>
+                <div class="col-sm-8">
+                    <input type="hidden" class="form-control" name="word">
+                    <div class="summernote" id="word"></div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <th:block th:include="include :: summernote-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "system/gc"
+        $("#form-gc-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-gc-add').serialize());
+            }
+        }
+
+        $("input[name='time']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+
+        $(function() {
+            $('.summernote').summernote({
+                lang: 'zh-CN',
+                dialogsInBody: true,
+                callbacks: {
+                    onChange: function(contents, $edittable) {
+                        $("input[name='" + this.id + "']").val(contents);
+                    },
+                    onImageUpload: function(files) {
+                        var obj = this;
+                    	var data = new FormData();
+                    	data.append("file", files[0]);
+                    	$.ajax({
+                            type: "post",
+                            url: ctx + "common/upload",
+                    		data: data,
+                    		cache: false,
+                    		contentType: false,
+                    		processData: false,
+                    		dataType: 'json',
+                    		success: function(result) {
+                    		    if (result.code == web_status.SUCCESS) {
+                    		        $('#' + obj.id).summernote('insertImage', result.url);
+                    		    } else {
+                    		        $.modal.alertError(result.msg);
+                    		    }
+                    		},
+                    		error: function(error) {
+                    		    $.modal.alertWarning("图片上传失败。");
+                    		}
+                    	});
+                    }
+                }
+            });
+        });
+    </script>
+</body>
+</html>

+ 164 - 0
guanshi-system/src/main/resources/templates/system/gc/edit.html

@@ -0,0 +1,164 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改招标网工程类爬虫')" />
+    <th:block th:include="include :: datetimepicker-css" />
+    <th:block th:include="include :: summernote-css" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-gc-edit" th:object="${zbGc}">
+            <input name="id" th:field="*{id}" type="hidden">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">标题:</label>
+                <div class="col-sm-8">
+                    <input name="title" th:field="*{title}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">招标省市:</label>
+                <div class="col-sm-8">
+                    <input name="addr" th:field="*{addr}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">标文规范:</label>
+                <div class="col-sm-8">
+                    <input name="rule" th:field="*{rule}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">发布时间:</label>
+                <div class="col-sm-8">
+                    <div class="input-group date">
+                        <input name="time" th:value="${#dates.format(zbGc.time, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                        <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                    </div>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">转载信息:</label>
+                <div class="col-sm-8">
+                    <input name="other" th:field="*{other}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">标书类型:</label>
+                <div class="col-sm-8">
+                    <select name="type" class="form-control m-b" th:with="type=${@dict.getType('gc_type')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{type}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">文章详情地址:</label>
+                <div class="col-sm-8">
+                    <input name="url" th:field="*{url}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">检索关键词:</label>
+                <div class="col-sm-8">
+                    <input name="searchKey" th:field="*{searchKey}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">部门类型:</label>
+                <div class="col-sm-8">
+                    <select name="depType" class="form-control m-b" th:with="type=${@dict.getType('gc_dep')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{depType}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">部门名称:</label>
+                <div class="col-sm-8">
+                    <input name="dep" th:field="*{dep}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">招标价格:</label>
+                <div class="col-sm-8">
+                    <input name="price" th:field="*{price}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">标书详细内容:</label>
+                <div class="col-sm-8">
+                    <input type="hidden" class="form-control" th:field="*{word}">
+                    <div class="summernote" id="word"></div>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">:</label>
+                <div class="col-sm-8">
+                    <select name="regex" class="form-control m-b" th:with="type=${@dict.getType('gc_regex')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{regex}"></option>
+                    </select>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <th:block th:include="include :: summernote-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "system/gc";
+        $("#form-gc-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-gc-edit').serialize());
+            }
+        }
+
+        $("input[name='time']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+
+        $(function() {
+            $('.summernote').each(function(i) {
+                $('#' + this.id).summernote({
+                    lang: 'zh-CN',
+                    dialogsInBody: true,
+                    callbacks: {
+                        onChange: function(contents, $edittable) {
+                            $("input[name='" + this.id + "']").val(contents);
+                        },
+                        onImageUpload: function(files) {
+                            var obj = this;
+                            var data = new FormData();
+                            data.append("file", files[0]);
+                            $.ajax({
+                                type: "post",
+                                url: ctx + "common/upload",
+                                data: data,
+                                cache: false,
+                                contentType: false,
+                                processData: false,
+                                dataType: 'json',
+                                success: function(result) {
+                                    if (result.code == web_status.SUCCESS) {
+                                        $('#' + obj.id).summernote('insertImage', result.url);
+                                    } else {
+                                        $.modal.alertError(result.msg);
+                                    }
+                                },
+                                error: function(error) {
+                                    $.modal.alertWarning("图片上传失败。");
+                                }
+                            });
+                        }
+                    }
+                });
+                var content = $("input[name='" + this.id + "']").val();
+                $('#' + this.id).summernote('code', content);
+            })
+        });
+    </script>
+</body>
+</html>

+ 187 - 0
guanshi-system/src/main/resources/templates/system/gc/gc.html

@@ -0,0 +1,187 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('招标网工程类爬虫列表')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>标题:</label>
+                                <input type="text" name="title"/>
+                            </li>
+                            <li>
+                                <label>招标省市:</label>
+                                <input type="text" name="addr"/>
+                            </li>
+                            <li>
+                                <label>标文规范:</label>
+                                <input type="text" name="rule"/>
+                            </li>
+                            <li class="select-time">
+                                <label>发布时间:</label>
+                                <input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginTime]"/>
+                                <span>-</span>
+                                <input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endTime]"/>
+                            </li>
+                            <li>
+                                <label>转载信息:</label>
+                                <input type="text" name="other"/>
+                            </li>
+                            <li>
+                                <label>标书类型:</label>
+                                <select name="type" th:with="type=${@dict.getType('gc_type')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <label>文章详情地址:</label>
+                                <input type="text" name="url"/>
+                            </li>
+                            <li>
+                                <label>检索关键词:</label>
+                                <input type="text" name="searchKey"/>
+                            </li>
+                            <li>
+                                <label>部门类型:</label>
+                                <select name="depType" th:with="type=${@dict.getType('gc_dep')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <label>部门名称:</label>
+                                <input type="text" name="dep"/>
+                            </li>
+                            <li>
+                                <label>招标价格:</label>
+                                <input type="text" name="price"/>
+                            </li>
+                            <li>
+                                <label>清洗程度:</label>
+                                <select name="regex" th:with="type=${@dict.getType('gc_regex')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="system:gc:add">
+                    <i class="fa fa-plus"></i> 添加
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="system:gc:edit">
+                    <i class="fa fa-edit"></i> 修改
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="system:gc:remove">
+                    <i class="fa fa-remove"></i> 删除
+                </a>
+                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="system:gc:export">
+                    <i class="fa fa-download"></i> 导出
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('system:gc:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('system:gc:remove')}]];
+        var typeDatas = [[${@dict.getType('gc_type')}]];
+        var depTypeDatas = [[${@dict.getType('gc_dep')}]];
+        var regexDatas = [[${@dict.getType('gc_regex')}]];
+        var prefix = ctx + "system/gc";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "招标网工程类爬虫",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field: 'id',
+                    title: '招标id',
+                    visible: false
+                },
+                {
+                    field: 'title',
+                    title: '标题'
+                },
+                {
+                    field: 'addr',
+                    title: '招标省市'
+                },
+                {
+                    field: 'rule',
+                    title: '标文规范'
+                },
+                {
+                    field: 'time',
+                    title: '发布时间'
+                },
+                {
+                    field: 'other',
+                    title: '转载信息'
+                },
+                {
+                    field: 'type',
+                    title: '标书类型',
+                    formatter: function(value, row, index) {
+                       return $.table.selectDictLabel(typeDatas, value);
+                    }
+                },
+                {
+                    field: 'url',
+                    title: '文章详情地址'
+                },
+                {
+                    field: 'searchKey',
+                    title: '检索关键词'
+                },
+                {
+                    field: 'dep',
+                    title: '部门名称'
+                },
+                {
+                    field: 'price',
+                    title: '招标价格'
+                },
+                {
+                    field: 'word',
+                    title: '标书详细内容'
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>