Browse Source

feat: 新增项目管理模块及相关组件

添加项目管理功能,包括项目列表、审核列表、创建项目页面及相关组件
实现项目管理的API接口、路由配置和状态管理
修改企业管理的企业列表、审核企业列表的网站搜索框逻辑修改
15313670163 1 ngày trước cách đây
mục cha
commit
ffc6cf3583

+ 59 - 0
src/api/project.js

@@ -0,0 +1,59 @@
+// 项目管理
+import request from '@/utils/request'
+
+//获取项目列表
+export const getProjectList = (data) => {
+    return request({
+        url: '/news/getProjectList',
+        method: 'post',
+        data
+    })
+}
+
+//新增项目
+export const addProject = (data) => {
+    return request({
+        url: '/news/addProject',
+        method: 'post',
+        data
+    })
+}
+
+//删除项目
+export const delProject = (data) => {
+    return request({
+        url: '/news/delProject',
+        method: 'post',
+        data
+    })
+}
+
+//编辑项目
+export const upProject = (data) => {
+    return request({
+        url: '/news/upProject',
+        method: 'post',
+        data
+    })
+}
+
+//审核项目
+export const checkProject = (data) => {
+    return request({
+        url: '/news/checkProject',
+        method: 'post',
+        data
+    })
+}
+
+//获取项目详情
+export const getProjectInfo = (data) => {
+    return request({
+        url: '/news/getProjectInfo',
+        method: 'post',
+        data
+    })
+}
+
+
+

+ 51 - 0
src/router/index.js

@@ -1298,6 +1298,57 @@ export const constantRoutes = [
     ]
   },
   // --------------企业管理fr--------------end---------
+
+  // --------------项目管理fr--------------start---------
+  {
+    path: '/projectList',
+    component: Layout,
+    children: [
+      {
+        name: '',
+        path: '',
+        component: () => import('@/views/project/projectList.vue'),
+        meta: {
+          title: '项目列表',
+          hidden: true,
+          breadcrumb: true
+        }
+      }
+    ]
+  },
+  {
+    path: '/checkprojectList',
+    component: Layout,
+    children: [
+      {
+        name: '',
+        path: '',
+        component: () => import('@/views/project/checkprojectList.vue'),
+        meta: {
+          title: '待审核列表',
+          hidden: true,
+          breadcrumb: true
+        }
+      }
+    ]
+  },
+  {
+    path: '/creatProject',
+    component: Layout,
+    children: [
+      {
+        name: '',
+        path: '',
+        component: () => import('@/views/project/creatProject'),
+        meta: {
+          title: '添加项目',
+          hidden: true,
+          breadcrumb: true
+        }
+      }
+    ]
+  },
+  // --------------企业管理fr--------------end---------
 ]
 
 /**

+ 72 - 0
src/store/modules/project.js

@@ -0,0 +1,72 @@
+import { getProjectList,addProject,delProject,upProject,checkProject,getProjectInfo} from '@/api/project'
+
+const state = {
+
+}
+
+const mutations = {
+
+}
+
+const actions = {
+    getProjectList({commit},data) {
+        return new Promise((resolve, reject) => {
+            getProjectList(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      addProject({ commit }, data) {
+        return new Promise((resolve, reject) => {
+            addProject(data).then(response => {
+                resolve(response)
+            }).catch(error => {
+                reject(error)
+            })
+        })
+    },
+    delProject({ commit }, data) {
+        return new Promise((resolve, reject) => {
+            delProject(data).then(response => {
+                resolve(response)
+            }).catch(error => {
+                reject(error)
+            })
+        })
+    },
+    upProject({ commit }, data) {
+        return new Promise((resolve, reject) => {
+            upProject(data).then(response => {
+                resolve(response)
+            }).catch(error => {
+                reject(error)
+            })
+        })
+    },
+    checkProject({ commit }, data) {
+        return new Promise((resolve, reject) => {
+            checkProject(data).then(response => {
+                resolve(response)
+            }).catch(error => {
+                reject(error)
+            })
+        })
+    },
+    getProjectInfo({ commit }, data) {
+        return new Promise((resolve, reject) => {
+            getProjectInfo(data).then(response => {
+                resolve(response)
+            }).catch(error => {
+                reject(error)
+            })
+        })
+    },
+}
+export default {
+    namespaced: true,
+    state,
+    mutations,
+    actions
+}

+ 56 - 13
src/views/company/checkcompanyList.vue

@@ -6,16 +6,22 @@
         <el-row>
           <el-col :span="8">
             <div class="searchBox">
-              <div class="searchTitle">标题:</div>
-              <el-input placeholder="请输入标题" autocomplete="off" v-model="getApiData.title" />
-            </div>
-          </el-col>
-          <el-col :span="8">
-            <div class="searchBox">
-              <div class="searchTitle"> 网站名称:</div>
-              <el-input placeholder="请输入网站名称" autocomplete="off" v-model="getApiData.website_name" />
+              <div class="searchTitle">标题名称:</div>
+              <el-input placeholder="请输入标题名称" autocomplete="off" v-model="getApiData.title" />
             </div>
           </el-col>
+          <el-col :span="8" class="left">
+              <div class="searchBox">
+                <div class="searchTitle">网站名称</div>
+                <el-select v-model="getApiData.website_id" :multiple="false" :multiple-limit="1" filterable remote
+                    reserve-keyword placeholder="请输入网站名称" clearable :remote-method="getWebNavLists"
+                    :loading="webSiteLoading" @change="selectWebSite">
+                    <el-option v-for="item in webSiteLists" :key="item.value" :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+              </div>
+            </el-col>
           <el-col :span="8">
             <div class="searchBox">
               <div class="searchTitle">资讯状态:</div>
@@ -149,6 +155,10 @@ export default {
       }
     }
     return {
+        // 可以输入的搜索框相关
+        webSiteList: [],//获取关联网站列表
+        webSiteLists: [],
+        webSiteLoading: false,
       //1.列表和分页相关 start ------------------------------------------------------------>
       formLabelWidth: "120px",//表单label宽度
       tableDivTitle: "企业列表",
@@ -165,11 +175,9 @@ export default {
       editId: 0,//要修改的网站id
       selectStatusWindow: false,//反选窗口
       getApiData: {
-        id: "",//id
         title: "",//标题
-        website_name: "",//导航池id
+        website_id: "",//导航池id
         ischeck: 1,//待审核列表  1      已审核列表     2
-        islink: "",//是否使用外链
         status: null,//企业状态
         page: 1,//当前是第几页
         pageSize: 10,//一共多少条
@@ -248,9 +256,10 @@ export default {
     //1.6 重置按钮
     clearSearchList() {
       this.tableData = [];
-      this.getApiData.id = "";
+      this.webSiteList = [];
+      this.webSiteLists = [];
+      this.getApiData.website_id = "";
       this.getApiData.title = "";
-      this.getApiData.website_name = "";
       this.getApiData.status = null;
       this.getApiData.page = 1;
       this.getApiData.pageSize = 10;
@@ -342,6 +351,40 @@ export default {
         }
       })
     },
+    // 搜索框网站------------------------------------------>
+      getWebNavLists(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.webSiteLists = dataArr;
+                    console.log("搜索下拉列表",this.webSiteLists)
+                    this.webSiteLoading = false;
+                }).catch(() => {
+                    this.$message({
+                        type: 'info',
+                        message: '网络错误,请重试!'
+                    });
+                })
+            } else {
+                this.navList = [];
+                this.webSiteLists = [];
+            }
+        },
+       //搜索部分的输入关键词下拉框
+        selectWebSite(value) {
+            this.getApiData.website_id = value
+
+        },
   },
   mounted() {
     this.creatNews_user_type = getUseType()

+ 51 - 11
src/views/company/companyList.vue

@@ -10,10 +10,16 @@
                 <el-input placeholder="请输入标题" autocomplete="off" v-model="getApiData.title" />
               </div>
             </el-col>
-            <el-col :span="8">
+            <el-col :span="8" class="left">
               <div class="searchBox">
-                <div class="searchTitle"> 网站名称:</div>
-                <el-input placeholder="请输入网站名称" autocomplete="off" v-model="getApiData.category_name" />
+                <div class="searchTitle">网站名称</div>
+                <el-select v-model="getApiData.website_id" :multiple="false" :multiple-limit="1" filterable remote
+                    reserve-keyword placeholder="请输入网站名称" clearable :remote-method="getWebNavLists"
+                    :loading="webSiteLoading" @change="selectWebSite">
+                    <el-option v-for="item in webSiteLists" :key="item.value" :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
               </div>
             </el-col>
           </el-row>
@@ -133,6 +139,10 @@
     },
     data() {
       return {
+        // 可以输入的搜索框相关
+        webSiteList: [],//获取关联网站列表
+        webSiteLists: [],
+        webSiteLoading: false,
         //1.列表和分页相关 start ------------------------------------------------------------>
         tableDivTitle: "企业列表",
         tableData: [],//内容
@@ -147,11 +157,9 @@
         editId: 0,//要修改的网站id
         selectStatusWindow: false,//反选窗口
         getApiData: {
-          id: "",//id
           title: "",//标题
-          category_name: "",//导航池id
+          website_id: "",//导航池id
           ischeck: 2,//待审核列表  1      已审核列表     2
-          islink: "",//是否使用外链
           status: 1,//企业状态
           page: 1,//当前是第几页
           pageSize: 10,//一共多少条
@@ -241,11 +249,10 @@
       //1.6 重置按钮
       clearSearchList() {
         this.tableData = [];
-        this.getApiData.id = "";
+        this.webSiteList = [];
+        this.webSiteLists = [];
+        this.getApiData.website_id = "";
         this.getApiData.title = "";
-        this.getApiData.category_name = "";
-        this.getApiData.author = "";
-        this.getApiData.islink = "";
         this.getApiData.status = "";
         this.getApiData.page = 1;
         this.getApiData.pageSize = 10;
@@ -400,7 +407,40 @@
         })
       },
       //3.编辑新闻 end ------------------------------------------------------------>
-  
+      // 搜索框网站------------------------------------------>
+      getWebNavLists(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.webSiteLists = dataArr;
+                    console.log("搜索下拉列表",this.webSiteLists)
+                    this.webSiteLoading = false;
+                }).catch(() => {
+                    this.$message({
+                        type: 'info',
+                        message: '网络错误,请重试!'
+                    });
+                })
+            } else {
+                this.navList = [];
+                this.webSiteLists = [];
+            }
+        },
+       //搜索部分的输入关键词下拉框
+        selectWebSite(value) {
+            this.getApiData.website_id = value
+
+        },
     },
     mounted() {
       this.creatNews_user_type = getUseType()

+ 413 - 0
src/views/project/checkprojectList.vue

@@ -0,0 +1,413 @@
+<template>
+  <div class="mainBox">
+    <!--搜索功能 start------------------------------------------------------------>
+    <div class="layerBox_search">
+      <div class="layerBoxLine">
+        <el-row>
+          <el-col :span="8">
+            <div class="searchBox">
+              <div class="searchTitle">标题名称:</div>
+              <el-input placeholder="请输入标题名称" autocomplete="off" v-model="getApiData.title" />
+            </div>
+          </el-col>
+          <el-col :span="8" class="left">
+            <div class="searchBox">
+                <div class="searchTitle">网站名称</div>
+                <el-select v-model="getApiData.website_id" :multiple="false" :multiple-limit="1" filterable remote
+                    reserve-keyword placeholder="请输入网站名称" clearable :remote-method="getWebNavLists"
+                    :loading="webSiteLoading" @change="selectWebSite">
+                    <el-option v-for="item in webSiteLists" :key="item.value" :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </div>
+          </el-col>
+          <el-col :span="8">
+            <div class="searchBox">
+              <div class="searchTitle">项目状态:</div>
+              <el-select v-model="getApiData.status" placeholder="请选择..">
+                <el-option label="待审核" value="0"></el-option>
+                <el-option label="已拒绝" value="2"></el-option>
+              </el-select>
+            </div>
+          </el-col>
+        </el-row>
+      </div>
+    </div>
+
+    <div class="layerBoxNoBg">
+      <div>
+      </div>
+      <div>
+        <el-button @click="clearSearchList">重置</el-button>
+        <el-button type="primary" @click="getData('search')">搜索</el-button>
+      </div>
+    </div>
+    <!--搜索功能 end------------------------------------------------------------>
+
+    <!--表格内容 start------------------------------------------------------------>
+    <div class="layerBox">
+      <tableTitle :name="tableDivTitle" />
+      <el-row>
+        <template>
+          <el-table :data="tableData" style="width: 100%">
+            <el-table-column fixed prop="id" label="ID" width="80"></el-table-column>
+            <el-table-column prop="title" label="标题名称" width="300">
+              <template slot-scope="scope">
+                <el-popover placement="top-start" width="340" trigger="hover" :content="scope.row.title">
+                  <span slot="reference" class="titleWidth">{{ scope.row.title }}</span>
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column prop="category_name" label="栏目名称" width="210"></el-table-column>
+            <el-table-column prop="website_name" label="网站名称" width="210"></el-table-column>
+            <el-table-column prop="updated_at" label="修改时间" width=""></el-table-column>
+            <el-table-column prop="status" label="状态" width="">
+              <template slot-scope="scope">
+                <span v-if="scope.row.status == 0">待审核</span>
+                <span v-if="scope.row.status == 1">已通过</span>
+                <span v-if="scope.row.status == 2">已拒绝</span>
+              </template>
+            </el-table-column>
+            <el-table-column fixed="right" label="操作" width="350" header-align="center"
+              v-if="creatNews_user_type == 10000">
+              <template slot-scope="scope">
+                <div class="listBtnBox">
+                  <div class="listMainBtn" @click="getUpRow(scope.row.id, tableData)"><i class="el-icon-check"></i>审核
+                  </div>
+                  <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-column fixed="right" label="操作" width="180" header-align="center"
+              v-if="creatNews_user_type != 10000">
+              <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 @size-change="handleSizeChange" :current-page="getApiData.page"
+            @current-change="handleCurrentChange" :page-size="10" layout="total, prev, pager, next, jumper"
+            :total="allCount"></el-pagination>
+        </el-col>
+      </el-row>
+    </div>
+    <!--分页 end------------------------------------------------------------>
+    <!--表格内容 end------------------------------------------------------------>
+        <!--弹出框1:外部表单弹出框 start------------------------------------------------------------>
+        <el-dialog title="请输入驳回理由" :visible.sync="examineWindow" :close-on-click-modal="false">
+          <el-form :model="form" ref="form" :rules="formRules" label-position="left">
+            <div class="formDiv">
+              <el-form-item label="驳回原因:" :label-width="formLabelWidth" prop="reason" class="custom-align-right">
+                <el-input type="textarea" v-model="form.reason" class="custom-textarea" placeholder="请输入驳回原因"
+                  :rows="3"></el-input>
+              </el-form-item>
+            </div>
+          </el-form>
+          <div slot="footer" class="dialog-footer">
+            <div>
+              <el-button type="info" @click="examineWindow = false">取消</el-button>
+              <el-button type="primary" @click="examineToServe">确定</el-button>
+            </div>
+          </div>
+        </el-dialog>
+        <!--弹出框1:外部表单弹出框 end------------------------------------------------------------>
+  </div>
+</template>
+
+<script>
+//表格标题
+import tableTitle from './components/tableTitle';
+//引入公用样式
+import '@/styles/global.less';
+//获得用户身份
+import { getUseType } from '@/utils/auth'
+
+export default {
+  components: {
+    tableTitle,//表格标题
+  },
+  data() {
+    let self = this;
+    //表单验证
+    const validateEmpty = (rule, value, callback) => {
+      if (value == '') {
+        callback(new Error('该项不能为空!'))
+      } else {
+        callback()
+      }
+    }
+    return {
+      // 可以输入的搜索框相关
+        webSiteList: [],//获取关联网站列表
+        webSiteLists: [],
+        webSiteLoading: false,
+      //1.列表和分页相关 start ------------------------------------------------------------>
+      formLabelWidth: "120px",//表单label宽度
+      tableDivTitle: "项目列表",
+      tableData: [],//内容
+      webSiteData: [],//可选网站列表
+      creatNews_user_type: 0,//用户类型
+      //选择要发布的网站
+      webSiteForm: {
+        ignore_ids: []
+      },
+      status: 0,//审核状态
+      ids: [],//待选网站列表
+      loading: false,//loading
+      editId: 0,//要修改的网站id
+      selectStatusWindow: false,//反选窗口
+      getApiData: {
+        id: "",//id
+        title: "",//标题
+        website_name: "",//导航池id
+        ischeck: 1,//待审核列表  1      已审核列表     2
+        islink: "",//是否使用外链
+        status: null,//项目状态
+        page: 1,//当前是第几页
+        pageSize: 10,//一共多少条
+      },
+      //提交驳回
+      form: {
+        reason: ""
+      },
+      formRules: {
+        //导航池名称不能为空
+        reason: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+      },
+      allCount: 0,//总条数
+      examineWindow: false,//审核窗口
+      //分页相关 end ------------------------------------------------------------>
+    }
+  },
+  methods: {
+    //1.列表和分页相关 start ------------------------------------------------------------>
+    //1.1 开始请求列表信息方法
+    getData(type) {
+    // 豆包--------使两个变量不互相影响
+      if (type == "search") {
+        this.getApiData.page = 1;
+      }
+      // 深拷贝 this.getApiData,避免直接引用导致修改相互影响
+      let data = JSON.parse(JSON.stringify(this.getApiData));
+      if (this.getApiData.status == null) {
+        data.status = 3;
+      }
+    // 豆包厉害--------
+      console.log("this.getApiData",this.getApiData);
+      this.$store.dispatch('project/getProjectList', data).then(res => {
+        //格式化:islink=0为不使用外面 islink=1为使用外链
+        //status=1为显示 status=2为不显示
+        
+        this.tableData = res.data.rows; //给与内容
+        this.allCount = res.data.count; //给与总条数
+      }).catch(() => {
+        this.$message({
+          type: 'warning',
+          message: '网络错误,请重试!'
+        });
+      })
+    },
+    //1.2 删除内容
+    deleteRow(id) {
+      this.$confirm('此操作将永久删除该条数据, 是否继续?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        console.log("当前删除:" + id)
+        this.$store.dispatch('project/delProject', { id: id }).then(res => {
+          this.getData();
+          this.$message({
+            type: 'success',
+            message: '删除成功!'
+          });
+        }).catch(() => {
+          this.$message({
+            type: 'warning',
+            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 重置按钮
+    clearSearchList() {
+      this.tableData = [];
+      this.webSiteList = [];
+      this.webSiteLists = [];
+      this.getApiData.title = "";
+      this.getApiData.website_id = "";
+      this.getApiData.status = null;
+      this.getApiData.page = 1;
+      this.getApiData.pageSize = 10;
+      this.getData();
+    },
+    //列表和分页相关 end ------------------------------------------------------------>
+
+    //2.添加新闻 start ------------------------------------------------------------>
+    //跳转到项目发布页面
+    goCreat() {
+      this.$router.push({
+        path: '/creatProject',
+      });
+    },
+    goEdit(id) {
+      let data = {
+        id: id,
+        to: "checkProject"
+      }
+      this.$router.push({
+        path: '/creatProject',
+        query: data
+      });
+    },
+    // },
+   //1.4 审核温江
+   getUpRow(id) {
+    //设置待审核的id
+    this.editId = id;
+    console.log(id)
+    this.$confirm('将此文章通过审核吗?', '提示', {
+      confirmButtonText: '通过',
+      cancelButtonText: '拒绝',
+      distinguishCancelAndClose: true,  // 关键配置项,用于区分取消和关闭按钮
+      type: 'warning'
+    }).then(() => {
+      this.upRow(id, 1)
+    }).catch((the_reback) => {
+      //输入驳回理由
+      
+      if (the_reback == "cancel") {
+        //输入驳回理由
+        // console.log("驳回" )
+        this.examineWindow = true;
+      }
+
+    })
+  },
+  // //3.5 修改文章状态
+  upRow(id, status) {
+      let data = {
+        id: id,
+        status: status
+      }
+      this.$store.dispatch('project/checkProject', data).then(res => {
+        if (res.code == 200) {
+          this.$message({
+            type: 'success',
+            message: '操作成功!'
+          });
+          this.getData();
+        }
+      })
+    },
+    //3.编辑新闻 end ------------------------------------------------------------>
+
+    //提交驳回内容
+    examineToServe(id) {
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          let data = {
+            id: this.editId,
+            status: 2,//驳回status
+            refuse_reason: this.form.reason
+          }
+          this.$store.dispatch('project/checkProject', data).then(res => {
+            if (res.code == 200) {
+              this.$message({
+                type: 'success',
+                message: '操作成功!'
+              });
+              this.getData();
+              this.form.reason = "";//清空上一次的输入
+              this.examineWindow = false;
+            }
+          })
+        } else {
+          this.$message.error("驳回理由不能为空!")
+        }
+      })
+    },
+    // 搜索框网站------------------------------------------>
+      getWebNavLists(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.webSiteLists = dataArr;
+                    console.log("搜索下拉列表",this.webSiteLists)
+                    this.webSiteLoading = false;
+                }).catch(() => {
+                    this.$message({
+                        type: 'info',
+                        message: '网络错误,请重试!'
+                    });
+                })
+            } else {
+                this.navList = [];
+                this.webSiteLists = [];
+            }
+        },
+       //搜索部分的输入关键词下拉框
+        selectWebSite(value) {
+            this.getApiData.website_id = value
+
+        },
+  },
+  mounted() {
+    this.creatNews_user_type = getUseType()
+    //1.获得初始数据
+    this.getData();
+  }
+}
+</script>
+
+<style scoped lang="less">
+.titleWidth {
+  width: 350px;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+</style>

+ 106 - 0
src/views/project/components/CityCascader.vue

@@ -0,0 +1,106 @@
+<template>
+  <el-cascader
+    :key="cascaderKey"
+    v-model="internalValue"
+    placeholder="请选择地区"
+    :props="SearchCityData"
+    filterable
+    clearable
+    @change="handleChange">
+  </el-cascader>
+</template>
+
+<script>
+export default {
+  props: {
+    value: { // 接收外部传递的 v-model 值
+      type: [Array, String], // 允许传入数组或字符串类型的数据
+      default: () => [],
+    },
+  },
+  data() {
+    let self = this;
+    return {
+      internalValue: [], // 用于与级联选择器进行双向绑定的内部数据
+      cascaderKey: 0, // 用于强制刷新 cascader
+      SearchCityData: {
+        checkStrictly: true,
+        lazy: true,
+        async lazyLoad(node, resolve) {
+          const { level, data } = node;
+          let parentId = level == 0 ? 0 : data.value;
+          let parames = {
+            pid: parentId,
+          };
+          self.$store
+            .dispatch("pool/getcityList", parames)
+            .then((res) => {
+              if (res.data) {
+                const nodes = res.data.map((item) => ({
+                  value: item.id,
+                  label: item.name,
+                  leaf: level >= 3,
+                  children: [],
+                }));
+                resolve(nodes);
+              }
+            })
+            .catch(() => {
+              this.$message({
+                type: "info",
+                message: "网络错误,请重试!",
+              });
+            });
+        },
+      },
+    };
+  },
+  watch: {
+    value: {
+      immediate: true, // 组件挂载时立即执行
+      handler(newVal) {
+        try {
+          const parsedValue = Array.isArray(newVal) ? newVal : JSON.parse(newVal);
+          this.internalValue = parsedValue; // 设置内部值
+          if (parsedValue.length) {
+            this.loadCascaderPath(parsedValue); // 动态加载回显的路径
+          }
+        } catch (error) {
+          console.error("无法解析传入的值:", error);
+          this.internalValue = []; // 如果解析失败,重置为默认空数组
+        }
+      },
+    },
+  },
+  methods: {
+    handleChange(value) {
+      // 当选择变化时,向父组件发送更新的值
+      this.$emit("input", value); // v-model 双向绑定
+      this.$emit("update-city-id", value); // 额外事件,方便父组件监听
+    },
+    async loadCascaderPath(path) {
+      for (let i = 0; i < path.length; i++) {
+        const parentId = path[i - 1] || 0; // 获取当前层级的父级ID
+        const level = i; // 当前层级的索引
+        await this.$store.dispatch('pool/getcityList', { pid: parentId })
+          .then((res) => {
+            const nodes = res.data.map(item => ({
+              value: item.id,
+              label: item.name,
+              leaf: level >= 3, // 假设4层结构,设置叶子节点标记
+            }));
+            // 级联选择器加载数据
+            if (level === path.length - 1) {
+              this.internalValue = path; // 确保最后一级路径正确设置
+              this.cascaderKey += 1; // 强制刷新 cascader
+            }
+          });
+      }
+    },
+  },
+};
+</script>
+
+<style scoped>
+/* 可根据需要自定义样式 */
+</style>

+ 41 - 0
src/views/project/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 {
+  color: #333333;
+  position: relative;
+  padding-bottom: 20px;
+  margin-top: 20px;
+
+  .tableFloatLine {
+    width: 3px;
+    height: 16px;
+    background: #5570F1;
+    display: block;
+    position: absolute;
+    left: -20px;
+    top: 1px;
+  }
+}
+</style>

+ 40 - 0
src/views/project/components/tableTitle1.vue

@@ -0,0 +1,40 @@
+<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;
+  padding-bottom: 20px;
+
+  .tableFloatLine {
+    width: 3px;
+    height: 16px;
+    background: #5570F1;
+    display: block;
+    position: absolute;
+    left: -20px;
+    top: 1px;
+  }
+}
+</style>

+ 911 - 0
src/views/project/creatProject.vue

@@ -0,0 +1,911 @@
+<template>
+  <div class="mainBox">
+    <div class="layerBox">
+      <tableTitle :name="tableDivTitle" />
+      <el-form :model="form" ref="form" :rules="formRules" label-position="left" label-width="140px">
+        <div class="formDiv">
+          <div v-if="creatNews_user_type == 10000">
+            <el-form-item label="站点名称:" prop="website_id" class="custom-align-right">
+              <el-cascader :key="parentKey" v-model="form.website_id" placeholder="请选择站点名称"
+                popper-class="my_cascader" :options="creatNews_nav_pool_arr"
+                @change="creatNews_nav_pool_change_fun(form.website_id)" filterable clearable></el-cascader>
+            </el-form-item>
+            <el-form-item label="栏目名称:" prop="cat_arr_id" class="custom-align-right">
+                <el-cascader :key="parentKey_2" v-model="form.cat_arr_id" placeholder="请选择要绑定的展示名称" 
+                popper-class="my_cascader" style="height: 100%;" :props="parentData_2" filterable clearable>
+                </el-cascader>
+            </el-form-item>
+          </div>
+          <div v-if="creatNews_user_type != 10000">
+            <el-form-item label="栏目名称:" prop="cat_arr_id" class="custom-align-right">
+              <el-cascader :key="parentKey" v-model="form.cat_arr_id" placeholder="请选择要绑定的展示名称" :props="parentData"
+                  popper-class="my_cascader" style="height: 100%;" filterable clearable>
+              </el-cascader>
+            </el-form-item>
+          </div>
+          <div>
+          <el-form-item label="标题名称:" prop="title" class="custom-align-right">
+            <el-input v-model="form.title" autocomplete="off" placeholder="请输入标题名称"></el-input>
+            <!-- <el-checkbox v-model="form.islink">是否使用外链</el-checkbox> -->
+          </el-form-item>
+          
+          <div>
+            <el-form-item label="缩略图:" class="custom-align-right" prop="">
+              <div class="uploaderBox" @mouseenter="hovering = true" mouseleave="hovering = false">
+                <el-upload class="avatar-uploader" action="#" :show-file-list="false"
+                  :before-upload="beforeAvatarUpload">
+                  <!-- 预览图片 -->
+                  <img v-if="imgUrl" :src="imgUrl" class="avatar">
+                  <div v-else class="chooseImgDiv">
+                    <div>
+                      <img src="@/assets/public/upload/noImage.png">
+                      <div>选择图片</div>
+                    </div>
+                  </div>
+                </el-upload>
+                <input type="hidden" v-model="form.imgurl">
+                <span class="photo_tips">推荐图片长宽比例为 16:9,大小不能超过 500 K。</span>
+                <div v-if="hovering && imgUrl" class="delete-button" @click="handleDelete">
+                  <i class="el-icon-delete"></i>
+                </div>
+              </div>
+            </el-form-item>
+            <el-form-item label="项目关键词:" prop="" class="custom-align-right">
+              <template #label>
+                <span class="askBox">
+                  项目关键词:
+                  <el-tooltip class="item" effect="dark" introduce="项目关键词,如:三农市场网、全国三农、信息一体化。" placement="top">
+                    <i class="el-icon-question"></i>
+                  </el-tooltip>
+                </span>
+              </template>
+              <tagInput :initialTags="tags" @tags-updated="updateTags"></tagInput>
+            </el-form-item>
+            <el-form-item label="项目描述:" prop="" class="custom-align-right">
+              <template #label>
+                <span class="askBox">
+                  项目描述:
+                  <el-tooltip class="item" effect="dark" introduce="项目描述,如:中国三农市场网创建以来,社会效益和会员经济效益贡献。" placement="top">
+                    <i class="el-icon-question"></i>
+                  </el-tooltip>
+                </span>
+              </template>
+              <el-input type="textarea" v-model="form.description" class="custom-textarea"
+                placeholder="请输入项目描述"></el-input>
+            </el-form-item>
+           
+            <el-form-item label="企业名称:" prop="business_name" class="custom-align-right">
+              <el-input v-model="form.business_name" autocomplete="off" placeholder="请输入企业名称"></el-input>
+            </el-form-item>
+            <el-form-item label="联系人:" prop="content_person" class="custom-align-right">
+              <el-input v-model="form.content_person" autocomplete="off" placeholder="请输入联系人"></el-input>
+            </el-form-item>
+            <el-form-item label="联系电话:" prop="telephone" class="custom-align-right">
+              <el-input v-model="form.telephone" autocomplete="off" placeholder="请输入联系电话"></el-input>
+            </el-form-item>
+            <el-form-item label="手机:" prop="mobile" class="custom-align-right">
+              <el-input v-model="form.mobile" autocomplete="off" placeholder="请输入手机"></el-input>
+            </el-form-item>
+            <el-form-item label="邮编:" prop="post_code" class="custom-align-right">
+              <el-input v-model="form.post_code" autocomplete="off" placeholder="请输入邮编"></el-input>
+            </el-form-item>
+            <el-form-item label="传真:" prop="fax" class="custom-align-right">
+              <el-input v-model="form.fax" autocomplete="off" placeholder="请输入传真"></el-input>
+            </el-form-item>
+            <el-form-item label="电子邮件:" prop="email" class="custom-align-right">
+              <el-input v-model="form.email" autocomplete="off" placeholder="请输入电子邮件"></el-input>
+            </el-form-item>
+            <el-form-item label="行政区划:" class="custom-align-right" prop="city_arr_id">
+              <CityCascader v-model="form.city_arr_id" @update-city-id="update_city_arr_id"></CityCascader>
+            </el-form-item>
+            <el-form-item label="详细地址:" prop="address" class="custom-align-right">
+              <el-input v-model="form.address" autocomplete="off" placeholder="请输入详细地址"></el-input>
+            </el-form-item>
+              <el-form-item label="项目介绍:" prop="introduce" class="custom-align-right">
+                <myEditor ref="myEditor" v-model="form.introduce"></myEditor>
+              </el-form-item>
+              <el-form-item label="加盟详情:" prop="franchise_details" class="custom-align-right">
+                <el-input type="textarea" v-model="form.franchise_details" :autosize="{ minRows: 10, maxRows: 50 }"></el-input>
+              </el-form-item>
+            </div>
+          </div>
+        </div>
+      </el-form>
+    </div>
+    <div class="bottomBtnBox">
+      <el-button type="info" @click="returnPage">返回</el-button>
+      <el-button type="primary" @click="editToServe" v-if="editStatus == true">确定</el-button>
+      <el-button type="primary" @click="addToServe" v-else>确定</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getWebSiteId, getUseType } from '@/utils/auth'
+//表格标题
+import tableTitle from './components/tableTitle.vue';
+//引入tag标签组件
+import tagInput from '../../components/InputTag/index.vue';
+//引入公用样式
+import '@/styles/global.less';
+//城市级联选择器
+import CityCascader from './components/CityCascader';
+//引入富文本编辑器
+import myEditor from '../../components/edit/myEditor.vue';
+//引入拖拽组件
+import draggable from 'vuedraggable';
+
+export default {
+  components: {
+    tableTitle,
+    CityCascader,
+    tagInput,
+    myEditor,
+    draggable
+  },
+  data() {
+    //0.全局操作 start ------------------------------------------------------------>
+    //表单验证
+    const validateEmpty = (rule, value, callback) => {
+      if (value == '') {
+        callback(new Error('该项不能为空!'))
+      } else {
+        callback()
+      }
+    }
+    const validateArray = (rule, value, callback) => {
+      if (value.length == 0) {
+        callback(new Error('该项不能为空!'))
+      } else {
+        callback()
+      }
+    }
+    const validateRadio = (rule, value, callback) => {
+      if (value != '1' || value != '0') {
+        callback()
+      } else {
+        callback()
+      }
+    }
+    const validateZero = (rule, value, callback) => {
+      if (value == 0 || value == '' || value == "0") {
+        callback(new Error('该项不能为空!'))
+      } else {
+        callback()
+      }
+    }
+    let self = this;
+    //0.全局操作 end ------------------------------------------------------------>
+    return {
+      loading: false,
+      logoUrl: '',
+      hovering: false, // 鼠标悬浮状态 悬浮时显示删除
+      tags: [],//标签数组
+      websiteid: 0,
+      creatNews_pid_num: "0",//请求子导航用的pid
+      creatNews_nav_pool_arr: [],//
+      creatNews_add_nav_pool_arr: [],//
+      creatNews_son_website_id_num: "",
+      checked: false,
+      formLabelWidth: '80px',//表单的长度
+      //1.表单项 start ------------------------------------------------------------>
+      editStatus: false,
+      tableDivTitle:"添加项目",
+      disclaimer: true,//免责声明
+      //提交表单
+      creatNews_user_type: 0,//判断用户类型'
+      created_at: "",//创建时间
+
+      form: {
+        website_id: 0,//站点id
+        cat_arr_id: [],//导航池名称
+        category_id: 0,//栏目id
+        nav_add_pool_id: [],//导航池子级
+        title: '',//项目标题
+        imgurl: "",//缩略图
+        description: "",//描述
+        keyword: "",//关键词
+        content_person: "",//联系人
+        telephone: "",//联系电话
+        mobile: "",//手机
+        post_code: "",//邮编
+        fax: "",//传真
+        email: "",//电子邮件
+        address: "",//详细地址
+        introduce: "",//项目简介
+        user_type: "??",//判断用户类型'
+        city_arr_id: [],//行政区划
+        city_id: "",//区划最后一个数字
+        franchise_details: "",//加盟详情
+        status: 0,//状态状态:0:未审核;1:已审核;2:已拒绝;
+      },
+      //1.2 表单验证规则
+      formRules: {
+        //导航池名称不能为空
+        website_id: [{ required: true, trigger: 'blur', validator: validateZero }],
+        //项目名称不能为空
+        title: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        //如果使用了外链,外链地址不能为空
+        // city_arr_id: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        //导航池名称不能为空
+        cat_arr_id: [{ required: true, trigger: 'blur', validator: validateArray }],
+        //行政区划
+        city_arr_id: [{ required: true, trigger: 'blur', validator: validateArray }],
+        //企业名称不能为空
+        business_name: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        //联系人不能为空
+        content_person: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        //联系电话不能为空
+        telephone: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        //项目简介不能为空
+        introduce: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        //加盟详情不能为空
+        franchise_details: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+      },
+
+      //1.4图片上传
+      imgUrl: "",//在页面上显示缩略图
+      //获取父级导航池
+      parentKey: 0,//获取父级导航
+      parentData: {
+        checkStrictly: true,
+        lazy: true,
+        async lazyLoad(node, resolve) {
+          const { level, data } = node;
+          if (data && data.children && data.children.length !== 0) {
+            return resolve(node)
+          }
+          let parentId;
+          parentId = level == 0 ? 0 : data.value;
+          let parames = {
+            'type': 1,
+            'website_id': getWebSiteId(),
+            'pid': parentId
+          }
+          self.$store.dispatch('pool/get_creatNews_nav_son_actions', parames).then(res => {
+            if (res.data) {
+              const nodes = res.data.map(item => ({
+                value: item.category_id,
+                label: item.name,
+                leaf: level >= 3,
+                children: [],
+                disabled: item.type != 1
+              }))
+              resolve(nodes)
+            }
+          })
+        }
+      },
+      parentKey_2: 0,//获取父级导航 
+      parentData_2: {
+        checkStrictly: true,
+        lazy: true,
+        async lazyLoad(node, resolve) {
+          const { level, data } = node;
+          if (data && data.children && data.children.length !== 0) {
+            return resolve(node)
+          }
+          let parentId;
+          if (self.ifwebsitId == true) {
+            console.log("网站选择已经改变!")
+            parentId = 0;
+            self.ifwebsitId = false;
+            self.cat_arr_id = [];
+          } else {
+            parentId = level == 0 ? 0 : data.value;
+            self.ifwebsitId = false;
+          }
+          let parames = {
+            'type': 1,
+            'website_id': self.form.website_id,
+            'pid': parentId
+          }
+          self.$store.dispatch('pool/get_creatNews_nav_son_actions', parames).then(res => {
+            if (res.data) {
+              const nodes = res.data.map(item => ({
+                value: item.category_id,
+                label: item.alias,
+                leaf: level >= 3,
+                children: [],
+                disabled: item.type != 1
+              }))
+              resolve(nodes)
+            }
+          })
+        }
+      },
+      inputList: [
+        { value: '' }
+      ]
+      //表单项 end ------------------------------------------------------------>
+    };
+
+  }, watch: {
+    '$route'(to, from) {
+      console.log(from, '---------------------------------------');
+      // 监听路由参数中的 id 变化,若变化则更新页面状态并获取数据
+      if (to.query.id) {
+        this.getMainData();
+      }
+    },
+  },
+  methods: {
+    //1.提交表单 start ------------------------------------------------------------>
+    //1.1 直接上传图片
+    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.imgUrl = res.data.imgUrl;//显示缩略图
+        this.form.imgurl = res.data.imgUrl;//提供表单地址
+        console.log(res.data.imgUrl)
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '网络错误,请重试!'
+        });
+      })
+
+      // 阻止默认的上传行为
+      return false;
+    },
+    //1.2 提交表单
+    addToServe() {
+      
+      //取出行政职能和行政区划数组的最后一个数字
+      if (this.form.city_arr_id == "[]" || this.form.city_arr_id == null) {
+        this.form.city_arr_id = '[]'
+        this.form.city_id = 0;
+      } else {
+        if (JSON.parse(this.form.city_arr_id.length == 0)) {
+          this.form.city_id = 0;
+        } else {
+          this.form.city_id = this.form.city_arr_id[this.form.city_arr_id.length - 1];
+        }
+      }
+      // this.form.keyword = JSON.stringify(this.form.keyword);
+      //判断用户身份
+      if (this.creatNews_user_type == 10000) {
+        console.log("用户身份为管理员,无需审核直接发布!")
+        this.form.status = 1;
+      } else {
+        console.log("用户身份为其他用户,提交到审核!")
+        this.form.status = 0;
+        this.form.website_id = this.websiteid;
+      }
+
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          // delete formData.cat_arr_id;
+          const formData = { ...this.form };
+          formData.city_arr_id = Array.isArray(this.form.city_arr_id) ? JSON.stringify(this.form.city_arr_id):  this.form.city_arr_id ;
+          
+          if (this.form.cat_arr_id == "[]" || this.form.cat_arr_id == null) {
+            this.form.cat_arr_id = '[]'
+            this.form.category_id = 0;
+            // console.log("this.form.category_id11111", this.form.category_id);
+          } else {
+            if (JSON.parse(this.form.cat_arr_id.length == 0)) {
+              this.form.category_id = 0;
+              //  console.log("this.form.category_id22222", this.form.category_id);
+            } else {
+              this.form.category_id = this.form.cat_arr_id[this.form.cat_arr_id.length - 1];
+              //  console.log("this.form.category_id133333", this.form.category_id);
+            }
+          }
+          formData.category_id = this.form.category_id;
+          formData.cat_arr_id = Array.isArray(this.form.cat_arr_id) ? JSON.stringify(this.form.cat_arr_id):  this.form.cat_arr_id ;
+          console.log("formData==", this.form.category_id);
+          delete formData.commend_id;
+          delete formData.nav_add_pool_id;
+          delete formData.user_type;
+          console.log("formData==格式化后的日期", formData);
+          // delete formData.data;
+          this.$store.dispatch('project/addProject', formData).then(res => {
+            if (res.code == 200) {
+              console.log("项目发布成功!200")
+              //汇报结果
+              if (this.creatNews_user_type == 10000) {
+                this.$message({
+                  type: 'success',
+                  message: '已成功添加项目!'
+                });
+                this.cleatForm(2);
+                //返回列表页
+                this.returnPage()
+              } else {
+                this.$message({
+                  type: 'success',
+                  message: '待管理员审核!'
+                });
+                this.cleatForm(2);
+                //返回列表页
+                this.returnPage()
+              }
+            } else {
+              this.$message({
+                type: 'error',
+                message: res.message
+              });
+
+
+            }
+          }).catch(() => {
+            this.$message({
+              type: 'info',
+              message: '网络错误,请重试!'
+            });
+          })
+        }
+      })
+    },
+    //1.3 清理表单
+    cleatForm() {
+        this.form.website_id = 0;
+        this.form.cat_arr_id = [];
+        this.form.nav_add_pool_id = [],//导航池子级
+        this.form.category_id = 0;
+        this.form.title = "";
+        this.form.imgurl = "";
+        this.form.description = "";
+        this.form.keyword = "";
+        this.form.business_name = "";
+        this.form.content_person = "";
+        this.form.telephone = "";
+        this.form.mobile = "";
+        this.form.post_code = "";
+        this.form.fax = "";
+        this.form.email = "";
+        this.form.business_name = "";
+        this.form.address = "";
+        this.form.introduce = "";
+        this.form.city_arr_id = [];
+        this.form.city_id = "";
+        this.form.status = 0;
+        this.form.franchise_details = "";
+    },
+    //1.4更新详细地址
+    update_city_arr_id(value) {
+      console.log("行政区划ID已更新:", value);
+      this.form.city_arr_id = value;
+    },
+    //1.5 删除图片
+    handleDelete() {
+      // 删除图片
+      this.imgUrl = ''; // 清空图片 URL
+      this.form.imgurl = ''; // 清空表单中的图片 URL
+    },
+    //提交表单 end ------------------------------------------------------------>
+
+    //2.跳转操作 start ------------------------------------------------------------>
+    returnPage() {
+      if (this.$route.query.to == "checkProject") {
+        this.$router.push({
+          path: '/checkprojectList',
+        });
+      } else {
+        this.$router.push({
+          path: '/projectList',
+        });
+      }
+    },
+    //跳转操作 end ------------------------------------------------------------>
+
+    //3.回显操作 ------------------------------------------------------------>
+    //3.1回显数据
+    getMainData() {
+      let data = {
+        id: this.$route.query.id
+      };
+      this.$store.dispatch('project/getProjectInfo', data).then(res => {
+        console.log("回显数据==", res);
+        this.form.title = res.data.title;
+        if (typeof res.data.website_id === 'string') {
+          this.form.website_id = Number(res.data.website_id);
+        } else {
+          this.form.website_id = res.data.website_id//站点名称
+        }
+        this.form.cat_arr_id = Array.isArray(res.data.cat_arr_id) ? res.data.cat_arr_id : JSON.parse(res.data.cat_arr_id);
+        console.log(this.form.cat_arr_id)
+        //回显导航池 连同非管理员得一起刷新
+        this.parentKey += 1; // 触发级联选择器重新加载
+        this.loadCascaderPath(this.form.cat_arr_id); // 加载路径数据
+        this.parentKey_2 += 1; // 触发级联选择器重新加载
+        this.loadCascaderPath(this.form.cat_arr_id); // 加载路径数据
+        //回显行政区划
+        this.form.city_arr_id = JSON.parse(res.data.city_arr_id);
+
+        //回显其他数据
+        this.form.imgurl = res.data.imgurl;
+        this.imgUrl = res.data.imgurl;
+        this.form.keyword = res.data.keyword;
+        this.tags = res.data.keyword ? res.data.keyword.split(",") : '';
+        this.form.description = res.data.description;
+        //回显编辑器内容
+        this.$nextTick(() => {
+          this.form.introduce = res.data.introduce;
+        });
+        //回显编辑器内容
+        // this.$nextTick(() => {
+          this.form.franchise_details = res.data.franchise_details;
+        // });
+        this.form.status = res.data.status;
+        this.form.business_name = res.data.business_name;
+        this.form.content_person = res.data.content_person;
+        this.form.telephone = res.data.telephone;
+        this.form.mobile = res.data.mobile;
+        this.form.post_code = res.data.post_code;
+        this.form.fax = res.data.fax;
+        this.form.email = res.data.email;
+        this.form.address = res.data.address; 
+        console.log(this.inputList)
+      })
+    },
+    async loadCascaderPath(path) {
+      for (let i = 0; i < path.length; i++) {
+        const parentId = path[i - 1] || 0; // 获取当前层级的父级ID
+        const level = i; // 当前层级的索引
+
+        await this.$store.dispatch('pool/categoryList', { pid: parentId })
+          .then((res) => {
+            const nodes = res.data.map(item => ({
+              value: item.id,
+              label: item.name,
+              leaf: level >= 3, // 假设4层结构,设置叶子节点标记
+            }));
+
+            // 级联选择器加载数据
+            if (level === path.length - 1) {
+              this.form.cat_arr_id = path; // 确保最后一级路径正确设置
+              this.parentKey += 1; // 强制刷新 cascader
+            }
+          });
+      }
+    },
+    //1.3提交修改
+    editToServe() {
+      //不使用外联 验证投票逻辑
+      this.form.id = this.editId;
+      //先进行验证
+      this.$refs.form.validate(valid => {
+      if (valid) {
+          // 如果没有,可以根据实际情况修改
+        
+        // ===== 日期处理逻辑结束 =====
+          //取出行政职能和行政区划数组的最后一个数字
+          if (this.form.city_arr_id == "[]" || this.form.city_arr_id == null) {
+            this.form.city_arr_id = '[]'
+            this.form.city_id = 0;
+          } else {
+            if (JSON.parse(this.form.city_arr_id.length == 0)) {
+              this.form.city_id = 0;
+            } else {
+              this.form.city_id = this.form.city_arr_id[this.form.city_arr_id.length - 1];
+            }
+          }
+          if (this.form.cat_arr_id == "[]" || this.form.cat_arr_id == null) {
+            this.form.cat_arr_id = '[]'
+            this.form.category_id = 0;
+          } else {
+            if (JSON.parse(this.form.cat_arr_id.length == 0)) {
+              this.form.category_id = 0;
+            } else {
+              this.form.category_id = this.form.cat_arr_id[this.form.cat_arr_id.length - 1];
+            }
+          }
+          if (this.creatNews_user_type == 10000) {
+            console.log("用户身份为管理员,无需审核直接发布!")
+            this.form.status = 1;
+          } else {
+            console.log("用户身份为其他用户,提交到审核!")
+            this.form.status = 0;
+            this.form.website_id = this.websiteid;
+          }
+          console.log("this.form111==", this.form);
+          const formData = { ...this.form };
+          // console.log("this.form222==", this.form);
+          formData.city_arr_id = Array.isArray(this.form.city_arr_id) ? JSON.stringify(this.form.city_arr_id):  this.form.city_arr_id ;
+          formData.cat_arr_id = Array.isArray(this.form.cat_arr_id) ? JSON.stringify(this.form.cat_arr_id):  this.form.cat_arr_id ;
+          delete formData.user_type;
+          delete formData.nav_add_pool_id;
+          // console.log("formData==", formData);
+          this.$store.dispatch('project/upProject', formData).then(res => {
+          if (res.code != 200) {
+
+            this.$message({
+              type: 'error',
+              message: res.message
+            });
+
+          } else {
+            //汇报结果
+            if (this.creatNews_user_type == 10000) {
+              this.$message({
+                type: 'success',
+                message: '已成功编辑项目!'
+              });
+              this.cleatForm(2);
+              //返回列表页
+              this.returnPage()
+            } else {
+              this.$message({
+                type: 'success',
+                message: '待管理员审核!'
+              });
+              this.cleatForm(2);
+              //返回列表页
+              this.returnPage()
+            }
+          }
+          }).catch(() => {
+            this.$message({
+              type: 'info',
+              message: '网络错误,请重试!'
+            });
+          })
+        }
+      })
+    },
+    //跳转操作 end ------------------------------------------------------------>
+
+
+    //5.站点选择 曹国庆 start ------------------------------------------------------------>
+    get_creatNews_form_id_fun() {
+      //判断用户类型ajax
+      this.$store.dispatch('public/getInfo').then(res => {
+        //     console.log("res======",res)
+        this.form.user_type = res.data.type_id;
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '网络错误,请重试!'
+        });
+      })
+    },
+    get_creatNews_nav_pool_arr_fun() {//
+      this.$store.dispatch('pool/get_creatNews_nav_actions', { page: 1, pageSize: 666666 }).then(res => {
+        res.data.rows.forEach((per_obj) => {
+          let new_per = {
+            label: per_obj.website_name,
+            value: per_obj.id,
+          }
+          this.creatNews_nav_pool_arr.push(new_per)
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '网络错误,请重试!'
+        });
+      })
+    },
+    creatNews_nav_pool_change_fun() {
+      //开启导航池级联选择器
+      this.ifwebsitId = true;
+      console.log(this.ifwebsitId);
+      //  导航池级
+      let that = this;
+      // console.log("website_id",this.form.website_id)
+      this.form.website_id = this.form.website_id[0];
+      that.parentKey_2 += 1;
+      this.$store.dispatch('pool/get_creatNews_nav_son_actions', { type: 1, pid: String(this.creatNews_pid_num), website_id: String(this.form.website_id) }).then(res => {
+        if (res.data.length == 0) {//没有导航池子级
+          // alert("没有导航池子级");
+          return
+        }
+        this.creatNews_add_nav_pool_arr = res.data;
+        this.creatNews_add_nav_pool_arr.forEach((per_obj) => {
+          per_obj.label = per_obj.name,
+            per_obj.value = per_obj.id,
+            this.creatNews_pid_num = per_obj.category_id
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '网络错误,请重试!'
+        });
+      })
+    },
+    updateTags(newTags) {
+      this.tags = newTags;
+      if(this.tags.length == 0){
+        this.form.keyword = '';
+      }else{
+        this.form.keyword = JSON.stringify(newTags);
+      }
+     
+      console.log(this.form.keyword);
+    },
+    //推荐等级多选获取到的数据
+    levelChange(value) {
+      this.form.level = value;
+    },
+    getNews() {
+      this.$store.dispatch('news/getArticleList', { page: 1, pageSize: 20 }).then(res => {
+        let data = [];
+        for (let item of res.data.rows) {
+          data.push(item)
+        }
+        this.commend_article = data;
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '网络错误,请重试!'
+        });
+      })
+    },
+    // 远程搜索方法
+    remoteMethod(query) {
+      const artical_params = { page: 1, pageSize: 20, id: query }
+      if (query !== '') {
+        this.loading = true;
+        //如果全是数字,就id,其他就是搜title
+        let reg = /^[0-9]+$/;
+        let isNum = reg.test(query);
+        if (isNum) {
+          delete artical_params.title;
+          artical_params.id = query;
+        } else {
+          delete artical_params.id;
+          artical_params.title = query;
+        }
+        this.$store.dispatch('project/getProjectList', artical_params).then(res => {
+          this.loading = false;
+          let data = [];
+          for (let item of res.data.rows) {
+            data.push(item);
+          }
+          this.commend_article = data;
+        }).catch(() => {
+          this.loading = false;
+          this.$message({
+            type: 'info',
+            message: '网络错误,请重试!'
+          });
+        });
+      } else {
+        this.commend_article = [];
+      }
+    },
+    //5.站点选择 曹国庆 end ------------------------------------------------------------>
+
+    //6.问卷 刘佳伟 start ------------------------------------------------------------>
+    addInput(index) {
+      // 在当前索引后插入一个新的输入框对象
+      if (this.inputList.length > 10) {
+        this.$message.warning('最多只能添加10个文本框');
+        return false;
+      }
+      this.inputList.splice(index + 1, 0, { value: '' });
+    },
+    deleteInput(index) {
+      if (this.inputList.length > 1) {
+        // 如果输入框数量大于 1,则删除当前索引对应的输入框对象
+        this.inputList.splice(index, 1);
+      } else {
+        this.$message.warning('至少保留一个输入框');
+      }
+    },
+    onDragEnd() {
+      // 处理拖拽结束事件(如果需要)
+      console.log('拖拽结束', this.commend_article);
+    },
+    handleClose(item) {
+      const index = this.form.commend_id.indexOf(item);
+      if (index > -1) {
+        this.form.commend_id.splice(index, 1);
+      }
+    },
+    //6.问卷 刘佳伟 end ------------------------------------------------------------>
+  },
+  mounted() {
+    console.log("mounted")
+    this.getNews()
+    console.log(this.commend_article, '-------news-------');
+    this.creatNews_user_type = getUseType()
+    this.websiteid = getWebSiteId()
+    //1.获得站点标识
+    this.get_creatNews_form_id_fun()
+    this.get_creatNews_nav_pool_arr_fun()
+    //2.判断是新建还是回显
+    if (this.$route.query.id != undefined) {
+      this.editId = this.$route.query.id;
+      this.editStatus = true;
+      // this.tableDivTitle = "编辑项目";
+      console.log("编辑项目!")
+      this.getMainData();
+    } else {
+      this.editStatus = false;
+      // this.tableDivTitle = "添加项目";
+      console.log("添加项目!")
+    }
+  },
+};
+</script>
+
+<style scoped lang="less">
+//执行v-deep穿透scope选择器 start------------------------------------------------------------>*/
+::v-deep .custom-form-item>.el-form-item__label {
+  line-height: 140px !important;
+}
+
+::v-deep .custom-textarea .el-textarea__inner {
+  resize: none;
+  /* 禁止用户拖拽调整大小 */
+}
+
+::v-deep .custom-align-right .el-form-item__label {
+  text-align: right;
+  /* 设置标签文字右对齐 */
+}
+
+::v-deep .el-popper {
+  height: 500px;
+}
+
+::v-deep .el-select {
+  width: 100%;
+  /* 禁止用户拖拽调整大小 */
+}
+
+::v-deep .el-input-group__prepend {
+  color: black !important;
+}
+
+.formLabelFloatBox {
+  margin-bottom: 10px;
+  position: relative;
+
+  .formLabeladdIcon {
+    position: absolute;
+    right: 45px;
+    top: 5px;
+    width: 38px;
+    height: 24px;
+  }
+
+  .formLabelDelIcon {
+    position: absolute;
+    right: 5px;
+    top: 5px;
+    width: 38px;
+    height: 24px;
+  }
+}
+
+//该项不能为空几个字的位置
+::v-deep .el-form-item__error {
+  color: #ff4949;
+  font-size: 12px;
+  line-height: 1;
+  padding-top: 4px;
+  position: relative;
+  // top: 22%;
+  // left: 93%;
+}
+
+//输入框距离底部的距离
+::v-deep .el-form-item {
+  margin-bottom: 5px;
+}
+
+//图片提示文字样式
+.photo_tips {
+  font-size: 12px;
+  color: #999;
+}
+
+// 执行v-deep穿透scope选择器 end------------------------------------------------------------></style>

+ 477 - 0
src/views/project/projectList.vue

@@ -0,0 +1,477 @@
+<template>
+    <div class="mainBox">
+      <!--搜索功能 start------------------------------------------------------------>
+      <div class="layerBox_search">
+        <div class="layerBoxLine">
+          <el-row>
+            <el-col :span="8">
+              <div class="searchBox">
+                <div class="searchTitle">标题:</div>
+                <el-input placeholder="请输入标题" autocomplete="off" v-model="getApiData.title" />
+              </div>
+            </el-col>
+            <el-col :span="8" class="left">
+                <div class="searchBox">
+                    <div class="searchTitle">网站名称</div>
+                    <el-select v-model="getApiData.website_id" :multiple="false" :multiple-limit="1" filterable remote
+                        reserve-keyword placeholder="请输入网站名称" clearable :remote-method="getWebNavLists"
+                        :loading="webSiteLoading" @change="selectWebSite">
+                        <el-option v-for="item in webSiteLists" :key="item.value" :label="item.label"
+                            :value="item.value">
+                        </el-option>
+                    </el-select>
+                </div>
+            </el-col>
+          </el-row>
+        </div>
+      </div>
+  
+      <div class="layerBoxNoBg">
+        <div>
+          <el-button type="primary" @click="goCreat">添加项目</el-button>
+        </div>
+        <div>
+          <el-button @click="clearSearchList">重置</el-button>
+          <el-button type="primary" @click="getData('search')">搜索</el-button>
+        </div>
+      </div>
+      <!--搜索功能 end------------------------------------------------------------>
+  
+      <!--表格内容 start------------------------------------------------------------>
+      <div class="layerBox">
+        <tableTitle :name="tableDivTitle" />
+        <el-row>
+          <template>
+            <el-table :data="tableData" style="width: 100%">
+              <el-table-column fixed prop="id" label="ID" width="80"></el-table-column>
+              <el-table-column prop="title" label="标题名称" width="300">
+                <template slot-scope="scope">
+                  <el-popover placement="top-start" width="340" trigger="hover" :content="scope.row.title">
+                    <span slot="reference" class="titleWidth">{{ scope.row.title }}</span>
+                  </el-popover>
+                </template>
+              </el-table-column>
+              <el-table-column prop="website_name" label="网站名称" width="210"></el-table-column>
+              <el-table-column prop="category_name" label="栏目名称" width="210"></el-table-column>
+              <el-table-column prop="status" label="状态" width="">
+                <template slot-scope="scope">
+                  <span v-if="scope.row.status == 0">待审核</span>
+                  <span v-if="scope.row.status == 1">已通过</span>
+                  <span v-if="scope.row.status == 2">已拒绝</span>
+                </template>
+              </el-table-column>
+              <el-table-column prop="updated_at" label="修改时间" width=""></el-table-column>
+              
+              <el-table-column fixed="right" label="操作" width="350" header-align="center"
+                v-if="creatNews_user_type == 10000">
+                <template slot-scope="scope">
+                  <div class="listBtnBox">
+                    <div class="listUpBtn" @click="returnRow(scope.row.id, tableData)"><i
+                        class="el-icon-refresh-right"></i>撤回</div>
+                    <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-column fixed="right" label="操作" width="180" header-align="center"
+                v-if="creatNews_user_type != 10000">
+                <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 @size-change="handleSizeChange" :current-page="getApiData.page"
+              @current-change="handleCurrentChange" :page-size="10" layout="total, prev, pager, next, jumper"
+              :total="allCount"></el-pagination>
+          </el-col>
+        </el-row>
+      </div>
+      <!--分页 end------------------------------------------------------------>
+      <!--表格内容 end------------------------------------------------------------>
+  
+      <!--弹出框:选择要发布的网站 start------------------------------------------------------------>
+      <el-dialog title="请选择不要发布的网站" :visible.sync="selectStatusWindow" :close-on-click-modal="false">
+        <el-form label-position="left">
+          <div class="formDiv">
+            <el-table v-loading="loading" ref="multipleTable" :data="webSiteData" tooltip-effect="dark"
+              style="width: 100%" @selection-change="handleSelectionChange">
+              <el-table-column type="selection" width="55"></el-table-column>
+              <el-table-column prop="website_id" label="网站id"></el-table-column>
+              <el-table-column prop="website_name" label="网站名称"></el-table-column>
+            </el-table>
+          </div>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <div>
+            <el-button type="info" @click="selectStatusWindow = false">取消</el-button>
+            <el-button type="primary" @click="selectWebSiteToServe">确定</el-button>
+          </div>
+        </div>
+      </el-dialog>
+      <!--弹出框:选择要发布的网站 end------------------------------------------------------------>
+    </div>
+  </template>
+  
+  <script>
+  //表格标题
+  import tableTitle from './components/tableTitle';
+  //引入公用样式
+  import '@/styles/global.less';
+  //获得用户身份
+  import { getUseType } from '@/utils/auth'
+  
+  export default {
+    components: {
+      tableTitle,//表格标题
+    },
+    data() {
+      return {
+        //1.列表和分页相关 start ------------------------------------------------------------>
+        tableDivTitle: "项目列表",
+        tableData: [],//内容
+        webSiteData: [],//可选网站列表
+        creatNews_user_type: 0,//用户类型
+        //选择要发布的网站
+        webSiteForm: {
+          ignore_ids: []
+        },
+        // 可以输入的搜索框相关
+        webSiteList: [],//获取关联网站列表
+        webSiteLists: [],
+        webSiteLoading: false,
+        ids: [],//待选网站列表
+        loading: false,//loading
+        editId: 0,//要修改的网站id
+        selectStatusWindow: false,//反选窗口
+        getApiData: {
+          website_id: "",//网站id
+          title: "",//标题
+          status: 1,//项目状态
+          page: 1,//当前是第几页
+          pageSize: 10,//一共多少条
+        },
+        allCount: 0,//总条数
+        //分页相关 end ------------------------------------------------------------>
+      }
+    },
+    methods: {
+       
+      //1.列表和分页相关 start ------------------------------------------------------------>
+      //1.1 开始请求列表信息方法
+      getData(type) {
+        if (type == "search") {
+          this.getApiData.page = 1;
+        }
+        this.$store.dispatch('project/getProjectList', this.getApiData).then(res => {
+          //格式化:islink=0为不使用外面 islink=1为使用外链
+          //status=1为显示 status=2为不显示
+          let data = [];
+          console.log(res);
+          this.tableData = res.data.rows; //给与内容
+          this.allCount = res.data.count; //给与总条数
+        }).catch(() => {
+          this.$message({
+            type: 'warning',
+            message: '网络错误,请重试!'
+          });
+        })
+      },
+      //1.2 删除内容
+      deleteRow(id) {
+        this.$confirm('此操作将永久删除该条数据, 是否继续?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          console.log("当前删除:" + id)
+          this.$store.dispatch('project/delProject', { 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('project/upProject', 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 重置按钮
+      clearSearchList() {
+        this.tableData = [];
+        this.webSiteList = [];
+        this.webSiteLists = [];
+        this.getApiData.title = "";
+        this.getApiData.website_id = "";
+        this.getApiData.status = 1;
+        this.getApiData.page = 1;
+        this.getApiData.pageSize = 10;
+        this.getData();
+      },
+      //列表和分页相关 end ------------------------------------------------------------>
+  
+      // 搜索框网站------------------------------------------>
+      getWebNavLists(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.webSiteLists = dataArr;
+                    console.log("搜索下拉列表",this.webSiteLists)
+                    this.webSiteLoading = false;
+                }).catch(() => {
+                    this.$message({
+                        type: 'info',
+                        message: '网络错误,请重试!'
+                    });
+                })
+            } else {
+                this.navList = [];
+                this.webSiteLists = [];
+            }
+        },
+       //搜索部分的输入关键词下拉框
+        selectWebSite(value) {
+            this.getApiData.website_id = value
+
+        },
+
+      // 搜索网站------------------------------------------>
+
+
+
+
+
+
+
+
+
+
+
+      //2.添加新闻 start ------------------------------------------------------------>
+      //跳转到项目发布页面
+      goCreat() {
+        this.$router.push({
+          path: '/creatProject',
+        });
+      },
+      goEdit(id) {
+        let data = {
+          id: id
+        }
+        this.$router.push({
+          path: '/creatProject',
+          query: data
+        });
+      },
+      //添加新闻 end ------------------------------------------------------------>
+  
+      //3.编辑新闻 start ------------------------------------------------------------>
+      //3.1 打开反选窗口
+      selectRow(cid, row) {
+        console.log(row)
+        this.selectStatusWindow = true;
+        //给与编辑的id
+        this.editId = row.id;
+        //给与编辑的状态
+        this.editStatus = row.status;
+        //把cid转换成数组,然后取出最后一位
+  
+        let cidLast = "";
+        // 判断cid是否为数组
+        if (!Array.isArray(cid)) {
+          let cidArr = cid.replace(/[\[\]]/g, '').split(',');
+          cidLast = cidArr[cidArr.length - 1];
+        } else {
+          cidLast = cid[cid.length - 1];
+        }
+        this.getWebsiteNavPoolSite(cidLast, row)
+      },
+      //3.2 获取可选网站列表
+      getWebsiteNavPoolSite(cid, row) {
+        this.loading = true;
+        let ignoreIds = JSON.parse(row.ignore_ids);
+        this.webSiteData = [];
+        this.$store.dispatch('news/getWebsiteNavPoolSite', { category_id: cid }).then(res => {
+          //this.webSiteData = res.data;
+          for (let item of res.data) {
+            if (item.website_name != null) {
+              this.webSiteData.push(item)
+            }
+          }
+  
+          //延迟一会返显,否则可能显示不了
+          if (res.data.length > 0 && ignoreIds != null) {
+            setTimeout(() => {
+              for (let index in this.webSiteData) {
+                if (ignoreIds.includes(this.webSiteData[index].website_id)) {
+                  //调用回显方法
+                  this.toggleSelection([this.webSiteData[index]])
+                }
+              }
+              this.loading = false;
+            }, 500)
+          } else {
+            this.loading = false;
+          }
+        })
+      },
+      //3.3 回显 选中的方法 
+      toggleSelection(rows) {
+        console.log(rows)
+        if (rows) {
+          rows.forEach(row => {
+            this.$refs.multipleTable.toggleRowSelection(row);
+          });
+        } else {
+          this.$refs.multipleTable.clearSelection();
+        }
+      },
+      //3.4 把选择的网站保存到待选择的网站列表
+      handleSelectionChange(val) {
+        console.log(val)
+        this.ids = val;
+      },
+      //3.5 提交选择的网站列表
+      selectWebSiteToServe(id) {
+        let ids = [];
+        for (let item of this.ids) {
+          ids.push(item.website_id)
+        }
+        //把数组转换为字符串
+        //let idsStr = ids.join(',');
+        //把数组转换为字符串
+        let idsStr = JSON.stringify(ids);
+  
+        if (idsStr.length == 0) {
+          this.$message.error("至少需要选择一个网站!")
+          return;
+        } else {
+          let data = {
+            id: this.editId,
+            ignore_ids: idsStr,
+            status: this.editStatus
+          }
+          this.$store.dispatch('news/upArticleStatus', data).then(res => {
+            console.log(res)
+            if (res.code == 200) {
+              this.$message({
+                type: 'success',
+                message: '项目绑定网站成功!'
+              });
+              this.selectStatusWindow = false;
+              this.getData();
+            } else {
+              this.$message.error(res.data.msg)
+            }
+          })
+        }
+      },
+      //3.6 撤回审核
+      returnRow(id) {
+        this.$confirm('确定要撤回吗?', '提示', {
+          confirmButtonText: '撤回',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          //撤回,把文章状态修改为0,重新进行审核
+          this.upRow(id, 0)
+        })
+      },
+      //3.5 修改文章状态
+      upRow(id, status) {
+        let data = {
+          id: id,
+          status: 0
+        }
+        this.$store.dispatch('project/checkProject', data).then(res => {
+          if (res.code == 200) {
+            this.$message({
+              type: 'success',
+              message: '操作成功!'
+            });
+            this.getData();
+          }
+        })
+      },
+      //3.编辑新闻 end ------------------------------------------------------------>
+  
+    },
+    mounted() {
+      this.creatNews_user_type = getUseType()
+      //1.获得初始数据
+      this.getData();
+    }
+  }
+  </script>
+  
+  <style scoped lang="less">
+  .titleWidth {
+    width: 350px;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+  }
+  </style>
+