Jing 3 месяцев назад
Родитель
Сommit
81b6d26710

+ 48 - 0
src/router/index.js

@@ -475,6 +475,54 @@ export const constantRoutes = [
       }
     ]
   },
+  {
+    path: '/blogroll',
+    component: Layout,
+    children: [
+      {
+        name: '',
+        path: '',
+        component: () => import('@/views/website/blogroll.vue'),
+        meta: {
+          title: '友情链接',
+          hidden: true,
+          breadcrumb: true
+        }
+      }
+    ]
+  },
+  {
+    path: '/tabbar',
+    component: Layout,
+    children: [
+      {
+        name: '',
+        path: '',
+        component: () => import('@/views/tabbar/tabbar.vue'),
+        meta: {
+          title: '底部导航栏',
+          hidden: true,
+          breadcrumb: true
+        }
+      }
+    ]
+  },
+  {
+    path: '/tabbarDetail',
+    component: Layout,
+    children: [
+      {
+        name: '',
+        path: '',
+        component: () => import('@/views/tabbar/tabbarDetail.vue'),
+        meta: {
+          title: '导航详情',
+          hidden: true,
+          breadcrumb: true
+        }
+      }
+    ]
+  },
   // {
   //   path: '/documentation',
   //   component: Layout,

+ 48 - 6
src/views/advertise/adPlaceList.vue

@@ -33,7 +33,7 @@
         <!--表格内容 start------------------------------------------------------------>
         <div class="layerBox">
             <tableTitle :name="tableDivTitle" />
-            <!-- <button class="btn" @click="addWebsite">添加广告位</button> -->
+            <button class="btn" @click="addWebsite">添加广告位</button>
             <el-row>
                 <template>
                     <el-table class="my-table" v-loading="loading" :data="tableData" style="width: 100%">
@@ -114,6 +114,9 @@
                     <el-form-item label="广告位名称:" prop="adName">
                         <el-input v-model="ruleForm.adName" placeholder="请输入广告位名称"></el-input>
                     </el-form-item>
+                    <el-form-item label="广告位标识:" prop="adTag">
+                        <el-input v-model="ruleForm.adTag" placeholder="请输入广告位标识"></el-input>
+                    </el-form-item>
                     <el-form-item label="广告位介绍:" prop="adDesc">
                         <el-input v-model="ruleForm.adDesc" type="textarea" :rows="2" placeholder="请输入广告位介绍"
                             resize="none">
@@ -233,16 +236,19 @@ export default {
             ruleForm: {
                 webName: '', //网站名称
                 adName: '', //广告位名称
+                adTag: '', //广告位标识
                 adDesc: '',//广告位介绍
                 adPhoto: '', //广告示例图
                 adType: '',//广告类型
                 adSize: '',   //广告位大小
+                ad_size_id: 1,   //广告位大小
                 price: '',  //价格
                 status: '',   //状态
             },
             rules: {
                 webName: [{ required: true, trigger: 'blur', validator: validateEmpty }],
                 adName: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+                adTag: [{ required: true, trigger: 'blur', validator: validateEmpty }],
                 adDesc: [{ required: true, trigger: 'blur', validator: validateEmpty }],
                 adPhoto: [{ required: true, trigger: 'blur', validator: validateEmpty }],
                 adType: [{ required: true, trigger: 'blur', validator: validateEmpty }],
@@ -268,6 +274,11 @@ export default {
                     this.total = data.data.count
                     for (let item of this.tableData) {
                         item.size = item.width + 'x' + item.height
+                        if (item.typeid == 2) {
+                            item.type_name = '图文'
+                        } else if (item.typeid == 1) {
+                            item.type_name = '文字'
+                        }
                     }
                 })
             } else {
@@ -281,6 +292,11 @@ export default {
                     this.total = data.data.count
                     for (let item of this.tableData) {
                         item.size = item.width + 'x' + item.height
+                        if (item.typeid == 2) {
+                            item.type_name = '图文'
+                        } else if (item.typeid == 1) {
+                            item.type_name = '文字'
+                        }
                     }
                 })
             }
@@ -299,8 +315,10 @@ export default {
             })
         },
 
-        change() {
-            console.log(this.ruleForm.adSize);
+        change(val) {
+            console.log('val1111111111', val);
+            this.ruleForm.ad_size_id = val
+            console.log('this.ruleForm.adSize', this.ruleForm.adSize);
         },
 
         //1.2 删除内容
@@ -368,6 +386,11 @@ export default {
                 this.total = data.data.count
                 for (let item of this.tableData) {
                     item.size = item.width + 'x' + item.height
+                    if (item.typeid == 2) {
+                        item.type_name = '图文'
+                    } else if (item.typeid == 1) {
+                        item.type_name = '文字'
+                    }
                 }
             })
 
@@ -393,11 +416,13 @@ export default {
             this.website_id = val.website_id
             this.ruleForm.webName = val.website_name //网站名称
             this.ruleForm.adName = val.name //广告位名称
+            this.ruleForm.adTag = val.ad_tag //广告位标识
             this.ruleForm.adDesc = val.introduce //广告位介绍
             this.logoUrl = val.thumb //广告示例图
             this.ruleForm.adPhoto = val.thumb //广告示例图
             this.ruleForm.price = val.price //价格
             this.ruleForm.status = val.status //状态
+            // this.ad_size_id=val.ad_size_id
 
             if (val.ad_size_id == 1) {
                 this.ruleForm.adSize = '1200x90'  //广告位大小
@@ -434,6 +459,7 @@ export default {
             //添加时清空回显回来的数据
             this.ruleForm.webName = '' //网站名称
             this.ruleForm.adName = '' //广告位名称
+            this.ruleForm.adTag = '' //广告位标识
             this.ruleForm.adDesc = '' //广告位介绍
             this.ruleForm.adPhoto = '' //广告示例图
             this.ruleForm.adSize = '' //广告尺寸
@@ -455,10 +481,18 @@ export default {
                 })
                 return
             }
+            if (this.ruleForm.adTag == '') {
+                this.$message({
+                    message: '请将数据填写完整',
+                    type: 'error'
+                })
+                return
+            }
             if (this.dialogName == "添加") {
                 createAdPlace({
                     name: this.ruleForm.adName,
                     website_id: this.website_id,
+                    ad_tag: this.ruleForm.adTag,
                     price: this.ruleForm.price,
                     thumb: this.ruleForm.adPhoto,
                     typeid: this.ruleForm.adType,
@@ -499,15 +533,23 @@ export default {
                 })
                 this.dialogVisible = true
             }
+            if (this.ruleForm.adTag == '') {
+                this.$message({
+                    message: '请将数据填写完整',
+                    type: 'error'
+                })
+                return
+            }
             if (this.dialogName == "编辑") {
                 updateAdPlace({
                     name: this.ruleForm.adName,
                     website_id: this.website_id,
+                    ad_tag: this.ruleForm.adTag,
                     price: this.ruleForm.price,
                     thumb: this.ruleForm.adPhoto,
-                    typeid: this.ruleForm.adType,
-                    ad_size_id: this.ruleForm.adSize,
-                    status: this.ruleForm.status,
+                    typeid: Number(this.ruleForm.adType),
+                    ad_size_id: Number(this.ruleForm.ad_size_id),
+                    status: Number(this.ruleForm.status),
                     introduce: this.ruleForm.adDesc,
                     id: this.activeid
                 }).then(data => {

+ 41 - 0
src/views/tabbar/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>

+ 785 - 0
src/views/tabbar/tabbar.vue

@@ -0,0 +1,785 @@
+<template>
+    <!-- 广告位管理 -->
+    <div>
+        <!-- 头部搜索框部分 -->
+        <div class="title">
+            <el-row>
+                <el-col :span="6" class="left">
+                    <div class="searchBox">
+                        <div class="searchTitle">网站名称</div>
+                        <el-input v-model="webSiteName_name" class="input" placeholder="请输入网站名称"></el-input>
+                        <!-- <el-select v-model="webSiteName_id" :multiple="false" :multiple-limit="1" filterable remote
+                            reserve-keyword placeholder="请输入网站名称" :remote-method="getWebNavList"
+                            :loading="webSiteLoading" @change="selectWebSite">
+                            <el-option v-for="item in webSiteList" :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-input v-model="tabbarName" class="input" placeholder="请输入底部导航名称"></el-input>
+                    </div>
+                </el-col>
+                <el-col :span="8" 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="addWebsite">添加底部导航</button>
+            <el-row>
+                <template>
+                    <el-table class="my-table" :data="tableData" style="width: 100%">
+                        <el-table-column fixed prop="id" label="编号" width="90">
+                        </el-table-column>
+                        <el-table-column prop="website_name" label="网站" width="">
+                        </el-table-column>
+                        <el-table-column prop="name" 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="300">
+                            <template slot-scope="scope">
+                                <div class="listBtnBox">
+                                    <div class="listDeleteBtn" @click="deleteRow(scope.row.id)">
+                                        <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%" top="8vh"
+            :close-on-click-modal="false">
+            <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="120px" class="demo-ruleForm">
+                <div class="dialogText">
+                    <el-form-item label="关联网站名称:" prop="webName">
+                        <el-select v-model="ruleForm.webName" :multiple="false" :multiple-limit="1" filterable remote
+                            reserve-keyword placeholder="请输入关联网站名称" :remote-method="getWebNavList"
+                            :loading="webSiteLoading" @change="detectionWebSite">
+                            <el-option v-for="item in webSiteList" :key="item.value" :label="item.label"
+                                :value="item.value">
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="底部导航名称:" prop="tabbarName">
+                        <el-input v-model="ruleForm.tabbarName" placeholder="请输入底部导航名称"></el-input>
+                    </el-form-item>
+                    <el-form-item label="页面类型:" prop="pageType">
+                        <el-radio v-model="ruleForm.pageType" label="1" :disabled="this.disabled">特殊列表页</el-radio>
+                        <el-radio v-model="ruleForm.pageType" label="0" :disabled="this.disabled">特殊详情页</el-radio>
+                    </el-form-item>
+                </div>
+                <div class="dialogBtn">
+                    <el-button type="info" @click="cancelForm">取消</el-button>
+                    <el-button type="primary" @click="submitForm('ruleForm')">提交</el-button>
+                </div>
+            </el-form>
+        </el-dialog>
+        <!-- 弹出框 编辑 end----------------------------------------------------------->
+    </div>
+</template>
+
+<script>
+//表格标题
+import tableTitle from './components/tableTitle.vue';
+
+//引入公用样式
+import '@/styles/global.less';
+import { getFooterCategory, getTemplateClass, upFooterCategory, delFooterCategory } from '@/api/tabbar'
+export default {
+    components: {
+        tableTitle,//表格标题-
+    },
+    data() {
+        const validateEmpty = (rule, value, callback) => {
+            if (value.length == 0) {
+                callback(new Error('该项不能为空!'))
+            } else {
+                callback()
+            }
+        }
+        return {
+            tableDivTitle: "底部导航列表",  //列表标题
+            dialogTableVisible: false,      //编辑弹框
+            dialogName: '编辑', //编辑弹窗名称
+            disabled: false, //禁用
+
+            tableData: [],//表格数据
+
+            // 可以输入的搜索框相关
+            webSiteList: [],//获取关联网站列表
+            webSiteLoading: false,
+
+            //3.4 上传logo图片
+            logoUrl: '',
+            hovering: false, // 鼠标悬浮状态 悬浮时显示删除
+
+            value: '',
+
+            
+            activeid: "",  //活动id 
+            type:"",  //查看时需要传递的类型
+
+            // 分页相关
+            page: 1,
+            pageSize: 10,
+            total: 0,
+
+
+            formLabelWidth: '', //广告示例图相关
+
+
+            // 搜索框相关
+            webSiteName_name: '', //网站名称
+            webSiteName_id: '', //网站名称id
+            tabbarName: '', //底部导航名称
+            website_id: "", //网站id
+
+
+            ruleForm: {
+                webName: '', //网站名称
+                tabbarName: '', //底部导航名称
+                pageType: '', //页面类型
+            },
+            rules: {
+                webName: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+                tabbarName: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+                pageType: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+            }
+        }
+    },
+    methods: {
+        //1.列表和分页相关 start ------------------------------------------------------------>
+        //1.1 开始请求列表信息方法
+        getData() {
+            getFooterCategory({
+                page: this.page,
+                pageSize: this.pageSize
+            }).then(data => {
+                console.log(data);
+                this.tableData = data.data.rows
+                this.total = data.data.count
+            })
+        },
+
+        //1.2 删除内容
+        deleteRow(id) {
+            console.log(id);
+            let data = new FormData()
+            data.append('id', id)
+            this.$confirm('注意:删除后,该条信息及其绑定关系全部删除', '是否确认删除该条信息?', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+            }).then(() => {
+                console.log("当前删除:" + id)
+
+                delFooterCategory({
+                    id: id
+                }).then(data => {
+                    console.log(data);
+                    if (data.code = 200) {
+                        this.$message({
+                            message: '删除成功',
+                            type: 'success'
+                        })
+                        this.getData()
+                    } else if (data.code == 0) {
+                        this.$message({
+                            message: data.message,
+                            type: 'error'
+                        })
+                    }
+                })
+
+            }).catch(() => {
+                this.$message({
+                    type: 'warning',
+                    message: '已取消删除'
+                });
+            });
+        },
+        //1.3 查看示例图
+        goGraph() {
+            this.dialogVisible = true
+        },
+
+        //1.4 列表内容分页
+        //直接跳转
+        handleSizeChange(val) {
+            this.page = val;
+            this.getData();
+        },
+        //1.5 点击分页
+        handleCurrentChange(val) {
+            this.page = val;
+            this.getData();
+        },
+        // 1.6 搜索按钮
+        goSearch() {
+            if (this.webSiteName_name && this.tabbarName) {
+                getFooterCategory({
+                    page: this.page,
+                    pageSize: this.pageSize,
+                    name: this.tabbarName,
+                    website_name: this.webSiteName_name, //网站名称
+                }).then(data => {
+                    console.log(data);
+                    this.tableData = data.data.rows
+                    this.total = data.data.count
+                })
+            } else if (this.webSiteName_name && !this.tabbarName) {
+                getFooterCategory({
+                    page: this.page,
+                    pageSize: this.pageSize,
+                    // name: this.tabbarName,
+                    website_name: this.webSiteName_name, //网站名称
+                }).then(data => {
+                    console.log(data);
+                    this.tableData = data.data.rows
+                    this.total = data.data.count
+                })
+            } else if (!this.webSiteName_name && this.tabbarName) {
+                getFooterCategory({
+                    page: this.page,
+                    pageSize: this.pageSize,
+                    name: this.tabbarName,
+                    // website_name: this.webSiteName_name, //网站名称
+                }).then(data => {
+                    console.log(data);
+                    this.tableData = data.data.rows
+                    this.total = data.data.count
+                })
+            }
+
+        },
+        //1.7 重置按钮
+        goReset() {
+            this.webSiteName_name = ""
+            this.tabbarName = ""
+            this.getData()
+        },
+        //列表和分页相关 end ------------------------------------------------------------>
+
+        //1.9 编辑
+        goEdit(id, val) {
+            // console.log(id);
+            this.dialogName = '编辑'
+            this.activeid = id
+            this.dialogTableVisible = true
+            this.disabled=true
+            console.log(id, val);
+            console.log("状态", val);
+
+            //数据回显
+            this.website_id = val.website_id
+            this.ruleForm.webName = val.website_name //网站名称
+            this.ruleForm.tabbarName = val.name //底部导航名称
+            if (val.type == 0) {
+                this.ruleForm.pageType = '0' //页面类型
+            } else if (val.type == 1) {
+                this.ruleForm.pageType = '1' //页面类型
+            }
+        },
+
+        //2.0 查看
+        goLook(id,val) {
+            this.activeid = id
+            this.type=val.type
+            this.$router.push({
+                path: '/tabbarDetail',
+                query: {
+                    id: this.activeid,
+                    type:this.type
+                }
+            })
+        },
+
+        //1.7 添加
+        addWebsite() {
+            this.dialogTableVisible = true
+            this.dialogName = "添加"
+            this.disabled=false
+
+            //添加时清空回显回来的数据
+            this.ruleForm.webName = '' //关联网站名称
+            this.ruleForm.tabbarName = '' //底部导航名称
+            this.ruleForm.pageType = '' //页面类型
+        },
+
+        // 弹出层相关方法
+        // 提交表单
+        submitForm(formName) {
+            this.$refs[formName].validate((valid) => {
+                if (valid) {
+                    console.log('submit!');
+
+                } else {
+                    console.log('error submit!!');
+                    return false;
+                }
+            });
+            if (this.dialogName == "添加") {
+                getTemplateClass({
+                    website_id: this.website_id,
+                    name: this.ruleForm.tabbarName,
+                    type: this.ruleForm.pageType,
+                }).then(data => {
+                    console.log(data);
+                    if (data.code == 200) {
+                        this.$message({
+                            message: '添加成功',
+                            type: 'success'
+                        })
+                        this.dialogTableVisible = false
+                        this.getData()
+                    } else if (data.code == 0) {
+                        this.$message({
+                            message: data.message,
+                            type: 'error'
+                        })
+                        this.dialogTableVisible = true
+                        return
+                    } else {
+                        this.$message({
+                            message: data.message,
+                            type: 'error'
+                        })
+                        this.dialogTableVisible = true
+                        return
+                    }
+                })
+            }
+            if (this.website_id == '') {
+                this.$message({
+                    message: '请输入并选择网站名称',
+                    type: 'error'
+                })
+                this.dialogVisible = true
+            }
+            if (this.dialogName == "编辑") {
+                upFooterCategory({
+                    website_id: this.website_id,
+                    name: this.ruleForm.tabbarName,
+                    id: this.activeid
+                }).then(data => {
+                    console.log(data);
+                    if (data.code == 200) {
+                        this.$message({
+                            message: '编辑成功',
+                            type: 'success'
+                        })
+                        this.dialogTableVisible = false
+                    }
+                    if (data.code == 0) {
+                        this.$message({
+                            message: data.message,
+                            type: 'error'
+                        })
+                        this.dialogTableVisible = true
+                    }
+                    this.getData()
+                })
+            }
+
+        },
+        //取消添加或编辑
+        cancelForm() {
+            this.dialogTableVisible = false
+        },
+        //3.6 上传图片操作
+        beforeAvatarUpload(file) {
+            const isJPG = file.type === 'image/jpeg';
+            const isPNG = file.type === 'image/png';
+            const isLt2M = file.size / 1024 / 1024 < 2;
+
+            if (!isJPG && !isPNG) {
+                this.$message.error('上传图片只能是 JPG 或 PNG 格式!');
+                return false;
+            }
+            if (!isLt2M) {
+                this.$message.error('上传图片大小不能超过 2MB!');
+                return false;
+            }
+
+            const formData = new FormData();
+            formData.append('file', file);
+
+            this.$store.dispatch('pool/uploadFile', formData).then(res => {
+                this.logoUrl = res.data.imgUrl;//显示缩略图
+                this.ruleForm.adPhoto = res.data.imgUrl;//提供表单地址
+                console.log(res.data.imgUrl)
+            }).catch(() => {
+                this.$message({
+                    type: 'info',
+                    message: '网络错误,请重试!'
+                });
+            })
+
+            // 阻止默认的上传行为
+            return false;
+        },
+        handleDelete() {
+            // 删除图片
+            this.logoUrl = ''; // 清空图片 URL
+        },
+
+        //搜索部分的输入关键词下拉框
+        selectWebSite(value) {
+            this.webSiteName_id = value
+        },
+
+        //添加 / 编辑弹窗中输入关键词下拉框 
+        // 判断是否已经关联了网站
+        detectionWebSite(value) {
+            console.log(value);
+            this.website_id = value
+            console.log(this.website_id);
+
+        },
+
+        //
+        getWebNavList(query) {
+            if (query !== '') {
+                this.webSiteLoading = true;
+                let data = { keyword: query }
+                let dataArr = [];
+                this.$store.dispatch('pool/getNavWebList', data).then(res => {
+                    console.log(res.data)
+                    for (let item of res.data) {
+                        let data = {};
+                        data.key = item.id;
+                        data.value = item.id;
+                        data.label = item.website_name;
+                        dataArr.push(data)
+                    }
+                    this.webSiteList = dataArr;
+                    this.webSiteLoading = false;
+                }).catch(() => {
+                    this.$message({
+                        type: 'info',
+                        message: '网络错误,请重试!'
+                    });
+                })
+            } else {
+                this.navList = [];
+            }
+        },
+    },
+    mounted() {
+        this.getData()
+    },
+}
+</script>
+
+<style scoped lang="less">
+input[aria-hidden=true] {
+    display: none !important;
+}
+
+// 提示信息
+.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: 80%;
+        }
+
+        .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 {
+            height: 38px;
+            border: none;
+            border-radius: 8px;
+            padding: 0 30px;
+        }
+
+        .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: #55b5f1;
+        background-color: rgba(85, 181, 241, 0.16);
+
+        >i {
+            padding-right: 8px;
+        }
+    }
+
+    ::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: 30px 60px 1px 20px;
+    background-color: #f5f7fb;
+
+    .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;
+        }
+    }
+
+
+
+    ::v-deep .avatar {
+        width: 140px;
+        height: auto;
+    }
+
+    .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;
+    }
+
+    ::v-deep .el-select {
+        width: 100%;
+    }
+
+    ::v-deep .el-form-item {
+        margin-bottom: 50px;
+    }
+}
+
+// 弹出层按钮
+.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 {
+    ::v-deep .el-form-item {
+        margin-top: 40px;
+        margin-bottom: 0;
+    }
+}
+
+.graph {
+    background-color: #f5f7fb;
+    padding: 60px 100px;
+    overflow: hidden;
+
+    li {
+        float: left;
+    }
+
+    >li:first-child {
+        margin-right: 100px;
+    }
+}
+
+.dialog-footer {
+    margin: 0 auto;
+}
+</style>

+ 651 - 0
src/views/tabbar/tabbarDetail.vue

@@ -0,0 +1,651 @@
+<template>
+    <!-- 广告位管理 -->
+    <div>
+        <!-- 头部搜索框部分 -->
+        <div class="title" v-if="this.tabbarType == 1">
+            <el-row>
+                <el-col :span="6" class="left">
+                    <div class="searchBox">
+                        <div class="searchTitle">列表标题</div>
+                        <el-input v-model="listTitle" class="input" placeholder="请输入列表标题"></el-input>
+                    </div>
+                </el-col>
+                <el-col :span="6" class="left">
+                    <div class="searchBox">
+                        <div class="searchTitle">内容标题</div>
+                        <el-input v-model="contentTitle" class="input" placeholder="请输入内容标题"></el-input>
+                    </div>
+                </el-col>
+                <el-col :span="8" 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="addWebsite">添加详情</button>
+            <el-row>
+                <template>
+                    <el-table class="my-table" :data="tableData" style="width: 100%">
+                        <el-table-column fixed prop="id" label="编号" width="90">
+                        </el-table-column>
+                        <el-table-column prop="list_title" label="列表标题" width="" v-if="this.tabbarType == 1">
+                        </el-table-column>
+                        <el-table-column prop="con_title" 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="200">
+                            <template slot-scope="scope">
+                                <div class="listBtnBox">
+                                    <div class="listDeleteBtn" @click="deleteRow(scope.row.id)">
+                                        <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>
+                            </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%" top="8vh"
+            :close-on-click-modal="false">
+            <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="120px" class="demo-ruleForm">
+                <div class="dialogText">
+                    <el-form-item label="列表标题:" prop="listTitle" v-if="this.tabbarType == 1">
+                        <el-input v-model="ruleForm.listTitle" placeholder="请输入列表标题"></el-input>
+                    </el-form-item>
+                    <el-form-item label="内容标题:" prop="contentTitle">
+                        <el-input v-model="ruleForm.contentTitle" placeholder="请输入内容标题"></el-input>
+                    </el-form-item>
+                    <el-form-item label="内容详情:" prop="contentDetail">
+                        <el-input v-model="ruleForm.contentDetail" type="textarea" :rows="10" placeholder="请输入内容详情"
+                            resize="none">
+                        </el-input>
+                    </el-form-item>
+                </div>
+                <div class="dialogBtn">
+                    <el-button type="info" @click="cancelForm">取消</el-button>
+                    <el-button type="primary" @click="submitForm('ruleForm')">提交</el-button>
+                </div>
+            </el-form>
+        </el-dialog>
+        <!-- 弹出框 编辑 end----------------------------------------------------------->
+    </div>
+</template>
+
+<script>
+//表格标题
+import tableTitle from './components/tableTitle.vue';
+
+//引入公用样式
+import '@/styles/global.less';
+import { addFooterContent, getFooterContent, upFooterContent, delFooterContent } from '@/api/tabbar'
+export default {
+    components: {
+        tableTitle,//表格标题-
+    },
+    data() {
+        const validateEmpty = (rule, value, callback) => {
+            if (value.length == 0) {
+                callback(new Error('该项不能为空!'))
+            } else {
+                callback()
+            }
+        }
+        return {
+            tableDivTitle: "底部导航详情",  //列表标题
+            dialogTableVisible: false,      //编辑弹框
+            dialogName: '编辑', //编辑弹窗名称
+
+            tableData: [],//表格数据
+            tabbarId: '',//底部导航传递的id
+            tabbarType: 1,//底部导航传递的类型
+
+            //活动id
+            activeid: "",
+
+            // 分页相关
+            page: 1,
+            pageSize: 10,
+            total: 0,
+
+
+            // 搜索框相关
+            listTitle: '', //网站名称id
+            contentTitle: '', //广告位名称
+
+            //弹框相关
+            ruleForm: {
+                listTitle: '', //列表标题
+                contentTitle: '', //内容标题
+                contentDetail: '', //内容详情
+            },
+            rules: {
+                listTitle: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+                contentTitle: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+                contentDetail: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+            }
+        }
+    },
+    methods: {
+        //1.列表和分页相关 start ------------------------------------------------------------>
+        //1.1 开始请求列表信息方法
+        getData() {
+            getFooterContent({
+                fcat_id: this.tabbarId,
+                page: this.page,
+                pageSize: this.pageSize
+            }).then(data => {
+                console.log(data);
+                this.tableData = data.data.rows
+                this.total = data.data.count
+            })
+        },
+
+        //1.2 删除内容
+        deleteRow(id) {
+            console.log(id);
+            let data = new FormData()
+            data.append('id', id)
+            this.$confirm('注意:删除后,该条信息及其绑定关系全部删除', '是否确认删除该条信息?', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+            }).then(() => {
+                console.log("当前删除:" + id)
+
+                delFooterContent({
+                    id: id
+                }).then(data => {
+                    console.log(data);
+                    if (data.code = 200) {
+                        this.$message({
+                            message: '删除成功',
+                            type: 'success'
+                        })
+                        this.getData()
+                    } else if (data.code == 0) {
+                        this.$message({
+                            message: data.message,
+                            type: 'error'
+                        })
+                    }
+                })
+
+            }).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() {
+            getFooterContent({
+                fcat_id: this.tabbarId,
+                page: this.page,
+                pageSize: this.pageSize,
+                list_title:this.listTitle,
+                con_title:this.contentTitle,
+            }).then(data => {
+                console.log(data);
+                this.tableData = data.data.rows
+                this.total = data.data.count
+            })
+        },
+        //1.6 重置按钮
+        goReset() {
+            this.listTitle = ""
+            this.contentTitle = ""
+            this.getData()
+        },
+        //列表和分页相关 end ------------------------------------------------------------>
+
+        //1.7 编辑
+        goEdit(id, val) {
+            // console.log(id);
+            this.dialogName = '编辑'
+            this.activeid = id
+            this.dialogTableVisible = true
+            console.log(id, val);
+
+            //数据回显
+            this.ruleForm.listTitle = val.list_title //列表标题
+            this.ruleForm.contentTitle = val.con_title //内容标题
+            this.ruleForm.contentDetail = val.content //内容详情
+        },
+
+        //1.8 添加
+        addWebsite() {
+            this.dialogTableVisible = true
+            this.dialogName = "添加"
+
+            //添加时清空回显回来的数据
+            this.ruleForm.contentTitle = '' //内容标题
+            this.ruleForm.contentDetail = '' //内容详情
+        },
+
+        // 弹出层相关方法
+        // 1.9 提交表单
+        submitForm(formName) {
+            // 判断用户是否输入数据
+            this.$refs[formName].validate((valid) => {
+                if (valid) {
+                    console.log('submit!');
+                } else {
+                    console.log('error submit!!');
+                    return false;
+                }
+            });
+            if (this.dialogName == "添加") {
+                if (this.tabbarType == 0) { //详情页类型
+                    addFooterContent({
+                        fcat_id: this.tabbarId,
+                        type: this.tabbarType,
+                        con_title: this.ruleForm.contentTitle,
+                        content: this.ruleForm.contentDetail,
+                    }).then(data => {
+                        console.log(data);
+                        if (data.code == 200) {
+                            this.$message({
+                                message: '添加成功',
+                                type: 'success'
+                            })
+                            this.dialogTableVisible = false
+                            this.getData()
+                        } else {
+                            this.$message({
+                                message: data.message,
+                                type: 'error'
+                            })
+                        }
+                    })
+                } else if (this.tabbarType == 1) { //列表页类型
+                    addFooterContent({
+                        fcat_id: this.tabbarId,
+                        type: this.tabbarType,
+                        list_title: this.ruleForm.listTitle,
+                        con_title: this.ruleForm.contentTitle,
+                        content: this.ruleForm.contentDetail,
+                    }).then(data => {
+                        console.log(data);
+                        if (data.code == 200) {
+                            this.$message({
+                                message: '添加成功',
+                                type: 'success'
+                            })
+                            this.dialogTableVisible = false
+                            this.getData()
+                        } else {
+                            this.$message({
+                                message: data.message,
+                                type: 'error'
+                            })
+                        }
+                    })
+                }
+            }
+            if (this.dialogName == "编辑") {
+                if (this.tabbarType == 0) { //详情页类型
+                    upFooterContent({
+                        id: this.activeid, //内容id
+                        type: this.tabbarType,
+                        con_title: this.ruleForm.contentTitle,
+                        content: this.ruleForm.contentDetail,
+                    }).then(data => {
+                        console.log(data);
+                        if (data.code == 200) {
+                            this.$message({
+                                message: '修改成功!',
+                                type: 'success'
+                            })
+                            this.dialogTableVisible = false
+                            this.getData()
+                        } else {
+                            this.$message({
+                                message: data.message,
+                                type: 'error'
+                            })
+                        }
+                    })
+                } else if (this.tabbarType == 1) { //列表页类型
+                    upFooterContent({
+                        id: this.activeid, //内容id
+                        type: this.tabbarType,
+                        list_title: this.ruleForm.listTitle,
+                        con_title: this.ruleForm.contentTitle,
+                        content: this.ruleForm.contentDetail,
+                    }).then(data => {
+                        console.log(data);
+                        if (data.code == 200) {
+                            this.$message({
+                                message: '修改成功!',
+                                type: 'success'
+                            })
+                            this.dialogTableVisible = false
+                            this.getData()
+                        } else {
+                            this.$message({
+                                message: data.message,
+                                type: 'error'
+                            })
+                        }
+                    })
+                }
+            }
+
+        },
+        //取消
+        cancelForm() {
+            this.dialogTableVisible = false
+        },
+    },
+    mounted() {
+        console.log(this.$route.query.id);
+        this.tabbarId = this.$route.query.id
+        this.tabbarType = this.$route.query.type
+
+        this.getData() //获取数据
+    },
+}
+</script>
+
+<style scoped lang="less">
+input[aria-hidden=true] {
+    display: none !important;
+}
+
+// 提示信息
+.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: 80%;
+        }
+
+        .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 {
+            height: 38px;
+            border: none;
+            border-radius: 8px;
+            padding: 0 30px;
+        }
+
+        .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 {
+        margin-left: 0px;
+        padding-left: 0px;
+        margin-right: 20px;
+        width: 76px;
+        height: 36px;
+        line-height: 36px;
+    }
+
+    ::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: 30px 60px 1px 20px;
+    background-color: #f5f7fb;
+
+    .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;
+        }
+    }
+
+
+
+    ::v-deep .avatar {
+        width: 140px;
+        height: auto;
+    }
+
+    .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;
+    }
+
+    ::v-deep .el-select {
+        width: 100%;
+    }
+
+    ::v-deep .el-form-item {
+        margin-bottom: 50px;
+    }
+}
+
+// 弹出层按钮
+.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 {
+    ::v-deep .el-form-item {
+        margin-top: 40px;
+        margin-bottom: 0;
+    }
+}
+
+.graph {
+    background-color: #f5f7fb;
+    padding: 60px 100px;
+    overflow: hidden;
+
+    li {
+        float: left;
+    }
+
+    >li:first-child {
+        margin-right: 100px;
+    }
+}
+
+.dialog-footer {
+    margin: 0 auto;
+}
+</style>

+ 811 - 0
src/views/website/blogroll.vue

@@ -0,0 +1,811 @@
+<template>
+    <!-- 友情链接列表 -->
+    <div>
+        <div class="title">
+            <el-row>
+                <el-col :span="6" class="left">
+                    <div class="searchBox">
+                        <div class="searchTitle">所属站点</div>
+                        <el-select v-model="siteName" :multiple="false" :multiple-limit="1" filterable remote
+                            reserve-keyword placeholder="请输入所属站点" :remote-method="getWebNavList"
+                            :loading="webSiteLoading" @change="selectWebSite">
+                            <el-option v-for="item in webSiteList" :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-input v-model="webName" placeholder="请输入链接名称"></el-input>
+                    </div>
+                </el-col>
+                <el-col :span="10" 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="70">
+                        </el-table-column>
+                        <el-table-column prop="website_name" label="关联网站" width="180">
+                        </el-table-column>
+                        <el-table-column prop="title" label="链接名称" width="160">
+                        </el-table-column>
+                        <el-table-column prop="url" label="链接网址" width="180">
+                        </el-table-column>
+                        <el-table-column prop="type" label="类型" width="90">
+                        </el-table-column>
+                        <el-table-column label="网站LOGO" width="150">
+                            <template slot-scope="scope">
+                                <img :src="scope.row.logo_url" alt="" class="uploadImage">
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="sort" label="排序" width="90">
+                        </el-table-column>
+                        <el-table-column prop="created_at" label="创建时间" width="180">
+                        </el-table-column>
+                        <el-table-column prop="updated_at" label="修改时间" width="180">
+                        </el-table-column>
+                        <el-table-column fixed="right" label="操作" width="220">
+                            <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>
+                            </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%" :close-on-click-modal="false">
+            <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+                <div class="dialogText">
+                    <el-form-item label="关联网站:" prop="correlationWeb">
+                        <el-select v-model="ruleForm.correlationWeb" :multiple="false" :multiple-limit="1" filterable
+                            remote reserve-keyword placeholder="请输入关联网站名称" :remote-method="getWebNavList"
+                            :loading="webSiteLoading" @change="detectionWebSite">
+                            <el-option v-for="item in webSiteList" :key="item.value" :label="item.label"
+                                :value="item.value">
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="链接名称:" prop="webName">
+                        <el-input v-model="ruleForm.webName" placeholder="请输入链接名称"></el-input>
+                    </el-form-item>
+                    <el-form-item label="链接地址:" prop="webUrl">
+                        <el-input v-model="ruleForm.webUrl" placeholder="请输入链接地址"></el-input>
+                    </el-form-item>
+                    <el-form-item label="类型:" prop="type">
+                        <el-radio v-model="ruleForm.type" label="1">图片</el-radio>
+                        <el-radio v-model="ruleForm.type" label="2">文本</el-radio>
+                        <el-radio v-model="ruleForm.type" label="3">底部</el-radio>
+                    </el-form-item>
+                    <el-form-item label="网站logo:" prop="" :label-width="formLabelWidth" :class="['custom-form-item']"
+                        class="custom-align-right" v-show="this.ruleForm.type != '2'">
+                        <div class="uploaderBox">
+                            <!--图片上传组件 start ------------------------------------------------------------>
+                            <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="logoUrl" :src="logoUrl" class="avatar">
+                                    <!-- 上传图标 -->
+                                    <div v-else class="chooseImgDiv">
+                                        <div>
+                                            <img src="@/assets/public/upload/noImage.png">
+                                            <div>选择图片</div>
+                                        </div>
+                                    </div>
+                                    <input type="hidden" name="logo" v-model="ruleForm.webLogo">
+                                </el-upload>
+                                <!-- 删除按钮,当鼠标悬浮时显示 -->
+                                <div v-if="hovering && logoUrl" class="delete-button" @click="handleDelete">
+                                    <i class="el-icon-delete"></i>
+                                </div>
+                            </div>
+                            <!--图片上传组件 end ------------------------------------------------------------>
+                        </div>
+                    </el-form-item>
+                    <el-form-item label="网站介绍:" prop="">
+                        <el-input v-model="ruleForm.webDesc" type="textarea" :rows="3" placeholder="请输入网站介绍"
+                            resize="none">
+                        </el-input>
+                    </el-form-item>
+                    <el-form-item label="排序:" prop="sort">
+                        <el-input v-model="ruleForm.sort" placeholder="请输入排序"></el-input>
+                    </el-form-item>
+
+                </div>
+                <div class="dialogBtn">
+                    <!-- <button class="cancel" @click="cancelForm">取消</button>
+                    <button class="submit" @click="submitFormTow">提交</button> -->
+                    <el-button type="info" @click="cancelForm">取消</el-button>
+                    <el-button type="primary" @click="submitForm">提交</el-button>
+                </div>
+            </el-form>
+        </el-dialog>
+        <!-- 弹出框 end------------------------------------------------------------>
+    </div>
+
+</template>
+
+<script>
+//表格标题
+import tableTitle from './components/blogroll/tableTitle.vue';
+//引入公用样式
+import '@/styles/global.less';
+// 引入api
+import { getLinkInfo, getLinkList, createLink, delLink, updateLink } from '@/api/link.js'
+
+export default {
+    components: {
+        tableTitle,//表格标题
+    },
+    data() {
+        const validateEmpty = (rule, value, callback) => {
+            if (value.length == 0) {
+                callback(new Error('该项不能为空!'))
+            } else {
+                callback()
+            }
+        }
+        return {
+            tableDivTitle: "友情链接列表",  //表格标题
+            webName: '', // 网站名称
+            activeId: '', // 被编辑的网站的id
+            activeType: '', //被编辑网站的type
+            disabled: true, //是否禁用
+
+
+            //搜索相关
+            siteName: '', //所属站点
+            webName: '', //网站名称
+
+            //3.4 上传logo图片
+            logoUrl: '',
+            hovering: false, // 鼠标悬浮状态 悬浮时显示删除
+
+
+            // 分页器相关
+            total: 0,
+            page: 1,
+            pageSize: 10,
+
+            //表格相关
+            tableData: [],
+
+            //弹出框相关
+            dialogTableVisible: false,  //是否显示
+            dialogName: '',     //弹框标题名
+
+
+            // 可以输入的搜索框相关
+            webSiteList: [],//获取关联网站列表
+            webSiteLoading: false,
+
+            options: [],
+            value: [],
+            list: [],
+
+            value: '',
+            radio: '1',
+            textarea: '',
+
+            // 图片相关
+            formLabelWidth: '120px',//表单的长度
+
+
+            website_id: "",
+            //表单相关
+            ruleForm: {
+                correlationWeb: '', //关联网站
+                webName: '',  //网站名称
+                webUrl: '', //网站地址
+                type: '1',  //类型
+                webLogo: '', //网站logo
+                webDesc: '', //网站介绍
+                sort: '',  //排序
+            },
+            rules: {   //规则
+                correlationWeb: [{ required: true, trigger: 'blur', validator: validateEmpty }], //关联网站
+                webName: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+                webUrl: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+                type: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+                sort: [{ required: true, trigger: 'blur', validator: validateEmpty }]
+            },
+
+        }
+    },
+    methods: {
+        //1.列表和分页相关 start ------------------------------------------------------------>
+        //1.1 获取网站列表数据
+        getData() {
+            getLinkList({
+                page: this.page,
+                pageSize: this.pageSize,
+            }).then(data => {
+                console.log(data);
+                this.tableData = data.data.rows
+                this.total = data.data.count
+                for (let item of this.tableData) {
+                    if (item.type == '1') {
+                        item.type = '图片'
+                    } else if (item.type == '2') {
+                        item.type = '文字'
+                    } else if (item.type == '3') {
+                        item.type = '底部'
+                    }
+                }
+            })
+        },
+        //1.2 删除内容
+        deleteRow(id, val) {
+            this.activeId = id
+            this.$confirm('注意:删除后,该条信息及其绑定关系全部删除', '是否确认删除该条信息?', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+            }).then(() => {
+                console.log("当前删除:" + id)
+                delLink({
+                    id: this.activeId,
+                }).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() {
+            getLinkList({
+                page: this.page,
+                pageSize: this.pageSize,
+                website_id: this.siteName,
+                title: this.webName
+            }).then(data => {
+                console.log(data);
+                this.tableData = data.data.rows
+                this.total = data.data.count
+                for (let item of this.tableData) {
+                    if (item.type == '1') {
+                        item.type = '图片'
+                    } else if (item.type == '2') {
+                        item.type = '文字'
+                    } else if (item.type == '3') {
+                        item.type = '底部'
+                    }
+                }
+            })
+        },
+        //1.6 重置按钮
+        reset() {
+            this.siteName = ''
+            this.webName = ''
+            this.getData()
+        },
+        //列表和分页相关 end ------------------------------------------------------------>
+
+        //1.7 添加
+        addWebsite() {
+            this.dialogTableVisible = true //弹窗是否显示
+            this.dialogName = "添加"  //弹窗名称
+            this.ruleForm.correlationWeb = ''
+            this.ruleForm.webName = ''
+            this.ruleForm.webUrl = ''
+            this.ruleForm.type = '1'
+            this.logoUrl = 'http://183.131.25.186:9501/image/20241225/17350893036168.png'
+            this.ruleForm.webLogo = 'http://183.131.25.186:9501/image/20241225/17350893036168.png'
+            this.ruleForm.webDesc = ''
+            this.ruleForm.sort = 0
+        },
+        //1.8 编辑
+        goEdit(id, val) {
+            this.dialogTableVisible = true //弹框显示
+            this.dialogName = "编辑"    //弹框名字
+            console.log(id, val);
+
+            this.activeId = id //活动id
+            this.website_id = val.website_id //网站id
+            this.ruleForm.correlationWeb = val.website_name
+            this.ruleForm.webName = val.title
+            this.ruleForm.webUrl = val.url
+            this.ruleForm.webLogo = val.logo_url
+            this.logoUrl = val.logo_url
+            this.ruleForm.webDesc = val.describe
+            this.ruleForm.sort = val.sort
+            if (val.type == "图片") {
+                this.ruleForm.type = '1'
+            } else if (val.type == "文字") {
+                this.ruleForm.type = '2'
+            } else if (val.type == "底部") {
+                this.ruleForm.type = '3'
+            }
+        },
+
+
+        // 弹出层相关方法
+        // 提交表单
+        submitForm() {
+            // console.log(123)
+            if (this.ruleForm.correlationWeb == '') {
+                this.$message.error("请输入并选择关联网站名称");
+                return
+            }
+            // 添加
+            if (this.dialogName == "添加") {
+                if (this.ruleForm.type == '2') {
+                    createLink({
+                        title: this.ruleForm.webName,
+                        website_id: this.website_id,
+                        sort: this.ruleForm.sort,
+                        url: this.ruleForm.webUrl,
+                        type: this.ruleForm.type,
+                        logo_url: '',
+                        describe: this.ruleForm.webDesc
+                    }).then(data => {
+                        console.log(data);
+                        if (data.code == 200) {
+                            this.$message({
+                                message: "添加成功",
+                                type: 'success'
+                            });
+                            this.dialogTableVisible = false
+                            this.getData()
+                        } else {
+                            this.$message.error(data.message)
+                        }
+                    })
+                } else {
+                    createLink({
+                        title: this.ruleForm.webName,
+                        website_id: this.website_id,
+                        sort: this.ruleForm.sort,
+                        url: this.ruleForm.webUrl,
+                        type: this.ruleForm.type,
+                        logo_url: this.ruleForm.webLogo,
+                        describe: this.ruleForm.webDesc
+                    }).then(data => {
+                        console.log(data);
+                        if (data.code == 200) {
+                            this.$message({
+                                message: "添加成功",
+                                type: 'success'
+                            });
+                            this.dialogTableVisible = false
+                            this.getData()
+                        } else {
+                            this.$message.error(data.message)
+                        }
+                    })
+                }
+
+            }
+            if (this.dialogName == "编辑") {
+                if (this.website_id == " ") {
+                    this.$message.error("请输入并选择关联网站");
+                    this.dialogTableVisible = true
+                    return
+                }
+                if (this.ruleForm.type == '2') {
+                    updateLink({
+                        title: this.ruleForm.webName,
+                        website_id: this.website_id,
+                        sort: this.ruleForm.sort,
+                        url: this.ruleForm.webUrl,
+                        type: this.ruleForm.type,
+                        logo_url: '',
+                        describe: this.ruleForm.webDesc,
+                        id: this.activeId,
+                    }).then(data => {
+                        console.log(data);
+                        if (data.code == 200) {
+                            this.$message({
+                                message: "修改成功",
+                                type: 'success'
+                            })
+                            this.dialogTableVisible = false
+                            this.getData()
+                        } else {
+                            this.$message({
+                                message: data.message,
+                                type: 'error'
+                            })
+                        }
+                    })
+                } else {
+                    updateLink({
+                        title: this.ruleForm.webName,
+                        website_id: this.website_id,
+                        sort: this.ruleForm.sort,
+                        url: this.ruleForm.webUrl,
+                        type: this.ruleForm.type,
+                        logo_url: this.ruleForm.webLogo,
+                        describe: this.ruleForm.webDesc,
+                        id: this.activeId,
+                    }).then(data => {
+                        console.log(data);
+                        if (data.code == 200) {
+                            this.$message({
+                                message: "修改成功",
+                                type: 'success'
+                            })
+                            this.dialogTableVisible = false
+                            this.getData()
+                        } else {
+                            this.$message({
+                                message: data.message,
+                                type: 'error'
+                            })
+                        }
+                    })
+                }
+
+            }
+        },
+        //取消添加或编辑
+        cancelForm() {
+            this.dialogTableVisible = false
+        },
+        //3.6 上传图片操作
+        beforeAvatarUpload(file) {
+            console.log(file);
+            // this.ruleForm.webLogo=file
+            const isJPG = file.type === 'image/jpeg';
+            const isPNG = file.type === 'image/png';
+            const isLt2M = file.size / 1024 / 1024 < 2;
+
+            if (!isJPG && !isPNG) {
+                this.$message.error('上传头像图片只能是 JPG 或 PNG 格式!');
+                return false;
+            }
+            if (!isLt2M) {
+                this.$message.error('上传头像图片大小不能超过 2MB!');
+                return false;
+            }
+
+            const formData = new FormData();
+            formData.append('file', file);
+
+            this.$store.dispatch('pool/uploadFile', formData).then(res => {
+                console.log('res', res);
+                this.logoUrl = res.data.imgUrl;//显示缩略图
+                this.ruleForm.webLogo = res.data.imgUrl;//提供表单地址
+                console.log(res.data.imgUrl)
+            }).catch(() => {
+                this.$message({
+                    type: 'info',
+                    message: '网络错误,请重试!'
+                });
+            })
+
+            // 阻止默认的上传行为
+            return false;
+        },
+        handleDelete() {
+            // 删除图片
+            this.logoUrl = ''; // 清空图片 URL
+        },
+
+        //搜索部分的输入关键词下拉框
+        selectWebSite(value) {
+            this.siteName = value
+        },
+
+        //添加 / 编辑弹窗中输入关键词下拉框 
+        // 判断是否已经关联了网站
+        detectionWebSite(value) {
+            console.log(value);
+            this.website_id = value
+            // let data = {
+            //     website_id: value
+            // }
+            //验证一下是不是存在了关联网站名称
+            // this.$store.dispatch('pool/getAdminWebsiteCategory', data).then(res => {
+            //     if (res.data.length > 0) {
+            //         this.ruleForm.webName = "";
+            //         this.$message({
+            //             type: 'warning',
+            //             message: '该网站已经关联了导航,请重新选择!'
+            //         });
+            //     }
+            // })
+        },
+
+        //
+        getWebNavList(query) {
+            if (query !== '') {
+                this.webSiteLoading = true;
+                let data = { keyword: query }
+                let dataArr = [];
+                this.$store.dispatch('pool/getNavWebList', data).then(res => {
+                    console.log(res.data)
+                    for (let item of res.data) {
+                        let data = {};
+                        data.key = item.id;
+                        data.value = item.id;
+                        data.label = item.website_name;
+                        dataArr.push(data)
+                    }
+                    this.webSiteList = dataArr;
+                    this.webSiteLoading = false;
+                }).catch(() => {
+                    this.$message({
+                        type: 'info',
+                        message: '网络错误,请重试!'
+                    });
+                })
+            } else {
+                this.navList = [];
+            }
+        },
+    },
+    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: 85%;
+            display: inline-block;
+            position: relative;
+        }
+    }
+
+    .btnList {
+        float: right;
+        padding-top: 28px;
+
+        button {
+            width: 120px;
+            height: 38px;
+            border: none;
+            border-radius: 8px;
+            // padding: 0 30px;
+        }
+
+        .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: #55b5f1;
+        background-color: rgba(85, 181, 241, 0.16);
+
+        >i {
+            padding-right: 8px;
+        }
+    }
+
+    .uploadImage {
+        width: 130px;
+    }
+
+    // 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%;
+    }
+
+    //图片的宽高
+    ::v-deep .avatar {
+        width: 140px;
+        height: auto;
+    }
+
+    .keywords {
+        position: relative;
+
+        i {
+            position: absolute;
+            top: 0;
+            left: -15px;
+        }
+    }
+}
+
+// 弹出层按钮
+.dialogBtn {
+    text-align: center;
+    margin: 50px auto 20px;
+
+    ::v-deep .avatar {
+        width: 140px;
+        height: 50px;
+        display: block;
+    }
+
+    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>