|
@@ -1,5 +1,5 @@
|
|
<template>
|
|
<template>
|
|
- <div id="jobDetail" ref="jobDetail" style="padding:24px 8%;background-color:#f7f7f7;" v-loading="loading">
|
|
|
|
|
|
+ <div id="jobDetail" style="padding:24px 12%" >
|
|
<el-card style="color: #5E5E5E;" ref="navBar">
|
|
<el-card style="color: #5E5E5E;" ref="navBar">
|
|
<el-breadcrumb separator-class="el-icon-arrow-right">
|
|
<el-breadcrumb separator-class="el-icon-arrow-right">
|
|
<el-breadcrumb-item :to="{ path: '/index' }">首页</el-breadcrumb-item>
|
|
<el-breadcrumb-item :to="{ path: '/index' }">首页</el-breadcrumb-item>
|
|
@@ -7,124 +7,381 @@
|
|
<el-breadcrumb-item>职业详情</el-breadcrumb-item>
|
|
<el-breadcrumb-item>职业详情</el-breadcrumb-item>
|
|
</el-breadcrumb>
|
|
</el-breadcrumb>
|
|
</el-card>
|
|
</el-card>
|
|
- <div style="background-color: #F0F3FC;margin-top:10px;" class="header">
|
|
|
|
- <div class="left" :style="{'backgroundColor':theme,'text-align':'center'}">
|
|
|
|
- <div>
|
|
|
|
- <h1 style="margin: 0;font-size: 40px;color:#525252;">{{jobDetails.name}}</h1>
|
|
|
|
|
|
+ <div class="mt20 header-content pd20">
|
|
|
|
+ <p class="f28 f-333">{{vocationDetail.name || ''}}</p>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="tabs-wrap">
|
|
|
|
+ <span class="tabs-item" @click="tabActive = 0" :class="{'bg-primary':tabActive == 0}">职业概况</span>
|
|
|
|
+ <span class="tabs-item" @click="tabActive = 1":class="{'bg-primary':tabActive == 1}">就业岗位</span>
|
|
|
|
+ </div>
|
|
|
|
+ <p class="line"></p>
|
|
|
|
+ <div
|
|
|
|
+ v-show="loading"
|
|
|
|
+ class="loading-div"
|
|
|
|
+ v-loading="loading"
|
|
|
|
+ :style="{height:windowHeight + 'px'}">
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div class="content-wrap mt20" >
|
|
|
|
+ <!-- 职业概况 -->
|
|
|
|
+ <div v-if="Object.keys(vocationDetail).length > 0">
|
|
|
|
+ <div v-show="tabActive == 0">
|
|
|
|
+ <div class="desc-item">
|
|
|
|
+ <p class="format-tit">职业介绍</p>
|
|
|
|
+ <div class="text-666" v-html="vocationDetail.description"></div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="desc-item">
|
|
|
|
+ <p class="format-tit">就业岗位<span class="text-666 f14">({{vocationDetail.postJobs.length || 0}}个)</span></p>
|
|
|
|
+ <div class="post-item mb20" v-for="post in vocationDetail.postJobs">
|
|
|
|
+ <div class="post-title f16 mb10" style="cursor: pointer">{{post.name}}</div>
|
|
|
|
+ <div class="pb10 text-666 post-text">
|
|
|
|
+ <div>{{`${post.salaryMin}元-${post.salaryMax}元/月`}}</div>
|
|
|
|
+ <div>热门地区:{{post.hotCity}}</div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="desc-item">
|
|
|
|
+ <p class="format-tit">相关专业<span class="text-666 f14">({{vocationDetail.postMajors.length}}个)</span></p>
|
|
|
|
+ <div class="post-item mb20" v-for="post in vocationDetail.postMajors">
|
|
|
|
+ <div class="post-title f16 mb10" style="cursor: pointer">{{post.name}}</div>
|
|
|
|
+ <div class="pb10 text-666 post-text">
|
|
|
|
+ <div>国标代码:{{post.code}}</div>
|
|
|
|
+ <div>学制:{{post.learnYear}}</div>
|
|
|
|
+ <div>男女比例:{{`${post.maleRatio}/${post.femaleRatio}`}}</div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
- <div class="right" style="padding:30px;">
|
|
|
|
- <div v-html="jobDetails.zysm" class="headerText"></div>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- <div style="margin-top: 20px;background-color: #ffffff" v-for="(item,index) in contentArr">
|
|
|
|
- <div style="display: flex;justify-content: space-between;padding:30px 10px 0 10px;">
|
|
|
|
- <span :style="{'color':theme}" style="background-color:#F0F3FC;font-size:16px;font-weight:bold;padding:12px 100px 10px 50px;display:inline-block;clip-path: polygon(0 0, 80% 0, 100% 100%, 0 100%);">{{getDeatailCon(index,'title')}}</span>
|
|
|
|
- <span :style="{'color':theme}" style="font-size:36px;color:#FCE1B0;">{{getDeatailCon(index,'title02')}}</span>
|
|
|
|
|
|
+
|
|
|
|
+ <!-- 就业岗位-->
|
|
|
|
+ <div v-if="vocationalPosts.length > 0">
|
|
|
|
+ <div v-show="tabActive == 1">
|
|
|
|
+ <el-row :gutter="20" type="flex" class="jobTabs">
|
|
|
|
+ <el-col class="job-item-wrap" :span="4" v-for="item in vocationalPosts" :key="item.name">
|
|
|
|
+ <div class="job-item f14 f-333" :class="{'bg-primary':jobActiveName == item.name}" @click="toActiveJob(item.name)">
|
|
|
|
+ <p class="mb10">{{item.name}}</p>
|
|
|
|
+ <p>{{`${item.salaryMin}-${item.salaryMax}`}}{{item.salaryUnit}}</p>
|
|
|
|
+ </div>
|
|
|
|
+ </el-col>
|
|
|
|
+ </el-row>
|
|
|
|
+ <!-- 岗位详情 -->
|
|
|
|
+ <div v-if="Object.keys(jobDetail).length > 0">
|
|
|
|
+ <!-- 图表 -->
|
|
|
|
+ <div class="desc-item">
|
|
|
|
+ <p class="format-tit">薪资情况</p>
|
|
|
|
+ <el-row :gutter="10">
|
|
|
|
+ <el-col :span="12">
|
|
|
|
+ <p class="text-right f-333">按趋势</p>
|
|
|
|
+ <mx-chart :options="chartExperience" height="300px"></mx-chart>
|
|
|
|
+ </el-col>
|
|
|
|
+ <el-col :span="12">
|
|
|
|
+ <p class="text-right f-333">按分布</p>
|
|
|
|
+ <mx-chart :options="chartSalary" height="300px"></mx-chart>
|
|
|
|
+ </el-col>
|
|
|
|
+ </el-row>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="desc-item">
|
|
|
|
+ <p class="format-tit">就业形势</p>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="desc-item">
|
|
|
|
+ <p class="format-tit">招聘需求量</p>
|
|
|
|
+ <el-row :gutter="40" type="flex" class="flex-wrap">
|
|
|
|
+ <el-col :span="12" class="f16" v-for="(item,index) in jobDetail.demand">
|
|
|
|
+ <el-row class="format-job-wrap">
|
|
|
|
+ <el-col :span="3" class="f18 text-center f-666">{{index + 1}}</el-col>
|
|
|
|
+ <el-col :span="15" class="f-333">{{item.city}}</el-col>
|
|
|
|
+ <el-col :span="6" class="f-666 text-right f14">{{item.count}}职位</el-col>
|
|
|
|
+ </el-row>
|
|
|
|
+ </el-col>
|
|
|
|
+ </el-row>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="desc-item">
|
|
|
|
+ <p class="format-tit">收入排行-按行业</p>
|
|
|
|
+ <el-row :gutter="40" type="flex" class="flex-wrap">
|
|
|
|
+ <el-col :span="12" class="f16" v-for="(item,index) in jobDetail.industrySalary">
|
|
|
|
+ <el-row class="format-job-wrap">
|
|
|
|
+ <el-col :span="3" class="f18 text-center f-666">{{index + 1}}</el-col>
|
|
|
|
+ <el-col :span="15" class="f-333">{{item.name}}</el-col>
|
|
|
|
+ <el-col :span="6" class="f-666 text-right f14">{{item.salary}}元 / 月</el-col>
|
|
|
|
+ </el-row>
|
|
|
|
+ </el-col>
|
|
|
|
+ </el-row>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="desc-item">
|
|
|
|
+ <p class="format-tit">收入排行-按地区</p>
|
|
|
|
+ <el-row :gutter="40" type="flex" class="flex-wrap">
|
|
|
|
+ <el-col :span="12" class="f16" v-for="(item,index) in jobDetail.citySalary">
|
|
|
|
+ <el-row class="format-job-wrap">
|
|
|
|
+ <el-col :span="3" class="f18 text-center f-666">{{index + 1}}</el-col>
|
|
|
|
+ <el-col :span="15" class="f-333">{{item.city}}</el-col>
|
|
|
|
+ <el-col :span="6" class="f-666 text-right f14">{{item.salary}}元 / 月</el-col>
|
|
|
|
+ </el-row>
|
|
|
|
+ </el-col>
|
|
|
|
+ </el-row>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
</div>
|
|
</div>
|
|
- <div style="padding:30px" v-html="getDeatailCon(index,item)"></div>
|
|
|
|
|
|
+
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
<script>
|
|
<script>
|
|
-import {mapState} from 'vuex';
|
|
|
|
-import {getJobDetail} from '@/api/webApi/vocation'
|
|
|
|
|
|
+import MxChart from '@/components/MxChart/index'
|
|
|
|
+import { vocationalPostsDetail, vocationalOverview, vocationalPosts } from '@/api/webApi/vocation'
|
|
export default {
|
|
export default {
|
|
name: "Detail",
|
|
name: "Detail",
|
|
|
|
+ components: {
|
|
|
|
+ MxChart
|
|
|
|
+ },
|
|
data(){
|
|
data(){
|
|
return {
|
|
return {
|
|
loading:false,
|
|
loading:false,
|
|
- jobId:'',
|
|
|
|
- jobDetails:{},
|
|
|
|
- contentArr:['zydy','rwzz','zsbj','zyjn','cyzg','cygj','fzqj'],
|
|
|
|
- title1:['职业定义','任务职责','知识背景','职业技能','从业资格','常用工具','发展前景'],
|
|
|
|
- title2:['PROFESSIONAL DETAILS','COLLEGES AND UNIVERSITIES','CHARACTERISTICS','CHARACTERISTICS','CHARACTERISTICS','CHARACTERISTICS']
|
|
|
|
|
|
+ code:'',
|
|
|
|
+ tabActive: 0,
|
|
|
|
+ vocationalPosts: [], // 就业岗位
|
|
|
|
+ vocationDetail:{}, // 职业概况
|
|
|
|
+ jobActiveName: '', // 激活状态的岗位
|
|
|
|
+ jobDetail: {}, // 岗位详情
|
|
|
|
+ windowHeight:document.documentElement.clientHeight,
|
|
}
|
|
}
|
|
},
|
|
},
|
|
computed:{
|
|
computed:{
|
|
- ...mapState({theme: state => state.settings.theme}),
|
|
|
|
- getDeatailCon(){
|
|
|
|
- return function (id,type){
|
|
|
|
- if(type==='title'){
|
|
|
|
- return this.title1[id]
|
|
|
|
- }
|
|
|
|
- if(type==='title02'){
|
|
|
|
- return this.title2[id]
|
|
|
|
- }
|
|
|
|
- const flag=this.contentArr.some(item=>{
|
|
|
|
- return item===type
|
|
|
|
- })
|
|
|
|
- if(flag){
|
|
|
|
- return this.jobDetails[type]
|
|
|
|
|
|
+ // 按工资分布
|
|
|
|
+ chartSalary() {
|
|
|
|
+ if (!this.jobDetail.salary.length) return null
|
|
|
|
+ const pieData = this.jobDetail.salary.map(item => {
|
|
|
|
+ return {
|
|
|
|
+ value: item.ratio,
|
|
|
|
+ name: `${item.min}-${item.max}元/月 ${item.ratio}`,
|
|
}
|
|
}
|
|
|
|
+ })
|
|
|
|
+ const options = {
|
|
|
|
+ toolbox: {
|
|
|
|
+ show: true,
|
|
|
|
+ },
|
|
|
|
+ series: [
|
|
|
|
+ {
|
|
|
|
+ name: 'Nightingale Chart',
|
|
|
|
+ type: 'pie',
|
|
|
|
+ radius: [70, 100],
|
|
|
|
+ label:{
|
|
|
|
+ formatter: '{b}'
|
|
|
|
+ },
|
|
|
|
+ data: pieData
|
|
|
|
+ }
|
|
|
|
+ ]
|
|
}
|
|
}
|
|
|
|
+ return options
|
|
|
|
+ },
|
|
|
|
+ // 按经验趋势
|
|
|
|
+ chartExperience() {
|
|
|
|
+ if (!this.jobDetail.experience.length) return null
|
|
|
|
+ const col = this.jobDetail.experience.map(item => item.year)
|
|
|
|
+ const row = this.jobDetail.experience.map(item => item.salary)
|
|
|
|
+ const options = {
|
|
|
|
+ xAxis: {
|
|
|
|
+ data: col,
|
|
|
|
+ axisLine: {
|
|
|
|
+ lineStyle: {
|
|
|
|
+ type: 'dashed'
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ axisTick: {
|
|
|
|
+ alignWithLabel: true
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ yAxis: {
|
|
|
|
+ type: 'value',
|
|
|
|
+ },
|
|
|
|
+ series: [
|
|
|
|
+ {
|
|
|
|
+ name: 'Email',
|
|
|
|
+ type: 'line',
|
|
|
|
+ color: '#47C6A2',
|
|
|
|
+ stack: 'Total',
|
|
|
|
+ label: {
|
|
|
|
+ show: true,
|
|
|
|
+ position: 'top',
|
|
|
|
+ },
|
|
|
|
+ smooth: false,
|
|
|
|
+ data: row
|
|
|
|
+ },
|
|
|
|
+ ]
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ return options
|
|
}
|
|
}
|
|
},
|
|
},
|
|
watch:{
|
|
watch:{
|
|
- theme:{
|
|
|
|
- immediate:true,
|
|
|
|
- handler(val){
|
|
|
|
- this.$nextTick(()=>{
|
|
|
|
- this.$refs.jobDetail.style.setProperty('--themeColor', val)
|
|
|
|
- })
|
|
|
|
|
|
+ tabActive: {
|
|
|
|
+ handler(newVal){
|
|
|
|
+ // 1 岗位 0 概览
|
|
|
|
+ if(newVal == 0) this.getVocationalOverview();
|
|
|
|
+ if(newVal == 1) this.getVocationalPosts();
|
|
}
|
|
}
|
|
},
|
|
},
|
|
'$route':{
|
|
'$route':{
|
|
immediate:true,
|
|
immediate:true,
|
|
handler(val){
|
|
handler(val){
|
|
- this.jobId=val.query.id;
|
|
|
|
- if(val.query.id){
|
|
|
|
- this.getJobDetail();
|
|
|
|
|
|
+ this.code=val.query.code;
|
|
|
|
+ if(val.query.code){
|
|
|
|
+ console.log(22222222222222222222)
|
|
|
|
+ this.getVocationalOverview();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
},
|
|
methods:{
|
|
methods:{
|
|
- getJobDetail(){
|
|
|
|
- this.loading=true
|
|
|
|
|
|
+ toActiveJob(name) {
|
|
|
|
+ if(this.jobActiveName == name) return
|
|
|
|
+ this.jobActiveName = name
|
|
|
|
+ // 刷新数据
|
|
|
|
+ this.getVocationalPostsDetail()
|
|
|
|
+ },
|
|
|
|
+ // 就业岗位
|
|
|
|
+ getVocationalPosts() {
|
|
|
|
+ this.loading = true
|
|
|
|
+ const params={
|
|
|
|
+ code:this.code
|
|
|
|
+ };
|
|
|
|
+ vocationalPosts(params).then(res => {
|
|
|
|
+ this.vocationalPosts = res.data
|
|
|
|
+ if(this.jobActiveName == '') {
|
|
|
|
+ this.jobActiveName = res.data[0].name
|
|
|
|
+ this.$nextTick(_ => {
|
|
|
|
+ this.getVocationalPostsDetail()
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+ }).finally(_ => {
|
|
|
|
+ this.loading = false
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ // 就业岗位详情
|
|
|
|
+ getVocationalPostsDetail() {
|
|
|
|
+ vocationalPostsDetail({postName:this.jobActiveName }).then(res => {
|
|
|
|
+ console.log(res)
|
|
|
|
+ this.jobDetail = res.data || {}
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ // 职业概况
|
|
|
|
+ getVocationalOverview(){
|
|
|
|
+ this.loading = true
|
|
const params={
|
|
const params={
|
|
- jobId:this.jobId
|
|
|
|
|
|
+ code:this.code
|
|
};
|
|
};
|
|
- getJobDetail(params).then(res=>{
|
|
|
|
- this.jobDetails=res.data
|
|
|
|
- this.loading=false;
|
|
|
|
|
|
+ vocationalOverview(params).then(res=>{
|
|
|
|
+ console.log(res)
|
|
|
|
+ this.vocationDetail = res.data
|
|
|
|
+ }).finally(_ => {
|
|
|
|
+ this.loading = false
|
|
})
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
</script>
|
|
-<style scoped lang="scss">
|
|
|
|
-#jobDetail{
|
|
|
|
- font-family: PingFangSC-Semibold, PingFang SC;
|
|
|
|
- .header{
|
|
|
|
- .headerText{
|
|
|
|
- p{
|
|
|
|
- background-color: #1ab394 !important;
|
|
|
|
|
|
+<style lang="scss" scoped>
|
|
|
|
+#jobDetail {
|
|
|
|
+ .header-content{
|
|
|
|
+ top: 0;
|
|
|
|
+ left: 0;
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 100%;
|
|
|
|
+ background: rgba(66, 185, 131, 0.1);
|
|
|
|
+ }
|
|
|
|
+ .tabs-wrap{
|
|
|
|
+ margin-top: 20px;
|
|
|
|
+ height: 40px;
|
|
|
|
+ .tabs-item{
|
|
|
|
+ cursor: pointer;
|
|
|
|
+ padding: 0 33px;
|
|
|
|
+ border-radius: 4px 4px 0 0;
|
|
|
|
+ display: inline-block;
|
|
|
|
+ line-height: 40px;
|
|
|
|
+ &:hover{
|
|
|
|
+ color:#47C6A2;
|
|
|
|
+ }
|
|
|
|
+ &.bg-primary{
|
|
|
|
+ background: #47C6A2 ;
|
|
|
|
+ color: white;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-}
|
|
|
|
-</style>
|
|
|
|
-<style lang="scss">
|
|
|
|
-#jobDetail {
|
|
|
|
- .header {
|
|
|
|
- .left{
|
|
|
|
- display: table-cell;
|
|
|
|
- width:25%;
|
|
|
|
- vertical-align: middle;
|
|
|
|
- }
|
|
|
|
- .right{
|
|
|
|
- display: table-cell;
|
|
|
|
- }
|
|
|
|
- .headerText {
|
|
|
|
- p {
|
|
|
|
- span{
|
|
|
|
- background-color: transparent !important;
|
|
|
|
- }
|
|
|
|
- background-color: transparent !important;
|
|
|
|
|
|
+ .bg-primary{
|
|
|
|
+ background: #47C6A2 !important;
|
|
|
|
+ color: white;
|
|
|
|
+ }
|
|
|
|
+ .format-job-wrap {
|
|
|
|
+ display: flex;
|
|
|
|
+ height: 44px;
|
|
|
|
+ line-height: 44px;
|
|
|
|
+ border-bottom: 1px solid #f2f2f2;
|
|
|
|
+ }
|
|
|
|
+ .line{
|
|
|
|
+ background: #47C6A2;
|
|
|
|
+ height: 1px;
|
|
|
|
+ }
|
|
|
|
+ .post-text{
|
|
|
|
+ display: flex;
|
|
|
|
+ div{
|
|
|
|
+ min-width: 160px;
|
|
|
|
+ &:not(:first-child):before{
|
|
|
|
+ content: "";
|
|
|
|
+ display: inline-block;
|
|
|
|
+ width: 1px;
|
|
|
|
+ height: 12px;
|
|
|
|
+ background-color: #ccc;
|
|
|
|
+ vertical-align: text-top;
|
|
|
|
+ margin-right: 60px;
|
|
|
|
+ margin-top: 4px;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ }
|
|
|
|
+ .loading-div {
|
|
|
|
+ width: 100%;
|
|
|
|
+ position: absolute;
|
|
|
|
+ background: transparent;
|
|
|
|
+ left: 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .post-title{
|
|
|
|
+ color: #333;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .post-item{
|
|
|
|
+ border-bottom: 1px solid #f2f2f2;
|
|
|
|
+ color: #333;
|
|
|
|
+ }
|
|
|
|
+ .format-tit{
|
|
|
|
+ border-left: 4px solid #47C6A2;
|
|
|
|
+ padding-left: 10px;
|
|
|
|
+ margin-bottom: 20px;
|
|
|
|
+ font-size: 20px;
|
|
|
|
+ }
|
|
|
|
+ .desc-item{
|
|
|
|
+ margin-bottom: 40px;
|
|
|
|
+ }
|
|
|
|
+ .text-666{
|
|
|
|
+ font-size: 14px;
|
|
|
|
+ color: #666666 !important;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ .flex-wrap{
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
+ }
|
|
|
|
+ .jobTabs{
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
+ .job-item-wrap{
|
|
|
|
+ padding: 10px;
|
|
|
|
+ margin-bottom: 20px;
|
|
|
|
+ .job-item{
|
|
|
|
+ cursor: pointer;
|
|
|
|
+ border-radius: 4px;
|
|
|
|
+ padding: 10px;
|
|
|
|
+ background: #f2f2f2;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|
|
</style>
|