ソースを参照

Merge branch 'pre' of http://git.bjzxtw.org.cn:3000/zxt/admin_home into pre

LiuJ 2 日 前
コミット
980b302157

+ 155 - 0
src/api/news.js

@@ -307,3 +307,158 @@ export function deleteComplaint(data) {
   })
 }
 //20250324  通知,公告,消息
+//招聘列表 start  fr ------------------------------------->
+
+//1.获取职位列表
+export function getJobRecruitingList(params) {
+    return request({
+    url: '/news/getJobRecruitingList',
+    method: 'get',
+    params
+   })
+  }
+  //2.添加职位
+  export function addJobRecruiting(data) {
+    return request({
+    url: '/news/addJobRecruiting',
+    method: 'post',
+    data
+   })
+  }
+  // 3.获取职位详情
+  export function getJobRecruitingInfo(params) {
+    return request({
+    url: '/news/getJobRecruitingInfo',
+    method: 'get',
+    params
+   }) 
+  }
+  //4.修改职位
+  export function upJobRecruiting(data) {
+    return request({
+    url: '/news/upJobRecruiting',
+    method: 'post',
+    data
+   })
+  }
+  // 5.删除职位
+  export function delJobRecruiting(data) {
+    return request({
+    url: '/news/delJobRecruiting',
+    method: 'post',
+    data
+   })
+  }
+  // 6.获取公司信息
+  export function getJobCompany(params) {
+    return request({
+    url: '/news/getJobCompany',
+    method: 'get',
+    params
+   })
+  }
+  // 7.修改公司信息
+  export function upJobCompany(data) {
+    return request({
+    url: '/news/upJobCompany',
+    method: 'post',
+    data
+   }) 
+  }
+  // 2.1 获取行业分类
+  export function getIndustry(params) {
+    return request({
+    url: '/news/getIndustry',
+    method: 'get',
+    params
+   })
+  }
+  //2.2 获取职位分类
+  export function getPositionList(params) {
+    return request({
+    url: '/news/getPositionList',
+    method: 'get',
+    params
+   })
+  }
+  //2.3 获取地区
+  export function getJobRecruitingArea(params) {
+    return request({
+    url: '/news/getJobRecruitingArea',
+    method: 'get',
+    params
+   })
+  }
+  //2.4 获取职位性质
+  export function getJobNature(params) {
+    return request({
+    url: '/news/getJobNature',
+    method: 'get',
+    params
+   })
+  }
+  //2.5 获取工作经验
+  export function getExperience(params) {
+    return request({
+    url: '/news/getExperience',
+    method: 'get',
+    params
+   })
+  }
+  //2.6 获取学历
+  export function getEducation(params) {
+    return request({
+    url: '/news/getEducation',
+    method: 'get',
+    params
+   }) 
+  }
+  //2.7 获取薪资
+  export function getSalary(params) {
+    return request({
+    url: '/news/getSalary',
+    method: 'get',
+    params
+   }) 
+  }
+  //2.8 获取语种
+  export function getLanguage(params) {
+    return request({
+    url: '/news/getLanguage',
+    method: 'get',
+    params
+   }) 
+  }
+  //2.9 获取语言能力
+  export function getLevel(params) {
+    return request({
+    url: '/news/getLevel',
+    method: 'get',
+    params
+   })
+  }
+  //2.10 获取公司规模
+  export function getCompanySize(params) {
+    return request({
+    url: '/news/getCompanySize',
+    method: 'get',
+    params
+   })
+  }
+  //2.11 获取公司性质
+  export function getCompanyNature(params) {
+    return request({
+    url: '/news/getCompanyNature',
+    method: 'get',
+    params
+   })
+  }
+  // 8.修改职位信息状态(审核通过、拒绝、撤回)
+  export function checkJobRecruiting(data) {
+    return request({
+    url: '/news/checkJobRecruiting',
+    method: 'post',
+    data
+   }) 
+  }
+  // 招聘列表 end  fr ------------------------------------->

+ 49 - 1
src/router/index.js

@@ -414,7 +414,55 @@ export const constantRoutes = [
         }
       ]
     },
-
+    ,
+    {
+      path: '/jobRecruitingList',
+      component: Layout,
+      children: [
+        {
+         name: '',
+         path: '',
+         component: () => import('@/views/job/jobRecruitingList'),
+         meta: {
+         title: '招聘列表',
+         hidden: true,
+         breadcrumb: true
+         }
+        }
+      ]
+    },
+    {
+      path: '/checkjobRecruitingList',
+      component: Layout,
+      children: [
+        {
+         name: '',
+         path: '',
+         component: () => import('@/views/job/checkjobRecruitingList'),
+         meta: {
+         title: '招聘审核列表',
+         hidden: true,
+         breadcrumb: true
+         }
+        }
+      ]
+    },
+    {
+      path: '/creatJob',
+      component: Layout, 
+      children: [
+        {
+         name: '',
+         path: '',
+         component: () => import('@/views/job/creatJob'),
+         meta: {
+         title: '发布职位',
+         hidden: true,
+         breadcrumb: true
+         }
+        }
+      ]
+    },
   // -----------fr---------
   // ----------liuj------------
     {

+ 194 - 2
src/store/modules/news.js

@@ -4,7 +4,8 @@ import { getArticleList, addArticle, delArticle, getArticleInfo, updateArticle,
   getSurveyList,getSurveyInfo, getJobHuntingList, getJobHuntingInfo,addJobHunting,delJobHunting,updateJobHunting,getJobHuntingData,
   getComplaintList,
   getComplaintInfo, updateComplaint, deleteComplaint,  addComplaint1,    getMSG,  getNoticeList, getNoticeInfo, addNotice, updateNotice, deleteNotice,
-  updateGoodStatus, updateJobHuntingStatus, updateNoticeStatus, updateComplaintStatus,getDUser
+  updateGoodStatus, updateJobHuntingStatus, updateNoticeStatus, updateComplaintStatus,getDUser,
+  getJobRecruitingList, addJobRecruiting,getJobRecruitingInfo, upJobRecruiting, delJobRecruiting,getIndustry, getJobCompany, upJobCompany, getPositionList, getJobRecruitingArea, getJobNature, getExperience, getEducation, getSalary, getLanguage, getLevel, getCompanySize, getCompanyNature,checkJobRecruiting,
 } from '@/api/news'
 
 const state = {
@@ -462,7 +463,198 @@ const actions = {
     })
   },
   //20250324  通知,公告,消息
-
+  //招聘列表 start  fr ------------------------------------->
+  //1.获取职位列表
+  getJobRecruitingList({commit},data) {
+        return new Promise((resolve, reject) => {
+          getJobRecruitingList(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      //2.添加职位
+      addJobRecruiting({commit},data) {
+        return new Promise((resolve, reject) => {
+          addJobRecruiting(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      // 3.获取职位详情
+      getJobRecruitingInfo({commit},data) {
+        return new Promise((resolve, reject) => {
+          getJobRecruitingInfo(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      //4.修改职位
+      upJobRecruiting({commit},data) {
+        return new Promise((resolve, reject) => {
+          upJobRecruiting(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        }) 
+      },
+      // 5.删除职位
+      delJobRecruiting({commit},data) {
+        return new Promise((resolve, reject) => {
+          delJobRecruiting(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      // 6.获取公司信息
+      getJobCompany({commit},data) {
+        return new Promise((resolve, reject) => {
+          getJobCompany(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        }) 
+      },
+      // 7.修改公司信息
+      upJobCompany({commit},data) {
+        return new Promise((resolve, reject) => {
+          upJobCompany(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      // 2.0 获取行业
+      getIndustry({commit},data) {
+        return new Promise((resolve, reject) => {
+          getIndustry(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      // 2.1 获取职位分类
+      getPositionList({commit},data) {
+        return new Promise((resolve, reject) => {
+          getPositionList(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      // 2.2 获取工作区域
+      getJobRecruitingArea({commit},data) {
+        return new Promise((resolve, reject) => {
+          getJobRecruitingArea(data).then(response => {
+            resolve(response) 
+          }) .catch(error => {
+            reject(error)
+          })
+        }) 
+      },
+      // 2.3 获取工作性质
+      getJobNature({commit},data) {
+        return new Promise((resolve, reject) => {
+          getJobNature(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      // 2.4 获取工作经验
+      getExperience({commit},data) {
+        return new Promise((resolve, reject) => {
+          getExperience(data).then(response => {
+            resolve(response) 
+          }) .catch(error => {
+            reject(error)
+          })
+        }) 
+      },
+      // 2.5 获取教育程度
+      getEducation({commit},data) {
+        return new Promise((resolve, reject) => {
+          getEducation(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      // 2.6 获取薪资
+      getSalary({commit},data) {
+        return new Promise((resolve, reject) => {
+          getSalary(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      // 2.7 获取语言
+      getLanguage({commit},data) {
+        return new Promise((resolve, reject) => {
+          getLanguage(data).then(response => {
+            resolve(response) 
+          }) .catch(error => {
+            reject(error)
+          })
+        }) 
+      },
+      // 2.8 获取级别
+      getLevel({commit},data) {
+        return new Promise((resolve, reject) => {
+          getLevel(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      // 2.9 获取公司规模
+      getCompanySize({commit},data) {
+        return new Promise((resolve, reject) => {
+          getCompanySize(data).then(response => {
+            resolve(response) 
+          }) .catch(error => {
+            reject(error)
+          })
+        }) 
+      },
+      // 2.10 获取公司性质
+      getCompanyNature({commit},data) {
+        return new Promise((resolve, reject) => {
+          getCompanyNature(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      // 8.修改职位信息状态(审核通过、拒绝、撤回)
+      checkJobRecruiting({commit},data) {
+        return new Promise((resolve, reject) => {
+          checkJobRecruiting(data).then(response => {
+            resolve(response)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      // 招聘列表 end  fr ------------------------------------->
 }
 
 

+ 298 - 0
src/views/job/checkjobRecruitingList.vue

@@ -0,0 +1,298 @@
+<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.keyword"/>
+              </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="编号" width="100"></el-table-column>
+              <el-table-column prop="title" label="职位名称" width=""></el-table-column>
+              <el-table-column prop="website_name" label="网站名称" width=""></el-table-column>
+              <el-table-column prop="user_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 prop="status" label="审核状态" width="100">
+                <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="300" header-align="center">
+                <template slot-scope="scope">
+                  <div class="listBtnBox">
+                    <div class="listMainBtn" @click="getUpRow(scope.row.id, tableData)" v-if="creatNews_user_type == '10000'"><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>
+          </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="refuse_reason" class="custom-align-right">
+            <el-input type="textarea" v-model="form.refuse_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() {
+      const validateEmpty = (rule, value, callback) => {
+        if (value == '') {
+          callback(new Error('该项不能为空!'))
+        } else {
+          callback()
+        }
+      }
+      return {
+        //1.列表和分页相关 start ------------------------------------------------------------>
+        tableDivTitle:"职位列表",
+        tableData:[],//内容
+        editId:0,//要修改的网站id
+        examineWindow:false,//审核窗口
+        formLabelWidth:"120px",//表单label宽度
+        getApiData:{
+          title:"",//职位名称
+          website_name:"",//网站名称
+          user_name:"",//发布人
+          created_at:"",//创建时间
+          updated_at:"",//修改时间
+          page:1,//当前是第几页
+          page_size:10,//一共多少条
+          checkout:0,//是否审核 0 未审核 
+          
+        },
+        //提交驳回
+        form:{
+          refuse_reason:""
+        },
+        formRules: {
+          //导航池名称不能为空
+          refuse_reason: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        },
+        creatNews_user_type:'0',//用户类型
+        keyword:"",//搜索关键字
+        allCount:0,//总条数
+        //分页相关 end ------------------------------------------------------------>
+      }
+    },
+    methods: {
+      //1.列表和分页相关 start ------------------------------------------------------------>
+      //1.1 开始请求列表信息方法
+      getData(type){
+        if(type=="search"){
+          this.getApiData.page = 1;
+        }
+        this.getApiData.checkout = 0;
+        // this.getApiData.keyword = this.keyword;
+        this.$store.dispatch('news/getJobRecruitingList',this.getApiData).then(res=> {
+          let data = [];
+          console.log(res.data.rows)
+          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('news/delJobRecruiting',{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 审核温江
+      getUpRow(id){
+        //设置待审核的id
+        this.editId = id;
+        console.log(id)
+        this.$confirm('将此职位通过审核吗?', '提示', {
+          confirmButtonText: '通过',
+          cancelButtonText: '拒绝',
+          type: 'warning'
+        }).then(() => {
+          this.upRow(id,1)
+        }).catch(() => {
+        //输入驳回理由
+        console.log("驳回")
+        this.examineWindow = true;
+        })
+      },
+      //1.5 修改文章状态
+      upRow(id,status){
+        let data = {
+          id:id,
+          status:status
+        }
+        this.$store.dispatch('news/checkJobRecruiting',data).then(res=> {
+          if(res.code==200){
+            this.$message({
+              type: 'success',
+              message: '操作成功!'
+            });
+            this.getData();
+          }
+        })
+      },
+      //提交驳回内容
+      examineToServe(id){
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            let data = {
+              id:this.editId,
+              status:2,//驳回status
+              refuse_reason:this.form.refuse_reason
+            }
+            this.$store.dispatch('news/checkJobRecruiting',data).then(res=> {
+              if(res.code==200){
+                this.$message({
+                  type: 'success',
+                  message: '操作成功!'
+                });
+                this.getData();
+                this.form.refuse_reason = "";//清空上一次的输入
+                this.examineWindow = false;
+              }
+            })
+          }else{
+            this.$message.error("驳回理由不能为空!")
+          }
+        })
+      },
+      //1.4 列表内容分页
+      //直接跳转
+      handleSizeChange(val) {
+        this.getApiData.page = val;
+        this.getData();
+      },
+      //1.5 点击分页
+      handleCurrentChange(val) {
+        this.getApiData.page = val;
+        this.getData();
+      },
+      //1.6 重置按钮
+      clearSearchList(){
+        this.getApiData.keyword = "";
+        this.getApiData.page = 1;
+        this.getApiData.page_size = 10;
+        this.getData();
+      },
+      //列表和分页相关 end ------------------------------------------------------------>
+  
+      //2.添加新闻 start ------------------------------------------------------------>
+      //跳转到职位发布页面
+      goCreat(){
+        this.$router.push({
+          path: '/creatJob',
+        });
+      },
+      goEdit(id){
+        let data = {
+          id:id,
+          to:"checkjob"
+        }
+        this.$router.push({
+          path: '/creatJob',
+          query: data
+        });
+      }
+      //添加新闻 end ------------------------------------------------------------>
+    },
+    mounted(){
+      this.creatNews_user_type = getUseType()
+      //1.获得初始数据
+      this.getData();
+    }
+  }
+  </script>
+  
+  <style scoped lang="less">
+  
+  </style>
+  

+ 111 - 0
src/views/job/components/CityCascader.vue

@@ -0,0 +1,111 @@
+<template>
+  <el-cascader
+    :key="cascaderKey"
+    v-model="internalValue"
+    placeholder="请选择地区"
+    :props="SearchCityData"
+    filterable
+    clearable
+    :disabled="user_type !== '10000'"
+    @change="handleChange">
+  </el-cascader>
+</template>
+
+<script>
+export default {
+  props: {
+    value: { // 接收外部传递的 v-model 值
+      type: [Array, String], // 允许传入数组或字符串类型的数据
+      default: () => [],
+    },
+    user_type: { // 接收外部传递的 user_type 值
+      type: String, // 允许传入数组或字符串类型的数据
+      default: 1,
+    }
+  },
+  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>

+ 39 - 0
src/views/job/components/tableTitle.vue

@@ -0,0 +1,39 @@
+<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>

+ 993 - 0
src/views/job/creatJob.vue

@@ -0,0 +1,993 @@
+<template>
+  <div class="mainBox">
+    <div class="layerBox">
+      <tableTitle :name="tableDivTitle" />
+      <el-form :model="form" ref="form" :rules="formRules" label-position="left" label-width="120px">
+        <div class="formDiv">
+          <div v-if="creatNews_user_type == 10000">
+            <el-form-item label="站点名称:" prop="web_site_id" class="custom-align-right">
+              <el-cascader :key="parentKey" v-model="form.web_site_id" placeholder="请选择站点名称" popper-class="my_cascader" :options="creatNews_nav_pool_arr" @change="creatNews_nav_pool_change_fun(form.web_site_id)" filterable clearable></el-cascader>
+            </el-form-item>
+          </div>
+          <el-form-item label="导航池名称:" prop="cat_arr_id" class="custom-align-right">
+              <el-cascader :key="parentKey_2" v-model="form.cat_arr_id" placeholder="请选择导航池名称" :props="parentData_2" popper-class="my_cascader" filterable clearable></el-cascader>
+            </el-form-item>
+          <el-form-item label="招聘职位名称" prop="title" class="custom-align-right">
+            <el-input v-model="form.title" autocomplete="off" placeholder="请输入招聘职位名称"></el-input>
+          </el-form-item>
+          <el-form-item label="工作地点:"  prop="province_id" class="custom-align-right">
+            <el-select v-model="form.province_id" placeholder="请选择省" style="display:inline-block;width:50%" @change = "province_change">
+              <el-option v-for="item in province_array" :key="item.id" :label="item.name" :value="item.id"  > 
+              </el-option>
+            </el-select>
+            <el-select v-model="form.city_id" placeholder="请选择市" style="width:50%">
+              <el-option v-for="item in city_array" :key="item.id" :label="item.name" :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="行业类别:" prop="hy_id" class="custom-align-right">
+            <el-select v-model="form.hy_id" placeholder="请选择行业类别">
+              <el-option v-for="item in hy_array" :key="item.hyid" :label="item.hyname" :value="item.hyid">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="职位类别:" prop="zw_id" class="custom-align-right">
+            <el-select v-model="form.zw_id" placeholder="请选择职位类别" @change = "zwid_change">
+              <el-option v-for="item in zw_array" :key="item.zwid" :label="item.zwname" :value="item.zwid">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="具体职位:" prop="jtzw_id" class="custom-align-right">
+            <el-select v-model="form.jtzw_id" placeholder="请选择具体职位">
+              <el-option v-for="item in jtzw_array" :key="item.zwid" :label="item.zwname" :value="item.zwid">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="职位性质:" prop="nature_id" class="custom-align-right">
+            <el-select v-model="form.nature_id" placeholder="请选择职位性质">
+              <el-option v-for="item in nature_array" :key="item.evalue" :label="item.ename" :value="item.evalue">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <div>
+            <el-form-item label="截止日期:" prop="due_data" class="custom-align-right">
+              <el-date-picker v-model="form.due_data" placeholder="请选择截止日期"> </el-date-picker>
+            </el-form-item>
+            <el-form-item label="工作经验:" prop="experience" class="custom-align-right">
+              <el-select v-model="form.experience" clearable placeholder="请选择工作经验">
+                <el-option v-for="item in experience_array" :key="item.evalue" :label="item.ename" :value="item.evalue"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="学历要求:" prop="educational" class="custom-align-right">
+              <el-select v-model="form.educational" clearable placeholder="请选择学历要求">
+                <el-option v-for="item in educational_array" :key="item.evalue" :label="item.ename" :value="item.evalue"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="月薪:" prop="salary" class="custom-align-right">
+              <el-select v-model="form.salary" clearable placeholder="请输入月薪">
+                <el-option v-for="item in salary_array" :key="item.evalue" :label="item.ename" :value="item.evalue"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="招聘人数:" prop="number" class="custom-align-right">
+              <el-input v-model="form.number" autocomplete="off" placeholder="请输入招聘人数"></el-input>
+            </el-form-item>
+
+            <el-form-item label="语言能力:" prop="language" class="custom-align-right" style="width: 50%;display: inline-block;">
+              <el-select v-model="form.language" clearable placeholder="请选择语种">
+                <el-option v-for="item in language_array" :key="item.evalue" :label="item.ename" :value="item.evalue"></el-option>
+              </el-select>
+            </el-form-item>
+           
+            <el-form-item label="掌握程度:" prop="level" class="custom-align-right" style="width: 50%;display: inline-block;">
+              <el-select v-model="form.level" clearable placeholder="请选择掌握程度">
+                <el-option v-for="item in level_array" :key="item.evalue" :label="item.ename" :value="item.evalue">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="职位描述:" prop="description" class="custom-align-right" style="display:block;">
+              <el-input v-model="form.description" type="textarea" :rows="2" placeholder="介绍公司对该职位的职位描述..."> </el-input>
+            </el-form-item>
+            <el-form-item label="具体要求:" prop="jt_description" class="custom-align-right" style="display:block;">
+              <el-input v-model="form.jt_description" type="textarea" :rows="2" placeholder="介绍公司对该职位的具体要求..."> </el-input>
+            </el-form-item>
+          </div>
+          <div>
+            <!--公司信息  start-->
+            <el-form-item label="公司名称:" prop="business_name" class="custom-align-right">
+              <el-input v-model="form.business_name" autocomplete="off"  placeholder="请输入公司名称" :disabled="creatNews_user_type !== '10000'"></el-input>
+            </el-form-item>
+            <el-form-item label="所属行业:" prop="company_hy_id" class="custom-align-right">
+              <el-select v-model="form.company_hy_id" clearable placeholder="请选择公司所属的行业" :disabled="creatNews_user_type !== '10000'">
+                <el-option v-for="item in hy_array" :key="item.hyid" :label="item.hyname" :value="item.hyid">
+                </el-option> 
+              </el-select>
+            </el-form-item>
+            <el-form-item label="公司规模:" prop="company_size" class="custom-align-right">
+              <el-select v-model="form.company_size" clearable placeholder="请选择公司的规模" :disabled="creatNews_user_type !== '10000'">
+                <el-option v-for="item in companysize_array" :key="item.evalue" :label="item.ename" :value="item.evalue">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="公司性质:" prop="company_nature" class="custom-align-right">
+              <el-select v-model="form.company_nature" clearable placeholder="请选择公司的性质" :disabled="creatNews_user_type !== '10000'">
+                <el-option v-for="item in companynature_array" :key="item.id" :label="item.nature_name" :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="公司简介:" prop="introduction" class="custom-align-right">
+              <el-input v-model="form.introduction" autocomplete="off" :disabled="creatNews_user_type !== '10000'" type="textarea" :rows="2"
+                placeholder="请填写公司简介..."> </el-input>
+            </el-form-item>
+            <el-form-item label="联系人:" prop="real_name" class="custom-align-right">
+              <el-input v-model="form.real_name" autocomplete="off" :disabled="creatNews_user_type !== '10000'"
+                placeholder="请输入联系人"></el-input>
+            </el-form-item>
+            <el-form-item label="联系电话:" prop="mobile" class="custom-align-right">
+              <el-input v-model="form.mobile" autocomplete="off" :disabled="creatNews_user_type !== '10000'"
+                placeholder="请输入联系电话"></el-input>
+            </el-form-item>
+            <el-form-item label="公司网址:" prop="company_url" class="custom-align-right">
+              <el-input v-model="form.company_url" autocomplete="off" :disabled="creatNews_user_type !== '10000'"
+                placeholder="请输入公司网址"></el-input>
+            </el-form-item>
+            <el-form-item label="地址:" prop="address_arr_id" class="custom-align-right">
+              <CityCascader v-model="form.address_arr_id" @update-city-id="update_address_arr_id" :user_type="creatNews_user_type"></CityCascader>
+              <el-input v-model="form.address" autocomplete="off" :disabled="creatNews_user_type !== '10000'"
+                placeholder="请输入公司地址"></el-input>
+            </el-form-item>
+            <el-form-item label="邮箱:" prop="email" class="custom-align-right">
+              <el-input v-model="form.email" autocomplete="off" :disabled="creatNews_user_type !== '10000'" placeholder="请输入邮箱"></el-input>
+            </el-form-item>
+            <!--公司信息  end-->
+          </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';
+//引入公用样式
+import '@/styles/global.less';
+import { create } from 'sortablejs';
+import CityCascader from './components/CityCascader';
+import { formatLocalDate } from '@/utils/public';
+export default {
+  components: {
+    tableTitle,
+    CityCascader
+  },
+  data() {
+
+    //0.全局操作 start ------------------------------------------------------------>
+    //表单验证
+    const validateEmpty = (rule, value, callback) => {
+      if (value.length == 0) {
+        callback(new Error('该项不能为空!'))
+      } else {
+        callback()
+      }
+    }
+    const validateArray = (rule, value, callback) => {
+      if (value.length == 0) {
+        callback(new Error('该项不能为空!'))
+      } else {
+        callback()
+      }
+    }
+    let self = this;
+    //0.全局操作 end ------------------------------------------------------------>
+    return {
+      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,//免责声明
+      //提交表单
+      province_array: [],//省份
+      city_array: [],//城市
+      hy_array: [],//行业分类
+      zw_array: [],//职位类别
+      jtzw_array: [],//具体职位
+      nature_array: [],//职位性质
+      experience_array: [],//工作经验
+      educational_array: [],//学历
+      salary_array: [],//薪资
+      language_array: [],//语言能力
+      level_array: [],//掌握程度
+      companysize_array: [],//公司规模
+      companynature_array: [],//公司性质
+      address_arr_id: [],//地址
+      // company_hyid_array: [],//所属行业
+      creatNews_user_type: '0',//判断用户类型'
+      
+      form: {
+        user_type: "??",//判断用户类型'
+        // cat_arr_id: 0,//导航池名称
+        nav_add_pool_id: [],//导航池子级
+        city_arr_id: [],//城市
+        // websiteName: "",//站点名称
+        cat_arr_id: [],//导航池名称
+        title: "",//招聘职位名称
+        province_id: "",//省份
+        job_pronviceid: "",//省份id
+        city_id: "",//城市
+        hy_id: "",//行业分类
+        zw_id: "",//职位类别
+        jtzw_id: "",//具体职位
+        nature_id: "",//职位性质
+        createjob_pronvice: "",//工作省份
+        experience: "",//工作经验
+        educational: "",//学历
+        salary: "",//月薪
+        number: "",//招聘人数
+        language: "",//语言能力
+        level: "",//掌握程度
+        description: "",//职位描述
+        jt_description: "",//具体要求
+        due_data: "",//截止日期
+
+        business_name: "",//公司名称
+        company_hy_id: "",//所属行业
+        company_size: "",//公司规模
+        company_nature: "",//公司性质
+        introduction: "",//公司简介
+        real_name: "",//联系人
+        mobile: "",//联系电话
+        company_url: "",//公司网址
+        address_arr_id: [],//地址
+        address: "",//地址
+        email: "",//邮箱
+
+
+      },
+      //1.2 表单验证规则
+      formRules: {
+        // 站点名称
+        // websiteName: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        //导航池名称不能为空
+        cat_arr_id: [{ required: true, trigger: 'blur', validator: validateArray }],
+
+        province_id: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        // 招聘职位名称
+        title: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        // 职位类别
+        zw_id: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        //具体职位
+        jtzw_id: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+
+        // 职位性质
+        nature_id: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        // 工作省份
+        province_id: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        // 工作城市
+        city_id: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        // 行业分类
+        hy_id: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        // 职位描述
+        description: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+         // 具体要求
+         jt_description: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        // 截止日期
+        due_data: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+
+
+        
+        // 公司名称
+        business_name: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        // 所属行业
+        company_hy_id: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        // 公司规模
+        company_size: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        // 公司简介
+        introduction: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        // 联系人
+        real_name: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        // 联系电话
+        mobile: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        // 地址
+        // address_arr_id: [{ required: true, trigger: 'blur', validator: validateEmpty }] ,
+        // 具体地址
+        address: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+
+      },
+
+      //获取父级导航池
+      parentKey: 0,//获取父级导航
+      webDpate: {
+        checkStrictly: true,
+        lazy: true, 
+
+      },
+      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 = level == 0 ? 0 : data.value
+          let parames = {
+            'pid': parentId
+          }
+          self.$store.dispatch('pool/categoryList', parames).then(res => {
+            if (res.data) {
+              const nodes = res.data.map(item => ({
+                value: item.id,
+                label: item.name,
+                leaf: level >= 3,
+                children: []
+              }))
+              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 (data != undefined) {
+            parentId = data.value;
+          } else {
+            parentId = self.creatNews_pid_num.toString();
+          }
+
+          let parames = {
+            'website_id': self.form.web_site_id ? self.form.web_site_id : self.websiteid,
+            '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: []
+              }))
+              resolve(nodes)
+            }
+          })
+        }
+      },
+      
+      inputList: [
+        { value: '' }
+      ]
+      //表单项 end ------------------------------------------------------------>
+    };
+
+  },
+  methods: {
+    //---------------------------
+    // 下拉列表
+    // 1.获取省
+    get_provinceid(value) {
+      this.$store.dispatch('news/getJobRecruitingArea').then(res => {
+        this.province_array = res.data;
+      })
+    },
+    province_change(value) {
+      this.form.city_id = ''; // 清空城市选择
+      this.$store.dispatch('news/getJobRecruitingArea', { pid: value }).then(res => {
+        this.city_array = res.data; 
+      })
+    },
+    // 3.获取行业分类
+    get_hyid(value) {
+      this.$store.dispatch('news/getIndustry').then(res => {
+      this.hy_array = res.data;
+      }) 
+    },
+    // 4.获取职位类别
+    get_zwid(value) {
+      this.$store.dispatch('news/getPositionList').then(res => {
+        this.zw_array = res.data;
+        
+      })
+    },
+    zwid_change(value) {
+      // 修改此处,确保传递的是正确的参数对象
+      this.form.jtzw_id = ''; // 清空具体职位选择
+      this.$store.dispatch('news/getPositionList', { zwpid: value }).then(res => {
+        this.jtzw_array = res.data; 
+      })
+    },
+    
+    // 6.获取职位性质
+    get_natureid(value) {
+      this.$store.dispatch('news/getJobNature').then(res => {
+        this.nature_array = res.data;
+      })
+    },
+    // 7.获取工作经验
+    get_experience(value) {
+      this.$store.dispatch('news/getExperience').then(res => {
+        this.experience_array = res.data;
+      })
+    },
+    // 8.获取学历
+    get_educational(value) {
+      this.$store.dispatch('news/getEducation').then(res => {
+        this.educational_array = res.data;
+      })
+    },
+    // 9.获取薪资
+    get_salary(value) {
+      this.$store.dispatch('news/getSalary').then(res => {
+        this.salary_array = res.data;
+      })
+    },
+    // 10.获取语言能力
+    get_language(value) {
+      this.$store.dispatch('news/getLanguage').then(res => {
+        this.language_array = res.data;
+      })
+    },
+    // 11.获取掌握程度
+    get_level(value) {
+      this.$store.dispatch('news/getLevel').then(res => {
+        this.level_array = res.data;
+      })
+    },
+    // 12.获取公司分类
+    get_company_hyid(value) {
+      this.$store.dispatch('news/getIndustry').then(res => {
+        this.hy_array = res.data;
+      })
+    },
+    //13.获取公司规模
+    get_company_size(value) {
+      this.$store.dispatch('news/getCompanySize').then(res => {
+        this.companysize_array = res.data;
+      })
+    },
+    //14.获取公司性质
+    get_company_nature(value) {
+      this.$store.dispatch('news/getCompanyNature').then(res => {
+        this.companynature_array = res.data;
+      })
+    },
+  //  15.获取地址
+    get_address_arr_id(value) {
+      this.$store.dispatch('news/getJobRecruitingArea').then(res => {
+        this.address_arr_id = res.data;
+      })
+    },
+    //1.提交表单 start ------------------------------------------------------------>
+    //1.2 提交表单
+    addToServe() {
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          // if(this.creatNews_user_type === '10000'){
+            this.form.user_type = this.creatNews_user_type;
+            this.form.website_id = this.websiteid;
+           
+            if(this.form.province_id != '' && this.form.province_id != null && this.form.province_id != undefined){
+              this.form.city_arr_id[0] = this.form.province_id;
+            }else{
+              this.form.city_arr_id[0] = null;
+            }
+            if(this.form.city_id != '' && this.form.city_id != null && this.form.city_id != undefined){
+              this.form.city_arr_id[1] = this.form.city_id;
+            }else{
+              this.form.city_arr_id[1] = null;
+            }
+            if(this.form.due_data != '' && this.form.due_data != null && this.form.due_data != undefined){
+              this.form.due_data = formatLocalDate(this.form.due_data); 
+            }else{
+              this.form.due_data = null;
+            }
+            delete this.form.nav_add_pool_id;
+            delete this.form.province_id;
+            delete this.form.job_pronviceid;
+            delete this.form.city_id;
+            delete this.form.createjob_pronvice;
+            delete this.form.web_site_id;
+            this.$store.dispatch('news/addJobRecruiting', this.form).then(res => {
+              if (res.code == 200) { 
+                //汇报结果
+                this.$message({
+                  type: 'success',
+                  message: '已成功发布职位!'
+                });
+                this.cleatForm(2);
+                //返回列表页
+                this.returnPage()
+              } else {
+                this.$message({
+                  type: 'error',
+                  message: ": '发布失败!'.".this.$message
+                });
+              }
+            }).catch(() => {
+              this.$message({
+                type: 'info',
+                message: '网络错误,请重试!'
+              });
+            })
+          // }
+        }
+      })
+    },
+    
+    //1.3 清理表单
+    cleatForm(type) {
+      // if (type == 1) {
+        //使用了外链,进行部分表单清理
+        //this.form.cat_arr_id = "";
+        this.form.cat_arr_id = "";
+        this.form.province_id = "";
+        this.form.title = "";
+        this.form.zw_id = "";
+        this.form.jtzw_id = "";
+        this.form.nature_id = "";
+        this.form.city_id = "";
+        this.form.hy_id = "";
+        this.form.description = "";
+        this.form.due_data = "";
+      // }
+      if (this.creatNews_user_type == '10000') {
+        //完全清理表单
+        this.form.business_name = "";
+        this.form.company_hy_id = "";
+        this.form.company_size = "";
+        this.form.introduction = "";
+        this.form.real_name = "";
+        this.form.mobile = "";
+        this.form.address_arr_id = [];
+        this.form.address = "";
+      }
+    },
+    //1.4更新详细地址
+    update_address_arr_id(value) {
+      console.log("行政区划ID已更新:", value);
+      this.form.address_arr_id = value;
+    },
+    //提交表单 end ------------------------------------------------------------>
+
+    //2.跳转操作 start ------------------------------------------------------------>
+    returnPage() {
+      if (this.$route.query.to == "checkjob") {
+        this.$router.push({
+          path: '/checkjobRecruitingList',
+        });
+      } else {
+        this.$router.push({
+          path: '/jobRecruitingList',
+        });
+      }
+    },
+    //跳转操作 end ------------------------------------------------------------>
+
+    //3.回显操作 ------------------------------------------------------------>
+  //   //3.1回显数据
+  //3.1回显数据
+  getMainData() {
+    if(this.creatNews_user_type === '10000' || this.$route.query.id != undefined){
+      let data = {
+        id: this.$route.query.id
+      };
+      this.$store.dispatch('news/getJobRecruitingInfo', data).then(res => {
+        //判断web_site_id是否为字符串,如果是转换为数字、
+        //职位信息 
+        if (typeof res.data.web_site_id === 'string') {
+          this.form.web_site_id = Number(res.data.website_id);
+        } else {
+          this.form.web_site_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);
+        this.parentKey_2 += 1; // 触发级联选择器重新加载
+        this.loadCascaderPath(this.form.cat_arr_id); // 加载路径数据
+        //回显行政区划
+        this.form.city_arr_id = Array.isArray(res.data.city_arr_id) ? res.data.city_arr_id : JSON.parse(res.data.city_arr_id);
+        
+        this.form.title = res.data.title;                                       //职位名称
+        
+        this.parentKey += 1; // 触发级联选择器重新加载
+        if (this.form.city_arr_id.length > 0) {
+          this.form.province_id = this.form.city_arr_id[0]?? '';
+          if (this.form.city_arr_id.length > 1) {
+            this.province_change(this.form.city_arr_id[0]);
+            this.form.city_id = this.form.city_arr_id[1]?? '';
+          }else{
+            let data = {
+              'pid': this.form.city_arr_id[0]
+            }
+            this.$store.dispatch('news/getJobRecruitingArea',data ).then(res => {
+              this.city_id = res.data;
+            })
+          }
+        }
+        
+          this.form.hy_id = res.data.hy_id;                //行业分类
+          this.form.zw_id = res.data.zw_id;                //职位类别
+          this.zwid_change(this.form.zw_id);
+          this.form.jtzw_id = res.data.jtzw_id;            //具体职位
+          this.form.nature_id = res.data.nature_id;        //职位性质
+          this.form.due_data = res.data.due_data;          //截止日期
+          this.form.experience = res.data.experience;      //工作经验
+          this.form.educational = res.data.educational;    //学历
+          this.form.salary = res.data.salary;              //薪资
+          this.form.number = res.data.number;              //招聘人数
+          this.form.language = res.data.language;          //语言能力
+          this.form.level = res.data.level;                //掌握程度
+          this.form.description = res.data.description;    //职位描述
+          this.form.jt_description = res.data.jt_description;//具体要求
+
+
+          this.form.business_name = res.data.business_name;
+          this.form.company_hy_id = res.data.company_hy_id;
+          this.form.company_size = res.data.company_size;
+          this.form.company_nature = res.data.company_nature;
+          this.form.introduction = res.data.introduction;
+          this.form.real_name = res.data.real_name;
+          this.form.mobile = res.data.mobile;
+          this.form.company_url = res.data.company_url;
+          this.form.address = res.data.address;
+          this.form.address_arr_id = Array.isArray(res.data.address_arr_id) ? res.data.address_arr_id : JSON.parse(res.data.address_arr_id);
+          this.form.email = res.data.email;
+        this.inputList = [];
+        console.log(this.inputList)
+      })
+    }else{
+      this.$store.dispatch('news/getJobCompany').then(res => {
+        // 企业信息
+        this.form.business_name = res.data.business_name;
+        this.form.company_hy_id = res.data.company_hy_id;
+        this.form.company_size = res.data.company_size;
+        this.form.company_nature = res.data.company_nature;
+        this.form.introduction = res.data.introduction;
+        this.form.real_name = res.data.real_name;
+        this.form.mobile = res.data.mobile;
+        this.form.company_url = res.data.company_url;
+        this.form.address = res.data.address;
+        this.form.address_arr_id = Array.isArray(res.data.address_arr_id) ? res.data.address_arr_id : JSON.parse(res.data.address_arr_id);
+        this.form.email = res.data.email;
+        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() {
+      //添加要修改的id
+      this.form.id = this.editId;
+      this.form.website_id = this.form.web_site_id;
+      // console.log('===========editId==============',this.form.web_site_id)
+      //先进行验证
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          this.form.city_arr_id[0] = this.form.province_id;
+          if(this.form.city_id!= '' && this.form.city_id!= null && this.form.city_id!= undefined){
+            this.form.city_arr_id[1] = this.form.city_id; 
+          }
+          // 假设你有一个 JSON 字符串变量 jsonStr,这里将其转换为数组
+          try {
+            this.form.address_arr_id = JSON.parse(this.form.address_arr_id);
+          } catch (error) {
+            console.error('JSON 解析出错:', error);
+          }
+
+          // console.log('===========city_arr_id==============', typeof(this.form.address_arr_id));
+          // console.log('===========city_arr_id==============', this.form.city_arr_id);
+          delete this.form.nav_add_pool_id;
+          delete this.form.province_id;
+          delete this.form.job_pronviceid;
+          delete this.form.city_id;
+          delete this.form.createjob_pronvice;
+          delete this.form.web_site_id;
+          this.$store.dispatch('news/upJobRecruiting', this.form).then(res => {
+            if (res.code != 200) {
+              this.$message.error("修改失败,请稍后再试!");
+            } else {
+              //汇报结果
+              this.$message({
+                type: 'success',
+                message: '已成功修改职位信息!'
+              });
+              this.cleatForm(2);
+              //返回列表页
+              this.returnPage()
+            }
+          }).catch(() => {
+            this.$message({
+              type: 'info',
+              message: '网络错误,请重试!'
+            });
+          })
+        }
+      })
+    },
+    //跳转操作 end ------------------------------------------------------------>
+    get_creatNews_form_id_fun() {//判断用户类型ajax
+      this.$store.dispatch('public/getInfo').then(res => {
+        this.form.user_type = res.data.type_id;
+
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '网络错误,请重试!'
+        });
+      })
+
+
+      // console.log("this.form.user_type==",this.form);
+      // console.log("this.form.user_type==2",this.form.user_type);
+
+    },
+    get_creatNews_nav_pool_arr_fun() {//xx
+      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() {
+      //xx  导航池级
+      let that = this;
+      this.form.web_site_id = this.form.web_site_id[0]
+      that.parentKey_2 += 1;
+      this.$store.dispatch('pool/get_creatNews_nav_son_actions', { pid: String(this.creatNews_pid_num), website_id: String(this.form.web_site_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: '网络错误,请重试!'
+        });
+      })
+    },
+  },
+  mounted() {
+    this.creatNews_user_type = getUseType()
+    this.websiteid = getWebSiteId()
+    // console.log("============================",this.creatNews_user_type)
+    //1.判断是新建还是回显
+    this.get_hyid()
+    this.get_provinceid()
+    this.get_zwid()
+    this.get_natureid()
+    this.get_experience()
+    this.get_educational()
+    this.get_salary()
+    this.get_language()
+    this.get_level()
+    this.get_company_hyid()
+    this.get_company_size()
+    this.get_company_nature()
+    // this.getMainData()
+    // this.get_createjob_pronvice ()
+    this.get_address_arr_id()
+    this.get_creatNews_form_id_fun()//
+    this.get_creatNews_nav_pool_arr_fun()//
+    if (this.$route.query.id != undefined) {
+      this.editId = this.$route.query.id;
+      this.editStatus = true;
+      console.log("编辑新闻!")
+      this.getMainData();
+    } else {
+      this.editStatus = false;
+      console.log(typeof(this.creatNews_user_type))
+      if(this.creatNews_user_type === '3'){
+        this.getMainData();
+        console.log("添加新闻!",this.creatNews_user_type)
+      }
+
+   
+    }
+
+    
+
+  },
+};
+</script>
+
+<style scoped lang="less">
+.language {
+  overflow: hidden;
+}
+
+//文本编辑器
+.QuillTitle {
+  line-height: 36px;
+  font-size: 14px;
+  color: #606266;
+  font-weight: bold;
+  padding-left: 30px;
+
+  span {
+    color: #ff4949
+  }
+
+  .QuillModelBtn {
+    display: inline-block;
+    margin-left: 10px;
+    font-size: 12px;
+    color: #999;
+    cursor: pointer;
+  }
+}
+
+.editor-container {
+  height: 420px;
+  padding-bottom: 20px;
+}
+
+.my-quill-editor {
+  height: 320px;
+}
+
+.ql-editor {
+  height: 320px;
+}
+
+/* 富文本对齐方式 */
+.ql-align-center {
+  text-align: center;
+}
+
+.ql-align-right {
+  text-align: right;
+}
+
+.ql-indent-1 {
+  padding-left: 16px;
+}
+
+.ql-indent-2 {
+  padding-left: 32px;
+}
+
+.ql-indent-3 {
+  padding-left: 48px;
+}
+
+.ql-indent-4 {
+  padding-left: 64px;
+}
+
+.ql-indent-5 {
+  padding-left: 80px;
+}
+
+.ql-indent-6 {
+  padding-left: 96px;
+}
+
+.ql-indent-7 {
+  padding-left: 112px;
+}
+
+.ql-indent-8 {
+  padding-left: 128px;
+}
+#company_list{
+  height: 500px;
+  overflow: auto;
+  padding: 20px 50px;
+}
+#company_list .descriptions{
+  line-height: 36px;
+  font-size: 16px;
+  color: #606266;
+  font-weight: bold;
+  padding-left: 30px;
+  width: 500px;
+  margin-right:200px;
+  background-color: aquamarine;
+}
+
+
+
+//执行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-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穿透scope选择器 end------------------------------------------------------------>*/</style>

+ 227 - 0
src/views/job/jobRecruitingList.vue

@@ -0,0 +1,227 @@
+<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.keyword"/>
+              </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="编号" width="100"></el-table-column>
+              <el-table-column prop="title" label="职位名称" width=""></el-table-column>
+              <el-table-column prop="website_name" label="网站名称" width=""></el-table-column>
+              <el-table-column prop="user_name" label="发布人" width=""></el-table-column>
+              <el-table-column prop="status" label="审核状态" width="150">
+                <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="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" header-align="center">
+                <template slot-scope="scope">
+                  <div class="listBtnBox">
+                    <div class="listUpBtn" @click="returnRow(scope.row.id, tableData)" v-if="creatNews_user_type == 10000"><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>
+          </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------------------------------------------------------------>
+    </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:[],//内容
+        editId:0,//要修改的网站id
+        getApiData:{
+          checkout:1,//审核状态
+          title:"",//职位名称
+          website_name:"",//网站名称
+          user_name:"",//发布人
+          status:"",//审核状态
+          created_at:"",//创建时间
+          updated_at:"",//修改时间
+          page:1,//当前是第几页
+          page_size:10,//一共多少条
+        },
+        allCount:0,//总条数
+        //分页相关 end ------------------------------------------------------------>
+      }
+    },
+    methods: {
+      //1.列表和分页相关 start ------------------------------------------------------------>
+      //1.1 开始请求列表信息方法
+      getData(type){
+        if(type=="search"){
+          this.getApiData.page = 1;
+        }
+        this.getApiData.checkout = 1;
+        this.$store.dispatch('news/getJobRecruitingList',this.getApiData).then(res=> {
+          let data = [];
+          console.log(res.data.rows)
+          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('news/delJobRecruiting',{id:id}).then(res=> {
+            this.getData();
+            this.$message({
+              type: 'success',
+              message: '删除成功!'
+            });
+          }).catch(() => {
+            this.$message({
+              type: 'warning',
+              message: '网络错误,请重试!'
+            });
+          })
+        }).catch(() => {
+          this.$message({
+            type: 'warning',
+            message: '已取消删除'
+          });
+        });
+      },
+      //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:status
+        }
+        this.$store.dispatch('news/checkJobRecruiting',data).then(res=> {
+          if(res.code==200){
+            this.$message({
+              type: 'success',
+              message: '操作成功!'
+            });
+            this.getData();
+          }
+        })
+      },
+      //直接跳转
+      handleSizeChange(val) {
+        this.getApiData.page = val;
+        this.getData();
+      },
+      //1.5 点击分页
+      handleCurrentChange(val) {
+        this.getApiData.page = val;
+        this.getData();
+      },
+      //1.6 重置按钮
+      clearSearchList(){
+        this.getApiData.keyword = "";
+        this.getApiData.page = 1;
+        this.getApiData.page_size = 10;
+        this.getData();
+      },
+      //列表和分页相关 end ------------------------------------------------------------>
+  
+      //2.添加新闻 start ------------------------------------------------------------>
+      //跳转到职位发布页面
+      goCreat(){
+        this.$router.push({
+          path: '/creatJob',
+        });
+      },
+      goEdit(id){
+        let data = {
+          id:id
+        }
+        this.$router.push({
+          path: '/creatJob',
+          query: data
+        });
+      }
+      //添加新闻 end ------------------------------------------------------------>
+    },
+    mounted(){
+      this.creatNews_user_type = getUseType()
+      //1.获得初始数据
+      this.getData();
+    }
+  }
+  </script>
+  
+  <style scoped lang="less">
+  
+  </style>
+  

+ 1 - 3
src/views/news/GoodListApply.vue

@@ -366,6 +366,4 @@ export default {
 }
 </script>
 
-<style scoped lang="less">
-.listBtnBox div {}
-</style>
+<style scoped lang="less"></style>

+ 106 - 0
src/views/profile/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>

+ 199 - 7
src/views/profile/index.vue

@@ -3,7 +3,7 @@
     <div class="userInfoBox">
       <tableTitle :name="tableDivTitle"/>
       <div class="userInfoTabs">
-        <el-tabs :tab-position="tabPosition" style="height:350px" class="demo-tabs">
+        <el-tabs :tab-position="tabPosition" style="height:550px" class="demo-tabs">
           <el-tab-pane label="用户信息">
             <el-form :model="infoform" ref="infoform" :rules="infoFormRules" autocomplete="off" label-position="left">
               <div class="infoBox">
@@ -129,9 +129,61 @@
               </el-tooltip>
               <!--新密码 end------------------------------------------>
             </el-form>
+            <div class="infoBtnBox">
+                <!-- <el-button type="info" @click="clearInput">重置</el-button> -->
+                <el-button type="primary" @click="changePassword">保存</el-button>
+              </div>
+              </el-tab-pane>
+              <!--企业信息 start------------------------------------------>
+              <el-tab-pane label="企业信息" v-if="creatNews_user_type == '3'">
+              <el-form :model="companyform" ref="companyform" :rules="companyRules" autocomplete="off" label-position="left">
+                <div class="infoBox">
+                <div>
+                  <!-- <img :src="user.avatar" class="avatar"> -->
+                  <el-form-item label="公司名称:" :label-width="formLabelWidth" prop="business_name" class="custom-align-right">
+                  <el-input v-model="companyform.business_name" autocomplete="off" placeholder="请输入公司名称"></el-input>
+                  </el-form-item>
+                  <el-form-item label="所属行业:" :label-width="formLabelWidth" prop="company_hy_id" class="custom-align-right">
+                  <el-select v-model="companyform.company_hy_id" clearable placeholder="请输入所属行业" >
+                    <el-option v-for="item in company_hy_id" :key="item.hyid" :label="item.hyname" :value="item.hyid">
+                    </el-option>
+                  </el-select>
+                  </el-form-item>
+                  <el-form-item label="公司规模:" :label-width="formLabelWidth" prop="company_size" class="custom-align-right">
+                  <el-select v-model="companyform.company_size" clearable placeholder="请输入公司规模" >
+                    <el-option v-for="item in company_size" :key="item.evalue" :label="item.ename" :value="item.evalue">
+                    </el-option>
+                  </el-select>
+                  </el-form-item>
+                  <el-form-item label="公司性质:" :label-width="formLabelWidth" prop="company_nature" class="custom-align-right">
+                  <el-select v-model="companyform.company_nature" clearable placeholder="请输入公司性质" >
+                    <el-option v-for="item in company_nature" :key="item.id" :label="item.nature_name" :value="item.id">
+                    </el-option>
+                  </el-select>
+                  </el-form-item>
+                  <el-form-item label="公司简介:" :label-width="formLabelWidth" prop="introduction" class="custom-align-right">
+                  <el-input v-model="companyform.introduction" autocomplete="off" type="textarea" :rows="2"
+                    placeholder="请输入公司简介"> </el-input>
+                  </el-form-item>
+                  <el-form-item label="公司网址:" :label-width="formLabelWidth" prop="company_url" class="custom-align-right">
+                  <el-input v-model="companyform.company_url" autocomplete="off" 
+                    placeholder="请输入公司网址"></el-input>
+                  </el-form-item>
+                  <el-form-item label="地址:" :label-width="formLabelWidth" prop="address_arr_id" class="custom-align-right">
+                  <CityCascader v-model="companyform.address_arr_id" @update-city-id="update_city_arr_id" ></CityCascader> 
+                  <!-- <el-select v-model="form.address_arr_id" placeholder="请选择省" @change="createjob_pronvice"> -->
+                  <!-- <el-option v-for="item in address_arr_id" :key="item.id" :label="item.name" :value="item.id"> -->
+                  <!-- </el-option> -->
+                  <!-- </el-select> -->
+                  <br>
+                  <el-input v-model="companyform.address" :label-width="formLabelWidth" placeholder="请输入公司地址"></el-input>
+                  </el-form-item>
+                </div>
+                </div>
+              </el-form>
             <div class="infoBtnBox">
               <!-- <el-button type="info" @click="clearInput">重置</el-button> -->
-              <el-button type="primary" @click="changePassword">保存</el-button>
+              <el-button type="primary" @click="changeCompany">保存</el-button>
             </div>
           </el-tab-pane>
         </el-tabs>
@@ -145,10 +197,13 @@
 import '@/styles/global.less';
 //表格标题
 import tableTitle from './components/tableTitle';
-
+import CityCascader from './components/CityCascader';
+import { formatLocalDate } from '@/utils/public';
+import { getWebSiteId, getUseType } from '@/utils/auth'
 export default {
   components: {
     tableTitle,//表格标题
+    CityCascader,//城市选择器
   },
   data() {
     // 配置验证规则:用于表单验证
@@ -166,6 +221,14 @@ export default {
         callback();
       }
     }
+    //表单验证
+    const validateCompanyEmpty = (rule, value, callback) => {
+      if (value.length == 0) {
+      callback(new Error('该项不能为空!'))
+      } else {
+      callback()
+      }
+    }
     return {
       tableDivTitle:"修改个人信息",
       tabPosition:"left",
@@ -186,7 +249,21 @@ export default {
         password:"",
         new_password:"",
         new_password1:""
+      }, 
+      // 修改企业信息
+      companyform:{
+        business_name:"",//公司名称
+        company_hy_id:"",//所属行业
+        company_size:"",//公司规模
+        company_nature:"",//公司性质
+        introduction:"",//公司简介
+        real_name:"",//联系人
+        mobile:"",//联系电话
+        company_url:"",//公司网址
+        address_arr_id:[],//地址 
+        address:""//具体地址
       },
+      creatNews_user_type: '0',//判断用户类型'
       capsTooltip1: false,//显示大小写提示
       capsTooltip2: false,
       capsTooltip3: false,
@@ -197,11 +274,35 @@ export default {
         password: [{ required: true, trigger: 'blur', validator: validatePassword }],
         new_password: [{ required: true, trigger: 'blur', validator: validatePassword }],
         new_password1: [{ required: true, trigger: 'blur', validator: validatePassword }]
-      }
+      },
+      companyRules: { //配置from表单验证规则
+        // 公司名称
+        business_name: { required: true, trigger: 'blur', validator: validateCompanyEmpty },
+        // 所属行业
+        company_hy_id: { required: true, trigger: 'blur', validator: validateCompanyEmpty },
+        // 公司规模
+        company_size: { required: true, trigger: 'blur', validator: validateCompanyEmpty },
+        // 公司简介
+        introduction: { required: true, trigger: 'blur', validator: validateCompanyEmpty },
+        // 联系人
+        real_name: { required: true, trigger: 'blur', validator: validateCompanyEmpty },
+        // 联系电话
+        mobile: { required: true, trigger: 'blur', validator: validateCompanyEmpty },
+        // 地址
+        address_arr_id: { required: true, trigger: 'blur', validator: validateCompanyEmpty },
+        // 具体地址
+        address: { required: true, trigger: 'blur', validator: validateCompanyEmpty },
+      },
     }
   },
   mounted() {
-    this.getUserInfo();
+    this.creatNews_user_type = getUseType()
+    this.getUserInfo()
+    this.company_hy_id()
+    this.company_size()
+    this.company_nature()
+    this.address_arr_id()
+    this.getCompanyInfo()
   },
   methods: {
     //0.全局操作 start ---------------------------------------->
@@ -334,8 +435,94 @@ export default {
           this.$message.error('请填写完整信息!');
         }
       })
-    }
+    },
     //2.修改头像和昵称 end ---------------------------------------->
+    // 3.企业信息 start ---------------------------------------->//1.4更新详细地址
+      // 12.获取公司分类
+      company_hy_id(value) {
+      this.$store.dispatch('news/getIndustry').then(res => {
+        this.company_hy_id = res.data;
+      })
+      },
+      //13.获取公司规模
+      company_size(value) {
+      this.$store.dispatch('news/getCompanySize').then(res => {
+        this.company_size = res.data;
+      })
+      },
+      //14.获取公司性质
+      company_nature(value) {
+      this.$store.dispatch('news/getCompanyNature').then(res => {
+        this.company_nature = res.data;
+      })
+      },
+      // 15.获取地址
+      address_arr_id(value) {
+      this.$store.dispatch('news/getJobRecruitingArea').then(res => {
+        this.address_arr_id = res.data;
+      })
+      },
+      getCompanyInfo(){
+        this.$store.dispatch('news/getJobCompany', {}).then(res => {
+        console.log('-----------res------------------',res);
+        
+        this.companyform.address_arr_id = Array.isArray(res.data.address_arr_id) ? res.data.address_arr_id : JSON.parse(res.data.address_arr_id);
+        this.companyform.business_name = res.data.business_name;
+        this.companyform.company_hy_id = res.data.company_hy_id;
+        this.companyform.company_size = res.data.company_size;
+        this.companyform.company_nature = res.data.company_nature;
+        this.companyform.introduction = res.data.introduction;
+        this.companyform.company_url = res.data.company_url;
+        this.companyform.address = res.data.address;
+        })
+      },
+      update_city_arr_id(value) {
+      console.log("行政区划ID已更新:", value);
+      this.form.city_arr_id = value;
+      },
+      //1.3 清理表单
+      cleatForm(type) {
+      if (type == 2) {
+        //使用了外链,进行部分表单清理
+        //this.form.cat_arr_id = "";
+        this.form.address_arr_id = [];
+        this.form.business_name = "";
+        this.form.company_hy_id = "";
+        this.form.company_size = "";
+        this.form.company_nature = "";
+        //this.form.author = "";
+        this.form.introduction = "";
+        this.form.company_url = "";
+        this.form.address = "";
+      }
+      },
+      changeCompany(value){
+      console.log(this.companyform)
+      
+      this.$store.dispatch('news/upJobCompany', this.companyform).then(res => {
+        if (res.code == 200) { 
+        //汇报结果
+        this.$message({
+          type: 'success',
+          message: '已成功修改公司信息!'
+        });
+        this.cleatForm(2);
+        //返回列表页
+        // this.returnPage()
+        } else {
+        this.$message({
+          type: 'error',
+          message: ": '发布失败!'.".this.$message
+        });
+        }
+      }).catch(() => {
+        this.$message({
+        type: 'info',
+        message: '网络错误,请重试!'
+        });
+      })
+      }
+  //3.企业信息 end ---------------------------------------->
   }
 }
 </script>
@@ -420,7 +607,12 @@ export default {
     padding-bottom: @spacingPx;
     text-align: center;
   }
-
+  // ----------------------企业信息下拉框宽度---------------------->
+  .el-select {
+    // text-align: right; /* 设置标签文字右对齐 */
+    width: 100%; /* 设置标签宽度 */; 
+  }
+  // ----------------------企业信息下拉框宽度---------------------->
   //执行v-deep穿透scope选择器 start------------------------------------------------------------>*/
   ::v-deep .custom-form-item > .el-form-item__label {
     line-height: 140px !important;

+ 81 - 4
src/views/role/components/userEnterprise.vue

@@ -49,6 +49,33 @@
           <el-form-item label="企业名称:" :label-width="formLabelWidth" 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="company_hy_id" class="custom-align-right">
+            <el-select v-model="form.company_hy_id" placeholder="请选择行业分类">
+              <el-option v-for="item in company_hyid_array" :key="item.hyid" :label="item.hyname" :value="item.hyid">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="公司规模:" prop="company_size" class="custom-align-right">
+            <el-select v-model="form.company_size" placeholder="请选择公司规模">
+              <el-option v-for="item in companysize_array" :key="item.evalue" :label="item.ename" :value="item.evalue">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="公司性质:" prop="company_nature" class="custom-align-right">
+            <el-select v-model="form.company_nature" placeholder="请选择公司性质">
+              <el-option v-for="item in companynature_array" :key="item.id" :label="item.nature_name" :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="公司简介:" prop="introduction" class="custom-align-right">
+            <el-input v-model="form.introduction" autocomplete="off" type="textarea" :rows="2"
+            placeholder="请输入公司简介"> </el-input>
+          </el-form-item>
+          <el-form-item label="公司网址:" prop="company_url" class="custom-align-right">
+            <el-input v-model="form.company_url" autocomplete="off" placeholder="请输入公司网址"></el-input>
+          </el-form-item>
+
           <el-form-item label="详细地址:" :label-width="formLabelWidth" prop="address_arr_id" class="custom-align-right">
             <CityCascader v-model="form.address_arr_id" @update-city-id="update_address_arr_id"></CityCascader>
           </el-form-item>
@@ -215,6 +242,9 @@ export default {
         pageSize: 666666,//一共多少条
         name: "",
       },
+         companysize_array: [],//公司规模
+         companynature_array: [],//公司性质
+         company_hyid_array: [],//行业分类
       form: {
         websiteTag_arr_id: [],//站点标识下拉id only
         websiteTag_reg: [],
@@ -229,6 +259,7 @@ export default {
         mobile: "",//手机号
         city_arr_id: [],//工作区域 
         address_arr_id: [],//详细地址
+        address: "",//门牌号
         from_time: "",//有效期开始时间
         to_time: "",//有效期结束时间
         long_time: 0,//是否为长期 //长期1:长期 0:非长期
@@ -239,6 +270,13 @@ export default {
         //企业相关字段
         fax: "",//传真
         business_name: "",//企业名称
+
+        company_hy_id: "",//所属行业
+        company_size: "",//公司规模
+        company_nature: "",//公司性质
+        introduction: "",//公司简介
+        company_url: "",//公司网址
+        
         position: "",//负责人职务
         legal_person_real_name: "",//法人姓名
         legal_person_mobile: "",//法人手机号
@@ -292,7 +330,14 @@ export default {
         //15.有效期
         timeList: [{ required: true, trigger: 'blur', validator: validateTimeTo }],
         //16.网站选择
-        sszq: [{ required: true, trigger: 'blur', validator: validateArray }]
+        sszq: [{ required: true, trigger: 'blur', validator: validateArray }],
+
+        // 17.所属行业
+        company_hy_id: [{ required: true, trigger: 'blur', validator: validateArray }],
+        // 18.公司规模
+        company_size: [{ required: true, trigger: 'blur', validator: validateArray }],
+        // 19.公司简介
+        introduction: [{ required: true, trigger: 'blur', validator: validateEmpty }],
       },
       //时间跨度
       pickerOptions: {
@@ -360,9 +405,28 @@ export default {
 
     //1.5更新详细地址
     update_address_arr_id(value) {
-      console.log("详细地址ID已更新:", value);
-      this.form.address_arr_id = value;
-    },
+        console.log("详细地址ID已更新:", value);
+        this.form.address_arr_id = value;
+      },
+      // 1.6所属行业
+      getCompanyHyid() {
+        this.$store.dispatch('news/getIndustry').then(res => {
+        this.company_hyid_array = res.data; 
+        console.log(this.company_hyid_array); // 打印结果以确认是否正确获取了行业数据
+        }) 
+      },
+      // 1.7公司规模
+      getCompanySize() {
+        this.$store.dispatch('news/getCompanySize').then(res => {
+        this.companysize_array = res.data;
+        })
+      },
+      // 1.8公司性质
+      getCompanyNature() {
+        this.$store.dispatch('news/getCompanyNature').then(res => {
+        this.companynature_array = res.data;
+        })
+      },
     //1.5重置表单
     clearData() {
 
@@ -509,6 +573,14 @@ export default {
         this.form.id_card = res.data.id_card;
         this.form.fax = res.data.fax;
         this.form.business_name = res.data.business_name;
+        this.form.address = res.data.address;
+
+        this.form.company_hy_id = res.data.company_hy_id;
+        this.form.company_size = res.data.company_size;
+        this.form.company_nature = res.data.company_nature;
+        this.form.introduction = res.data.introduction;
+        this.form.company_url = res.data.company_url;
+        
         this.form.legal_person_id_card = res.data.legal_person_id_card;
         this.form.legal_person_mobile = res.data.legal_person_mobile;
         this.form.legal_person_real_name = res.data.legal_person_real_name;
@@ -661,6 +733,11 @@ export default {
 
     this.get_website_tag_arr_fun()//得到站点标识所有内容xx
 
+    this.getRoleList();
+    this.getCompanyHyid();
+    this.getCompanySize();
+    this.getCompanyNature();
+
     this.getRoleList();
     //判断是新建还是回显
     if (this.$route.query.id != undefined) {

+ 2 - 2
src/views/tabbar/tabbar.vue

@@ -7,7 +7,7 @@
                 <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-input v-model="webSiteName_name" class="input" placeholder="请输入网站名称" clearable ></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">
@@ -20,7 +20,7 @@
                 <el-col :span="6" class="left">
                     <div class="searchBox">
                         <div class="searchTitle">单页名称</div>
-                        <el-input v-model="tabbarName" class="input" placeholder="请输入单页名称"></el-input>
+                        <el-input v-model="tabbarName" class="input" placeholder="请输入单页名称" clearable ></el-input>
                     </div>
                 </el-col>
                 <el-col :span="8" class="right">

+ 2 - 2
src/views/tabbar/tabbarDetail.vue

@@ -7,13 +7,13 @@
                 <el-col :span="6" class="left">
                     <div class="searchBox">
                         <div class="searchTitle">列表标题</div>
-                        <el-input v-model="listTitle" class="input" placeholder="请输入列表标题"></el-input>
+                        <el-input v-model="listTitle" class="input" placeholder="请输入列表标题" clearable ></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>
+                        <el-input v-model="contentTitle" class="input" placeholder="请输入内容标题" clearable ></el-input>
                     </div>
                 </el-col>
                 <el-col :span="8" class="right">

+ 7 - 7
src/views/website/addWebsite.vue

@@ -11,13 +11,13 @@
                         <el-form-item label="网站名称:" :label-width="formLabelWidth" prop="website_name"
                             class="custom-align-right">
                             <el-input v-model="form.website_name" autocomplete="off"
-                                @blur="checkWebsiteName(form.website_name)" placeholder="请输入网站名称"></el-input>
+                                @change="checkWebsiteName(form.website_name)" placeholder="请输入网站名称"></el-input>
                         </el-form-item>
                         <el-form-item label="网站地址1:" :label-width="formLabelWidth" prop="website_url[0].url"
                             class="custom-align-right">
                             <div class="formLabelFloatBox">
                                 <el-input v-model="form.website_url[0].url" autocomplete="off"
-                                    @blur="checkWebsiteUrl(form.website_url[0].url, 0)"
+                                    @change="checkWebsiteUrl(form.website_url[0].url, 0)"
                                     placeholder="请输入网站地址1"></el-input>
                                 <el-button type="info" icon="el-icon-plus" circle size="mini" @click="addUrlInput(1)"
                                     class="formLabeladdIcon"></el-button>
@@ -29,7 +29,7 @@
                             v-if="form.website_url[1].show == true" class="custom-align-right">
                             <div class="formLabelFloatBox">
                                 <el-input v-model="form.website_url[1].url" autocomplete="off"
-                                    @blur="checkWebsiteUrl(form.website_url[1].url, 1)"
+                                    @change="checkWebsiteUrl(form.website_url[1].url, 1)"
                                     placeholder="请输入网站地址2"></el-input>
                                 <el-button type="info" icon="el-icon-plus" circle size="mini" @click="addUrlInput(2)"
                                     class="formLabeladdIcon"></el-button>
@@ -41,7 +41,7 @@
                             v-if="form.website_url[2].show == true" class="custom-align-right">
                             <div class="formLabelFloatBox">
                                 <el-input v-model="form.website_url[2].url" autocomplete="off"
-                                    @blur="checkWebsiteUrl(form.website_url[2].url, 2)"
+                                    @change="checkWebsiteUrl(form.website_url[2].url, 2)"
                                     placeholder="请输入网站地址3"></el-input>
                                 <el-button type="info" icon="el-icon-plus" circle size="mini" @click="addUrlInput(3)"
                                     class="formLabeladdIcon"></el-button>
@@ -53,7 +53,7 @@
                             v-if="form.website_url[3].show == true" class="custom-align-right">
                             <div class="formLabelFloatBox">
                                 <el-input v-model="form.website_url[3].url" autocomplete="off"
-                                    @blur="checkWebsiteUrl(form.website_url[3].url, 3)"
+                                    @change="checkWebsiteUrl(form.website_url[3].url, 3)"
                                     placeholder="请输入网站地址4"></el-input>
                                 <el-button type="info" icon="el-icon-plus" circle size="mini" @click="addUrlInput(4)"
                                     class="formLabeladdIcon"></el-button>
@@ -65,7 +65,7 @@
                             v-if="form.website_url[4].show == true" class="custom-align-right">
                             <div class="formLabelFloatBox">
                                 <el-input v-model="form.website_url[4].url" autocomplete="off"
-                                    @blur="checkWebsiteUrl(form.website_url[4].url, 4)"
+                                    @change="checkWebsiteUrl(form.website_url[4].url, 4)"
                                     placeholder="请输入网站地址5"></el-input>
                                 <el-button type="info" icon="el-icon-plus" circle size="mini" @click=""
                                     class="formLabeladdIcon" disabled></el-button>
@@ -429,7 +429,7 @@ export default {
                 //网站地址不能为空
                 'website_url[0].url': [
                     { required: true, message: '至少要填写一个网站地址!', trigger: 'blur' },
-                    { validator: this.validateWebsiteUrl, trigger: 'blur' }
+                    // { validator: this.validateWebsiteUrl, trigger: 'blur' }
                 ],
                 //网系不能为空 注意,因为是select框,只有提交的时候才会验证
                 website_column_arr_id: [{ type: 'array', required: true, trigger: 'change', message: '必须选择一个网系!' }],

+ 15 - 7
src/views/website/blogroll.vue

@@ -8,7 +8,7 @@
                         <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">
+                            :loading="webSiteLoading" @change="selectWebSite" clearable>
                             <el-option v-for="item in webSiteList" :key="item.value" :label="item.label"
                                 :value="item.value">
                             </el-option>
@@ -18,7 +18,7 @@
                 <el-col :span="6" class="left">
                     <div class="searchBox">
                         <div class="searchTitle">链接名称</div>
-                        <el-input v-model="webName" placeholder="请输入链接名称"></el-input>
+                        <el-input v-model="webName" placeholder="请输入链接名称" clearable></el-input>
                     </div>
                 </el-col>
                 <el-col :span="10" class="right">
@@ -111,8 +111,8 @@
                         <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'">
+                    <el-form-item label="网站logo:" prop="webLogo" :label-width="formLabelWidth"
+                        :class="['custom-form-item']" class="custom-align-right" v-if="this.ruleForm.type != '2'">
                         <div class="uploaderBox">
                             <!--图片上传组件 start ------------------------------------------------------------>
                             <div class="avatar-upload-container" @mouseenter="hovering = true"
@@ -244,6 +244,7 @@ export default {
                 webName: [{ required: true, trigger: 'blur', validator: validateEmpty }],
                 webUrl: [{ required: true, trigger: 'blur', validator: validateEmpty }],
                 type: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+                webLogo: [{ required: true, trigger: 'blur', validator: validateEmpty }],
                 sort: [{ required: true, trigger: 'blur', validator: validateEmpty }]
             },
 
@@ -377,8 +378,8 @@ export default {
             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.logoUrl = ''
+            this.ruleForm.webLogo = ''
             this.ruleForm.webDesc = ''
             this.ruleForm.sort = 0
         },
@@ -440,6 +441,10 @@ export default {
                         }
                     })
                 } else {
+                    if (this.ruleForm.webLogo == '') {
+                        this.$message.error("请上传网站logo");
+                        return
+                    }
                     createLink({
                         title: this.ruleForm.webName,
                         website_id: this.website_id,
@@ -462,7 +467,6 @@ export default {
                         }
                     })
                 }
-
             }
             if (this.dialogName == "编辑") {
                 if (this.website_id == " ") {
@@ -497,6 +501,10 @@ export default {
                         }
                     })
                 } else {
+                    if (this.ruleForm.webLogo == '') {
+                        this.$message.error("请上传网站logo");
+                        return
+                    }
                     updateLink({
                         title: this.ruleForm.webName,
                         website_id: this.website_id,