Jing пре 4 месеци
родитељ
комит
2c606da231

+ 11 - 0
src/api/advertise.js

@@ -0,0 +1,11 @@
+// 广告
+import request from '@/utils/request'
+
+// 订单列表
+export const addWeb=(params)=> {
+  return request({
+    url: '/collector/addWeb',
+    method: 'get',
+    params
+  })
+}

+ 97 - 0
src/api/crawler.js

@@ -0,0 +1,97 @@
+// 采集器
+import request from '@/utils/request'
+// 建立网站  start------------------------------------------------------------
+// 添加网站
+export const addWeb = (data) => {
+    return request({
+        url: '/collector/addWeb',
+        method: 'post',
+        data
+    })
+}
+// 获取并搜索网站
+export const getWeb = (data) => {
+    return request({
+        url: '/collector/getWeb',
+        method: 'post',
+        data
+    })
+}
+// 修改网站
+export const updateWeb = (data) => {
+    return request({
+        url: '/collector/upWeb',
+        method: 'post',
+        data
+    })
+}
+//删除网站
+export const delWeb=(params)=>{
+    return request({
+        url: '/collector/delWeb',
+        method: 'get',
+        params
+    })
+}
+
+
+// 规则列表  start-------------------------------------------------------------
+// 添加规则任务
+export const addRule = (data) => {
+    return request({
+        url: '/collector/addRule',
+        method: 'post',
+        data
+    })
+}
+// 获取并搜索规则任务
+export const getRule = (data) => {
+    return request({
+        url: '/collector/getRule',
+        method: 'post',
+        data
+    })
+}
+// 获取某一个规则任务
+export const getOneRule = (params) => {
+    return request({
+        url: '/collector/getOneRule',
+        method: 'get',
+        params
+    })
+}
+// 修改采集规则
+export const updateRule = (data) => {
+    return request({
+        url: '/collector/upRule',
+        method: 'post',
+        data
+    })
+}
+// 删除规则任务
+export const delRule = (params) => {
+    return request({
+        url: '/collector/delRule',
+        method: 'get',
+        params
+    })
+}
+// 开始采集
+export const sendCrawler = (data) => {
+    return request({
+        url: '/collector/sendCrawler',
+        method: 'post',
+        data
+    })
+}
+
+// 采集列表  start-------------------------------------------------------------
+// 添加规则任务
+export const addRule1 = (data) => {
+    return request({
+        url: '/collector/addRule',
+        method: 'post',
+        data
+    })
+}
+

BIN
src/assets/advertise/404.png


BIN
src/assets/advertise/Graph.png


BIN
src/assets/advertise/Info Circle.png


BIN
src/assets/advertise/Shield.png


+ 80 - 0
src/router/index.js

@@ -315,6 +315,86 @@ export const constantRoutes = [
       }
     ]
   },
+  {
+    path: '/webCrawler',
+    component: Layout,
+    children: [
+      {
+        name: '',
+        path: '',
+        component: () => import('@/views/crawler/webCrawler'),
+        meta: {
+          title: '建立网站',
+          hidden: true,
+          breadcrumb: true
+        }
+      }
+    ]
+  },
+  {
+    path: '/webRule',
+    component: Layout,
+    children: [
+      {
+        name: '',
+        path: '',
+        component: () => import('@/views/crawler/webRule'),
+        meta: {
+          title: '规则列表',
+          hidden: true,
+          breadcrumb: true
+        }
+      }
+    ]
+  },
+  {
+    path: '/webCrawlerList',
+    component: Layout,
+    children: [
+      {
+        name: '',
+        path: '',
+        component: () => import('@/views/crawler/webCrawlerList'),
+        meta: {
+          title: '采集列表',
+          hidden: true,
+          breadcrumb: true
+        }
+      }
+    ]
+  },
+  {
+    path: '/webCrawlerListEdit',
+    component: Layout,
+    children: [
+      {
+        name: '',
+        path: '',
+        component: () => import('@/views/crawler/webCrawlerListEdit'),
+        meta: {
+          title: '编辑资讯',
+          hidden: true,
+          breadcrumb: true
+        }
+      }
+    ]
+  },
+  {
+    path: '/adList',
+    component: Layout,
+    children: [
+      {
+        name: '',
+        path: '',
+        component: () => import('@/views/advertise/advertiseList'),
+        meta: {
+          title: '广告列表',
+          hidden: true,
+          breadcrumb: true
+        }
+      }
+    ]
+  },
   // {
   //   path: '/documentation',
   //   component: Layout,

+ 1 - 0
src/utils/baseUrl.js

@@ -1,6 +1,7 @@
 const URL = {
   testUrl: 'http://192.168.1.201:9501',//老刘服务器
   baseUrl: 'http://183.131.25.186:9501',//测试服务器
+  base_URL:'http://192.168.1.118:9501', //冯蕊服务器地址
   WebsocketUrl: 'ws://192.168.1.201:9506',//老刘websocket地址
   //WebsocketUrl: 'ws://183.131.25.186:9506'//测试服务器websocket地址
 }

+ 2 - 1
src/utils/request.js

@@ -8,7 +8,8 @@ import URL from '@/utils/baseUrl';
 const service = axios.create({
   //千万不能在这里使用绝对地址,这会导致webpack的devserve不生效
   //baseURL: URL.testUrl, //老刘服务器
-  baseURL: URL.baseUrl, //测试服务器
+  // baseURL: URL.baseUrl, //测试服务器
+  baseURL: URL.base_URL, //冯蕊服务器
   //baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
   //withCredentials: true, // send cookies when cross-domain requests
   timeout: 50000 // request timeout

+ 702 - 0
src/views/advertise/advertiseList.vue

@@ -0,0 +1,702 @@
+<template>
+    <!-- 广告列表 -->
+    <div>
+        <!-- 提示信息 -->
+        <div class="tips">
+            <el-row>
+                <el-col :span="12">
+                    <i class="tipsIcon"></i>
+                    <span class="tipsText">7个工作日内,若运营没有操作用户的申请,则用户申请的时间、信息等将会释放。</span>
+                </el-col>
+            </el-row>
+        </div>
+        <!-- 头部搜索框部分 -->
+        <div class="title">
+            <el-row>
+                <el-col :span="6" class="left">
+                    <div class="searchBox">
+                        <div class="searchTitle">工单编号</div>
+                        <el-input class="input" v-model="input" placeholder="请输入工单编号"></el-input>
+                    </div>
+                </el-col>
+                <el-col :span="6" class="left">
+                    <div class="searchBox">
+                        <div class="searchTitle">审核状态</div>
+                        <el-select v-model="value" placeholder="请选择审核状态">
+                            <el-option v-for="item in options" :key="item.value" :label="item.label"
+                                :value="item.value">
+                            </el-option>
+                        </el-select>
+                    </div>
+                </el-col>
+                <el-col :span="6" class="left">
+                    <div class="searchBox">
+                        <div class="searchTitle">广告状态</div>
+                        <el-select v-model="value" placeholder="请选择广告状态">
+                            <el-option v-for="item in options" :key="item.value" :label="item.label"
+                                :value="item.value">
+                            </el-option>
+                        </el-select>
+                    </div>
+                </el-col>
+                <el-col :span="6" class="right">
+                    <div class="btnList">
+                        <button class="search">搜索</button>
+                        <button class="reset">重置</button>
+                    </div>
+                </el-col>
+            </el-row>
+        </div>
+        <!--表格内容 start------------------------------------------------------------>
+        <div class="layerBox">
+            <tableTitle :name="tableDivTitle" />
+            <el-row>
+                <template>
+                    <el-table class="my-table" :data="tableData" style="width: 100%">
+                        <el-table-column fixed prop="number" label="编号" width="90">
+                        </el-table-column>
+                        <el-table-column prop="orderNum" label="工单编号" width="120">
+                        </el-table-column>
+                        <el-table-column prop="adName" label="广告名称" width="255">
+                        </el-table-column>
+                        <el-table-column prop="status" label="审核状态" width="90" algin="center">
+                        </el-table-column>
+                        <el-table-column prop="status_ad" label="广告状态" width="90">
+                        </el-table-column>
+                        <el-table-column prop="startTime" label="开始时间" width="120">
+                        </el-table-column>
+                        <el-table-column prop="endTime" label="结束时间" width="120">
+                        </el-table-column>
+                        <el-table-column prop="createTime" label="创建时间" width="">
+                        </el-table-column>
+                        <el-table-column prop="name" label="操作人" width="100">
+                        </el-table-column>
+                        <el-table-column fixed="right" label="操作" width="330">
+                            <template slot-scope="scope">
+                                <div class="listBtnBox">
+                                    <div class="listDeleteBtn" @click="deleteRow(scope.row.id, tableData)"><i
+                                            class="el-icon-delete"></i>删除</div>
+                                    <div class="listEditBtn" @click="goEdit(scope.row.id, tableData)"><i
+                                            class="el-icon-edit-outline"></i>编辑</div>
+                                    <div class="listReviewBtn" @click="goReview(scope.row.id, tableData)"><i
+                                            class="review"></i>审核</div>
+                                </div>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                </template>
+            </el-row>
+        </div>
+        <!--分页 start------------------------------------------------------------>
+        <div class="alignBox">
+            <el-row>
+                <el-col :span="24">
+                    <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                        :current-page="currentPage" :page-size="10" layout="total, prev, pager, next, jumper"
+                        :total="40">
+                    </el-pagination>
+                </el-col>
+            </el-row>
+        </div>
+        <!--分页 end------------------------------------------------------------>
+        <!--表格内容 end------------------------------------------------------------>
+
+        <!-- 弹出框 编辑 start----------------------------------------------------------->
+        <el-dialog :title="dialogName" :visible.sync="dialogTableVisible" width="56%" top="8vh">
+            <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+                <div class="dialogText">
+                    <el-form-item label="广告名称:" prop="">
+                        <el-input v-model="ruleForm.name" disabled placeholder="请输入网站名称"></el-input>
+                    </el-form-item>
+                    <el-form-item label="广告网址:" prop="">
+                        <el-input v-model="ruleForm.name" disabled placeholder="请输入网站名称"></el-input>
+                    </el-form-item>
+                    <el-form-item label="广告图:" prop="">
+                        <div class="adImage">
+                            <img src="../../assets/advertise/404.png" alt="">
+                        </div>
+                    </el-form-item>
+                    <el-form-item label="持续时间:" prop="">
+                        <el-date-picker v-model="value1" type="datetime" disabled placeholder="选择日期时间">
+                        </el-date-picker> 至
+                        <el-date-picker v-model="value1" type="datetime" disabled placeholder="选择日期时间">
+                        </el-date-picker>
+                    </el-form-item>
+                    <el-form-item label="广告尺寸:" prop="">
+                        <el-radio v-model="radio" label="1">1200x90px</el-radio>
+                        <el-radio v-model="radio" label="2">420x560px</el-radio>
+                    </el-form-item>
+
+                    <el-form-item label="价格:" prop="price">
+                        <div class="price">
+                            <el-input v-model="input" placeholder="请输入内容"></el-input> 元 x
+                            <el-input v-model="input" disabled placeholder="请输入内容"></el-input> 天 x
+                            <el-input v-model="input" disabled placeholder="请输入内容"></el-input> 个
+                        </div>
+                    </el-form-item>
+                    <el-form-item label="广告位置:" prop="">
+                        <span class="example">查看示例图</span>
+                        <div>
+                            <el-button disabled v-for="item in 12" class="el_btnList">中农兴业网 一号广告位</el-button>
+                        </div>
+                    </el-form-item>
+                </div>
+                <div class="dialogBtn">
+                    <button class="cancel" @click="cancelForm">取消</button>
+                    <button class="submit" @click="submitForm">提交</button>
+                </div>
+            </el-form>
+        </el-dialog>
+        <!-- 弹出框 编辑 end----------------------------------------------------------->
+
+        <!-- 弹出框 审核 start----------------------------------------------------------->
+        <el-dialog title="审核地址" :visible.sync="dialogFormVisible" width="35%" top="25vh">
+            <el-form ref="form" :model="form" label-width="80px">
+                <div class="radioGroup">
+                    <el-radio-group v-model="radio1">
+                        <el-radio :label="3">通过</el-radio>
+                        <el-radio :label="6">驳回</el-radio>
+                    </el-radio-group>   
+                    <el-form-item label="驳回原因:" :label-width="formLabelWidth" prop="name">
+                        <el-input v-model="textarea" type="textarea" resize="none" :rows="3" placeholder="请输入内容">
+                        </el-input>
+                    </el-form-item>
+                </div>
+
+            </el-form>
+            <div slot="footer" class="dialog-footer">
+                <el-button @click="dialogFormVisible = false">取 消</el-button>
+                <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
+            </div>
+        </el-dialog>
+        <!-- 弹出框 审核 end----------------------------------------------------------->
+    </div>
+
+</template>
+
+<script>
+//表格标题
+import tableTitle from './components/tableTitle.vue';
+//引入公用样式
+import '@/styles/global.less';
+
+export default {
+    components: {
+        tableTitle,//表格标题-
+    },
+    data() {
+        return {
+            input: "",
+            tableDivTitle: "广告列表",
+            radio1: "",      //广告尺寸
+            radio: "",      //广告尺寸
+            startTime: '', //开始时间
+            endTime: '',   //结束时间
+            value1: '',
+            form: {},
+            formLabelWidth: '',
+            textarea: '',
+            options: [{
+                value: '选项1',
+                label: '黄金糕'
+            }, {
+                value: '选项2',
+                label: '双皮奶'
+            }, {
+                value: '选项3',
+                label: '蚵仔煎'
+            }, {
+                value: '选项4',
+                label: '龙须面'
+            }, {
+                value: '选项5',
+                label: '北京烤鸭'
+            }],
+            value: '',
+            tableData: [{
+                number: 1,
+                orderNum: '21253321',
+                adName: '习近平关于“三农”工作的重要概述',
+                status: '待审核',
+                status_ad: '待审核',
+                startTime: '2024-11-10',
+                endTime: '2024-11-10',
+                createTime: '2024-06-27 21:50:28',
+                name: '王小虎',
+            }, {
+                number: 2,
+                orderNum: '21253321',
+                adName: '习近平关于“三农”工作的重要概述',
+                status: '待审核',
+                status_ad: '待审核',
+                startTime: '2024-11-10',
+                endTime: '2024-11-10',
+                createTime: '2024-06-27 21:50:28',
+                name: '王小虎',
+            }, {
+                number: 3,
+                orderNum: '21253321',
+                adName: '习近平关于“三农”工作的重要概述',
+                status: '待审核',
+                status_ad: '待审核',
+                startTime: '2024-11-10',
+                endTime: '2024-11-10',
+                createTime: '2024-06-27 21:50:28',
+                name: '王小虎',
+            }, {
+                number: 4,
+                orderNum: '21253321',
+                adName: '习近平关于“三农”工作的重要概述',
+                status: '待审核',
+                status_ad: '待审核',
+                startTime: '2024-11-10',
+                endTime: '2024-11-10',
+                createTime: '2024-06-27 21:50:28',
+                name: '王小虎',
+            }, {
+                number: 1,
+                orderNum: '21253321',
+                adName: '习近平关于“三农”工作的重要概述',
+                status: '待审核',
+                status_ad: '待审核',
+                startTime: '2024-11-10',
+                endTime: '2024-11-10',
+                createTime: '2024-06-27 21:50:28',
+                name: '王小虎',
+            }, {
+                number: 2,
+                orderNum: '21253321',
+                adName: '习近平关于“三农”工作的重要概述',
+                status: '待审核',
+                status_ad: '待审核',
+                startTime: '2024-11-10',
+                endTime: '2024-11-10',
+                createTime: '2024-06-27 21:50:28',
+                name: '王小虎',
+            }, {
+                number: 3,
+                orderNum: '21253321',
+                adName: '习近平关于“三农”工作的重要概述',
+                status: '待审核',
+                status_ad: '待审核',
+                startTime: '2024-11-10',
+                endTime: '2024-11-10',
+                createTime: '2024-06-27 21:50:28',
+                name: '王小虎',
+            }, {
+                number: 4,
+                orderNum: '21253321',
+                adName: '习近平关于“三农”工作的重要概述',
+                status: '待审核',
+                status_ad: '待审核',
+                startTime: '2024-11-10',
+                endTime: '2024-11-10',
+                createTime: '2024-06-27 21:50:28',
+                name: '王小虎',
+            }],
+            currentPage: 4,
+            dialogTableVisible: false,      //编辑弹框
+            dialogFormVisible: false,     //查看弹框
+            dialogName: '',
+            ruleForm: {
+                name: '',
+                region: ''
+            },
+            rules: {
+                name: [
+                    { required: true, message: '请输入网站名称', trigger: 'blur' },
+                ],
+                price: [
+                    { required: true, message: '请选择活动区域', trigger: 'change' }
+                ]
+            }
+        }
+    },
+    watch: {
+        radio1: {
+            handler(newVal, oldVal) {
+                console.log(newVal);
+            },
+            deep: true,
+            immediate: true
+        }
+    },
+    methods: {
+        //1.列表和分页相关 start ------------------------------------------------------------>
+        //1.1 开始请求列表信息方法
+        getData(type) {
+            // if (type == "search") {
+            //     this.getApiData.page = 1;
+            // }
+            // this.$store.dispatch('news/getArticleList', this.getApiData).then(res => {
+            //     //格式化:islink=0为不使用外面 islink=1为使用外链
+            //     //status=1为显示 status=2为不显示
+            //     let data = [];
+            //     for (let item of res.data.rows) {
+            //         // if(item.status==0){item.status="隐藏"}
+            //         // if(item.status==1){item.status="显示"}
+            //         // if(item.status==404){item.status="已删除"}
+            //         if (item.islink == 0) { item.islink = "否" }
+            //         if (item.islink == 1) { item.islink = "是" }
+            //         data.push(item)
+            //     }
+            //     this.tableData = res.data.rows; //给与内容
+            //     this.allCount = res.data.count; //给与总条数
+            // }).catch(() => {
+            //     this.$message({
+            //         type: 'warning',
+            //         message: '网络错误,请重试!'
+            //     });
+            // })
+        },
+        //1.2 删除内容
+        deleteRow(id) {
+            this.$confirm('注意:删除后,该条信息及其绑定关系全部删除', '是否确认删除该条信息?', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+            }).then(() => {
+                this.$message({
+                    type: 'success',
+                    message: '删除成功!'
+                });
+                console.log("当前删除:" + id)
+                // this.$store.dispatch('news/delArticle', { id: id }).then(res => {
+                //     this.getData();
+                //     this.$message({
+                //         type: 'success',
+                //         message: '删除成功!'
+                //     });
+                // }).catch(() => {
+                //     this.$message({
+                //         type: 'warning',
+                //         message: '网络错误,请重试!'
+                //     });
+                // })
+            }).catch(() => {
+                this.$message({
+                    type: 'warning',
+                    message: '已取消删除'
+                });
+            });
+        },
+        //1.3 修改网站状态
+        upRow(id, status) {
+            let data = {
+                id: id,
+                status: status
+            }
+            this.$store.dispatch('news/upArticleStatus', data).then(res => {
+                if (res.code == 200) {
+                    this.$message({
+                        type: 'success',
+                        message: '资讯状态已修改!'
+                    });
+                }
+            }).catch(() => {
+                this.$message({
+                    type: 'warning',
+                    message: '已取消删除'
+                });
+            });
+        },
+        //1.4 列表内容分页
+        //直接跳转
+        handleSizeChange(val) {
+            this.getApiData.page = val;
+            this.getData();
+        },
+        //1.5 点击分页
+        handleCurrentChange(val) {
+            this.getApiData.page = val;
+            this.getData();
+        },
+        // 1.6 搜索按钮
+
+        //1.7 重置按钮
+        clearSearchList() {
+            this.tableData = [];
+            this.getApiData.title = "";
+            this.getApiData.category_name = "";
+            this.getApiData.author = "";
+            this.getApiData.islink = "";
+            this.getApiData.status = "";
+            this.getApiData.page = 1;
+            this.getApiData.pageSize = 10;
+            this.getData();
+        },
+        //列表和分页相关 end ------------------------------------------------------------>
+
+        //1.8 添加
+        addWebsite() {
+            this.dialogTableVisible = true
+            this.dialogName = "添加"
+        },
+        //1.9 编辑
+        goEdit(val) {
+            console.log(val);
+            this.dialogTableVisible = true
+            this.dialogName = "编辑"
+        },
+
+        //2.0 审核
+        goReview() {
+            this.dialogFormVisible = true
+        },
+
+        // 弹出层相关方法
+        // 提交表单
+        submitForm() {
+
+        },
+        //取消添加或编辑
+        cancelForm() {
+            this.dialogTableVisible = false
+        }
+    },
+}
+</script>
+
+<style scoped lang="less">
+// 提示信息
+.tips {
+    margin: 30px;
+    background-color: #e9ecf9;
+    border-radius: 11px;
+
+    .tipsIcon {
+        margin: 10px 15px;
+        display: inline-block;
+        width: 24px;
+        height: 24px;
+        background: url("../../assets/advertise/Info Circle.png") no-repeat;
+        vertical-align: middle;
+    }
+
+    .tipsText {
+        font-size: 14px;
+        color: #666666;
+    }
+}
+
+// 头部
+.title {
+    margin: 30px 30px 20px 30px;
+    padding: 30px 30px 40px 30px;
+    background-color: #fff;
+    border-radius: 20px 20px 20px 20px;
+    border: 1px solid #E9EDF7;
+
+    .left {
+        float: left;
+    }
+
+    .right {
+        float: right;
+    }
+
+
+    .searchBox {
+        ::v-deep .el-input {
+            position: relative;
+            font-size: 14px;
+            display: inline-block;
+            width: 73%;
+        }
+
+        .searchTitle {
+            padding-bottom: 10px;
+            font-family: Microsoft YaHei, Microsoft YaHei;
+            font-weight: 400;
+            font-size: 14px;
+            color: #999999;
+            line-height: 16px;
+        }
+
+        .el-select {
+            width: 100%;
+            display: inline-block;
+            position: relative;
+        }
+    }
+
+
+    .btnList {
+        float: right;
+        padding-top: 28px;
+
+        button {
+            width: 120px;
+            height: 38px;
+            border: none;
+            border-radius: 8px;
+        }
+
+        .search {
+            background-color: #5570f1;
+            color: #fff;
+            margin-right: 20px;
+        }
+
+        .reset {
+            font-family: Microsoft YaHei, Microsoft YaHei;
+            font-weight: 400;
+            font-size: 16px;
+            color: #333333;
+            background: #F5F7FB;
+            border-radius: 8px 8px 8px 8px;
+            border: 1px solid rgba(85, 112, 241, 0.11);
+        }
+    }
+}
+
+.layerBox {
+    padding: 30px 20px;
+    position: relative;
+
+    .btn {
+        position: absolute;
+        top: 30px;
+        right: 20px;
+        height: 38px;
+        color: #fff;
+        background-color: #5570f1;
+        border: none;
+        border-radius: 8px;
+        padding: 8px 28px 9px;
+        box-sizing: border-box;
+    }
+
+    .listBtnBox {
+        justify-content: left;
+    }
+
+
+    .listDeleteBtn,
+    .listEditBtn,
+    .listReviewBtn {
+        margin-left: 0px;
+        padding-left: 0px;
+        margin-right: 20px;
+        width: 76px;
+        height: 36px;
+        line-height: 36px;
+    }
+
+
+    .listReviewBtn {
+        text-align: center;
+        border-radius: 8px;
+        cursor: pointer;
+        color: #519C66;
+        background-color: rgba(81, 156, 102, 0.16);
+
+        >.review {
+            display: inline-block;
+            width: 20px;
+            height: 20px;
+            background: url("../../assets/advertise/Shield.png");
+            margin-right: 6px;
+            vertical-align: -6px;
+        }
+    }
+
+    ::v-deep .el-form-item {
+        margin-bottom: 50px;
+    }
+
+    ::v-deep .el-select {
+        width: 100%;
+    }
+
+    ::v-deep .el-input--medium,
+    ::v-deep .el-form-item__label {
+        line-height: 36px;
+        font-size: 16px;
+    }
+}
+
+// 弹出层内容
+.dialogText {
+    margin: 0 7px 0 3px;
+    padding-bottom: 1px;
+    padding: 0px 60px 1px 20px;
+
+    .adImage {
+        width: 140px;
+        height: 140px;
+        line-height: 210px;
+        border-radius: 12px;
+        border: 1px solid rgba(85, 112, 241, 0.11);
+
+        img {
+            width: 140px;
+            height: 80px;
+        }
+    }
+
+    .price {
+        ::v-deep .el-input {
+            width: 29%;
+        }
+    }
+
+    .example {
+        font-family: Microsoft YaHei;
+        color: #5570F1;
+    }
+
+    .el_btnList {
+        margin-right: 15px;
+        margin-top: 20px;
+    }
+
+    //日期时间选择器的宽
+    ::v-deep .el-date-editor.el-input {
+        width: 48%;
+    }
+
+    ::v-deep .el-button+.el-button {
+        margin-left: 0px;
+    }
+}
+
+// 弹出层按钮
+.dialogBtn {
+    text-align: center;
+    margin: 50px auto 20px;
+
+    button {
+        width: 184px;
+        padding: 16px;
+        font-family: Microsoft YaHei, Microsoft YaHei;
+        font-weight: 400;
+        font-size: 20px;
+        border: none;
+        border-radius: 12px 12px 12px 12px;
+    }
+
+    // 取消
+    .cancel {
+        color: #333333;
+        background-color: #f5f7fb;
+        border: 2px solid rgba(85, 112, 241, 0.11);
+    }
+
+    // 提交
+    .submit {
+        color: #fff;
+        background-color: #5570F1;
+        margin-left: 40px;
+    }
+}
+
+//
+.radioGroup {
+
+    // margin-bottom: 40px;
+    ::v-deep .el-form-item {
+        margin-top: 40px;
+        margin-bottom: 0;
+    }
+}
+</style>

+ 43 - 0
src/views/advertise/components/tableTitle.vue

@@ -0,0 +1,43 @@
+<template>
+  <div class="tableTitle">
+    <span class="tableFloatLine"></span>
+    {{name}}
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    name: {
+      type: String,
+      required: true,
+    },
+  },
+  data() {
+    return {
+      someData: '',
+    };
+  },
+};
+</script>
+
+<style scoped lang="less">
+  .tableTitle {
+    height: 38px;
+    line-height: 38px;
+    color:#333333;
+    position: relative;
+    margin-bottom: 30px;
+    .tableFloatLine {
+      // display: inline-block;
+      width: 3px;
+      height:16px;
+      background:#5570F1;
+      display: block;
+      position: absolute;
+      left:-20px;
+      top:10px;
+      // vertical-align: middle;
+    }
+  }
+</style>

+ 41 - 0
src/views/crawler/components/tableTitle.vue

@@ -0,0 +1,41 @@
+<template>
+  <div class="tableTitle">
+    <span class="tableFloatLine"></span>
+    {{name}}
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    name: {
+      type: String,
+      required: true,
+    },
+  },
+  data() {
+    return {
+      someData: '',
+    };
+  },
+};
+</script>
+
+<style scoped lang="less">
+  .tableTitle {
+    height: 38px;
+    line-height: 38px;
+    color:#333333;
+    position: relative;
+    margin-bottom: 30px;
+    .tableFloatLine {
+      width: 3px;
+      height:16px;
+      background:#5570F1;
+      display: block;
+      position: absolute;
+      left:-20px;
+      top:10px;
+    }
+  }
+</style>

+ 532 - 0
src/views/crawler/webCrawler.vue

@@ -0,0 +1,532 @@
+<template>
+    <!-- 建立网站 -->
+    <div>
+        <div class="title">
+            <el-row>
+                <el-col :span="6" class="left">
+                    <div class="searchBox">
+                        <div class="searchTitle">网站名称:</div>
+                        <el-input v-model="webName" placeholder="请输入网站名称"></el-input>
+                    </div>
+                </el-col>
+                <el-col :span="6" class="right">
+                    <div class="btnList">
+                        <button class="search" @click="goSearch">搜索</button>
+                        <button class="reset" @click="reset">重置</button>
+                    </div>
+                </el-col>
+            </el-row>
+        </div>
+        <!--表格内容 start------------------------------------------------------------>
+        <div class="layerBox">
+            <tableTitle :name="tableDivTitle" />
+            <button class="btn" @click="addWebsite">添加网站</button>
+            <el-row>
+                <template>
+                    <el-table class="my-table" :data="tableData" style="width: 100%">
+                        <el-table-column fixed prop="id" label="编号" width="100">
+                        </el-table-column>
+                        <el-table-column prop="name" label="网站名称" width="">
+                        </el-table-column>
+                        <el-table-column prop="url" label="网站网址" width="">
+                        </el-table-column>
+                        <el-table-column prop="created_at" label="创建时间" width="">
+                        </el-table-column>
+                        <el-table-column prop="updated_at" label="修改时间" width="">
+                        </el-table-column>
+                        <el-table-column fixed="right" label="操作" width="330">
+                            <template slot-scope="scope">
+                                <div class="listBtnBox">
+                                    <div class="listDeleteBtn" @click="deleteRow(scope.row.id, scope.row)"><i
+                                            class="el-icon-delete"></i>删除</div>
+                                    <div class="listEditBtn" @click="goEdit(scope.row.id, scope.row)"><i
+                                            class="el-icon-edit-outline"></i>编辑</div>
+                                    <div class="listLookBtn" @click="goLook(scope.row.id, scope.row)"><i
+                                            class="el-icon-view"></i>查看</div>
+                                </div>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                </template>
+            </el-row>
+        </div>
+        <!--分页 start------------------------------------------------------------>
+        <div class="alignBox">
+            <el-row>
+                <el-col :span="24">
+                    <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                        :current-page="page" :page-size="pageSize" layout="total, prev, pager, next, jumper"
+                        :total="total">
+                    </el-pagination>
+                </el-col>
+            </el-row>
+        </div>
+        <!--分页 end------------------------------------------------------------>
+        <!--表格内容 end------------------------------------------------------------>
+
+        <!-- 弹出框 start------------------------------------------------------------>
+        <el-dialog :title="dialogName" :visible.sync="dialogTableVisible" width="50%">
+            <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+                <div class="dialogText">
+                    <el-form-item label="网站名称:" prop="name">
+                        <el-input v-model="ruleForm.name" :disabled="this.dialogName == '查看' ? true : false"
+                            placeholder="请输入网站名称"></el-input>
+                    </el-form-item>
+                    <el-form-item label="网站地址:" prop="url">
+                        <el-input v-model="ruleForm.url" :disabled="this.dialogName == '查看' ? true : false"
+                            placeholder="请输入网站地址(即网站URL链接)"></el-input>
+                    </el-form-item>
+                    <el-form-item label="规则类型:" prop="ruleType">
+                        <el-select v-model="ruleForm.ruleType" placeholder="请选择规则类型" :disabled="disabledType">
+                            <el-option label="规则类" value="1"></el-option>
+                            <el-option label="接口类" value="2"></el-option>
+                            <el-option label="自定义" value="3"></el-option>
+                        </el-select>
+                    </el-form-item>
+                </div>
+                <div class="dialogBtn">
+                    <button class="cancel" @click="cancelForm">取消</button>
+                    <button class="submit" @click="submitForm">提交</button>
+                </div>
+            </el-form>
+        </el-dialog>
+        <!-- 弹出框 end------------------------------------------------------------>
+    </div>
+
+</template>
+
+<script>
+//表格标题
+import tableTitle from './components/tableTitle.vue';
+//引入公用样式
+import '@/styles/global.less';
+// 引入api
+import { addWeb, getWeb, updateWeb, delWeb } from '@/api/crawler'
+
+export default {
+    components: {
+        tableTitle,//表格标题
+    },
+    data() {
+        return {
+            tableDivTitle: "网站列表",  //表格标题
+            webName: '', // 网站名称
+            activeId: '', // 被编辑的网站的id
+            activeType: '', //被编辑网站的type
+            disabled: true, //是否禁用
+
+
+            // 分页器相关
+            total: 0,
+            page: 1,
+            pageSize: 10,
+
+            //表格相关
+            tableData: [],
+
+            //弹出框相关
+            dialogTableVisible: false,  //是否显示
+            dialogName: '',     //弹框标题名
+            disabledType: true,  // 编辑的时候类型不可以改变
+
+            //表单相关
+            ruleForm: {
+                name: '',
+                url: '',
+                ruleType: "",
+            },
+            rules: {   //规则
+                name: [
+                    { required: true, message: '请输入网站名称', trigger: 'blur' },
+                ],
+                url: [
+                    { required: true, message: '请输入网站地址(即网站URL链接)', trigger: 'blur' }
+                ],
+                ruleType: [
+                    { required: true, message: '请选择规则类型', trigger: 'blur' }
+                ]
+            },
+
+        }
+    },
+    methods: {
+        //1.列表和分页相关 start ------------------------------------------------------------>
+        //1.1 获取网站列表数据
+        getData() {
+            getWeb({
+                page: this.page,
+                pageSize: this.pageSize,
+            }).then(data => {
+                // console.log(data);
+                this.tableData = data.data.rep
+                this.total = data.data.count
+            })
+        },
+        //1.2 删除内容
+        deleteRow(id, val) {
+            this.activeId = id
+            this.activeType = val.type
+            this.$confirm('注意:删除后,该条信息及其绑定关系全部删除', '是否确认删除该条信息?', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+            }).then(() => {
+                console.log("当前删除:" + id)
+                delWeb({
+                    // id:12,
+                    id: this.activeId,
+                    type: this.activeType,
+                }).then(data => {
+                    console.log(data);
+                    if (data.code == 200) {
+                        this.$message({
+                            type: 'success',
+                            message: '删除成功!'
+                        });
+                        this.getData()
+                    } else if (data.code == 0) {
+                        this.$message({
+                            type: 'error',
+                            message: data.message
+                        });
+                    }
+                })
+            }).catch(() => {
+                this.$message({
+                    type: 'warning',
+                    message: '已取消'
+                });
+            });
+        },
+
+        //1.3 列表内容分页
+        //直接跳转
+        handleSizeChange(val) {
+            this.page = val;
+            this.getData();
+        },
+        //1.4 点击分页
+        handleCurrentChange(val) {
+            this.page = val;
+            this.getData();
+        },
+
+        // 1.5 搜索按钮
+        goSearch() {
+            if (this.webName) {
+                getWeb({
+                    page: this.page,
+                    pageSize: this.pageSize,
+                    keyWord: this.webName
+                }).then(data => {
+                    // console.log(data);
+                    this.total = data.data.count
+                    this.tableData = data.data.rep
+                })
+            } else {
+                getWeb({
+                    page: this.page,
+                    pageSize: this.pageSize,
+                    keyWord: this.webName
+                }).then(data => {
+                    // console.log(data.message);
+                    this.$message.error(data.message);
+                })
+            }
+        },
+        //1.6 重置按钮
+        reset() {
+            this.webName = ''
+            this.getData()
+        },
+        //列表和分页相关 end ------------------------------------------------------------>
+
+        //1.7 添加
+        addWebsite() {
+            this.dialogTableVisible = true
+            this.dialogName = "添加"
+            this.disabledType = false //添加的时候类型可以选择
+
+        },
+        //1.8 编辑
+        goEdit(id, val) {
+            this.dialogTableVisible = true //弹框显示
+            this.dialogName = "编辑"    //弹框名字
+            this.disabledType = true //编辑的时候类型不可以改变
+            this.activeId = id
+            this.activeType = val.type
+            this.ruleForm.name = val.name
+            this.ruleForm.url = val.url
+            if (val.type == 1) {
+                this.ruleForm.ruleType = "规则类"
+            } else if (val.type == 2) {
+                this.ruleForm.ruleType = "接口类"
+            } else if (val.type == 3) {
+                this.ruleForm.ruleType = "自定义"
+            }
+        },
+        //1.9 查看
+        goLook(id, val) {
+            // console.log(id);
+            // console.log(val.type);
+            // console.log(val.name);
+            console.log(this.ruleForm.ruleType);
+
+
+            //跳转到规则列表页
+            this.$router.push({
+                path: '/webRule',
+                query: {
+                    id: id,
+                    type: val.type,
+                    name: val.name
+                }
+            })
+        },
+
+        // 弹出层相关方法
+        // 提交表单
+        submitForm() {
+            if (!this.ruleForm.name) {
+                this.$message.error("网站名称不能为空");
+                return
+            }
+            if (!this.ruleForm.url) {
+                this.$message.error("网站地址不能为空");
+                return
+            }
+            if (!this.ruleForm.ruleType) {
+                this.$message.error('请选择规则类型')
+                return
+            }
+            if (this.dialogName == "添加") {
+                //添加
+                addWeb({
+                    name: this.ruleForm.name,
+                    url: this.ruleForm.url,
+                    type: this.ruleForm.ruleType
+                }).then(data => {
+                    console.log(data);
+                    if (data.code == 0) {
+                        this.$message.error(data.message)
+                        this.dialogTableVisible = false
+                    } else if (data.code == 200) {
+                        this.$message({
+                            message: data.data,
+                            type: 'success'
+                        });
+                        this.dialogTableVisible = false
+                        this.getData()
+                    }
+                })
+            } else if (this.dialogName == "编辑") {
+                updateWeb({
+                    name: this.ruleForm.name,
+                    url: this.ruleForm.url,
+                    id: this.activeId
+                }).then(data => {
+                    console.log(data);
+                    if (data.code == 0) {
+                        this.$message({
+                            message: data.message,
+                            type: 'error'
+                        })
+                    } else if (data.code == 200) {
+                        this.$message({
+                            message: "修改成功",
+                            type: 'success'
+                        })
+                        this.dialogTableVisible = false
+                        this.getData()
+                    }
+                })
+            } else if (this.dialogName == "查看") {
+                this.dialogTableVisible = false
+            }
+        },
+        //取消添加或编辑
+        cancelForm() {
+            this.dialogTableVisible = false
+        },
+    },
+    mounted() {
+        //获取网站列表数据
+        this.getData()
+
+    }
+}
+</script>
+
+<style scoped lang="less">
+.title {
+    margin: 30px 30px 20px 30px;
+    padding: 30px 30px 40px 30px;
+    background-color: #fff;
+    border-radius: 20px 20px 20px 20px;
+    border: 1px solid #E9EDF7;
+
+    .left {
+        float: left;
+    }
+
+    .right {
+        float: right;
+    }
+
+    .searchBox {
+        .searchTitle {
+            padding-bottom: 10px;
+            font-family: Microsoft YaHei, Microsoft YaHei;
+            font-weight: 400;
+            font-size: 14px;
+            color: #999999;
+            line-height: 16px;
+        }
+
+        .el-select {
+            width: 300px;
+            display: inline-block;
+            position: relative;
+        }
+    }
+
+    .btnList {
+        float: right;
+        padding-top: 28px;
+
+        button {
+            width: 120px;
+            height: 38px;
+            border: none;
+            border-radius: 8px;
+        }
+
+        .search {
+            background-color: #5570f1;
+            color: #fff;
+            margin-right: 20px;
+        }
+
+        .reset {
+            font-family: Microsoft YaHei, Microsoft YaHei;
+            font-weight: 400;
+            font-size: 16px;
+            color: #333333;
+            background: #F5F7FB;
+            border-radius: 8px 8px 8px 8px;
+            border: 1px solid rgba(85, 112, 241, 0.11);
+        }
+    }
+}
+
+.layerBox {
+    padding: 30px 20px;
+    position: relative;
+
+    .btn {
+        position: absolute;
+        top: 30px;
+        right: 20px;
+        height: 38px;
+        color: #fff;
+        background-color: #5570f1;
+        border: none;
+        border-radius: 8px;
+        padding: 8px 28px 9px;
+        box-sizing: border-box;
+    }
+
+    .listBtnBox {
+        justify-content: left;
+    }
+
+
+    .listDeleteBtn,
+    .listEditBtn,
+    .listLookBtn {
+        margin-left: 0px;
+        padding-left: 0px;
+        margin-right: 20px;
+        width: 76px;
+        height: 36px;
+        line-height: 36px;
+    }
+
+
+    .listLookBtn {
+        text-align: center;
+        border-radius: 8px;
+        cursor: pointer;
+        color: #999999;
+        background-color: rgba(153, 153, 153, 0.16);
+
+        >i {
+            padding-right: 8px;
+        }
+    }
+
+    // from表单中每条数据的下外边距
+    ::v-deep .el-form-item {
+        margin-bottom: 50px;
+    }
+
+    //下拉框宽度
+    ::v-deep .el-select {
+        width: 100%;
+    }
+
+    ::v-deep .el-input--medium,
+    ::v-deep .el-form-item__label {
+        line-height: 36px;
+        font-size: 16px;
+    }
+}
+
+// 弹出层内容
+.dialogText {
+    margin: 0 7px 0 3px;
+    padding-top: 20px;
+    padding-bottom: 1px;
+    padding: 20px 60px 1px 20px;
+    background-color: #f5f7fb;
+
+    // from表单中每条数据的下外边距
+    ::v-deep .el-form-item {
+        margin-bottom: 50px;
+    }
+
+    //下拉框宽度
+    ::v-deep .el-select {
+        width: 100%;
+    }
+}
+
+// 弹出层按钮
+.dialogBtn {
+    text-align: center;
+    margin: 50px auto 20px;
+
+    button {
+        width: 184px;
+        padding: 16px;
+        font-family: Microsoft YaHei, Microsoft YaHei;
+        font-weight: 400;
+        font-size: 20px;
+        border: none;
+        border-radius: 12px 12px 12px 12px;
+    }
+
+    // 取消
+    .cancel {
+        color: #333333;
+        background-color: #f5f7fb;
+        border: 2px solid rgba(85, 112, 241, 0.11);
+    }
+
+    // 提交
+    .submit {
+        color: #fff;
+        background-color: #5570F1;
+        margin-left: 40px;
+    }
+}
+</style>

+ 518 - 0
src/views/crawler/webCrawlerList.vue

@@ -0,0 +1,518 @@
+<template>
+    <!-- 采集列表 -->
+    <div>
+        <div class="title">
+            <el-row>
+                <el-col :span="6" class="left">
+                    <div class="searchBox">
+                        <div class="searchTitle">网站名称:</div>
+                        <el-select v-model="value" placeholder="请选择网站名称" width="100%">
+                            <el-option v-for="item in options" :key="item.value" :label="item.label"
+                                :value="item.value">
+                            </el-option>
+                        </el-select>
+                    </div>
+                </el-col>
+                <el-col :span="6" class="right">
+                    <div class="btnList">
+                        <button class="search">搜索</button>
+                        <button class="reset">重置</button>
+                    </div>
+                </el-col>
+            </el-row>
+        </div>
+        <!--表格内容 start------------------------------------------------------------>
+        <div class="layerBox">
+            <tableTitle :name="tableDivTitle" />
+            <div class="btnList">
+                <button class="navigation">关联导航池</button>
+                <button class="consultList">导入咨询列表</button>
+            </div>
+
+            <el-row>
+                <template>
+                    <el-table class="my-table" :data="tableData" style="width: 100%">
+                        <el-table-column fixed prop="number" label="编号" width="80">
+                        </el-table-column>
+                        <el-table-column prop="name" label="资讯题目" width="230">
+                        </el-table-column>
+                        <el-table-column prop="name" label="原始资讯题目" width="230">
+                        </el-table-column>
+                        <el-table-column prop="date" label="导航池名称" width="90">
+                        </el-table-column>
+                        <el-table-column prop="from" label="来源" width="180">
+                        </el-table-column>
+                        <el-table-column prop="status" label="导入状态" width="80">
+                        </el-table-column>
+                        <el-table-column prop="author" label="作者" width="80">
+                        </el-table-column>
+                        <el-table-column prop="createTime" label="采集时间" width="160">
+                        </el-table-column>
+                        <el-table-column prop="updateTime" label="修改时间" width="160">
+                        </el-table-column>
+                        <el-table-column fixed="right" label="操作" width="200">
+                            <template slot-scope="scope">
+                                <div class="listBtnBox">
+                                    <div class="listDeleteBtn" @click="deleteRow(scope.row.id, tableData)"><i
+                                            class="el-icon-delete"></i>删除</div>
+                                    <div class="listEditBtn" @click="goEdit(scope.row.id, tableData)"><i
+                                            class="el-icon-edit-outline"></i>编辑</div>
+                                </div>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                </template>
+            </el-row>
+        </div>
+        <!--分页 start------------------------------------------------------------>
+        <div class="alignBox">
+            <el-row>
+                <el-col :span="24">
+                    <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                        :current-page="currentPage" :page-size="10" layout="total, prev, pager, next, jumper"
+                        :total="40">
+                    </el-pagination>
+                </el-col>
+            </el-row>
+        </div>
+        <!--分页 end------------------------------------------------------------>
+        <!--表格内容 end------------------------------------------------------------>
+    </div>
+
+</template>
+
+<script>
+//表格标题
+import tableTitle from './components/tableTitle.vue';
+//引入公用样式
+import '@/styles/global.less';
+
+export default {
+    components: {
+        tableTitle,//表格标题
+    },
+    data() {
+        return {
+            tableDivTitle: "任务规则列表",
+            options: [{
+                value: '选项1',
+                label: '黄金糕'
+            }, {
+                value: '选项2',
+                label: '双皮奶'
+            }, {
+                value: '选项3',
+                label: '蚵仔煎'
+            }, {
+                value: '选项4',
+                label: '龙须面'
+            }, {
+                value: '选项5',
+                label: '北京烤鸭'
+            }],
+            value: '',
+            tableData: [{
+                number: 1,
+                date: '--',
+                name: '公安部公布5起涉企犯罪典型案例',
+                from: '中华人们共和国公安部',
+                createTime: '2024-06-27 21:50:28',
+                updateTime: '2024-06-27 21:50:28',
+                status: '未导入',
+                author: '佚名'
+            }, {
+                number: 2,
+                date: '--',
+                name: '公安部公布5起涉企犯罪典型案例',
+                from: '中华人们共和国公安部',
+                createTime: '2024-06-27 21:50:28',
+                updateTime: '2024-06-27 21:50:28',
+                status: '未导入',
+                author: '佚名'
+            }, {
+                number: 3,
+                date: '--',
+                name: '公安部公布5起涉企犯罪典型案例',
+                from: '中华人们共和国公安部',
+                createTime: '2024-06-27 21:50:28',
+                updateTime: '2024-06-27 21:50:28',
+                status: '未导入',
+                author: '佚名'
+            }, {
+                number: 4,
+                date: '--',
+                name: '公安部公布5起涉企犯罪典型案例',
+                from: '中华人们共和国公安部',
+                createTime: '2024-06-27 21:50:28',
+                updateTime: '2024-06-27 21:50:28',
+                status: '未导入',
+                author: '佚名'
+            }, {
+                number: 5,
+                date: '--',
+                name: '公安部公布5起涉企犯罪典型案例',
+                from: '中华人们共和国公安部',
+                createTime: '2024-06-27 21:50:28',
+                updateTime: '2024-06-27 21:50:28',
+                status: '未导入',
+                author: '佚名'
+            }, {
+                number: 6,
+                date: '--',
+                name: '公安部公布5起涉企犯罪典型案例',
+                from: '中华人们共和国公安部',
+                createTime: '2024-06-27 21:50:28',
+                updateTime: '2024-06-27 21:50:28',
+                status: '未导入',
+                author: '佚名'
+            }, {
+                number: 7,
+                date: '--',
+                name: '王小洪在新疆调研时强调深入学 习贯彻习近平总书记重要讲话精 神更好统筹高质量发展和高水平 安全',
+                from: '中华人们共和国公安部',
+                createTime: '2024-06-27 21:50:28',
+                updateTime: '2024-06-27 21:50:28',
+                status: '未导入',
+                author: '佚名'
+            }, {
+                number: 8,
+                date: '--',
+                name: '王小洪在新疆调研时强调深入学 习贯彻习近平总书记重要讲话精 神更好统筹高质量发展和高水平 安全',
+                from: '中华人们共和国公安部',
+                createTime: '2024-06-27 21:50:28',
+                updateTime: '2024-06-27 21:50:28',
+                status: '未导入',
+                author: '佚名'
+            }],
+            currentPage: 4,
+            dialogTableVisible: false,
+            dialogName: '',
+            ruleForm: {
+                name: '',
+                region: ''
+            },
+            rules: {
+                name: [
+                    { required: true, message: '请输入网站名称', trigger: 'blur' },
+                ],
+                region: [
+                    { required: true, message: '请选择活动区域', trigger: 'change' }
+                ]
+            }
+        }
+    },
+    methods: {
+        //1.列表和分页相关 start ------------------------------------------------------------>
+        //1.1 开始请求列表信息方法
+        getData(type) {
+            // if (type == "search") {
+            //     this.getApiData.page = 1;
+            // }
+            // this.$store.dispatch('news/getArticleList', this.getApiData).then(res => {
+            //     //格式化:islink=0为不使用外面 islink=1为使用外链
+            //     //status=1为显示 status=2为不显示
+            //     let data = [];
+            //     for (let item of res.data.rows) {
+            //         // if(item.status==0){item.status="隐藏"}
+            //         // if(item.status==1){item.status="显示"}
+            //         // if(item.status==404){item.status="已删除"}
+            //         if (item.islink == 0) { item.islink = "否" }
+            //         if (item.islink == 1) { item.islink = "是" }
+            //         data.push(item)
+            //     }
+            //     this.tableData = res.data.rows; //给与内容
+            //     this.allCount = res.data.count; //给与总条数
+            // }).catch(() => {
+            //     this.$message({
+            //         type: 'warning',
+            //         message: '网络错误,请重试!'
+            //     });
+            // })
+        },
+        //1.2 删除内容
+        deleteRow(id) {
+            this.$confirm('注意:删除后,该条信息及其绑定关系全部删除', '是否确认删除该条信息?', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+            }).then(() => {
+                this.$message({
+                    type: 'success',
+                    message: '删除成功!'
+                });
+                console.log("当前删除:" + id)
+                // this.$store.dispatch('news/delArticle', { id: id }).then(res => {
+                //     this.getData();
+                //     this.$message({
+                //         type: 'success',
+                //         message: '删除成功!'
+                //     });
+                // }).catch(() => {
+                //     this.$message({
+                //         type: 'warning',
+                //         message: '网络错误,请重试!'
+                //     });
+                // })
+            }).catch(() => {
+                this.$message({
+                    type: 'warning',
+                    message: '已取消删除'
+                });
+            });
+        },
+        //1.3 修改网站状态
+        upRow(id, status) {
+            let data = {
+                id: id,
+                status: status
+            }
+            this.$store.dispatch('news/upArticleStatus', data).then(res => {
+                if (res.code == 200) {
+                    this.$message({
+                        type: 'success',
+                        message: '资讯状态已修改!'
+                    });
+                }
+            }).catch(() => {
+                this.$message({
+                    type: 'warning',
+                    message: '已取消删除'
+                });
+            });
+        },
+        //1.4 列表内容分页
+        //直接跳转
+        handleSizeChange(val) {
+            this.getApiData.page = val;
+            this.getData();
+        },
+        //1.5 点击分页
+        handleCurrentChange(val) {
+            this.getApiData.page = val;
+            this.getData();
+        },
+        // 1.6 搜索按钮
+
+        //1.7 重置按钮
+        clearSearchList() {
+            this.tableData = [];
+            this.getApiData.title = "";
+            this.getApiData.category_name = "";
+            this.getApiData.author = "";
+            this.getApiData.islink = "";
+            this.getApiData.status = "";
+            this.getApiData.page = 1;
+            this.getApiData.pageSize = 10;
+            this.getData();
+        },
+        //列表和分页相关 end ------------------------------------------------------------>
+
+        //1.8 添加
+        // addWebsite() {
+        //     this.dialogTableVisible = true
+        //     this.dialogName = "添加"
+        // },
+        //1.9 编辑
+        goEdit(val) {
+            console.log(val);
+            this.$router.push('/webCrawlerListEdit')
+        },
+
+        // 弹出层相关方法
+        // 提交表单
+        submitForm() {
+
+        },
+        //取消添加或编辑
+        cancelForm() {
+            this.$confirm('确定要取消吗', '提示', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+            }).then(() => {
+                // console.log("当前删除:" + id)
+                // this.getData();
+                this.dialogTableVisible = false
+                this.$message({
+                    type: 'success',
+                    message: '已退出'
+                });
+
+            }).catch(() => {
+                this.$message({
+                    type: 'warning',
+                    message: '已取消'
+                });
+            });
+        }
+    },
+}
+</script>
+
+<style scoped lang="less">
+.title {
+    margin: 30px 30px 20px 30px;
+    padding: 30px 30px 40px 30px;
+    background-color: #fff;
+    border-radius: 20px 20px 20px 20px;
+    border: 1px solid #E9EDF7;
+
+    .left {
+        float: left;
+    }
+
+    .right {
+        float: right;
+    }
+
+    .searchBox {
+        .searchTitle {
+            padding-bottom: 10px;
+            font-family: Microsoft YaHei, Microsoft YaHei;
+            font-weight: 400;
+            font-size: 14px;
+            color: #999999;
+            line-height: 16px;
+        }
+
+        .el-select {
+            width: 300px;
+            display: inline-block;
+            position: relative;
+        }
+    }
+
+    .btnList {
+        float: right;
+        padding-top: 28px;
+
+        button {
+            width: 120px;
+            height: 38px;
+            border: none;
+            border-radius: 8px;
+        }
+
+        .search {
+            background-color: #5570f1;
+            color: #fff;
+            margin-right: 20px;
+        }
+
+        .reset {
+            font-family: Microsoft YaHei, Microsoft YaHei;
+            font-weight: 400;
+            font-size: 16px;
+            color: #333333;
+            background: #F5F7FB;
+            border-radius: 8px 8px 8px 8px;
+            border: 1px solid rgba(85, 112, 241, 0.11);
+        }
+    }
+}
+
+.layerBox {
+    padding: 30px 20px;
+    position: relative;
+
+
+    .btnList {
+        position: absolute;
+        top: 30px;
+        right: 20px;
+        height: 38px;
+
+        >button {
+            color: #fff;
+            background-color: #5570f1;
+            border: none;
+            border-radius: 8px;
+            padding: 8px 28px 9px;
+            box-sizing: border-box;
+        }
+
+        >button:first-child {
+            margin-right: 30px;
+        }
+    }
+
+    .listBtnBox {
+        justify-content: left;
+    }
+
+
+    .listDeleteBtn,
+    .listEditBtn,
+    .listLookBtn {
+        margin-left: 0px;
+        padding-left: 0px;
+        margin-right: 20px;
+        width: 76px;
+        height: 36px;
+        line-height: 36px;
+    }
+
+    .listLookBtn {
+        text-align: center;
+        border-radius: 8px;
+        cursor: pointer;
+        color: #999999;
+        background-color: rgba(153, 153, 153, 0.16);
+
+        >i {
+            padding-right: 8px;
+        }
+    }
+}
+
+// 弹出层内容
+.dialogText {
+    margin: 0 7px 0 3px;
+    padding-top: 20px;
+    padding-bottom: 1px;
+    padding: 20px 60px 1px 20px;
+    background-color: #f5f7fb;
+}
+
+// 弹出层按钮
+.dialogBtn {
+    text-align: center;
+    margin: 50px auto 20px;
+
+    button {
+        width: 184px;
+        padding: 16px;
+        font-family: Microsoft YaHei, Microsoft YaHei;
+        font-weight: 400;
+        font-size: 20px;
+        border: none;
+        border-radius: 12px 12px 12px 12px;
+    }
+
+    // 取消
+    .cancel {
+        color: #333333;
+        background-color: #f5f7fb;
+        border: 2px solid rgba(85, 112, 241, 0.11);
+    }
+
+    // 提交
+    .submit {
+        color: #fff;
+        background-color: #5570F1;
+        margin-left: 40px;
+    }
+}
+
+::v-deep .el-form-item {
+    margin-bottom: 50px;
+}
+
+::v-deep .el-select {
+    width: 100%;
+}
+
+::v-deep .el-input--medium,
+::v-deep .el-form-item__label {
+    line-height: 36px;
+    font-size: 16px;
+}
+</style>

+ 367 - 0
src/views/crawler/webCrawlerListEdit.vue

@@ -0,0 +1,367 @@
+<template>
+    <!-- 采集咨询 -->
+    <div>
+        <!--表格内容 start------------------------------------------------------------>
+        <div class="layerBox">
+            <tableTitle :name="tableDivTitle" />
+            <el-row class="formContent">
+                <el-checkbox v-model="checked" class="links">引用外链</el-checkbox>
+                <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+                    <el-form-item label="资讯题目:" prop="title">
+                        <el-input v-model="ruleForm.title" placeholder="请输入资讯题目" maxlength="26"
+                            show-word-limit></el-input>
+                    </el-form-item>
+                    <el-form-item label="外链地址:" prop="title">
+                        <el-input v-model="ruleForm.url" placeholder="请输入外链地址(即外链网站URL链接)" maxlength="26"
+                            show-word-limit></el-input>
+                    </el-form-item>
+                    <el-form-item label="导航池名称:" prop="name">
+                        <el-select v-model="ruleForm.name" disabled placeholder="请选择导航池名称">
+                            <el-option label="区域一" value="shanghai"></el-option>
+                            <el-option label="区域二" value="beijing"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="推荐等级:" prop="grade">
+                        <el-select v-model="ruleForm.grade" placeholder="请选择推荐等级">
+                            <el-option label="区域一" value="shanghai"></el-option>
+                            <el-option label="区域二" value="beijing"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <!-- 缩略图 -->
+                    <el-form-item label="缩略图:" prop="imgSrc">
+                        <div class="uploaderBox">
+                            <div class="avatar-upload-container" @mouseenter="hovering = true"
+                                @mouseleave="hovering = false">
+                                <!-- 上传组件 -->
+                                <el-upload class="avatar-uploader" action="#" :show-file-list="false"
+                                    :before-upload="beforeAvatarUpload">
+                                    <!-- 预览图片 -->
+                                    <img v-if="imgSrc" :src="imgSrc" class="avatar">
+                                    <div v-else class="chooseImgDiv">
+                                        <div>
+                                            <img src="@/assets/public/upload/noImage.png">
+                                            <div>请选择缩略图</div>
+                                        </div>
+                                    </div>
+                                </el-upload>
+                                <!-- 删除按钮,当鼠标悬浮时显示 -->
+                                <div v-if="hovering && iconSrc" class="delete-button" @click="handleDelete">
+                                    <i class="el-icon-delete"></i>
+                                </div>
+                            </div>
+                            <p class="imgTips">图片长宽比例为16:9, 大小不能超过500K。</p>
+                        </div>
+                    </el-form-item>
+                    <el-form-item label="资讯关键词:" prop="keywords" class="keywords">
+                        <el-input v-model="ruleForm.keywords" placeholder="请输入资讯的关键词"></el-input>
+                        <el-tooltip class="item" effect="dark"
+                            content="  资讯关键词,如:三农市场网,最大的三农市场交易平台—全国三农信息一体化应用平台—中农兴业工程指定网站-农业百强网站。"
+                            placement="top-start">
+                            <i class="el-icon-warning"></i>
+                        </el-tooltip>
+                    </el-form-item>
+                    <el-form-item label="资讯描述:" prop="desc" class="desc">
+                        <el-input type="textarea" v-model="ruleForm.desc" placeholder="请输入资讯的描述..." maxlength="300"
+                            resize="none" show-word-limit></el-input>
+                        <el-tooltip placement="top-start">
+                            <div slot="content">
+                                资讯描述,如:2020年,我们取得了脱贫攻坚的伟大胜利,如期全面建成小康社会,未来五年湖南在统筹推进乡村振兴、加快农业农村现代化建设方面有什么样的目标和具体措施?<br />
+                                省第十二次党代会代表,省委农村工作领导小组办公室主任,省农业农村厅党组书记、厅长袁延文在党代表通道,三农市场网,最大的三农市场交易平台—全国三农信息一体化应用平台—中农兴业工程指定网站-农业百强网站。
+                            </div>
+                            <i class="el-icon-warning"></i>
+                        </el-tooltip>
+                    </el-form-item>
+                    <!-- 富文本 -->
+                    <el-form-item label="资讯内容:" prop="content">
+                        <!-- <div class="editor-container">
+                            <div v-if="showHtml">
+                                <textarea v-model="editorHtml" style="width: 100%; height: 400px;"></textarea>
+                            </div>
+                            <div v-else>
+                                <quill-editor ref="quillEditor" v-model="form.content" :options="editorOptions"
+                                    class="my-quill-editor" />
+                            </div> -->
+                        <!-- 多图上传隐藏的input -->
+                        <!-- <input type="file" ref="multiFileInput" @change="handleMultipleFiles" multiple hidden
+                                accept="image/jpeg, image/png" />
+                        </div> -->
+                    </el-form-item>
+                    <el-form-item label="作者:" prop="author">
+                        <el-input v-model="ruleForm.author" placeholder="请输入发布资讯的作者"></el-input>
+                    </el-form-item>
+                    <el-form-item label="是否原创:" prop="original">
+                        <el-radio-group v-model="ruleForm.original">
+                            <el-radio label="否"></el-radio>
+                            <el-radio label="是"></el-radio>
+                        </el-radio-group>
+                    </el-form-item>
+                    <!-- 浏览量 -->
+                    <el-form-item label="浏览量:" prop="">
+                        <el-input-number v-model="ruleForm.count" @change="handleChange" :min="1" :max="10"
+                            label="描述文字"></el-input-number>
+                    </el-form-item>
+                    <el-form-item label="来源链接:" prop="link">
+                        <el-input v-model="ruleForm.link" placeholder="请输入完整的资讯来源链接。"></el-input>
+                    </el-form-item>
+                    <el-form-item label="来源:" prop="source">
+                        <el-input v-model="ruleForm.source" placeholder="请输入资讯来源,如:XX市农业农村局。"></el-input>
+                        <p class="tips">( 同意《免责声明》:
+                            本文来源于网络转载,仅供学习交流使用,不构成商业目的。版权归原作者所有,如设计作品内容,版权和其他问题,请在30天内与本网联系,我们将第一时间处理。)</p>
+                    </el-form-item>
+                </el-form>
+            </el-row>
+            <div class="btn">
+                <button class="cancel">取消</button>
+                <button class="sure">确定</button>
+            </div>
+        </div>
+        <!--分页 start------------------------------------------------------------>
+        <div class="alignBox">
+            <el-row>
+                <el-col :span="24">
+                    <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                        :current-page="currentPage" :page-size="10" layout="total, prev, pager, next, jumper"
+                        :total="40">
+                    </el-pagination>
+                </el-col>
+            </el-row>
+        </div>
+        <!--分页 end------------------------------------------------------------>
+        <!--表格内容 end------------------------------------------------------------>
+
+    </div>
+</template>
+
+<script>
+//表格标题
+import tableTitle from './webCrawlerListEdit/tableTitle.vue';
+//引入公用样式
+import '@/styles/global.less';
+
+import { quillEditor } from 'vue-quill-editor';
+import 'quill/dist/quill.snow.css';
+import ImageResize from 'quill-image-resize-module';
+import Quill from 'quill';  // 引入 Quill
+import Delta from 'quill-delta'; // 引入 Delta,用于手动修改文档
+
+export default {
+    components: {
+        quillEditor,
+        tableTitle,  //表格标题
+    },
+    data() {
+        return {
+            tableDivTitle: "编辑资讯",
+            num: 1,
+            checked: false,
+            iconSrc: '',
+            ruleForm: {
+                title: '',     // 资讯题目
+                url: '',       // 外链地址      
+                name: '',      // 导航池名称
+                grade: '',     // 推荐等级
+                imgSrc: '',    // 缩略图  
+                keywords: '',  // 关键词 
+                desc: '',      // 描述
+                content: '',   // 内容
+                author: '',    // 作者
+                count: '',     // 浏览量
+                original: '',  // 原创
+                source: '',    // 来源
+                link: ''       // 来源链接
+            },
+            rules: {
+                title: [
+                    { required: true, message: '请输入资讯题目', trigger: 'blur' }
+                ],
+                url: [
+                    { required: true, message: '请选择资讯推荐等级', trigger: 'blur' }
+                ],
+                name: [
+                    { required: true, message: '请选择资讯推荐等级', trigger: 'blur' }
+                ],
+                grade: [
+                    { required: true, message: '请选择资讯推荐等级', trigger: 'blur' }
+                ],
+                imgSrc: [
+                    { required: true, message: '请选择资讯推荐等级', trigger: 'blur' }
+                ],
+                keywords: [
+                    { required: true, message: '请选择资讯推荐等级', trigger: 'blur' }
+                ],
+                desc: [
+                    { required: true, message: '请选择资讯推荐等级', trigger: 'blur' }
+                ],
+                content: [
+                    { required: true, message: '请选择资讯推荐等级', trigger: 'blur' }
+                ],
+                author: [
+                    { required: true, message: '请选择资讯推荐等级', trigger: 'blur' }
+                ],
+                count: [
+                    { required: true, message: '请选择资讯推荐等级', trigger: 'blur' }
+                ],
+                original: [
+                    { required: true, message: '请选择资讯推荐等级', trigger: 'blur' }
+                ],
+                link: [
+                    { required: true, message: '请选择资讯推荐等级', trigger: 'change' }
+                ],
+                source: [
+                    { required: true, message: '请选择资讯推荐等级', trigger: 'change' }
+                ]
+
+            }
+        }
+    },
+    methods: {
+        // 提交表单
+        submitForm() {
+            
+        },
+        //取消添加或编辑
+        cancelForm() {
+            this.dialogTableVisible = false
+        },
+        submitForm(formName) {
+            this.$refs[formName].validate((valid) => {
+                if (valid) {
+                    alert('submit!');
+                } else {
+                    console.log('error submit!!');
+                    return false;
+                }
+            });
+        },
+        resetForm(formName) {
+            this.$refs[formName].resetFields();
+        },
+        handleChange(value) {
+            console.log(value);
+        }
+    },
+    
+}
+</script>
+
+<style scoped lang="less">
+p {
+    padding: 0;
+    margin: 0;
+}
+
+.layerBox {
+    padding: 30px 20px;
+    position: relative;
+
+    .listBtnBox {
+        justify-content: left;
+    }
+
+    // 表单内容
+    .formContent {
+        background-color: #f5f7fb;
+        padding: 30px 225px 0px 25px;
+        position: relative;
+
+        // 顶部引用外链
+        .links {
+            position: absolute;
+            top: 37px;
+            right: 97px;
+        }
+
+        //底部免责声明提示文字
+        .tips {
+            margin: 0 auto;
+            font-size: 13px;
+            color: #666666;
+        }
+
+        // 图片上传提示文字
+        .imgTips {
+            color: #8B8D97;
+            font-size: 14px;
+        }
+
+        // 资讯关键词 和 资讯描述 的 文字提示 
+        .keywords,
+        .desc {
+            position: relative;
+
+            i {
+                position: absolute;
+                top: 0;
+                left: -15px;
+            }
+        }
+
+        // 文字提示用到的图标的颜色
+        .el-icon-warning {
+            color: #a9a9a9;
+        }
+
+        // input框右下角数字颜色
+        ::v-deep .el-input__count {
+            color: #999;
+        }
+
+        // 多行文本框的高度
+        ::v-deep .el-textarea__inner {
+            height: 100px;
+        }
+
+        // 表单元素的下外边距
+        ::v-deep .el-form-item {
+            margin-bottom: 50px;
+        }
+
+        // 下拉框
+        ::v-deep .el-select {
+            width: 100%;
+            display: inline-block;
+            position: relative;
+        }
+
+    }
+
+    //按钮
+    .btn {
+        width: 440px;
+        margin: 50px auto 20px;
+
+        button {
+            width: 180px;
+            height: 58px;
+            border-radius: 12px;
+            border: none;
+            font-size: 20px;
+        }
+
+        .cancel {
+            color: #333;
+            background-color: #f5f7fb;
+            border: 2px solid #e3e8fa;
+            margin-right: 80px;
+        }
+
+        .sure {
+            background-color: #5570f1;
+            color: #fff;
+        }
+    }
+
+    //缩略图
+    .uploaderBox {
+
+        .chooseImgDiv {
+            background-color: #fff;
+
+            img {
+                display: inline-block;
+            }
+        }
+    }
+
+}
+</style>

+ 41 - 0
src/views/crawler/webCrawlerListEdit/tableTitle.vue

@@ -0,0 +1,41 @@
+<template>
+  <div class="tableTitle">
+    <span class="tableFloatLine"></span>
+    {{ name }}
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    name: {
+      type: String,
+      required: true,
+    },
+  },
+  data() {
+    return {
+      someData: '',
+    };
+  },
+};
+</script>
+
+<style scoped lang="less">
+.tableTitle {
+  color: #333333;
+  position: relative;
+  margin-bottom: 30px;
+  margin-top: 2px;
+
+  .tableFloatLine {
+    width: 3px;
+    height: 16px;
+    background: #5570F1;
+    display: block;
+    position: absolute;
+    left: -20px;
+    top: 1px;
+  }
+}
+</style>

+ 747 - 0
src/views/crawler/webRule.vue

@@ -0,0 +1,747 @@
+<template>
+    <!-- 规则列表 -->
+    <div>
+        <div class="title">
+            <el-row>
+                <el-col :span="6" class="left">
+                    <div class="searchBox">
+                        <div class="searchTitle">任务规则名:</div>
+                        <el-input v-model="searchRuleName" placeholder="请输入任务规则名"></el-input>
+                    </div>
+                </el-col>
+                <el-col :span="6" class="right">
+                    <div class="btnList">
+                        <button class="search" @click="goSearch">搜索</button>
+                        <button class="reset" @click="goReset">重置</button>
+                    </div>
+                </el-col>
+            </el-row>
+        </div>
+        <!--表格内容 start------------------------------------------------------------>
+        <div class="layerBox">
+            <tableTitle :name="tableDivTitle" />
+            <button class="btn" @click="addCrawlerRule">设置采集规则</button>
+            <el-row>
+                <template>
+                    <el-table class="my-table" :data="tableData" style="width: 100%">
+                        <el-table-column fixed prop="id" label="编号" width="100">
+                        </el-table-column>
+                        <el-table-column prop="name" label="任务规则名" width="">
+                        </el-table-column>
+                        <el-table-column prop="arts_count" label="采集个数" width="">
+                        </el-table-column>
+                        <el-table-column prop="created_at" label="创建时间" width="">
+                        </el-table-column>
+                        <el-table-column prop="updated_at" label="修改时间" width="">
+                        </el-table-column>
+                        <el-table-column fixed="right" label="操作" width="385">
+                            <template slot-scope="scope">
+                                <div class="listBtnBox">
+                                    <div class="listDeleteBtn" @click="deleteRow(scope.row.id, tableData)"><i
+                                            class="el-icon-delete"></i>删除</div>
+                                    <div class="listEditBtn" @click="goEdit(scope.row.id, tableData)"><i
+                                            class="el-icon-edit-outline"></i>编辑</div>
+                                    <div class="collector" @click="goCollect(scope.row.id, tableData)"><i
+                                            class="collectorIcon"></i>采集</div>
+                                    <div class="listLookBtn" @click="goLook(scope.row.id, tableData)"><i
+                                            class="el-icon-view"></i>查看</div>
+                                </div>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                </template>
+            </el-row>
+        </div>
+        <!--分页 start------------------------------------------------------------>
+        <div class="alignBox">
+            <el-row>
+                <el-col :span="24">
+                    <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                        :current-page="page" :page-size="pageSize" layout="total, prev, pager, next, jumper"
+                        :total="total">
+                    </el-pagination>
+                </el-col>
+            </el-row>
+        </div>
+        <!--分页 end------------------------------------------------------------>
+        <!--表格内容 end------------------------------------------------------------>
+
+        <!-- 弹出框 -->
+        <el-dialog :title="dialogName" :visible.sync="dialogTableVisible" width="50%">
+            <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="120px" class="demo-ruleForm">
+                <div class="one" v-show="this.webType == 1">
+                    <div class="dialogText">
+                        <el-form-item label="任务规则名:" prop="ruleName" class="keywords">
+                            <el-input v-model="ruleForm.ruleName" placeholder="请输入任务规则名"></el-input>
+                            <el-tooltip class="item" effect="dark" content="任务规则名,如中国农村网-时政要闻" placement="top-start">
+                                <i class="el-icon-warning"></i>
+                            </el-tooltip>
+                        </el-form-item>
+                        <el-form-item label="第1页网址:" prop="first_url" class="keywords">
+                            <el-input v-model="ruleForm.first_url" placeholder="请输入第一页网址"></el-input>
+                            <el-tooltip placement="top-start">
+                                <div slot="content">
+                                    一般为网站的栏目页网址,也是文章列表页网址。<br />
+                                    若网站内页数为多页,第1页网址如:http://politics.people.com.cn/GB/1024/index1.html(第1页的数字)
+                                </div>
+                                <i class="el-icon-warning"></i>
+                            </el-tooltip>
+                        </el-form-item>
+                        <div class="pageTwo">
+                            <el-form-item label="第2页网址:" prop="secondWeb" class="keywords">
+                                <el-input v-model="ruleForm.second_start" placeholder="请输入网站开头"></el-input>
+                                <el-input v-model="ruleForm.second_num" placeholder="请输入代码页数"></el-input>
+                                <el-input v-model="ruleForm.second_end" placeholder="请输入网址结束字符串"
+                                    class="lastInput"></el-input>
+                                <el-tooltip placement="top-start">
+                                    <div slot="content">
+                                        网址如:http://politics.people.com.cn/GB/1024/index2.html<br />
+                                        输入为 http://politics.people.com.cn/GB/1024/index 2 .html分别埴入输入框内
+                                    </div>
+                                    <i class="el-icon-warning"></i>
+                                </el-tooltip>
+                            </el-form-item>
+                        </div>
+                        <el-form-item label="起始代码:" prop="startCode" class="keywords">
+                            <el-input v-model="ruleForm.startCode" placeholder="请输入起始代码"></el-input>
+                            <el-tooltip placement="top-start">
+                                <div slot="content">
+                                    起始代码为文章列表第一篇文章上面几行代码中一段代码<br />
+                                    如<'div class="ej list box clear">,输入为 .ej list box clear 埴入输入框内<br />
+                                        如<'ul class="ej list box clear">,输入为 .ej list box clearul 埴入输入框内
+                                </div>
+                                <i class="el-icon-warning"></i>
+                            </el-tooltip>
+                        </el-form-item>
+                        <el-form-item label="结束页数:" prop="endPage" class="keywords">
+                            <el-input v-model="ruleForm.endPage" placeholder="请输入结束页数"></el-input>
+                        </el-form-item>
+                    </div>
+
+                    <div class="dialogText">
+                        <el-form-item label="标题字符串:" prop="title" class="keywords">
+                            <el-input v-model="ruleForm.title" placeholder="请输入网站名称"></el-input>
+                            <el-tooltip placement="top-start">
+                                <div slot="content">
+                                    如标题代码:<'h1 class='news_art'>红枣滞销喂羊 电商帮忙促销</'h1>,标题字符串为 .news_art 填入输入框内<br />
+                                    如标题代码:<'h1 id='news at'>红枣滞销喂羊 电商帮忙促销</'h1>,标题字符串为 #news art 填入输入框内
+                                </div>
+                                <i class="el-icon-warning"></i>
+                            </el-tooltip>
+                        </el-form-item>
+                        <el-form-item label="内容字符串:" prop="content" class="keywords">
+                            <el-input v-model="ruleForm.content" placeholder="请输入标题字符串"></el-input>
+                            <el-tooltip placement="top-start">
+                                <div slot="content">
+                                    如内容代码:<'h1 class='news box'>
+                                        <' /h1>,内容字符串为.news box 填入输入框内<br />
+                                            如内容代码:<'h1 id='news_box'>
+                                                <' /h1>,内容字符串为 #news_box 填入输入框内
+                                </div>
+                                <i class="el-icon-warning"></i>
+                            </el-tooltip>
+                        </el-form-item>
+                        <el-form-item label="来源字符串:" prop="" class="keywords">
+                            <el-input v-model="ruleForm.source" placeholder="请输入来源字符串"></el-input>
+                        </el-form-item>
+                        <el-form-item label="作者字符串:" prop="" class="keywords">
+                            <el-input v-model="ruleForm.author" placeholder="请输入作者字符串"></el-input>
+                        </el-form-item>
+                        <el-form-item label="作者替换名称:" prop="authorName" class="keywords">
+                            <el-input v-model="ruleForm.authorName" placeholder="请输入作者替换名称"></el-input>
+                        </el-form-item>
+                    </div>
+                </div>
+
+                <div class="two" v-show="this.webType == 2">
+                    <div class="dialogText">
+                        <el-form-item label="任务规则名:" prop="ruleName" class="keywords">
+                            <el-input v-model="ruleForm.ruleName" placeholder="请输入任务规则名"></el-input>
+                            <el-tooltip class="item" effect="dark" content="任务规则名,如中国农村网-时政要闻" placement="top-start">
+                                <i class="el-icon-warning"></i>
+                            </el-tooltip>
+                        </el-form-item>
+                        <el-form-item label="采集网址:" prop="first_url" class="keywords">
+                            <el-input v-model="ruleForm.first_url" placeholder="请输入采集网址"></el-input>
+                            <el-tooltip placement="top-start">
+                                <div slot="content">
+                                    一般为网站的栏目页网址,也是文章列表页网址。<br />
+                                    若网站内页数为多页,第1页网址如:http://politics.people.com.cn/GB/1024/index1.html(第1页的数字)
+                                </div>
+                                <i class="el-icon-warning"></i>
+                            </el-tooltip>
+                        </el-form-item>
+                        <el-form-item label="接口参数:" prop="parameter" class="keywords">
+                            <el-input v-model="ruleForm.parameter" placeholder="请输入接口参数"></el-input>
+                            <el-tooltip placement="top-start">
+                                <div slot="content">
+                                    如website=10008838&server=s1&datatype=common page&sendid=1731994851720,中间用"&"隔开。
+                                </div>
+                                <i class="el-icon-warning"></i>
+                            </el-tooltip>
+                        </el-form-item>
+                        <el-form-item label="列表开始标签:" prop="startCode" class="keywords">
+                            <el-input v-model="ruleForm.startCode" placeholder="请输入列表开始标签"></el-input>
+                            <el-tooltip placement="top-start">
+                                <div slot="content">
+                                    如包含本网页内所有的数据(data)下含有本网页内所有新闻的数据标签(resut),输入为 [data][result] 填入输入框。
+                                </div>
+                                <i class="el-icon-warning"></i>
+                            </el-tooltip>
+                        </el-form-item>
+                        <el-form-item label="标题字符串:" prop="title" class="keywords">
+                            <el-input v-model="ruleForm.title" placeholder="请输入标题字符串"></el-input>
+                            <el-tooltip class="item" effect="dark" content="如(标题)是title=“xXX应急演习”,输入为 [title]埴入输入框。"
+                                placement="top-start">
+                                <i class="el-icon-warning"></i>
+                            </el-tooltip>
+                        </el-form-item>
+                        <el-form-item label="内容字符串:" prop="content" class="keywords">
+                            <el-input v-model="ruleForm.content" placeholder="请输入内容字符串"></el-input>
+                            <el-tooltip placement="top-start">
+                                <div slot="content">
+                                    如内容(content)下含有本网页内所有新闻的详细数据(content),输入为[content][content] 填入输入框。
+                                </div>
+                                <i class="el-icon-warning"></i>
+                            </el-tooltip>
+                        </el-form-item>
+                        <el-form-item label="来源字符串:" prop="" class="keywords">
+                            <el-input v-model="ruleForm.source" placeholder="请输入来源字符串"></el-input>
+                            <el-tooltip placement="top-start">
+                                <div slot="content">
+                                    如(来源)是contentSource="XXX应急处置部门",输入为[contentSource]埴入输入框。
+                                </div>
+                                <i class="el-icon-warning"></i>
+                            </el-tooltip>
+                        </el-form-item>
+                        <el-form-item label="是否有作者:" prop="name" class="keywords">
+                            <el-radio v-model="radio" label="true">是</el-radio>
+                            <el-radio v-model="radio" label="false">否</el-radio>
+                        </el-form-item>
+                        <el-form-item label="作者字符串:" prop="author" class="keywords" v-show="this.radio == 'true'">
+                            <el-input v-model="ruleForm.author" placeholder="请输入作者字符串"></el-input>
+                            <el-tooltip placement="top-start">
+                                <div slot="content">
+                                    如作者(author)是author=“张三”,输入为 [author] 埴入输入框。
+                                </div>
+                                <i class="el-icon-warning"></i>
+                            </el-tooltip>
+                        </el-form-item>
+                        <el-form-item label="作者替换名称:" prop="authorName" class="keywords" v-show="this.radio == 'false'">
+                            <el-input v-model="ruleForm.authorName" placeholder="请输入作者替换名称"></el-input>
+                        </el-form-item>
+                    </div>
+                </div>
+
+                <div class="three" v-show="this.webType == 3">
+                    <div class="dialogText">
+                        <el-form-item label="任务规则名:" prop="name" class="keywords">
+                            <el-input type="textarea" :rows="8" resize="none" placeholder="" v-model="textarea">
+                            </el-input>
+                        </el-form-item>
+                    </div>
+                </div>
+
+                <div class="dialogBtn">
+                    <button class="cancel" @click="saveForm">保存</button>
+                    <button class="submit" @click="submitForm">确定</button>
+                </div>
+            </el-form>
+        </el-dialog>
+    </div>
+
+</template>
+
+<script>
+//表格标题
+import tableTitle from './components/tableTitle.vue';
+//引入公用样式
+import '@/styles/global.less';
+// 引入api
+import { addRule, getRule, updateRule, delRule, sendCrawler } from '@/api/crawler'
+
+export default {
+    components: {
+        tableTitle,//表格标题
+    },
+    data() {
+        return {
+            tableDivTitle: "任务规则列表",  //表格标题
+            dialogTableVisible: false, //弹窗是否显示
+            dialogName: '设置采集规则', //弹窗名称
+            searchRuleName: '',  //任务规则名
+
+            // 建立网站页面传递的参数
+            webId: '',
+            webType: '',
+            webName: '',
+
+            //分页相关数据
+            page: 1,
+            pageSize: 10,
+            total: 40,
+
+            value: '',
+            textarea: "",
+            radio: 'true',
+            // 表格相关
+            tableData: [], //表格中的数据
+
+            ruleForm: {
+                ruleName: '三农', //任务规则名
+                first_url: 'http://sn.com.cn', //第1页网址
+                second_start: 'http://sn.com.cn', //第2页网址开头
+                second_num: '', //第2页代码页数
+                second_end: '.html', //第2页网址结束字符串
+                startCode: '.box', //起始代码
+                endPage: '3', //结束页数
+                title: '.news_art',  //标题字符串
+                content: '.news_art', //内容字符串
+                source: '三农', // 来源字符串
+                author: '', // 作者字符串
+                authorName: '', // 作者替换名称
+                parameter: 'website: 10008838,server: s1,datatype: click_click,sendid: 1732000383378'  //接口类2 接口参数
+            },
+
+            rules: {  //规则
+                ruleName: [
+                    { required: true, message: '请输入任务规则名', trigger: 'blur' },
+                ],
+                first_url: [
+                    { required: true, message: '请输入第1页网址', trigger: 'blur' }
+                ],
+                secondWeb: [
+                    // { required: true, message: '请输入第2页网址', trigger: 'change' }
+                ],
+                startCode: [
+                    { required: true, message: '请输入起始代码', trigger: 'blur' },
+                ],
+                endPage: [
+                    { required: true, message: '请输入结束页数', trigger: 'blur' }
+                ],
+                title: [
+                    { required: true, message: '请输入标题字符串', trigger: 'blur' }
+                ],
+                content: [
+                    { required: true, message: '请输入内容字符串', trigger: 'blur' },
+                ],
+                source: [
+                    { required: true, message: '请输入来源字符串', trigger: 'change' }
+                ],
+                author: [
+                    { required: true, message: '请输入作者字符串', trigger: 'change' }
+                ],
+                authorName: [
+                    { required: true, message: '请输入作者替换名称', trigger: 'blur' },
+                ],
+                parameter: [
+                    { required: true, message: '请输入接口参数', trigger: 'blur' },
+                ]
+            }
+        }
+    },
+    methods: {
+        //1.列表和分页相关 start ------------------------------------------------------------>
+        //1.1 开始请求列表信息方法
+        getData() {
+            getRule({
+                web_id: this.webId,
+                pageSize: this.pageSize,
+                page: this.page,
+            }).then(data => {
+                console.log(data.data.rep);
+                this.tableData = data.data.rep
+                this.total = data.data.count
+            })
+        },
+        //1.2 删除内容
+        deleteRow(id) {
+            this.$confirm('注意:删除后,该条信息及其绑定关系全部删除', '是否确认删除该条信息?', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+            }).then(() => {
+                delRule({
+                    rule_id: id
+                }).then(data => {
+                    console.log(data);
+                    this.$message({
+                        type: 'success',
+                        message: '删除成功!'
+                    });
+
+                })
+                console.log("当前删除:" + id)
+                this.getData()
+
+            }).catch(() => {
+                this.$message({
+                    type: 'warning',
+                    message: '已取消删除'
+                });
+            });
+        },
+
+        //1.4 列表内容分页
+        //直接跳转
+        handleSizeChange(val) {
+            this.page = val;
+            this.getData();
+        },
+        //1.5 点击分页
+        handleCurrentChange(val) {
+            this.page = val;
+            this.getData();
+        },
+        // 1.6 搜索按钮
+        goSearch() {
+            getRule({
+                web_id: this.webId,
+                pageSize: this.pageSize,
+                page: this.page,
+                keyWord: this.searchRuleName,
+                type: this.webType,
+            }).then(data => {
+                // console.log(data);
+                this.tableData = data.data.rep
+                this.total = data.data.count
+            })
+
+        },
+        //1.7 重置按钮
+        goReset() {
+            this.searchRuleName = ""
+            this.getData()
+        },
+        //列表和分页相关 end ------------------------------------------------------------>
+
+        //1.8 设置采集规则
+        addCrawlerRule() {
+            this.dialogTableVisible = true
+
+        },
+        //1.9 编辑采集规则
+        goEdit(val) {
+            console.log(val);
+            this.dialogTableVisible = true
+            // this.dialogName = "编辑"
+        },
+        //采集
+        goCollect() {
+            sendCrawler().then(data => {
+                console.log(data);
+                this.$message({
+                    message: '采集中',
+                    type: 'success',
+                    iconClass:'el-icon-refresh'
+                });
+            })
+        },
+
+        // 弹出层相关方法
+        // 提交表单
+        submitForm() {
+            if (this.webType == 1) {
+                addRule({
+                    name: this.ruleForm.ruleName,
+                    web_id: this.webId,
+                    type: this.webType,
+                    first_url: this.ruleForm.first_url,//规则型1:第1页网址  接口型2:开始采集地址
+                    second_start: this.ruleForm.second_start,//规则型1:第2页网址开头
+                    second_num: this.ruleForm.second_num,//规则型1:第2页代码页数
+                    second_end: this.ruleForm.second_end,//规则型1:第2页网址结束字符串
+                    start: this.ruleForm.startCode, //规则型1:列表标签类名  接口型2:列表标签
+                    title: this.ruleForm.title, //规则型1:标题标签类名  接口型2:标题标签
+                    content: this.ruleForm.content,//规则型1:内容标签类名  接口型2:内容标签
+                    source: this.ruleForm.source, //规则型1:来源标签类名  接口型2:来源标签
+                    writer_class: this.ruleForm.author,//规则型1:作者标签类名  接口型2:作者标签
+                    writer: this.ruleForm.authorName,//规则型1:接口型2:作者默认名称(若未采集到则设置默认作者)
+                    end_pagenum: this.ruleForm.endPage//规则型1:列表页结束页码
+                }).then(data => {
+                    this.getData()
+                    console.log(data);
+                    if (data.code == 200) {
+                        this.dialogTableVisible = false
+                        this.$message({
+                            message: '添加成功',
+                            type: 'success'
+                        })
+                    } else if (data.code == 0) {
+                        this.$message({
+                            message: data.message,
+                            type: 'error'
+                        })
+                    }
+                })
+            } else if (this.webType == 2) {
+                addRule({
+                    name: this.ruleForm.ruleName,
+                    web_id: this.webId,
+                    type: this.webType,
+                    first_url: this.ruleForm.first_url,//规则型1:第1页网址  接口型2:开始采集地址
+                    parameter: this.ruleForm.parameter,//接口型2:接口参数
+                    start: this.ruleForm.startCode, //规则型1:列表标签类名  接口型2:列表标签
+                    title: this.ruleForm.title, //规则型1:标题标签类名  接口型2:标题标签
+                    content: this.ruleForm.content,//规则型1:内容标签类名  接口型2:内容标签
+                    source: this.ruleForm.source, //规则型1:来源标签类名  接口型2:来源标签
+                    writer_class: this.ruleForm.author,//规则型1:作者标签类名  接口型2:作者标签
+                    writer: this.ruleForm.authorName,//规则型1:接口型2:作者默认名称(若未采集到则设置默认作者)
+                    end_pagenum: this.ruleForm.endPage//规则型1:列表页结束页码
+                }).then(data => {
+                    this.getData()
+                    console.log(data);
+                    if (data.code == 200) {
+                        this.dialogTableVisible = false
+                        this.$message({
+                            message: '添加成功',
+                            type: 'success'
+                        })
+                    } else if (data.code == 0) {
+                        this.$message({
+                            message: data.message,
+                            type: 'error'
+                        })
+                    }
+                })
+            } else if (this.webType == 3) {
+                addRule({
+                    name: this.ruleForm.ruleName,
+                    web_id: this.webId,
+                    type: this.webType,
+                    diy_rule: '', //自定义3:规则
+                }).then(data => {
+                    console.log(data);
+                    this.getData()
+                })
+            }
+        },
+        //保存
+        saveForm() {
+            this.dialogTableVisible = false
+
+        }
+    },
+    mounted() {
+        this.webId = this.$route.query.id
+        this.webType = this.$route.query.type
+        this.webName = this.$route.query.name
+
+        //获取数据
+        this.getData()
+
+    }
+}
+</script>
+
+<style scoped lang="less">
+.title {
+    margin: 30px 30px 20px 30px;
+    padding: 30px 30px 40px 30px;
+    background-color: #fff;
+    border-radius: 20px 20px 20px 20px;
+    border: 1px solid #E9EDF7;
+
+    .left {
+        float: left;
+    }
+
+    .right {
+        float: right;
+    }
+
+    .searchBox {
+        .searchTitle {
+            padding-bottom: 10px;
+            font-family: Microsoft YaHei, Microsoft YaHei;
+            font-weight: 400;
+            font-size: 14px;
+            color: #999999;
+            line-height: 16px;
+        }
+
+        .el-select {
+            width: 300px;
+            display: inline-block;
+            position: relative;
+        }
+    }
+
+    .btnList {
+        float: right;
+        padding-top: 28px;
+
+        button {
+            width: 120px;
+            height: 38px;
+            border: none;
+            border-radius: 8px;
+        }
+
+        .search {
+            background-color: #5570f1;
+            color: #fff;
+            margin-right: 20px;
+        }
+
+        .reset {
+            font-family: Microsoft YaHei, Microsoft YaHei;
+            font-weight: 400;
+            font-size: 16px;
+            color: #333333;
+            background: #F5F7FB;
+            border-radius: 8px 8px 8px 8px;
+            border: 1px solid rgba(85, 112, 241, 0.11);
+        }
+    }
+}
+
+.layerBox {
+    padding: 30px 20px;
+    position: relative;
+
+    .btn {
+        position: absolute;
+        top: 30px;
+        right: 20px;
+        height: 38px;
+        color: #fff;
+        background-color: #5570f1;
+        border: none;
+        border-radius: 8px;
+        padding: 8px 28px 9px;
+        box-sizing: border-box;
+    }
+
+    .listBtnBox {
+        justify-content: left;
+    }
+
+
+    .listDeleteBtn,
+    .listEditBtn,
+    .listLookBtn,
+    .collector {
+        margin-left: 0px;
+        padding-left: 0px;
+        margin-right: 20px;
+        width: 76px;
+        height: 36px;
+        line-height: 36px;
+
+        .collectorIcon {
+            display: inline-block;
+            width: 20px;
+            height: 20px;
+            background: url("../../assets/advertise/Graph.png");
+            vertical-align: middle;
+            margin-right: 6px;
+        }
+    }
+
+
+    .collector {
+        text-align: center;
+        border-radius: 8px;
+        cursor: pointer;
+        color: #519C66;
+        background-color: rgba(81, 156, 102, 0.16);
+
+        >i {
+            padding-right: 8px;
+        }
+    }
+
+    .listLookBtn {
+        text-align: center;
+        border-radius: 8px;
+        cursor: pointer;
+        color: #999999;
+        background-color: rgba(153, 153, 153, 0.16);
+
+        >i {
+            padding-right: 8px;
+        }
+    }
+}
+
+// 弹出层内容
+.dialogText {
+    margin: 0 7px 30px 3px;
+    padding-top: 20px;
+    padding-bottom: 1px;
+    padding: 20px 60px 1px 20px;
+    background-color: #f5f7fb;
+
+    .pageTwo {
+        .keywords {
+            ::v-deep .el-input {
+                position: relative;
+                font-size: 14px;
+                display: inline-block;
+                width: 32%;
+                margin-right: 10px;
+            }
+
+            .lastInput {
+                margin: 0;
+            }
+
+        }
+    }
+
+    // 资讯关键词 和 资讯描述 的 文字提示 
+    .keywords,
+    .desc {
+        position: relative;
+
+        i {
+            position: absolute;
+            top: 0;
+            left: -15px;
+        }
+    }
+}
+
+// 弹出层按钮
+.dialogBtn {
+    text-align: center;
+    margin: 50px auto 20px;
+
+    button {
+        width: 184px;
+        padding: 16px;
+        font-family: Microsoft YaHei, Microsoft YaHei;
+        font-weight: 400;
+        font-size: 20px;
+        border: none;
+        border-radius: 12px 12px 12px 12px;
+    }
+
+    // 取消
+    .cancel {
+        color: #333333;
+        background-color: #f5f7fb;
+        border: 2px solid rgba(85, 112, 241, 0.11);
+    }
+
+    // 提交
+    .submit {
+        color: #fff;
+        background-color: #5570F1;
+        margin-left: 40px;
+    }
+}
+
+::v-deep .el-form-item {
+    margin-bottom: 50px;
+}
+
+::v-deep .el-select {
+    width: 100%;
+}
+
+::v-deep .el-input--medium,
+::v-deep .el-form-item__label {
+    line-height: 36px;
+    // font-size: 16px;
+}
+</style>