提交 4b675b20 authored 作者: 刘旭's avatar 刘旭

更新代码,职位管理接口对接中

上级 b98df412
差异被折叠。
# Diff Details
Date : 2023-11-29 21:22:54
Directory c:\\Users\\Administrator\\Desktop\\XBRL\\XBPX-ZP
Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines
[Summary](results.md) / [Details](details.md) / [Diff Summary](diff.md) / Diff Details
## Files
| filename | language | code | comment | blank | total |
| :--- | :--- | ---: | ---: | ---: | ---: |
[Summary](results.md) / [Details](details.md) / [Diff Summary](diff.md) / Diff Details
\ No newline at end of file
"filename", "language", "", "comment", "blank", "total"
"Total", "-", , 0, 0, 0
\ No newline at end of file
# Diff Summary
Date : 2023-11-29 21:22:54
Directory c:\\Users\\Administrator\\Desktop\\XBRL\\XBPX-ZP
Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines
[Summary](results.md) / [Details](details.md) / Diff Summary / [Diff Details](diff-details.md)
## Languages
| language | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
## Directories
| path | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
[Summary](results.md) / [Details](details.md) / Diff Summary / [Diff Details](diff-details.md)
\ No newline at end of file
Date : 2023-11-29 21:22:54
Directory : c:\Users\Administrator\Desktop\XBRL\XBPX-ZP
Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines
Languages
+----------+------------+------------+------------+------------+------------+
| language | files | code | comment | blank | total |
+----------+------------+------------+------------+------------+------------+
+----------+------------+------------+------------+------------+------------+
Directories
+------+------------+------------+------------+------------+------------+
| path | files | code | comment | blank | total |
+------+------------+------------+------------+------------+------------+
+------+------------+------------+------------+------------+------------+
Files
+----------+----------+------------+------------+------------+------------+
| filename | language | code | comment | blank | total |
+----------+----------+------------+------------+------------+------------+
| Total | | 0 | 0 | 0 | 0 |
+----------+----------+------------+------------+------------+------------+
\ No newline at end of file
差异被折叠。
# Summary
Date : 2023-11-29 21:22:54
Directory c:\\Users\\Administrator\\Desktop\\XBRL\\XBPX-ZP
Total : 119 files, 17406 codes, 217 comments, 1176 blanks, all 18799 lines
Summary / [Details](details.md) / [Diff Summary](diff.md) / [Diff Details](diff-details.md)
## Languages
| language | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
| Vue | 49 | 5,817 | 23 | 470 | 6,310 |
| JSON | 5 | 5,454 | 0 | 5 | 5,459 |
| YAML | 1 | 2,943 | 0 | 437 | 3,380 |
| SCSS | 23 | 2,140 | 16 | 157 | 2,313 |
| TypeScript | 34 | 954 | 168 | 99 | 1,221 |
| JavaScript | 1 | 40 | 4 | 1 | 45 |
| JSON with Comments | 1 | 26 | 4 | 1 | 31 |
| HTML | 1 | 20 | 0 | 2 | 22 |
| Ignore | 1 | 7 | 2 | 2 | 11 |
| Markdown | 1 | 3 | 0 | 2 | 5 |
| XML | 2 | 2 | 0 | 0 | 2 |
## Directories
| path | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
| . | 119 | 17,406 | 217 | 1,176 | 18,799 |
| . (Files) | 11 | 3,215 | 87 | 450 | 3,752 |
| public | 1 | 1 | 0 | 0 | 1 |
| src | 104 | 14,045 | 118 | 722 | 14,885 |
| src (Files) | 4 | 39 | 1 | 12 | 52 |
| src\\Layout | 5 | 338 | 0 | 32 | 370 |
| src\\Layout (Files) | 4 | 333 | 0 | 31 | 364 |
| src\\Layout\\interface | 1 | 5 | 0 | 1 | 6 |
| src\\assets | 3 | 5,299 | 0 | 3 | 5,302 |
| src\\assets (Files) | 2 | 5 | 0 | 2 | 7 |
| src\\assets\\json | 1 | 5,294 | 0 | 1 | 5,295 |
| src\\components | 8 | 770 | 1 | 76 | 847 |
| src\\components (Files) | 7 | 759 | 1 | 73 | 833 |
| src\\components\\interface | 1 | 11 | 0 | 3 | 14 |
| src\\routers | 1 | 127 | 9 | 3 | 139 |
| src\\services | 12 | 276 | 55 | 50 | 381 |
| src\\services (Files) | 2 | 145 | 34 | 20 | 199 |
| src\\services\\api | 10 | 131 | 21 | 30 | 182 |
| src\\stores | 6 | 81 | 14 | 13 | 108 |
| src\\stores (Files) | 1 | 5 | 1 | 3 | 9 |
| src\\stores\\helper | 1 | 10 | 7 | 3 | 20 |
| src\\stores\\interface | 1 | 3 | 0 | 1 | 4 |
| src\\stores\\modules | 3 | 63 | 6 | 6 | 75 |
| src\\styles | 2 | 237 | 5 | 16 | 258 |
| src\\utils | 2 | 26 | 0 | 5 | 31 |
| src\\views | 61 | 6,852 | 33 | 512 | 7,397 |
| src\\views\\collegeStudents | 2 | 346 | 0 | 14 | 360 |
| src\\views\\counterpartAssistance | 1 | 5 | 0 | 3 | 8 |
| src\\views\\disabilitiesEmployment | 2 | 63 | 0 | 10 | 73 |
| src\\views\\editor | 1 | 49 | 0 | 7 | 56 |
| src\\views\\employmentAssistance | 2 | 63 | 0 | 10 | 73 |
| src\\views\\flexibleEmploym | 4 | 530 | 0 | 35 | 565 |
| src\\views\\flexibleEmploym (Files) | 3 | 401 | 0 | 25 | 426 |
| src\\views\\flexibleEmploym\\components | 1 | 129 | 0 | 10 | 139 |
| src\\views\\home | 3 | 344 | 7 | 25 | 376 |
| src\\views\\housekeepingServices | 2 | 63 | 0 | 10 | 73 |
| src\\views\\humanResourcesServices | 2 | 63 | 0 | 10 | 73 |
| src\\views\\innovationEntrepreneurship | 2 | 63 | 0 | 10 | 73 |
| src\\views\\login | 1 | 201 | 0 | 11 | 212 |
| src\\views\\macaoYouthEmployment | 2 | 63 | 0 | 10 | 73 |
| src\\views\\policy | 2 | 102 | 0 | 13 | 115 |
| src\\views\\recruitmentManagement | 26 | 4,197 | 24 | 278 | 4,499 |
| src\\views\\recruitmentManagement (Files) | 7 | 1,573 | 21 | 86 | 1,680 |
| src\\views\\recruitmentManagement\\components | 11 | 1,504 | 0 | 114 | 1,618 |
| src\\views\\recruitmentManagement\\config | 1 | 189 | 0 | 4 | 193 |
| src\\views\\recruitmentManagement\\style | 7 | 931 | 3 | 74 | 1,008 |
| src\\views\\skillTraining | 2 | 105 | 0 | 11 | 116 |
| src\\views\\specialRecruitment | 2 | 116 | 0 | 14 | 130 |
| src\\views\\streetOfficeSpecialTopic | 2 | 411 | 2 | 28 | 441 |
| src\\views\\trainingBase | 1 | 5 | 0 | 3 | 8 |
| src\\views\\veterans | 2 | 63 | 0 | 10 | 73 |
| types | 3 | 145 | 12 | 4 | 161 |
Summary / [Details](details.md) / [Diff Summary](diff.md) / [Diff Details](diff-details.md)
\ No newline at end of file
差异被折叠。
......@@ -16,6 +16,7 @@
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
<script src="https://map.qq.com/api/gljs?v=1.exp&key=3M5BZ-SFCRJ-AHSF7-XRA5Q-Y6NIJ-DXBH4"></script>
</body>
</html>
......@@ -23,7 +23,8 @@
"sass": "^1.64.1",
"vue": "^3.3.4",
"vue-dompurify-html": "^4.1.4",
"vue-router": "4"
"vue-router": "4",
"vue-scrollto": "^2.20.0"
},
"devDependencies": {
"@babel/core": "^7.22.9",
......
......@@ -44,6 +44,9 @@ dependencies:
vue-router:
specifier: '4'
version: 4.2.4(vue@3.3.4)
vue-scrollto:
specifier: ^2.20.0
version: 2.20.0
devDependencies:
'@babel/core':
......@@ -1391,6 +1394,10 @@ packages:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
dev: true
/bezier-easing@2.1.0:
resolution: {integrity: sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==}
dev: false
/big-integer@1.6.51:
resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==}
engines: {node: '>=0.6'}
......@@ -3294,6 +3301,12 @@ packages:
vue: 3.3.4
dev: false
/vue-scrollto@2.20.0:
resolution: {integrity: sha512-7i+AGKJTThZnMEkhIPgrZjyAX+fXV7/rGdg+CV283uZZwCxwiMXaBLTmIc5RTA4uwGnT+E6eJle3mXQfM2OD3A==}
dependencies:
bezier-easing: 2.1.0
dev: false
/vue-template-compiler@2.7.14:
resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==}
dependencies:
......
......@@ -43,16 +43,29 @@
</template>
</div>
<div class="info-name">
<div v-if="isPersonalOrCompany && token">{{ companyInfo?.FNAME }}</div>
<div v-if="!isPersonalOrCompany && token" class="flx-align-center">
<el-avatar :src="baseURL + '/' + personalInfo?.F_LQKJ_Photos" />
<span
style="margin-left: 8px; width: 95px"
class="nowrap-ellipsis"
:title="'欢迎' + personalInfo?.FNAME"
>欢迎{{ personalInfo?.FNAME }}</span
<el-dropdown>
<div v-if="isPersonalOrCompany && token" style="color: #177cfa">
欢迎{{ companyInfo?.FNAME }}
</div>
<div
v-if="!isPersonalOrCompany && token"
class="flx-align-center"
style="color: #177cfa"
>
</div>
<el-avatar :src="baseURL + '/' + personalInfo?.F_LQKJ_Photos" />
<span
style="margin-left: 8px; width: 95px"
class="nowrap-ellipsis"
:title="'欢迎' + personalInfo?.FNAME"
>欢迎{{ personalInfo?.FNAME }}</span
>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="logout">退出登录</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</div>
</div>
......@@ -68,6 +81,7 @@ import { baseURL } from '@/services'
import loginVue from '@/views/login/index.vue'
const route = useRoute()
const router = useRouter()
const globalStore = useGlobalStore()
const userInfoStore = useUserInfoStore()
......@@ -91,6 +105,11 @@ const login = () => {
if (token.value) return
show.value = true
}
const logout = () => {
userInfoStore.$reset()
globalStore.$reset()
router.push('/home')
}
const handleClick = (item: any) => {
// console.log(item)
......@@ -152,5 +171,9 @@ const handleClick = (item: any) => {
}
}
}
:deep(.el-tooltip__trigger) {
outline: 0;
}
}
</style>
......@@ -40,6 +40,7 @@ import Footer from './footer.vue'
padding: 0;
width: 100%;
background-color: #022756;
z-index: 1;
}
}
</style>
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -19,10 +19,10 @@
class="dropdown-item flx-justify-between"
@click="handleChange(item)"
>
<span :style="{ color: item.FNUMBER === modelValue ? '#177CFA' : '' }">{{
<span :style="{ color: item.FENTRYID === modelValue ? '#177CFA' : '' }">{{
item.FDATAVALUE
}}</span>
<el-icon color="#177CFA"><i-ep-Check v-show="item.FNUMBER === modelValue" /></el-icon>
<el-icon color="#177CFA"><i-ep-Check v-show="item.FENTRYID === modelValue" /></el-icon>
</div>
</div>
</div>
......@@ -81,9 +81,9 @@ const mouseleave = () => {
const handleChange = (item: any) => {
dropdownRef.value.style.display = 'none'
if (item.FNUMBER === props.modelValue) return emits('update:modelValue', '')
emits('update:modelValue', item.FNUMBER)
emits('change', item.FNUMBER)
if (item.FENTRYID === props.modelValue) return emits('update:modelValue', '')
emits('update:modelValue', item.FENTRYID)
emits('change', item.FENTRYID)
}
</script>
......
<template>
<el-dialog :modelValue="show" width="40%" @close="handleClose">
<el-upload
class="upload-demo"
drag
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
multiple
:show-file-list="false"
>
<div class="flx-center-column">
<div class="upload-title">拖拽文件到这里或点击上传简历</div>
<p>简历建议使用 PDF 文件,也支持DOC、DOCX、JPG、PNG 格式</p>
<span>文件大小不超过20M</span>
<div class="btn">上传简历</div>
</div>
</el-upload>
</el-dialog>
</template>
<script setup lang="ts">
defineProps({
show: {
type: Boolean,
default: false
}
})
const emits = defineEmits(['update:show'])
const handleClose = () => {
emits('update:show', false)
}
</script>
<style lang="scss" scoped>
.upload-title {
height: 18px;
font-size: 18px;
font-weight: 400;
color: #222222;
line-height: 18px;
}
p {
height: 18px;
font-size: 16px;
font-weight: 400;
color: #999999;
line-height: 18px;
margin-top: 50px;
}
span {
height: 18px;
font-size: 16px;
font-weight: 400;
color: #ff3333;
line-height: 18px;
margin-top: 16px;
}
.btn {
width: 152px;
height: 34px;
background: linear-gradient(90deg, #177cfa 0%, #177cfa 100%);
border-radius: 4px;
font-size: 18px;
font-weight: 400;
color: #ffffff;
line-height: 34px;
text-align: center;
margin: 50px 0;
}
</style>
......@@ -14,7 +14,7 @@
<el-link>{{ item.FTITLE }}</el-link>
<img v-show="index < 3" src="@/assets/img/icon-new.png" width="28" height="15" alt="" />
</div>
<div v-show="isMore" class="policy-footer">
<div v-show="isMore" class="policy-footer" @click="seeMore">
查看更多<el-icon><i-ep-DArrowRight /></el-icon>
</div>
</div>
......@@ -41,11 +41,15 @@ defineProps({
}
})
const emits = defineEmits(['change'])
const emits = defineEmits(['change', 'seeMore'])
const handleChange = (row: any) => {
emits('change', row)
}
const seeMore = () => {
emits('seeMore')
}
</script>
<style lang="scss" scoped>
......
<template>
<div style="width: 100%; height: 210px">
<!-- <div>
<el-form>
<div style="display: flex; justify-content: flex-start">
<el-form-item label="纬度">
<el-input v-model:value="loc.lat"></el-input>
</el-form-item>
<el-form-item label="经度">
<el-input v-model:value="loc.lng"></el-input>
</el-form-item>
</div>
</el-form>
</div> -->
<div id="map-container" style="height: 210px; width: 100%" />
<!-- <div class="common-map-loc"></div> -->
</div>
</template>
<script lang="ts" setup>
import { jsonp } from '@/utils'
const windows: any = window
// 组件挂载后,渲染对应组件
const initMap = (address: string) => {
jsonp('https://apis.map.qq.com/ws/geocoder/v1/', {
output: 'jsonp',
address: address.replace('/', ''),
key: '3M5BZ-SFCRJ-AHSF7-XRA5Q-Y6NIJ-DXBH4'
}).then((res: any) => {
console.log(res, 'addr')
if (res.status === 0) {
const { lat, lng } = res.result.location
const center = new windows.TMap.LatLng(lat, lng) //设置中心点坐标
//初始化地图
const map = new windows.TMap.Map('map-container', {
center
})
new windows.TMap.MultiMarker({
map: map,
styles: {
// 点标记样式
marker: new windows.TMap.MarkerStyle({
width: 20, // 样式宽
height: 30, // 样式高
anchor: { x: 10, y: 30 } // 描点位置
})
},
geometries: [
// 点标记数据数组
{
// 标记位置(纬度,经度,高度)
position: center,
id: 'marker'
}
]
})
}
})
}
defineExpose({
initMap
})
</script>
<style lang="scss" scoped>
// .common-map-loc {
// // width: 100%;
// // height: 200px;
// }
// #map-ccontainer {
// width: 883px;
// height: 200px;
// }
</style>
......@@ -33,8 +33,7 @@ defineProps({
type: Array,
default: () => [
{ label: '找工作', value: 1 },
{ label: '找企业', value: 2 },
{ label: '找人才', value: 3 }
{ label: '找企业', value: 2 }
]
} as any
})
......@@ -106,6 +105,11 @@ defineExpose({ searchValue })
height: 59px;
}
:deep(.el-input.is-focus .el-input__wrapper) {
box-shadow: none !important;
outline: 0;
}
:deep(.el-input__wrapper) {
box-shadow: none;
padding: 0 11px;
......@@ -113,6 +117,7 @@ defineExpose({ searchValue })
&.is-focus {
box-shadow: none !important;
outline: 0;
}
&:hover {
......
......@@ -4,6 +4,7 @@ import App from './App.vue'
import router from './routers'
import store from './stores'
import VueDOMPurifyHTML from 'vue-dompurify-html'
import VueScrollto from 'vue-scrollto'
import '@/styles/reset.scss'
import '@/styles/common.scss'
......@@ -13,5 +14,6 @@ const app = createApp(App)
app.use(router)
app.use(store)
app.use(VueDOMPurifyHTML)
app.use(VueScrollto)
app.mount('#app')
......@@ -44,6 +44,14 @@ const routes = [
component: () => import('@/views/recruitmentManagement/editPosition.vue')
},
{
path: '/recruitmentManagement/editResume',
component: () => import('@/views/recruitmentManagement/editResume.vue')
},
{
path: '/recruitmentManagement/positionDetail',
component: () => import('@/views/recruitmentManagement/positionDetail.vue')
},
{
path: '/specialRecruitment',
component: () => import('@/views/specialRecruitment/index.vue')
},
......
......@@ -15,3 +15,10 @@ export const loginSign = (data: any) => {
data
)
}
// 企业注册
export const enterpriseRegisters = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.EnterpriseRegis,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
import request from '@/services'
// 获取职位类型
export const getPosition = () => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SePositionInfo,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc'
)
}
// 发布、修改职位
export const postPosition = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.PostJobs,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 更新职位开发状态
export const updatePositionStatus = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.UpPositionStatus,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 企业查询企业信息
export const getCompanyInfo = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeEnterpriseInfo,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 企业修改企业信息
export const editCompanyInfo = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.UpdateEnterprise,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 企业端岗位管理列表
export const getCompanyPositionList = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeJobListQY,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 企业端岗位管理列表
export const getCompanyPositionDetail = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeJobContent,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 个人用户查询详细岗位列表
export const getUserPostionList = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeUserJobsList,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 个人用户查询详细岗位
export const getUserPostionDetail = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeJobDetails,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 企业添加管理员
export const addAdmin = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.AddAdmin,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
......@@ -7,6 +7,7 @@ import axios, {
} from 'axios'
import { ElMessage } from 'element-plus'
import { useGlobalStore } from '@/stores/modules/global'
import { useUserInfoStore } from '@/stores/modules/userInfo'
import { LOGIN_URL } from '@/utils'
import router from '@/routers'
......@@ -34,7 +35,8 @@ enum RequestEnums {
TIMEOUT = 20000, // 请求超时
OVERDUE = 600, // 登录失败
FAIL = 999, // 请求失败
SUCCESS = 200 // 请求成功
SUCCESS = 200, // 请求成功
EXPIRE = 501 // token过期
}
let IsError = false
......@@ -65,7 +67,7 @@ class RequestHttp {
this.service.interceptors.request.use(
(config: CustomAxiosRequestConfig) => {
const globalStore = useGlobalStore()
if (config.headers && config?.Authorization) {
if (config.headers && globalStore.token) {
config.headers.set('Authorization', globalStore.token)
}
if (config?.IsError) IsError = true
......@@ -85,7 +87,14 @@ class RequestHttp {
(response: AxiosResponse) => {
const { data, config } = response // 解构
const globalStore = useGlobalStore()
if (IsError) return data
const userInfoStore = useUserInfoStore()
if (data.code === 501) {
globalStore.$reset()
userInfoStore.$reset()
router.replace('/home')
}
if (IsError || data.code === 502) return data
// 未携带token或token失效
if (data.code === RequestEnums.OVERDUE) {
// 登录信息失效,应跳转到登录页面,并清空本地的token
......
......@@ -9,8 +9,8 @@ import { PersistedStateOptions } from 'pinia-plugin-persistedstate'
const piniaPersistConfig = (key: string, paths?: string[]) => {
const persist: PersistedStateOptions = {
key,
// storage: localStorage,
storage: sessionStorage,
storage: localStorage,
// storage: sessionStorage,
paths
}
return persist
......
......@@ -5,3 +5,64 @@ export const locationIcon =
export const companyIcon =
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANZSURBVHgB7dxNTxNBHMfx/8zslioUsAjREIEYfCJcjLeacDJGX4dnook3T/XiTYjh7BuAF2CiHoiJ3ownjTHEYAxqohS0Bfu0HTvVRsBG0lh2f2t/nwNpKaEN38xMZ9JFyR42K4lcejKZKOWT2ksaoY4LgnIlKPRUB1+u5tWSBDsfU80b1orKLaRTySDVKxSaovG30rMreaXEuvuNIC5G/u7pIWNKvlDo3IhJ3fy47qJo9w03MhgjOsYk/NzCZMrdVnZRzPba+IhQ5A5/7V3Xm2sTKSEIufSnpC5ue5yqQCRKR5K6/3DFE4KgvarRQlAYBAyDgGEQMAwChkHAMAgYBgHDIGAYBAyDgGEQMAwChkHAMAgYBgHDIGAYBAyDgGEQMBAfcFCjl054w1PzVulpUapf/lWt8iD4/Dpr1x6/l5iJPIiLYUamH9lOhGjS/tX678wEIpfjFiXyKUsPn70tnYzRpNRAfdTNScxEHkRp/4ockMYUGDP/96J+ECPvgPFdFhgGAcMgYGA/aJ2Yub7rfvnJvbYejyuOEDAMAoZBwMCuIfutCe2vGUrURGbMP3pmTrSpbxhb7FHqZ2D2y5tsZfVpZMctXXL1lItxccwfOfewZYim+hmYGpnK+PUzsKiidMeUpbTyh05l/xrj9w8PKDeKItIVQaz79wimjTOzxpQWDe5DWoruDIzvssB07SXRXubWrvvVZ3cEAUcImC7ah8QDRwiYrl1DUNaMvThCwHAfAoYjBAz3Ib9wH0ItcR8ChiOkwQoK7kPAcISAYRAwDAKGQcAwCBgGAcMgYBgETOgbQ6uNkhA1nk97bT9n83WqWhDqNl5tzY8flxCp89c+SHxY++L+qISIUxYYBgETxeEiztHq/kJ/reEv6iHPyXHDKQsMg4BhEDAMAoZBwDAIGAYBwyBgGAQMg4BhEDAMAoZBwDAIGAYBwyBgGAQMg4BhEDAMAkbXql4gBCEIyhVd7tkoCkFIVQ9VdDp3jEFQPH9b0Cr7qlw0/pZQpFwDtSRBY1FfyK0Uvm2XqkKRCGqVSnp2Je9uG/dleVlsaqZQvNA7rDxbSwiFxo2MwRvvNpX6+bHVP66bsIv1SBsn+/L5774xCV+oo9wfvMeUqpvSV0rnEkW3ZOx8/AeuseK4CcGZoQAAAABJRU5ErkJggg=='
// 深拷贝
export const deepCopy = (obj: any) => {
// 检查是否为可复制的对象(数组或对象)
if (typeof obj !== 'object' || obj === null) {
return obj
}
// 创建新的对象或数组
const copy: any = Array.isArray(obj) ? [] : {}
// 遍历原始对象或数组,递归地进行深拷贝
for (let key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
copy[key] = deepCopy(obj[key])
}
}
// 返回新的对象或数组
return copy
}
export const jsonp = function (url: any, data: any) {
return new Promise((resolve, reject) => {
// 1.初始化url
const windows: any = window
let dataString = url.indexOf('?') === -1 ? '?' : '&'
let callbackName = `jsonpCB_${Date.now()}`
url += `${dataString}callback=${callbackName}`
if (data) {
// 2.有请求参数,依次添加到url
for (let k in data) {
url += `&${k}=${data[k]}`
}
}
let scriptNode = document.createElement('script')
scriptNode.src = url
// 3. callback
windows[callbackName] = (result: any) => {
result ? resolve(result) : reject('没有返回数据')
delete windows[callbackName]
document.body.removeChild(scriptNode)
}
// 4. 异常情况
scriptNode.addEventListener(
'error',
() => {
reject('接口返回数据失败')
delete windows[callbackName]
document.body.removeChild(scriptNode)
},
false
)
// 5. 开始请求
document.body.appendChild(scriptNode)
})
}
......@@ -3,7 +3,12 @@
<div class="flexible-top">{{ title }}</div>
<div class="flexible-content card">
<div>
<div v-for="(item, index) in list" :key="index" class="flexible-item">
<div
v-for="(item, index) in list"
:key="index"
class="flexible-item"
@click="handleChange(item)"
>
<span class="poliy-item-order" :class="index > 2 ? 'poliy-item-postorder' : ''">{{
index + 1
}}</span>
......@@ -11,7 +16,7 @@
<img v-show="index < 3" src="@/assets/img/icon-new.png" width="28" height="15" alt="" />
</div>
</div>
<div v-show="isMore" class="flexible-footer">
<div v-show="isMore" class="flexible-footer" @click="seeMore">
查看更多<el-icon><i-ep-DArrowRight /></el-icon>
</div>
</div>
......@@ -33,6 +38,16 @@ defineProps({
default: false
}
})
const emits = defineEmits(['change', 'seeMore'])
const handleChange = (row: any) => {
emits('change', row)
}
const seeMore = () => {
emits('seeMore')
}
</script>
<style lang="scss" scoped>
......
......@@ -9,6 +9,7 @@
:title="item.name"
:list="flexibleData?.[item.field]"
is-more
@change="flexibleChange"
/>
</div>
<el-input v-model="searchValue" placeholder="搜索关键词" @change="search">
......@@ -125,6 +126,10 @@ const flexibleNameList = [
{ name: '新闻', field: 'XwData' }
]
const flexibleChange = (row: any) => {
router.push({ path: '/commonDetail', query: { FID: row.FID, FormType: 'D', FTITLE: row.FTITLE } })
}
const handleChange = (name: number) => {
listQuery.obj.postName = tabsList[name].label
initPosition()
......
......@@ -84,6 +84,7 @@
justify-content: space-between;
padding: 0 26px;
margin-bottom: 15px;
cursor: pointer;
}
}
.train {
......
......@@ -24,7 +24,12 @@
<div class="home-tp">
<div class="n-title">街道办招聘</div>
<div class="recruit">
<div v-for="(item, index) in homeData?.JdData" :key="index" class="recruit-item">
<div
v-for="(item, index) in homeData?.JdData"
:key="index"
class="recruit-item"
@click="toStreet(item)"
>
<img :src="baseURL + '/' + item.FSTREETPICTURE" width="318" height="130" />
<div class="recruit-item-detail">{{ item.FNAME }}</div>
</div>
......@@ -35,7 +40,12 @@
<div class="employment-training">
<div class="n-title">灵活就业</div>
<div class="employment">
<div v-for="(item, index) in employmentList" :key="index" class="employment-item">
<div
v-for="(item, index) in employmentList"
:key="index"
class="employment-item"
@click="router.push('/flexibleEmploym')"
>
<div class="flx-align-center">
<div style="color: #177cfa">{{ item.name }}</div>
<img :src="item.url" style="margin-left: 4px" />
......@@ -47,22 +57,39 @@
<div class="employment-training">
<div class="n-title">技能培训</div>
<div class="train">
<div style="position: relative; height: 100px">
<div style="position: relative; height: 100px; cursor: pointer" @click="toTtrain('A')">
<img src="@/assets/img/pic-an.png" width="645" height="100" />
<div class="img-ct">基础安全培训</div>
</div>
<div style="display: flex; margin-top: 18px">
<div class="train-item flx-center" style="width: 253px; margin-right: 15px">
<div style="display: flex; margin-top: 18px; cursor: pointer">
<div
class="train-item flx-center"
style="width: 253px; margin-right: 15px"
@click="toTtrain('B')"
>
专业技能培训
</div>
<div class="train-item flx-center" style="width: 377px">专业知识培训</div>
<div
class="train-item flx-center"
style="width: 377px; cursor: pointer"
@click="toTtrain('C')"
>
专业知识培训
</div>
</div>
<div style="display: flex; margin: 18px 0">
<div style="position: relative; height: 100px">
<div
style="position: relative; height: 100px; cursor: pointer"
@click="toTtrain('D')"
>
<img src="@/assets/img/pic-zhi.png" width="377" height="100" />
<div class="img-ct">职业发展培训</div>
</div>
<div class="train-item flx-center" style="width: 253px; margin-left: 15px">
<div
class="train-item flx-center"
style="width: 253px; margin-left: 15px; cursor: pointer"
@click="toTtrain('E')"
>
团队管理培训
</div>
</div>
......@@ -120,6 +147,13 @@ const handleChange = (row: any) => {
router.push({ path: '/commonDetail', query: { FID: row.FID, FormType: 'B', FTITLE: row.FTITLE } })
}
const toStreet = (row: any) => {
router.push({ path: '/streetOfficeSpecialTopic', query: { FID: row.FID } })
}
const toTtrain = (type: string) => {
router.push({ path: '/skillTraining', query: { type } })
}
const init = async () => {
loading.value = false
const res: any = await getHome()
......
......@@ -61,6 +61,7 @@
</template>
<script setup lang="ts">
import router from '@/routers'
import { getCode, loginSign } from '@/services/api/login'
import { useGlobalStore } from '@/stores/modules/global'
import { useUserInfoStore } from '@/stores/modules/userInfo'
......@@ -143,7 +144,7 @@ const onConfirm = () => {
Phone: state.loginForm.Phone,
Code: state.loginForm.Code,
EnCode: state.EnCode,
Type: state.userType === '个人用户' ? 'GR' : 'QY' //企业:QY 个人:GR
Type: state.userType === '个人用户' ? 'GR' : 'QY' // 企业:QY 个人:GR
}
const res: any = await loginSign(params)
if (res.code === 200) {
......@@ -157,6 +158,13 @@ const onConfirm = () => {
globalStore.setToken(res.data.Token)
handleClose()
ElMessage.success('登录成功')
} else if (res.code === 502) {
router.push({
path: '/recruitmentManagement/editCompany',
query: { register: 1, companyName: state.loginForm.Company, phone: state.loginForm.Phone }
})
handleClose()
ElMessage.warning(res.msg)
}
} else {
console.log('error submit!', fields)
......
<template>
<div v-loading="loading" class="policy-container flx-center">
<div class="container">
<img
:src="baseURL + '/' + policyData?.HbData?.[0].FPOSTERPICTURE"
height="560"
style="width: 100%"
/>
<img :src="baseURL + '/' + policyData.posterUrl" height="560" style="width: 100%" />
<el-input v-model="searchValue" placeholder="搜索关键词" @change="search">
<template #suffix>
<el-icon size="24" style="cursor: pointer" @click="search"><i-ep-Search /></el-icon>
</template>
</el-input>
<div class="flx-justify-between" style="margin-bottom: 64px">
<div class="flx-justify-between" style="margin-bottom: 64px; align-items: start">
<policy
title="南山就业政策公告"
:list="policyData?.GgData"
:list="policyData.noticeData"
is-more
:min-height="401"
@change="handleChange"
@see-more="seeMore(0)"
/>
<policy
title="南山就业活动"
:list="policyData?.HdData"
:list="policyData.activityData"
is-more
:min-height="401"
@change="handleChange"
@see-more="seeMore(1)"
/>
</div>
</div>
......@@ -33,7 +29,7 @@
<script setup lang="ts">
import { baseURL } from '@/services'
import { getPolicy } from '@/services/api/policy'
import { getPolicy, getPolicyList } from '@/services/api/policy'
import policy from '@/components/policy.vue'
const router = useRouter()
......@@ -41,11 +37,37 @@ const router = useRouter()
const searchValue = ref()
const loading = ref(true)
const queryList = ref({ pageIndex: 1, pageSize: 10 })
const policyData: any = ref()
const policyData: any = reactive({
posterUrl: '',
noticeData: [] as any,
noticeParams: { pageIndex: 1, pageSize: 10, total: 10 },
activityData: [] as any,
activityParams: { pageIndex: 1, pageSize: 10, total: 10 }
})
const search = () => {
console.log(searchValue.value)
}
const seeMore = async (Type: number) => {
if (Type && policyData.activityParams.pageSize <= policyData.activityParams.total) {
policyData.activityParams.pageSize = policyData.activityParams.pageSize + 10
const res: any = await getPolicyList({ ...policyData.activityParams, ...{ Type } })
if (res.code === 200) {
policyData.activityData = res.data
policyData.activityParams.total = res.total
}
}
if (!Type && policyData.noticeParams.pageSize <= policyData.noticeParams.total) {
policyData.noticeParams.pageSize = policyData.noticeParams.pageSize + 10
const res: any = await getPolicyList({ ...policyData.noticeParams, ...{ Type } })
if (res.code === 200) {
policyData.noticeData = res.data
policyData.noticeParams.total = res.total
}
}
}
const handleChange = (row: any) => {
router.push({ path: '/commonDetail', query: { FID: row.FID, FormType: 'B', FTITLE: row.FTITLE } })
}
......@@ -54,7 +76,9 @@ const init = async () => {
const res: any = await getPolicy(queryList.value)
if (res.code === 200) {
console.log(res)
policyData.value = res.data
policyData.posterUrl = res.data?.HbData?.[0].FPOSTERPICTURE
policyData.noticeData = res.data?.GgData
policyData.activityData = res.data?.HdData
loading.value = false
}
}
......
<template>
<div class="business">
<el-form
ref="formRef"
:model="state.form"
:rules="state.rules"
hide-required-asterisk
label-position="top"
>
<el-row :gutter="8">
<el-col v-for="(item, index) in state.list" :key="index" :span="item.span">
<el-form-item v-if="item.label !== '经营范围'" :label="item.label" :prop="item.prop">
<el-input v-model="state.form[item.prop]" :placeholder="item.placeholder" />
</el-form-item>
<el-form-item v-else :label="item.label" :prop="item.prop">
<el-input
v-model="state.form[item.prop]"
type="textarea"
:rows="4"
:placeholder="item.placeholder"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts">
const formRef = ref()
const state = reactive({
form: {
FCompanyName: '', //公司名称
FLegalRepresentative: '', //法定代表人
FRegisteredAddress: '', //注册地址
FOperatingState: '', //经营状态
FRegisteredCapital: '', //注册资本
FTypeEnterprise: '', //企业类型
FOperatingTerm: '', //营业期限
FAffiliatingArea: '', //所属地区
FCreditCode: '', //统一社会信用代码
FDateApproval: '', //核准日期
FRegistrationAuthority: '', //登记机关
FDateEstablishment: '', //成立日期
FPreviouslyName: '', //曾用名
FFIndustryGS: '', //所属行业
FBusinessScope: '' //经营范围
} as any,
list: [
{ placeholder: '请输入公司名称', prop: 'FCompanyName', label: '公司名称', span: 12 },
{ placeholder: '请输入法定代表人', prop: 'FLegalRepresentative', label: '法定代表人', span: 6 },
{ placeholder: '请输入成立日期', prop: 'FDateEstablishment', label: '成立日期', span: 6 },
{ placeholder: '请输入注册地址', prop: 'FRegisteredAddress', label: '注册地址', span: 12 },
{ placeholder: '请输入经营状态', prop: 'FOperatingState', label: '经营状态', span: 6 },
{ placeholder: '请输入注册资本', prop: 'FRegisteredCapital', label: '注册资本', span: 6 },
{ placeholder: '请输入企业类型', prop: 'FTypeEnterprise', label: '企业类型', span: 12 },
{ placeholder: '请输入营业期限', prop: 'FOperatingTerm', label: '营业期限', span: 6 },
{ placeholder: '请输入所属地区', prop: 'FAffiliatingArea', label: '所属地区', span: 6 },
{
placeholder: '请输入统一社会信用代码',
prop: 'FCreditCode',
label: '统一社会信用代码',
span: 12
},
{ placeholder: '请输入核准日期', prop: 'FDateApproval', label: '核准日期', span: 6 },
{ placeholder: '请输入登记机关', prop: 'FRegistrationAuthority', label: '登记机关', span: 6 },
{ placeholder: '请输入曾用名', prop: 'FPreviouslyName', label: '曾用名', span: 12 },
{ placeholder: '请输入所属行业', prop: 'FFIndustryGS', label: '所属行业', span: 6 },
{ placeholder: '请输入经营范围', prop: 'FBusinessScope', label: '经营范围', span: 24 }
],
rules: {
FCompanyName: [{ required: true, message: '请输入公司名称', trigger: 'blur' }],
FLegalRepresentative: [{ required: true, message: '请输入法定代表人', trigger: 'blur' }],
FDateEstablishment: [{ required: true, message: '请输入成立日期', trigger: 'blur' }],
FRegisteredAddress: [{ required: true, message: '请输入注册地址', trigger: 'blur' }],
FOperatingState: [{ required: true, message: '请输入经营状态', trigger: 'blur' }],
FRegisteredCapital: [{ required: true, message: '请输入注册资本', trigger: 'blur' }],
FTypeEnterprise: [{ required: true, message: '请输入企业类型', trigger: 'blur' }],
FOperatingTerm: [{ required: true, message: '请输入营业期限', trigger: 'blur' }],
FAffiliatingArea: [{ required: true, message: '请输入所属地区', trigger: 'blur' }],
FCreditCode: [
{ required: true, message: '请输入统一社会信用代码', trigger: 'blur' },
{
validator: (rule: any, value: string, callback: any) => {
return /^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/.test(value)
},
message: '请输入正确的统一社会信用代码',
trigger: 'blur'
}
],
FDateApproval: [{ required: true, message: '请输入核准日期', trigger: 'blur' }],
FRegistrationAuthority: [{ required: true, message: '请输入登记机关', trigger: 'blur' }],
FPreviouslyName: [{ required: true, message: '请输入曾用名', trigger: 'blur' }],
FFIndustryGS: [{ required: true, message: '请输入所属行业', trigger: 'blur' }],
FBusinessScope: [{ required: true, message: '请输入经营范围', trigger: 'blur' }]
}
})
const formCheck = async () => {
let flag = true
await formRef.value.validate((valid: boolean) => {
if (!valid) flag = false
})
return flag
}
defineExpose({
form: state.form,
formCheck
})
</script>
<style lang="scss" scoped>
.business {
flex: 1;
background: #f8f8f8;
border-radius: 12px;
padding: 18px 8px;
:deep(.el-form-item__label) {
font-size: 16px;
font-weight: 400;
color: #999999;
}
:deep(.el-textarea__inner),
:deep(.el-input__wrapper) {
background: #ffffff !important;
}
.el-col {
margin-bottom: 16px;
}
}
</style>
<template>
<div v-show="show" class="edit-expected-position">
<el-form :model="userInfoData" label-position="top">
<el-row :gutter="28">
<el-col :span="12">
<el-form-item label="学校名称">
<el-input v-model="userInfoData.name" size="large" placeholder="请输入学校名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学制类型">
<el-select
v-model="userInfoData.region"
size="large"
placeholder="请选择学制类型"
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学历">
<el-select
v-model="userInfoData.region"
size="large"
placeholder="请选择学历"
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="专业">
<el-input v-model="userInfoData.name" size="large" placeholder="请输入专业" />
</el-form-item>
</el-col>
<el-col :span="12" class="flx-align-center">
<el-form-item label="在校时间">
<el-date-picker
v-model="userInfoData.date"
type="date"
placeholder="入学时间"
size="large"
/>
<span style="margin: 0 16px"></span>
<el-date-picker
v-model="userInfoData.date1"
type="date"
placeholder="毕业时间"
size="large"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="在校经历(选填)">
<div class="text-header">
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
type="textarea"
show-word-limit
:maxlength="300"
:rows="10"
:placeholder="`1、在校担任职务... \n2、获得荣誉... \n3、所学主要课程...`"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="毕业设计/论文题目(选填)">
<el-input
v-model="userInfoData.textareaVal"
size="large"
placeholder="请输入毕业设计/论文题目"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="毕业设计/论文描述(选填)">
<div class="text-header">
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
type="textarea"
show-word-limit
:maxlength="600"
:rows="10"
placeholder="请填写内容"
/>
</el-form-item>
</el-col>
<el-col class="edit-resume-btn">
<el-button size="large" style="width: 100px" @click="emits('update:show', false)"
>取消</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts">
defineProps({
show: {
type: Boolean,
default: false
}
})
const emits = defineEmits(['update:show'])
const userInfoData: any = ref({})
</script>
<style lang="scss" scoped>
.edit-expected-position {
background: #f8f8f8;
border-radius: 12px;
padding: 24px;
font-weight: 400;
color: #222222;
margin-top: 24px;
.edit-user__info {
font-size: 18px;
margin-bottom: 24px;
}
.sex {
display: flex;
align-items: center;
span {
width: 227px;
height: 38px;
line-height: 38px;
text-align: center;
display: inline-block;
background: #ffffff;
border-radius: 8px;
border: 1px solid #cccccc;
margin-right: 15px;
color: #999999;
cursor: pointer;
}
.active {
background: #dcecff;
border: 1px solid #177cfa;
color: #177cfa;
}
}
.edit-resume-btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 10px;
}
.text-header {
width: 100%;
height: 44px;
border-radius: 12px 12px 0px 0px;
border: 1px solid #cccccc;
border-bottom: 0;
display: flex;
align-items: center;
.el-icon {
transform: rotate(90deg);
color: #d9d9d9;
}
}
:deep(.el-textarea__inner) {
border-radius: 0px 0px 12px 12px;
}
}
</style>
<template>
<div v-show="show" class="edit-expected-position">
<el-form :model="userInfoData" label-position="top">
<el-row :gutter="28">
<el-col :span="12">
<el-form-item label="求职类型">
<div class="sex">
<span :class="radioBtn === '全职' ? 'active' : ''" @click="radioBtn = '全职'"
>全职</span
>
<span :class="radioBtn === '兼职' ? 'active' : ''" @click="radioBtn = '兼职'"
>兼职</span
>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="期望职位">
<el-select
v-model="userInfoData.region"
size="large"
placeholder=" "
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="期望行业">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12" class="flx-align-center">
<el-form-item label="薪资要求">
<el-select v-model="userInfoData.region" size="large" placeholder="选择薪资范围">
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
<span style="margin: 0 16px"></span>
<el-select v-model="userInfoData.region" size="large" placeholder="选择薪资范围">
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工作城市">
<el-cascader
ref="cascaderAddr"
v-model="userInfoData.addr"
size="large"
:options="cityData"
:props="cityProps"
style="width: 100%"
@change="handleAddrChange"
/>
</el-form-item>
</el-col>
<el-col :span="12" class="edit-resume-btn">
<el-button size="large" style="width: 100px" @click="emits('update:show', false)"
>取消</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts">
import cityData from '@/assets/json/pca-code.json'
defineProps({
show: {
type: Boolean,
default: false
}
})
const emits = defineEmits(['update:show'])
const userInfoData: any = ref({})
const cityProps = {
value: 'code',
label: 'name',
children: 'children'
}
const radioBtn = ref('全职')
const cascaderAddr = ref()
const handleAddrChange = (e: any) => {
console.log(unref(cascaderAddr), e)
// unref(cascaderAddr).map((item: any) => {
// if (item.getCheckedNodes().length) {
// state.cascaderData[prop] = item.getCheckedNodes()[0].text
// }
// })
}
</script>
<style lang="scss" scoped>
.edit-expected-position {
background: #f8f8f8;
border-radius: 12px;
padding: 24px;
font-weight: 400;
color: #222222;
margin-top: 24px;
.edit-user__info {
font-size: 18px;
margin-bottom: 24px;
}
.sex {
display: flex;
align-items: center;
span {
width: 227px;
height: 38px;
line-height: 38px;
text-align: center;
display: inline-block;
background: #ffffff;
border-radius: 8px;
border: 1px solid #cccccc;
margin-right: 15px;
color: #999999;
cursor: pointer;
}
.active {
background: #dcecff;
border: 1px solid #177cfa;
color: #177cfa;
}
}
.edit-resume-btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 10px;
}
}
</style>
<template>
<div v-show="personalInfo && JSON.stringify(personalInfo) !== '{}'" class="personal-info">
<div class="personal-info-tp">
<div class="personal-info-tp-lf">{{ personalInfo?.FNAME }}</div>
<div class="personal-info-tp-rg" @click="toEditResume">编辑简历</div>
</div>
<div class="personal-info-ct">
<span>年龄:{{ personalInfo?.AGE }}</span>
<span>工作年限:2年</span>
<span>学历:{{ personalInfo?.F_LQKJ_EDUCATIONS }}</span>
</div>
<el-divider />
<div class="personal-info-bt">
<div class="personal-info-bt-item">
<div class="personal-info-label">求职状态</div>
<span>{{ personalInfo?.F_LQKJ_DEPARTREMAIN }}</span>
</div>
<div class="personal-info-bt-item">
<div class="personal-info-label">已投递</div>
<span>{{ personalInfo?.DeliverCount }}</span>
</div>
<div class="personal-info-bt-item">
<div class="personal-info-label">已面试</div>
<span>{{ personalInfo?.InteriviewCount }}</span>
</div>
</div>
<div style="width: 100%; display: flex; justify-content: center">
<span class="logout" @click="logout">退出登录</span>
</div>
</div>
</template>
<script setup lang="ts">
import { useUserInfoStore } from '@/stores/modules/userInfo'
import { useGlobalStore } from '@/stores/modules/global'
const personalInfo = computed(() => userInfoStore.getPersonalInfo)
const globalStore = useGlobalStore()
const userInfoStore = useUserInfoStore()
const router = useRouter()
const toEditResume = () => {
router.push('/recruitmentManagement/editResume')
}
const logout = () => {
userInfoStore.$reset()
globalStore.$reset()
router.push('/recruitmentManagement')
}
</script>
<style lang="scss" scoped>
.personal-info {
box-shadow: 0px 4px 6px 0px rgba(0, 0, 0, 0.03);
border-radius: 12px;
background-color: #ffffff;
margin-left: 24px;
padding: 12px 20px;
height: 210px;
.personal-info-tp {
display: flex;
align-items: center;
margin-bottom: 8px;
.personal-info-tp-lf {
text-align: center;
flex: 1;
font-size: 18px;
font-weight: 500;
color: #222222;
}
.personal-info-tp-rg {
width: 48px;
font-size: 12px;
font-weight: 400;
color: #177cfa;
cursor: pointer;
}
}
.personal-info-ct {
font-size: 14px;
font-weight: 400;
color: #666666;
span {
margin-right: 16px;
}
}
.el-divider {
margin: 8px 0;
}
.personal-info-bt {
.personal-info-bt-item {
margin-bottom: 5px;
display: flex;
align-items: center;
.personal-info-label {
text-align: justify;
-moz-text-align-last: justify;
text-align-last: justify;
width: 64px;
font-size: 16px;
font-weight: 400;
color: #222222;
margin-right: 24px;
}
span {
font-size: 14px;
font-weight: 400;
color: #666666;
}
}
}
.logout {
cursor: pointer;
display: block;
width: 88px;
height: 29px;
background: linear-gradient(90deg, #177cfa 0%, #177cfa 100%);
border-radius: 4px;
font-size: 14px;
font-weight: 400;
color: #ffffff;
line-height: 29px;
text-align: center;
margin-top: 24px;
}
}
</style>
<template>
<div v-show="show" class="personal-advantages">
<div class="edit-info">编辑个人优势</div>
<el-input v-model="textareaVal" type="textarea" show-word-limit :maxlength="500" :rows="8" />
<div class="edit-resume-btn">
<el-button size="large" style="width: 100px" @click="emits('update:show', false)"
>取消</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
</div>
</div>
</template>
<script setup lang="ts">
defineProps({
show: {
type: Boolean,
default: false
}
})
const emits = defineEmits(['update:show'])
const textareaVal = ref()
</script>
<style lang="scss" scoped>
.personal-advantages {
background: #f8f8f8;
border-radius: 12px;
padding: 24px;
font-weight: 400;
color: #222222;
.edit-info {
font-size: 18px;
margin-bottom: 24px;
}
.edit-resume-btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 24px;
}
}
</style>
<template>
<div style="margin-bottom: 15px">
<div v-loading="loading" style="margin-bottom: 70px">
<div class="position-header">
<el-button type="primary" :icon="CirclePlusFilled" @click="toEditPosition"
>发布职位</el-button
>
<div class="tag-list">
<el-tag
v-for="item in positionList"
:key="item.type"
:type="tagActive === item.name ? '' : 'info'"
<span
v-for="(item, index) in positionList"
:key="index"
:class="positionQuery.FPOSITIONSTATUS === item.type ? 'tag-active' : ''"
@click="tagChange(item)"
>{{ item.name }}</el-tag
>{{ item.name }}</span
>
</div>
</div>
<div class="position-list">
<div v-for="(item, index) in 6" :key="index" class="position-item flx-justify-between">
<div v-if="positionData.length" class="position-list">
<div v-for="item in positionData" :key="item.FID" class="position-item flx-justify-between">
<div>
<div class="position-title">销售经理</div>
<div class="position-title">{{ item.JobName }}</div>
<div>
<span class="position-label">大专</span>
<span class="position-label">{{ item.FEDUCATIONALBACKGROUND }}</span>
<el-divider direction="vertical" />
<span class="position-label">1-3年</span>
<span class="position-label">{{ item.FEXPERIENCE }}</span>
<el-divider direction="vertical" />
<span class="position-label">招聘2人</span>
<span class="position-label">{{ item.FRECRUITSNUMBER }}</span>
<el-divider direction="vertical" />
<span class="position-label">6K-8K.13薪</span>
<span class="position-label"
>{{ item.FMINIMUMWAGE }}-{{ item.FMAXIMUMSALARY }}.{{ item.FMONTHLYSALARY }}</span
>
<el-divider direction="vertical" />
<span class="position-label">全职</span>
<span class="position-label">{{ '全职' }}</span>
</div>
</div>
<div class="options">
<span class="open"><span class="round open-round" /> 开放中</span>
<span>关闭</span>
<span v-if="item.FPOSITIONSTATUS !== 'A'"><span class="round" /> 已关闭</span>
<span v-else class="open"><span class="round open-round" style="" /> 开放中</span>
<span @click="updateStatus(item)">{{
item.FPOSITIONSTATUS === 'A' ? '关闭' : '开放'
}}</span>
<span>编辑</span>
<span @click="preview">预览</span>
<span>删除</span>
<span @click="preview(item.FID)">预览</span>
<span @click="deletePosition(item)">删除</span>
</div>
</div>
</div>
<el-empty v-else description="暂无未添加" />
<el-pagination
background
layout="->, prev, pager, next"
:total="total"
hide-on-single-page
style="margin-top: 15px"
/>
</div>
<previewPosition v-model:show="previewShow" />
<previewPosition v-model:show="previewShow" :position-item="positionDetailData" />
</template>
<script setup lang="ts">
import { CirclePlusFilled } from '@element-plus/icons-vue'
import { positionList } from '../config/index'
import {
getCompanyPositionList,
updatePositionStatus,
getCompanyPositionDetail
} from '@/services/api/recruitmentManagement'
import previewPosition from './previewPosition.vue'
const router = useRouter()
const tagActive = ref('职位管理')
const loading = ref(true)
const previewShow = ref(false)
const total = ref(0)
const positionQuery = ref({
pageIndex: 1,
pageSize: 10,
FPOSITIONSTATUS: '' //A开放,B关闭,空全部
})
const positionData: any = ref([])
const positionDetailData: any = ref([])
const tagChange = (row: any) => {
tagActive.value = row.name
positionQuery.value.FPOSITIONSTATUS = row.type
initCompanyPositionList()
}
const toEditPosition = () => {
router.push('/recruitmentManagement/editPosition')
}
const preview = () => {
previewShow.value = true
const preview = (FID: string) => {
initCompanyPositionDetail(FID)
setTimeout(() => {
console.log(positionDetailData.value)
previewShow.value = true
}, 100)
}
const updateStatus = (row: any) => {
ElMessageBox.confirm(
`确定${row.FPOSITIONSTATUS !== 'A' ? '开放职位' : '关闭职位'}?`,
`${row.FPOSITIONSTATUS !== 'A' ? '开放职位' : '关闭职位'}`,
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
}
)
.then(async () => {
const res: any = await updatePositionStatus({
FID: row.FID,
Type: row.FPOSITIONSTATUS !== 'A' ? 0 : 1
})
if (res.code === 200) {
initCompanyPositionList()
ElMessage.success(row.FPOSITIONSTATUS !== 'A' ? '开放职位成功' : '关闭职位成功')
}
})
.catch(() => {})
}
const deletePosition = (row: any) => {
ElMessageBox.confirm(`确定删除职位?`, `删除`, {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
})
.then(async () => {
// const res: any = await updatePositionStatus({
// FID: row.FID,
// Type: row.FPOSITIONSTATUS !== 'A' ? 0 : 1
// })
// if (res.code === 200) {
// initCompanyPositionList()
// ElMessage.success(row.FPOSITIONSTATUS !== 'A' ? '开放职位成功' : '关闭职位成功')
// }
})
.catch(() => {})
}
const initCompanyPositionDetail = async (FID: string) => {
const res: any = await getCompanyPositionDetail({ FID })
// console.log(res)
if (res.code === 200) {
positionDetailData.value = res.data
}
}
const initCompanyPositionList = async () => {
loading.value = true
const res: any = await getCompanyPositionList(positionQuery.value)
// console.log(res)
if (res.code === 200) {
positionData.value = res.data
total.value = res.total
loading.value = false
}
}
defineExpose({
initCompanyPositionList
})
</script>
<style lang="scss" scoped>
......@@ -74,9 +169,25 @@ const preview = () => {
.tag-list {
margin-top: 20px;
.el-tag {
display: flex;
span {
display: inline-block;
cursor: pointer;
margin-right: 20px;
margin-right: 8px;
font-size: 14px;
font-weight: 400;
height: 32px;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
padding: 6px 12px;
}
.tag-active {
background: #dcecff;
color: #177cfa;
border-radius: 4px;
}
}
}
......@@ -112,8 +223,7 @@ const preview = () => {
}
.open {
// background: linear-gradient(90deg, #a5cdff 0%, #177cfa 100%);
// color: #177cfa;
color: #177cfa;
}
.round {
display: inline-block;
......@@ -123,10 +233,10 @@ const preview = () => {
border-radius: 50%;
}
// .open-round {
// background: linear-gradient(90deg, #a5cdff 0%, #177cfa 100%);
// color: #177cfa;
// }
.open-round {
background: linear-gradient(90deg, #a5cdff 0%, #177cfa 100%);
color: #177cfa;
}
}
}
}
......
......@@ -8,25 +8,18 @@
</div>
<div style="margin-left: 42px">
<el-form-item label="公司:">
<span>深圳好利航·贸易/进出口·深圳市好利航国际货运代理有限公司武汉分公司</span>
<span>{{ positionItem?.FirmName }}</span>
</el-form-item>
<el-form-item label="招聘类型:"><span>校招</span></el-form-item>
<el-form-item label="职位名称:"><span>货代销售经理</span></el-form-item>
<el-form-item label="职位名称:"
><span>{{ positionItem?.JobName }}</span></el-form-item
>
<el-form-item label="职位描述:">
<p>岗位职责:</p>
<p>
1.负责新销售团队的搭建、管理和组织,制定销售目标和销售策略,确保团队实现业绩目标,
</p>
<p>
2.建立和维护与客户的良好关系,开发新的客户资源,扩大市场份额,并促进客户满意度的提升,
</p>
<p>3.制定销售计划,并协助销售业绩的达成,及时调整销售策略,确保销售目标的实现,</p>
<p>
5.负责销售团队的绩效评估和管理,制定激励机制和培训计划,提高团队成员的销售能力和团队凝聚力,
</p>
<p>6.主持新员工的货代行业业务培训,确保团队成员对货运行业有深入的理解和认识。</p>
<pre style="white-space: pre-wrap">{{ positionItem?.FJOBDESCRIPTION_Tag }}</pre>
</el-form-item>
<el-form-item label="职位类型:"><span>货代销售经理</span></el-form-item>
<el-form-item label="职位类型:"
><span>{{ positionItem?.FJOBTYPE }}</span></el-form-item
>
</div>
<div class="position-info-title" style="margin: 30px 0 5px">
<img src="@/assets/img/position1.png" width="24" height="24" />
......@@ -35,7 +28,7 @@
<div style="margin-left: 42px">
<div class="flx-align-center">
<el-form-item label="经验和学历 :"
><span>5-10年</span
><span>{{ positionItem?.FEXPERIENCE }}</span
><span
style="
display: inline-block;
......@@ -46,17 +39,26 @@
margin: 0 4px;
"
></span>
<span>学历不限</span></el-form-item
<span>{{ positionItem?.FEDUCATIONALBACKGROUND }}</span></el-form-item
>
</div>
<div class="flx-align-center">
<el-form-item label="薪资范围:"><span>10K-15K&nbsp;&nbsp;13个月</span></el-form-item>
<el-form-item label="薪资范围:"
><span>
{{ positionItem?.FMINIMUMWAGE }}-{{
positionItem?.FMAXIMUMSALARY
}}&nbsp;&nbsp;13个月</span
></el-form-item
>
</div>
<el-form-item label="工作地点:">深圳罗湖区</el-form-item>
<el-form-item label="工作地点:">{{ positionItem?.FWORKPLACE }}</el-form-item>
<el-form-item label="职位关键词:" class="tag-label"
><el-tag v-for="item in 10" :key="item" style="margin: 0 12px 12px 0"
>带团队</el-tag
><el-tag
v-for="(item, index) in positionItem?.FJOBKEYWORDS"
:key="index"
style="margin: 0 12px 12px 0"
>{{ item }}</el-tag
></el-form-item
>
</div>
......@@ -70,7 +72,11 @@ defineProps({
show: {
type: Boolean,
default: false
}
},
positionItem: {
type: Object,
default: () => {}
} as any
})
const emits = defineEmits(['update:show'])
......
<template>
<div v-show="show" class="edit-expected-position">
<el-form :model="userInfoData" label-position="top">
<el-row :gutter="28">
<el-col :span="12">
<el-form-item label="项目名称">
<el-input v-model="userInfoData.name" size="large" placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目角色">
<el-select
v-model="userInfoData.region"
size="large"
placeholder="请选择项目角色"
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目链接(选填)">
<el-input v-model="userInfoData.name" size="large" placeholder="请输入项目链接" />
</el-form-item>
</el-col>
<el-col :span="12" class="flx-align-center">
<el-form-item label="项目开始时间">
<el-date-picker
v-model="userInfoData.date"
type="date"
placeholder="项目开始时间"
size="large"
/>
<span style="margin: 0 16px"></span>
<el-date-picker
v-model="userInfoData.date1"
type="date"
placeholder="项目结束时间"
size="large"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="项目描述">
<div class="text-header">
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
type="textarea"
show-word-limit
:maxlength="1600"
:rows="10"
placeholder="请填写内容"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="项目描述(选填)">
<div class="text-header">
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
type="textarea"
show-word-limit
:maxlength="300"
:rows="10"
placeholder="请填写内容"
/>
</el-form-item>
</el-col>
<el-col class="edit-resume-btn">
<el-button size="large" style="width: 100px" @click="emits('update:show', false)"
>取消</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts">
defineProps({
show: {
type: Boolean,
default: false
}
})
const emits = defineEmits(['update:show'])
const userInfoData: any = ref({})
</script>
<style lang="scss" scoped>
.edit-expected-position {
background: #f8f8f8;
border-radius: 12px;
padding: 24px;
font-weight: 400;
color: #222222;
margin-top: 24px;
.edit-user__info {
font-size: 18px;
margin-bottom: 24px;
}
.sex {
display: flex;
align-items: center;
span {
width: 227px;
height: 38px;
line-height: 38px;
text-align: center;
display: inline-block;
background: #ffffff;
border-radius: 8px;
border: 1px solid #cccccc;
margin-right: 15px;
color: #999999;
cursor: pointer;
}
.active {
background: #dcecff;
border: 1px solid #177cfa;
color: #177cfa;
}
}
.edit-resume-btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 10px;
}
.text-header {
width: 100%;
height: 44px;
border-radius: 12px 12px 0px 0px;
border: 1px solid #cccccc;
border-bottom: 0;
display: flex;
align-items: center;
.el-icon {
transform: rotate(90deg);
color: #d9d9d9;
}
}
:deep(.el-textarea__inner) {
border-radius: 0px 0px 12px 12px;
}
}
</style>
<template>
<div class="resume">
<search style="margin-bottom: 24px" @search-change="searchChange" />
<div class="resume-filter">
<search
v-if="filterShow"
style="margin-bottom: 24px"
:select-options="[
{ label: '找人才', value: 1 },
{ label: '找企业', value: 2 }
]"
@search-change="searchChange"
/>
<div v-if="filterShow" class="resume-filter">
<div v-for="item in list" :key="item.name" class="filter-item">
<span class="filter-title">{{ item.name }}</span>
<span class="filter-item-label filter-item-active">不限</span>
......@@ -86,6 +94,13 @@
<script setup lang="ts">
import search from '@/components/search.vue'
defineProps({
filterShow: {
type: Boolean,
default: true
}
})
const list = [
{ name: '学历要求' },
{ name: '院校要求' },
......
......@@ -3,8 +3,8 @@
<el-tab-pane
v-for="(item, index) in recruitStatus"
:key="index"
:label="item.statu"
:name="item.statu"
:label="item.status + ' ' + item.value"
:name="item.status"
>
<div v-for="(col, colIndex) in 4" :key="colIndex" class="tab-item">
<div class="tab-item-tp">
......
<template>
<div v-show="show" class="edit-user-info">
<div class="edit-user__info">编辑个人信息</div>
<el-form :model="userInfoData" label-position="top">
<el-row :gutter="28">
<el-col :span="12">
<el-form-item label="姓名">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前求职状态">
<el-select
v-model="userInfoData.region"
size="large"
placeholder=" "
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别">
<div class="sex">
<span :class="radioBtn === '男' ? 'active' : ''" @click="radioBtn = '男'"></span>
<span :class="radioBtn === '女' ? 'active' : ''" @click="radioBtn = '女'"></span>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="我的牛人身份">
<el-select
v-model="userInfoData.region"
size="large"
placeholder=" "
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="出生年月">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="电话">
<el-input v-model="userInfoData.name" size="large" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="参加工作时间">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="微信号 (选填)">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="邮箱 (选填)">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12" class="edit-resume-btn">
<el-button size="large" style="width: 100px" @click="emits('update:show', false)"
>取消</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts">
defineProps({
show: {
type: Boolean,
default: false
}
})
const emits = defineEmits(['update:show'])
const userInfoData: any = ref({})
const radioBtn = ref('男')
</script>
<style lang="scss" scoped>
.edit-user-info {
background: #f8f8f8;
border-radius: 12px;
padding: 24px;
font-weight: 400;
color: #222222;
.edit-user__info {
font-size: 18px;
margin-bottom: 24px;
}
.sex {
display: flex;
align-items: center;
span {
width: 227px;
height: 38px;
line-height: 38px;
text-align: center;
display: inline-block;
background: #ffffff;
border-radius: 8px;
border: 1px solid #cccccc;
margin-right: 15px;
color: #999999;
cursor: pointer;
}
.active {
background: #dcecff;
border: 1px solid #177cfa;
color: #177cfa;
}
}
.edit-resume-btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 10px;
}
}
</style>
<template>
<div v-show="show" class="edit-expected-position">
<el-form :model="userInfoData" label-position="top">
<el-row :gutter="28">
<el-col :span="12">
<el-form-item label="公司名称">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属行业">
<el-select
v-model="userInfoData.region"
size="large"
placeholder=" "
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属部门 (选填)">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="职位名称">
<el-select
v-model="userInfoData.region"
size="large"
placeholder=" "
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="flx-align-center">
<el-form-item label="在职时间">
<el-date-picker
v-model="userInfoData.date"
type="date"
placeholder="入职时间"
size="large"
/>
<span style="margin: 0 16px"></span>
<el-date-picker
v-model="userInfoData.date1"
type="date"
placeholder="离职时间"
size="large"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="工作内容">
<div class="text-header">
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
type="textarea"
show-word-limit
:maxlength="1600"
:rows="10"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="工作业绩(选填)">
<div class="text-header">
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
type="textarea"
show-word-limit
:maxlength="300"
:rows="10"
:placeholder="`填写完整、有吸引力的工作业绩,有助于您获得更多老板的青睐 \n列如 \n1、取得的成绩..... \n2、实现的突破.....`"
/>
</el-form-item>
</el-col>
<el-col class="edit-resume-btn">
<el-button size="large" style="width: 100px" @click="emits('update:show', false)"
>取消</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts">
defineProps({
show: {
type: Boolean,
default: false
}
})
const emits = defineEmits(['update:show'])
const userInfoData: any = ref({})
</script>
<style lang="scss" scoped>
.edit-expected-position {
background: #f8f8f8;
border-radius: 12px;
padding: 24px;
font-weight: 400;
color: #222222;
margin-top: 24px;
.edit-user__info {
font-size: 18px;
margin-bottom: 24px;
}
.sex {
display: flex;
align-items: center;
span {
width: 227px;
height: 38px;
line-height: 38px;
text-align: center;
display: inline-block;
background: #ffffff;
border-radius: 8px;
border: 1px solid #cccccc;
margin-right: 15px;
color: #999999;
cursor: pointer;
}
.active {
background: #dcecff;
border: 1px solid #177cfa;
color: #177cfa;
}
}
.edit-resume-btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 10px;
}
.text-header {
width: 100%;
height: 44px;
border-radius: 12px 12px 0px 0px;
border: 1px solid #cccccc;
border-bottom: 0;
display: flex;
align-items: center;
.el-icon {
transform: rotate(90deg);
color: #d9d9d9;
}
}
:deep(.el-textarea__inner) {
border-radius: 0px 0px 12px 12px;
}
}
</style>
import { useUserInfoStore } from '@/stores/modules/userInfo'
const userInfoStore = useUserInfoStore()
const companyInfo = computed(() => userInfoStore.getCompanyInfo)
export const filterList = ref([
{
name: '工作经验',
list: [
{
value: '不限',
label: '不限'
},
{
value: '无经验',
label: '无经验'
},
{
value: '1年以下',
label: '1年以下'
},
{
value: '1-3年',
label: '1-3年'
},
{
value: '3-5年',
label: '3-5年'
}
]
prop: 'FEXPERIENCE',
list: []
},
{
name: '薪资待遇',
list: [
{
value: '不限',
label: '不限'
},
{
value: '4k以下',
label: '4k以下'
},
{
value: '4k-6k',
label: '4k-6k'
},
{
value: '6k-8k',
label: '6k-8k'
},
{
value: '8k-10k',
label: '8k-10k'
},
{
value: '50k以上',
label: '50k以上'
}
]
list: [],
prop: 'SalaryRange'
},
{
name: '学历要求',
list: [
{
value: '不限',
label: '不限'
},
{
value: '高中及以下',
label: '高中及以下'
},
{
value: '大专',
label: '大专'
},
{
value: '本科',
label: '本科'
},
{
value: '硕士',
label: '硕士'
},
{
value: '博士',
label: '博士'
}
]
list: [],
prop: 'FEDUCATIONALBACKGROUND'
},
{
name: '公司规模',
list: [
{
value: '不限',
label: '不限'
},
{
value: '20人以下',
label: '20人以下'
},
{
value: '20-99人',
label: '20-99人'
},
{
value: '100-299人',
label: '100-299人'
},
{
value: '300-499人',
label: '300-499人'
},
{
value: '500-999人',
label: '500-999人'
},
{
value: '1000-9999人',
label: '1000-9999人'
}
]
list: [],
prop: 'FSCALES'
},
{
name: '融资情况',
list: [
{
value: '不限',
label: '不限'
},
{
value: '未融资',
label: '未融资'
},
{
value: '天使轮',
label: '天使轮'
},
{
value: 'A轮',
label: 'A轮'
},
{
value: 'B轮',
label: 'B轮'
},
{
value: 'B轮',
label: 'B轮'
},
{
value: 'C轮',
label: 'C轮'
},
{
value: 'D轮及以上',
label: 'D轮及以上'
},
{
value: '已上市',
label: '已上市'
},
{
value: '不需要融资',
label: '不需要融资'
}
]
list: [],
prop: 'FFINANCINGS'
}
])
export const recruitStatus = [
{ statu: '简历未查看', value: '10份' },
{ statu: '简历待定', value: '10份' },
{ statu: '安排面试', value: '10份' },
{ statu: '已面试', value: '10份' },
{ statu: '已录用', value: '10份' },
{ statu: '已入职', value: '10份' },
{ statu: '人才库', value: '10份' },
{ statu: '黑名单', value: '10份' }
{ status: '简历未查看', value: companyInfo.value?.NotViewed + '份' },
{ status: '简历待定', value: companyInfo.value?.Pending + '份' },
{ status: '安排面试', value: companyInfo.value?.Arrange + '份' },
{ status: '已面试', value: companyInfo.value?.HaveInterview + '份' },
{ status: '已录用', value: companyInfo.value?.HaveHired + '份' },
{ status: '已入职', value: companyInfo.value?.AlreadyBoard + '份' },
{ status: '人才库', value: companyInfo.value?.TalentPool + '份' },
{ status: '黑名单', value: companyInfo.value?.Blacklist + '份' }
]
export const positionList = [
{ name: '全部职位', type: 0 },
{ name: '开放中', type: 1 },
{ name: '已关闭', type: 2 }
{ name: '全部职位', type: '' },
{ name: '开放中', type: 'A' },
{ name: '已关闭', type: 'B' }
]
export const resumeList = [
{ name: '个人信息' },
{ name: '个人优势' },
{ name: '期望职位' },
{ name: '工作经历' },
{ name: '项目经历' },
{ name: '教育经历' },
{ name: '自定义添加' },
{ name: '上传简历' },
{ name: '上传附件' }
]
差异被折叠。
......@@ -22,65 +22,56 @@
<div class="enterprise-header-rg">
<div class="company-tp">
<img
src="@/assets/img/icon-can.png"
:src="baseURL + '/' + userInfoStore.companyInfo?.FLOGO"
width="90"
height="90"
style="border-radius: 12px"
/>
<div class="flx-direction-column">
<span class="company-title">货拉拉科技</span>
<span class="company-title">{{ userInfoStore.companyInfo?.FNAME }}</span>
<div>
<span class="info-label">互联网</span>
<span class="info-label">D轮及以上</span>
<span class="info-label">10000人以上</span>
<span class="info-label">{{ userInfoStore.companyInfo?.FINDUSTRY }}</span>
<span class="info-label">{{ userInfoStore.companyInfo?.FFINANCING }}</span>
<span class="info-label">{{ userInfoStore.companyInfo?.FSCALE }}</span>
</div>
<div class="company-addr">
<el-icon style="margin-right: 3px"><i-ep-Location /></el-icon>
深圳市南山区南山街道办1109号7-6楼
{{ userInfoStore.companyInfo?.ADDRESSS }}
</div>
</div>
</div>
<div style="width: 391px">
<p class="company-detail">
货拉拉于2013年创立,成长于粤港澳大湾区。是一家从事同城/跨城货运、企业版物流服务、搬家、零担、汽车租售及车后市场服务的互联网物流商城。[7-8]
货拉拉通过共享模式整合社会运力资源,完成海量运力储备,依托移动互联、大数据和人工智能技术,搭建“方便、科技、可靠”的货运平台,实现多种车型的即时智能调度,为个人、商户及企业提供高效的物流解决方案。[9]
截至2021年10月,货拉拉业务范围已覆盖352座中国内地城市,月活司机达66万,月活用户达840万
货拉拉于2013年创立,成长于粤港澳大湾区。是一家从事同城/跨城货运、企业版物流服务、搬家、零担、汽车租售及车后市场服务的互联网物流商城。[7-8]
货拉拉通过共享模式整合社会运力资源,完成海量运力储备,依托移动互联、大数据和人工智能技术,搭建“方便、科技、可靠”的货运平台,实现多种车型的即时智能调度,为个人、商户及企业提供高效的物流解决方案。[9]
截至2021年10月,货拉拉业务范围已覆盖352座中国内地城市,月活司机达66万,月活用户达840万
货拉拉通过共享模式整合社会运力资源,完成海量运力储备,依托移动互联、大数据和人工智能技术,搭建“方便、科技、可靠”的货运平台,实现多种车型的即时智能调度,为个人、商户及企业提供高效的物流解决方案。[9]
截至2021年10月,货拉拉业务范围已覆盖352座中国内地城市,月活司机达66万,月活用户达840万
截至2021年10月,货拉拉业务范围已覆盖352座中国内地城市,月活司机达66万,月活用户达840万
货拉拉通过共享模式整合社会运力资源,完成海量运力储备,依托移动互联、大数据和人工智能技术,搭建“方便、科技、可靠”的货运平台,实现多种车型的即时智能调度,为个人、商户及企业提供高效的物流解决方案。[9]
截至2021年10月,货拉拉业务范围已覆盖352座中国内地城市,月活司机达66万,月活用户达840万
</p>
<p class="company-detail">{{ userInfoStore.companyInfo?.FCOMPANYPROFILE }}</p>
</div>
<div class="flx-justify-between">
<div class="flx-align-center">
<span class="btn" @click="toEditCompany">编辑公司信息</span>
<span class="btn" @click="toAddAdministrator">添加管理员</span>
<span class="btn" @click="toAddAdministrator">退出登录</span>
</div>
</div>
</div>
<talent v-if="manageActive === '人才管理'" />
<position v-if="manageActive === '职位管理'" />
<resume v-if="manageActive === '简历搜索'" />
<el-pagination
background
layout="->, prev, pager, next"
:total="1000"
style="margin-bottom: 15px"
/>
<talent v-if="manageActive === '人才管理'" ref="talentRef" />
<position v-else-if="manageActive === '职位管理'" ref="positionRef" />
<resume v-else-if="manageActive === '简历搜索'" />
<resume v-else :filterShow="false" />
</div>
</div>
</template>
<script setup lang="ts">
import { baseURL } from '@/services'
import { useUserInfoStore } from '@/stores/modules/userInfo'
import { useGlobalStore } from '@/stores/modules/global'
import talent from './components/talent.vue'
import position from './components/position.vue'
import resume from './components/resume.vue'
const router = useRouter()
const manageActive = ref('简历搜索')
const userInfoStore = useUserInfoStore()
const globalStore = useGlobalStore()
const manageActive = ref('职位管理')
const talentRef = ref()
const positionRef = ref()
const manageList = [
{ name: '人才管理', type: 'A' },
......@@ -89,16 +80,49 @@ const manageList = [
{ name: '简历推荐', type: 'D' }
]
watch(
() => userInfoStore,
() => {
if (JSON.stringify(userInfoStore.companyInfo) === '{}') {
router.push('/recruitmentManagement')
}
},
{ immediate: true, deep: true }
)
const toEditCompany = () => {
router.push('/recruitmentManagement/editCompany')
}
const toAddAdministrator = () => {
router.push('/recruitmentManagement/addAdministrator')
userInfoStore.$reset()
globalStore.$reset()
router.push('/home')
}
const manageChange = (row: any) => {
manageActive.value = row.name
}
watch(
() => manageActive.value,
(newVal: string) => {
setTimeout(() => {
switch (newVal) {
case '人才管理':
break
case '职位管理':
positionRef.value?.initCompanyPositionList()
break
case '简历搜索':
break
default:
break
}
}, 100)
},
{ immediate: true }
)
</script>
<style lang="scss" scoped>
......
......@@ -5,19 +5,21 @@
<div style="width: 444px; box-sizing: border-box" @mouseover="mouseover" @mouseout="mouseout">
<div class="job-menu">
<el-menu>
<el-menu-item
v-for="item in menuList"
:key="item.index"
@mouseover="mouseover(item)"
@mouseout="mouseout(item)"
>
<template #title>
<div class="menu-item-title">
<span>{{ item.FDATAVALUE }}</span>
<el-icon><i-ep-ArrowRight /></el-icon>
</div>
</template>
</el-menu-item>
<el-scrollbar height="400px">
<el-menu-item
v-for="item in menuList"
:key="item.index"
@mouseover="mouseover(item)"
@mouseout="mouseout(item)"
>
<template #title>
<div class="menu-item-title">
<span>{{ item.FDATAVALUE }}</span>
<el-icon><i-ep-ArrowRight /></el-icon>
</div>
</template>
</el-menu-item>
</el-scrollbar>
</el-menu>
<div class="job-menu-sub" @mouseover="mouseover" @mouseout="mouseout">
<el-scrollbar height="400px">
......@@ -31,7 +33,7 @@
<router-link
:to="{
path: '/recruitmentManagement/personal',
query: { FDATAVALUE: col.FDATAVALUE }
query: { searchValue: col.FDATAVALUE }
}"
style="text-decoration: none"
>
......@@ -156,10 +158,11 @@
import { baseURL } from '@/services'
import { getPosition } from '@/services/api/recruitmentManagement'
import { getStreet } from '@/services/api/streetOfficeSpecialTopic'
import { useUserInfoStore } from '@/stores/modules/userInfo'
import search from '@/components/search.vue'
const router = useRouter()
const userInfoStore = useUserInfoStore()
const menuList = ref([] as any)
const FDATAVALUE = ref()
......@@ -177,6 +180,19 @@ const tabsList = [
]
const activeName = ref(0)
watch(
() => userInfoStore,
() => {
if (
JSON.stringify(userInfoStore.personalInfo) === '{}' &&
JSON.stringify(userInfoStore.companyInfo) !== '{}'
) {
router.push('/recruitmentManagement/enterprise')
}
},
{ immediate: true, deep: true }
)
const handleClick = (tab: string) => {
router.push({ path: '/recruitmentManagement/enterprise' })
}
......@@ -188,7 +204,7 @@ const searchChange = (searchValue: string) => {
const subMenuList = computed(() => {
if (!FDATAVALUE.value) return []
const list = JSON.parse(JSON.stringify(menuList.value)) || []
const row = list.filter((item: any) => item.FDATAVALUE === FDATAVALUE.value)?.[0]?.TypeJobS
const row = list.filter((item: any) => item.FDATAVALUE === FDATAVALUE.value)?.[0]?.JobS
return row ? row : []
})
......@@ -215,7 +231,8 @@ const mouseout = (row?: any) => {
const init = async () => {
const res: any = await getPosition()
if (res.code === 200) {
menuList.value = res.data.LevelJobS.filter((item: any, i: number) => i < 10)
// menuList.value = res.data.LevelJobS.filter((item: any, i: number) => i < 10)
menuList.value = res.data.LevelJobS
}
const street: any = await getStreet()
......@@ -224,7 +241,9 @@ const init = async () => {
}
}
init()
onMounted(() => {
init()
})
</script>
<style lang="scss" scoped>
......
<template>
<div v-loading="loading" class="detail-container flx-center">
<div class="container">
<div class="detail-filter">
<div class="detail-header">
<div class="position-info">
<div>
<div class="position-name">{{ detailData?.JobName }}</div>
<div class="flx-align-center">
<div class="position-label">
<img src="@/assets/img/icon-map.png" />
<span>{{
detailData?.FWORKPLACE?.replace(/^.*?\/(.*?)\/(.*?)\/.*$/, '$1-$2')
}}</span>
</div>
<div class="position-label">
<img src="@/assets/img/icon-experience-white.png" />
<span>{{ detailData?.FEXPERIENCE }}</span>
</div>
<div class="position-label">
<img src="@/assets/img/icon-education-white.png" />
<span>{{ detailData?.FEDUCATIONALBACKGROUND }}</span>
</div>
</div>
<div class="flx-align-center" style="margin-top: 24px">
<span
v-for="(item, index) in detailData?.FJOBKEYWORDS"
:key="index"
class="label"
>{{ item }}</span
>
</div>
</div>
<div class="flx-column-start-between">
<span class="salary"
>{{ detailData?.FMINIMUMWAGE }}-{{ detailData?.FMAXIMUMSALARY }}</span
>
<span class="deliver">投递简历</span>
</div>
</div>
<div class="position-describe">
<span class="desc-title">职位描述</span>
<div class="keyWords">
<span v-for="(item, index) in detailData?.FCORPORATEWELFARE || []" :key="index">{{
item
}}</span>
</div>
<pre>{{ detailData?.FJOBDESCRIPTION_Tag }}</pre>
<el-divider style="margin: 24px 0" />
<div class="hr-info">
<img :src="baseURL + '/' + detailData?.FLOGO" />
<div class="flx-column-start-between">
<span>{{ detailData?.FPUBLISHERS }}</span>
<div class="flx-align-center" style="font-size: 14px">
{{ detailData?.FirmName }}
<span
style="
display: inline-block;
width: 4px;
height: 4px;
background: #cccccc;
border-radius: 50%;
margin: 0 4px;
"
/>
{{ detailData?.FJOBTITLES }}
</div>
</div>
</div>
</div>
</div>
<div class="company-info">
<div class="desc-title">公司介绍</div>
<div class="text-container">
<pre>{{ detailData?.FCOMPANYPROFILE }}</pre>
<div class="expand-btn" @click="expandMore">
<span class="expand-title">查看更多</span
><el-icon>
<i-ep-CaretBottom v-if="expandShow" />
<i-ep-CaretTop v-else />
</el-icon>
</div>
</div>
<div class="desc-title">工商信息</div>
<div class="business-info">
<el-descriptions title="" direction="vertical" :column="4">
<el-descriptions-item
v-for="(item, index) in list"
:key="index"
:label="item.label"
:span="item.span"
:width="item.width"
>{{
detailData?.gsData[item.prop] ? detailData?.gsData[item.prop] : '-'
}}</el-descriptions-item
>
</el-descriptions>
<div class="business-expand" @click="businessShow = !businessShow">
<span class="business-more">{{ businessShow ? '查看更多' : '收起' }}</span
><el-icon>
<i-ep-CaretBottom v-if="businessShow" />
<i-ep-CaretTop v-else />
</el-icon>
</div>
</div>
<div class="desc-title">工作地址</div>
<div class="map-info">
<div class="map-addr">
<el-icon color="#177CFA" style="margin-right: 4px"><i-ep-LocationFilled /></el-icon>
{{ detailData?.FWORKPLACE.split('/')[detailData?.FWORKPLACE.split('/').length - 1] }}
</div>
<qqMap ref="mapRef" />
</div>
</div>
</div>
<info />
</div>
</div>
</template>
<script setup lang="ts">
import { getUserPostionDetail } from '@/services/api/recruitmentManagement'
import { useGlobalStore } from '@/stores/modules/global'
import { baseURL } from '@/services'
import info from './components/info.vue'
import qqMap from '@/components/qqMap.vue'
const globalStore = useGlobalStore()
const route = useRoute()
const list: any = ref([])
const copyList = [
{ width: '50%', prop: 'FCompanyName', label: '公司名称', span: 2 },
{ width: '25%', prop: 'FLegalRepresentative', label: '法定代表人', span: 1 },
{ width: '25%', prop: 'FDateEstablishment', label: '成立日期', span: 1 },
{ width: '50%', prop: 'FRegisteredAddress', label: '注册地址', span: 2 },
{ width: '25%', prop: 'FOperatingState', label: '经营状态', span: 1 },
{ width: '25%', prop: 'FRegisteredCapital', label: '注册资本', span: 1 },
{ width: '50%', prop: 'FTypeEnterprise', label: '企业类型', span: 2 },
{ width: '25%', prop: 'FOperatingTerm', label: '营业期限', span: 1 },
{ width: '25%', prop: 'FAffiliatingArea', label: '所属地区', span: 1 },
{
width: '50%',
prop: 'FCreditCode',
label: '统一社会信用代码',
span: 2
},
{ width: '25%', prop: 'FDateApproval', label: '核准日期', span: 1 },
{ width: '25%', prop: '', label: '', span: 1 },
{ width: '100%', prop: 'FPreviouslyName', label: '曾用名', span: 4 },
{ width: '100%', prop: 'FRegistrationAuthority', label: '登记机关', span: 4 },
{ width: '100%', prop: 'FFIndustryGS', label: '所属行业', span: 4 },
{ width: '100%', prop: 'FBusinessScope', label: '经营范围', span: 4 }
]
const loading = ref(true)
const mapRef: any = ref()
const detailData: any = ref()
const expandShow = ref(true)
const businessShow = ref(true)
watch(
() => businessShow.value,
(newVal: any) => {
if (newVal) {
list.value = copyList.filter((item: any, i: number) => i < 6)
} else list.value = copyList
},
{ immediate: true }
)
const expandMore = () => {
const textContainer: any = document.querySelector('.text-container')
const content: any = document.querySelector('.expand-title')
const expandBtn: any = document.querySelector('.expand-btn')
textContainer.classList.toggle('expanded')
if (textContainer.classList.contains('expanded')) {
content.textContent = '收起'
textContainer.style.maxHeight = textContainer.scrollHeight + 'px' // 动态计算文本高度并设置max-height
expandBtn.style.bottom = '-30%'
expandShow.value = false
} else {
content.textContent = '查看更多'
textContainer.style.maxHeight = 'calc(3 * 1.3em)' // 恢复初始值
expandBtn.style.bottom = '-2px'
expandShow.value = true
}
}
const init = async () => {
const res: any = await getUserPostionDetail({ FID: route.query.FID })
if (res.code === 200) {
detailData.value = res.data
mapRef.value.initMap(detailData.value?.FWORKPLACE)
loading.value = false
}
}
init()
</script>
<style lang="scss" scoped>
@import url(./style/positionDetail.scss);
</style>
.edit-resume {
display: flex;
justify-content: center;
.containter {
position: relative;
display: flex;
justify-content: flex-end;
width: 1316px;
margin: 24px 0 56px;
.directory {
position: absolute;
left: 0;
width: 179px;
height: 460px;
background: #ffffff;
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
border-radius: 12px;
margin-right: 15px;
transition: top 0.4s ease-in-out;
.directory-first {
height: 46px;
text-align: center;
line-height: 46px;
border-radius: 12px 12px 0px 0px;
color: #177cfa;
background: linear-gradient(90deg, #d4e6fd 0%, rgba(212, 230, 253, 0.26) 100%);
}
.directory-item {
cursor: pointer;
height: 46px;
text-align: center;
line-height: 46px;
&:hover {
background-color: #f8f8f8;
&:last-child {
border-radius: 0px 0px 12px 12px;
}
}
}
.directory-active {
background-color: #177cfa;
color: #ffffff;
&:hover {
background-color: #177cfa;
}
&:last-child {
border-radius: 0px 0px 12px 12px;
}
}
}
.content {
width: 1122px;
background: #ffffff;
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
border-radius: 12px;
font-weight: 400;
.resume-header {
height: 46px;
background: #ffffff;
background: linear-gradient(90deg, #d4e6fd 0%, rgba(212, 230, 253, 0.26) 100%);
border-radius: 12px 12px 0px 0px;
padding: 0 64px;
span {
font-size: 14px;
color: #999999;
&:last-child {
color: #177cfa;
cursor: pointer;
}
}
}
.resume-main {
padding: 32px;
.user-info {
padding: 14px 32px;
width: 60%;
display: flex;
flex-direction: column;
color: #222222;
cursor: pointer;
.user-name {
font-size: 24px;
font-weight: 500;
margin-bottom: 12px;
}
.user-label {
font-size: 16px;
margin-bottom: 16px;
span {
font-size: 16px;
margin-left: 4px;
}
}
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-position'] {
cursor: pointer;
padding: 14px 32px;
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-work'] {
cursor: pointer;
padding: 14px 32px;
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-advantage'] {
cursor: pointer;
padding: 14px 32px;
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-project'] {
cursor: pointer;
padding: 14px 32px;
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-education'] {
cursor: pointer;
padding: 14px 32px;
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-resume'] {
cursor: pointer;
padding: 14px 32px;
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-annex'] {
cursor: pointer;
padding: 14px 32px;
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
.resume-item {
margin-top: 48px;
.resume-label {
width: 146px;
height: 44px;
box-sizing: border-box;
background: linear-gradient(90deg, #a5cdff 0%, #177cfa 100%);
box-shadow:
0px 2px 2px 0px rgba(1, 80, 178, 0.18),
inset 2px 3px 7px 0px rgba(255, 255, 255, 0.23);
border-radius: 8px;
font-size: 24px;
color: #ffffff;
}
.resume-content {
margin-top: 24px;
box-sizing: border-box;
.el-row {
justify-content: space-between;
}
:deep(.el-col-11) {
flex: 0 0 49%;
max-width: 49%;
}
.custom-col {
padding: 36px 24px !important;
height: 116px;
background: #f8f8f8;
border-radius: 8px;
font-size: 18px;
font-weight: 500;
color: #222222;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
// margin-right: 24px;
}
.tag-label {
box-sizing: border-box;
height: 32px;
padding: 8px 16px;
background: #f8f8f8;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 16px;
color: #666666;
}
.education {
margin-left: 16px;
display: flex;
flex-direction: column;
justify-content: space-around;
}
}
}
}
}
}
}
......@@ -100,7 +100,7 @@
}
.btn {
display: block;
width: 180px;
width: 120px;
height: 45px;
line-height: 45px;
text-align: center;
......@@ -109,7 +109,12 @@
font-size: 14px;
font-weight: 400;
color: #ffffff;
margin-right: 15px;
cursor: pointer;
&:last-child {
margin-right: 0;
}
}
}
}
......
......@@ -93,7 +93,7 @@
flex-wrap: wrap;
img {
display: block; /* 将图片设置为块级元素 */
max-width: 100%; /* 保证图片在其父元素内部自适应大小 */
max-width: 100%;
}
}
}
......
......@@ -51,6 +51,7 @@
.personal-contnet {
width: 100%;
.personal-ct-item {
cursor: pointer;
background: #ffffff;
border-radius: 12px;
box-sizing: border-box;
......@@ -122,69 +123,7 @@
}
}
}
.personal-info {
box-shadow: 0px 4px 6px 0px rgba(0, 0, 0, 0.03);
border-radius: 12px;
background-color: #ffffff;
margin-left: 24px;
padding: 12px 20px;
height: 145px;
.personal-info-tp {
display: flex;
align-items: center;
margin-bottom: 8px;
.personal-info-tp-lf {
text-align: center;
flex: 1;
font-size: 18px;
font-weight: 500;
color: #222222;
}
.personal-info-tp-rg {
width: 48px;
font-size: 12px;
font-weight: 400;
color: #177cfa;
cursor: pointer;
}
}
.personal-info-ct {
font-size: 14px;
font-weight: 400;
color: #666666;
span {
margin-right: 16px;
}
}
.el-divider {
margin: 8px 0;
}
.personal-info-bt {
.personal-info-bt-item {
margin-bottom: 5px;
display: flex;
align-items: center;
.personal-info-label {
text-align: justify;
-moz-text-align-last: justify;
text-align-last: justify;
width: 64px;
font-size: 16px;
font-weight: 400;
color: #222222;
margin-right: 24px;
}
span {
font-size: 14px;
font-weight: 400;
color: #666666;
}
}
}
}
.info-label {
background: #f8f8f8;
border-radius: 4px;
......
.detail-container {
width: 100%;
.container {
width: 1316px;
display: flex;
padding: 24px 0;
color: #222222;
.detail-filter {
flex: 1;
.detail-header {
background: #ffffff;
border-radius: 12px;
box-sizing: border-box;
.position-info {
border-radius: 12px 12px 0 0;
padding: 18px 32px;
color: #ffffff;
background: #022756;
display: flex;
justify-content: space-between;
.position-name {
font-size: 36px;
font-weight: 500;
margin-bottom: 8px;
}
.position-label {
display: flex;
align-items: center;
font-size: 14px;
color: #ffffff;
margin-right: 16px;
img {
width: 16px;
height: 16px;
margin-right: 2px;
}
}
.deliver {
cursor: pointer;
display: inline-block;
width: 120px;
height: 43px;
line-height: 43px;
text-align: center;
background: linear-gradient(90deg, #177cfa 0%, #177cfa 100%);
border-radius: 6px;
font-size: 18px;
color: #ffffff;
}
.salary {
font-size: 38px;
height: 57px;
line-height: normal;
}
}
.position-describe {
padding: 24px 36px;
.keyWords {
margin: 24px 0 20px;
span {
display: inline-block;
padding: 2px 12px;
border-radius: 39px;
border: 1px solid #177cfa;
margin-right: 12px;
font-size: 14px;
color: #177cfa;
}
}
pre {
color: #222222;
}
.hr-info {
display: flex;
img {
width: 48px;
height: 48px;
margin-right: 18px;
}
}
}
}
.company-info {
margin-top: 16px;
background: #ffffff;
border-radius: 12px;
box-sizing: border-box;
padding: 24px 36px;
.text-container {
position: relative;
max-height: calc(3 * 1.3em); /* 3行文本的高度,假设行高为1.2em */
overflow: hidden;
margin-bottom: 36px;
}
.expand-btn {
cursor: pointer;
position: absolute;
right: 0;
bottom: -2px;
display: flex;
align-items: center;
margin-top: 10px;
color: #177cfa;
background-color: #ffffff;
}
.expanded {
max-height: none;
overflow: visible;
}
.business-info {
background: #f8f8f8;
border-radius: 12px;
padding: 18px 26px 36px;
margin-bottom: 36px;
:deep(.el-descriptions__body) {
background: #f8f8f8;
}
:deep(.is-vertical-label) {
color: #999999;
font-size: 16px;
}
:deep(.is-vertical-content) {
color: #222222;
font-size: 16px;
}
.business-expand {
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
color: #177cfa;
}
}
.map-info {
height: 300px;
.map-addr {
display: flex;
align-items: center;
color: #177cfa;
font-size: 14px;
margin-bottom: 10px;
}
}
}
}
}
.label {
display: block;
box-sizing: border-box;
height: 26px;
background: #1c406e;
font-size: 12px;
border-radius: 4px;
padding: 0 10px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 8px;
}
.desc-title {
font-size: 18px;
color: #000000;
margin-bottom: 24px;
}
pre {
white-space: pre-wrap;
}
}
......@@ -25,12 +25,20 @@
color: #177cfa;
&:nth-child(5) {
border-right: 0;
border-radius: 0 8px 8px 0;
}
&:nth-child(1) {
border-radius: 8px 0 0 8px;
}
.active {
background-color: #177cfa;
}
}
.train-item-active {
background-color: #177cfa;
color: #ffffff;
}
}
}
}
......@@ -3,12 +3,18 @@
<div class="container">
<img :src="baseURL + '/' + skillTrainData?.HbData?.[0].FPOSTERPICTURE" height="560" />
<div class="train-list">
<div v-for="(item, index) in trainList" :key="index" class="train-item">
<div
v-for="(item, index) in trainList"
:key="index"
class="train-item"
:class="queryList.type === item.type ? 'train-item-active' : ''"
@click="handleChange(item)"
>
{{ item.name }}
</div>
</div>
<div style="margin-bottom: 360px">
<contentBlock :list="skillTrainData?.JcAqData" />
<contentBlock v-loading="subLoading" :list="skillTrainData?.JcAqData" />
</div>
</div>
</div>
......@@ -19,9 +25,11 @@ import { baseURL } from '@/services'
import { getSkillTraining, getSkillTrainingList } from '@/services/api/skillTraining'
import contentBlock from '@/components/contentBlock.vue'
const route = useRoute()
const loading = ref(true)
const subLoading = ref(true)
const queryList = ref({ pageIndex: 1, pageSize: 10, type: 'A' })
const skillTrainData: any = ref()
const skillTrainData: any = ref({})
const trainList = [
{ name: '基础安全培训', type: 'A' },
{ name: '专业技能培训', type: 'B' },
......@@ -30,15 +38,28 @@ const trainList = [
{ name: '团队管理培训', type: 'E' }
]
const handleChange = (row: any) => {}
const handleChange = (row: any) => {
queryList.value.type = row.type
initSkillTrainingList()
}
const initSkillTrainingList = async () => {
subLoading.value = true
const res: any = await getSkillTrainingList(queryList.value)
if (res.code === 200) {
skillTrainData.value.JcAqData = res.data
subLoading.value = false
}
}
const init = async () => {
if (route.query?.type) queryList.value.type = route.query?.type as string
const res: any = await getSkillTraining(queryList.value)
if (res.code === 200) {
console.log(res)
skillTrainData.value = res.data
skillTrainData.value.HbData = res.data.HbData
loading.value = false
}
initSkillTrainingList()
}
init()
......
......@@ -62,11 +62,11 @@
}
.special-tag {
cursor: pointer;
width: 88px;
cursor: default;
padding: 4px 16px;
height: 28px;
line-height: 28px;
text-align: center;
box-sizing: border-box;
background: #dcecff;
border-radius: 4px;
background-color: #dcecff;
......
......@@ -6,7 +6,10 @@
<div class="special-title">{{ item.FNAME }}</div>
<div class="special-detail">{{ item.FSUBTITLE }}</div>
<div class="flx-justify-between">
<span class="special-tag">进入专题</span>
<span v-show="!item.FSTATE" class="special-tag" style="cursor: pointer">进入专题</span>
<span v-show="item.FSTATE" class="special-tag" style="color: #666666; background: #f8f8f8"
>专题已结束</span
>
<span class="special-date">{{ item.FDATE }}</span>
</div>
<span class="piece">招聘</span>
......
......@@ -4,6 +4,46 @@
width: 1316px;
text-align: center;
.street-tp {
margin: 24px 0;
text-align: center;
.recruit {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
margin-top: 24px;
.recruit-item {
cursor: pointer;
flex-basis: calc(25% - 7.5px); /* 让每个盒子占据四分之一的宽度,并减去间距 */
margin-bottom: 15px; /* 设置下方的间距 */
&.recruit-item:nth-child(4n) {
margin-right: 0; /* 清除第4个盒子的右侧间距 */
}
img {
border-radius: 12px 12px 0px 0px;
display: block; /* 将图片设置为块级元素 */
max-width: 100%; /* 保证图片在其父元素内部自适应大小 */
// height: auto; /* 保持图片的宽高比 */
}
.recruit-item-detail {
width: 318px;
height: 50px;
background: #ffffff;
border-radius: 0px 0px 12px 12px;
color: #177cfa;
text-align: center;
font-size: 24px;
font-weight: 500;
line-height: 50px;
}
.recruit-item-detail-active {
background-color: #177cfa;
color: #ffffff;
}
}
}
}
.street-card {
height: 540px;
background: #ffffff;
......@@ -45,12 +85,17 @@
}
p {
width: 388px;
height: 240px;
height: 250px;
font-size: 14px;
font-weight: 400;
color: #333333;
line-height: 25px;
text-align: left;
display: -webkit-box;
-webkit-line-clamp: 10;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
.content-footer {
......@@ -190,5 +235,24 @@
}
}
}
.trapezoid {
position: absolute;
right: -14.1%;
top: 22%;
width: 29.5%;
border-bottom: 30px solid #ffffff;
border-left: 17px solid transparent;
transform: rotate(270deg);
}
.trapezoid1 {
position: absolute;
right: -14.1%;
bottom: 22%;
width: 29.5%;
border-top: 30px solid #ffffff;
border-left: 17px solid transparent;
transform: rotate(90deg);
}
}
}
<template>
<div class="street-container flx-center">
<div class="container">
<div class="street-tp">
<div class="recruit">
<div
v-for="(item, index) in streetList"
:key="index"
class="recruit-item"
@click="change(item.FID)"
>
<img :src="baseURL + '/' + item.FSTREETPICTURE" width="318" height="130" />
<div
class="recruit-item-detail"
:class="item.FID == streetAcive ? 'recruit-item-detail-active' : ''"
>
{{ item.FNAME }}
</div>
</div>
</div>
</div>
<div class="street-card">
<div style="position: relative">
<img src="@/assets/img/Frame377.png" width="850" />
<div class="street-card-triangle"></div>
<img :src="baseURL + '/' + streetDetail?.FSTREETPICTUREBIG" width="850" />
<div class="trapezoid"></div>
<div class="trapezoid1"></div>
</div>
<div class="street-card-content flx-center">
<div class="content-top">粤海街道概况</div>
<p>
南山区位于广东省深圳市中西部,地域由陆地与内伶仃岛、大铲岛、孖洲岛、大矾石岛、小矾石岛组成,地理坐标北纬22°24′~22°39′、东经113°47′~114°01′。行政区域东起车公庙与福田区毗邻,西至南头安乐村、赤尾村与宝安区相连,北靠羊台山与宝安区、龙华区接壤,南临蛇口港、大铲岛和内伶仃岛,东南隔深圳湾与香港元朗比邻,西南隔珠江口与澳门、珠海相望。地形为南北长、东西窄。辖区土地面积185.30平方千米,海岸线长43.7千米。东南距香港元朗5.5千米(直线距离,下同),东北距惠州61.6千米,西北距东莞61.3千米,西距广州102.4千米,西南距澳门59.1千米。
</p>
<div class="content-top">{{ streetOverview }}</div>
<p>{{ streetDetail?.FSTREETOVERVIEW }}</p>
<div class="content-footer">
查看更多<el-icon><i-ep-DArrowRight /></el-icon>
</div>
......@@ -19,10 +37,10 @@
<!-- 街道办 -->
<div class="sub-district-office">
<div class="n-title">粤海街道办</div>
<div class="n-title">{{ streetDetail?.FNAME }}</div>
<div class="sub-district-office-list">
<div
v-for="(item, index) in streetList"
v-for="(item, index) in streetData"
:key="index"
class="sub-district-office-item"
:style="{ backgroundColor: item.active ? '#177CFA' : '' }"
......@@ -32,9 +50,7 @@
<div v-show="item.active" class="sub-district-triangle"></div>
</div>
</div>
<div class="sub-district-office-detail">
{{ streetDetail }}
</div>
<div class="sub-district-office-detail">{{ overviewDetail }}</div>
</div>
<div class="hot-position">
......@@ -93,39 +109,76 @@
</template>
<script setup lang="ts">
const streetList = [
import { baseURL } from '@/services'
import { getStreet } from '@/services/api/streetOfficeSpecialTopic'
const route = useRoute()
const streetList: any = ref([])
const streetData = ref([
{
name: '街道概况',
active: true,
detail:
'南山区位于广东省深圳市中西部,地域由陆地与内伶仃岛、大铲岛、孖洲岛、大矾石岛、小矾石岛组成,地理坐标北纬22°24′~22°39′、东经113°47′~114°01′。行政区域东起车公庙与福田区毗邻,西至南头安乐村、赤尾村与宝安区相连,北靠羊台山与宝安区、龙华区接壤,南临蛇口港、大铲岛和内伶仃岛,东南隔深圳湾与香港元朗比邻,西南隔珠江口与澳门、珠海相望。地形为南北长、东西窄。辖区土地面积185.30平方千米,海岸线长43.7千米。东南距香港元朗5.5千米(直线距离,下同),'
prop: 'FSTREETOVERVIEW'
},
{
name: '工作时间',
active: false,
detail: '996'
prop: 'FWORKINGHOURS'
},
{
name: '工商信息',
active: false,
detail: '东南距香港元朗5.5千米(直线距离,下同)'
prop: 'FBUSINESSINFO'
},
{
name: '联系电话',
active: false,
detail: '1008600010101'
prop: 'FCONTACTNUMBER'
}
])
const streetAcive = ref()
const streetOverview = ref()
const streetDetail: any = ref()
const overviewDetail: any = ref()
watch(
() => streetAcive.value,
(newVal: any) => {
streetDetail.value = streetList.value.find((item: any) => item.FID == newVal)
overviewDetail.value = streetDetail.value?.FSTREETOVERVIEW
let result = streetDetail.value?.FNAME.match(/(.+)专题/)
result && result.length > 1
? (streetOverview.value = result[1] + '概况')
: streetDetail.value?.FNAME
// console.log(streetDetail.value)
}
]
)
const streetDetail = ref(streetList[0].detail)
const change = (FID: string) => {
streetAcive.value = FID
}
const streeChange = (index: number) => {
streetList.map((item: any, i: number) => {
if (index === i) item.active = true
else item.active = false
streetData.value.map((item: any, i: number) => {
if (index === i) {
item.active = true
overviewDetail.value = streetDetail.value[item.prop]
} else item.active = false
})
streetDetail.value = streetList[index].detail
}
const init = async () => {
const res: any = await getStreet()
if (res.code === 200) {
streetList.value = res.data.sort((a: any, b: any) => a.FSERIALNUMBER - b.FSERIALNUMBER)
const { FID } = route.query
if (!FID) streetAcive.value = streetList.value[0].FID
else streetAcive.value = FID
}
}
init()
</script>
<style lang="scss" scoped>
......
/* eslint-disable */
declare module '*.vue' {
import type { DefineComponent } from 'vue'
const component: DefineComponent<{}, {}, any>
export default component
}
\ No newline at end of file
import type { DefineComponent } from 'vue'
const component: DefineComponent<{}, {}, any>
export default component
}
declare module '*.json' {
const value: any
export default value
}
......@@ -8,6 +8,7 @@ declare global {
const EffectScope: typeof import('vue')['EffectScope']
const ElMessage: typeof import('element-plus/es')['ElMessage']
const ElMessageBox: typeof import('element-plus/es')['ElMessageBox']
const ElNotification: typeof import('element-plus/es')['ElNotification']
const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
const computed: typeof import('vue')['computed']
const createApp: typeof import('vue')['createApp']
......
......@@ -10,14 +10,19 @@ declare module 'vue' {
CommonDetail: typeof import('./../src/components/commonDetail.vue')['default']
ContentBlock: typeof import('./../src/components/contentBlock.vue')['default']
CustomSelect: typeof import('./../src/components/customSelect.vue')['default']
DragUpload: typeof import('./../src/components/dragUpload.vue')['default']
ElAvatar: typeof import('element-plus/es')['ElAvatar']
ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
ElButton: typeof import('element-plus/es')['ElButton']
ElCascader: typeof import('element-plus/es')['ElCascader']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCol: typeof import('element-plus/es')['ElCol']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
ElContainer: typeof import('element-plus/es')['ElContainer']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
ElDialog: typeof import('element-plus/es')['ElDialog']
ElDivider: typeof import('element-plus/es')['ElDivider']
ElDropdown: typeof import('element-plus/es')['ElDropdown']
......@@ -36,6 +41,7 @@ declare module 'vue' {
ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElRate: typeof import('element-plus/es')['ElRate']
ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElTabPane: typeof import('element-plus/es')['ElTabPane']
......@@ -46,13 +52,18 @@ declare module 'vue' {
IEpCaretBottom: typeof import('~icons/ep/caret-bottom')['default']
IEpCaretTop: typeof import('~icons/ep/caret-top')['default']
IEpCheck: typeof import('~icons/ep/check')['default']
IEpCirclePlusFilled: typeof import('~icons/ep/circle-plus-filled')['default']
IEpDArrowRight: typeof import('~icons/ep/d-arrow-right')['default']
IEpEditPen: typeof import('~icons/ep/edit-pen')['default']
IEpLocation: typeof import('~icons/ep/location')['default']
IEpLocationFilled: typeof import('~icons/ep/location-filled')['default']
IEpMoreFilled: typeof import('~icons/ep/more-filled')['default']
IEpOfficeBuilding: typeof import('~icons/ep/office-building')['default']
IEpPlus: typeof import('~icons/ep/plus')['default']
IEpSearch: typeof import('~icons/ep/search')['default']
IEpView: typeof import('~icons/ep/view')['default']
Policy: typeof import('./../src/components/policy.vue')['default']
QqMap: typeof import('./../src/components/qqMap.vue')['default']
RichTextEditor: typeof import('./../src/components/RichTextEditor.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
......@@ -60,6 +71,7 @@ declare module 'vue' {
VerificationCode: typeof import('./../src/components/verificationCode.vue')['default']
}
export interface ComponentCustomProperties {
vInfiniteScroll: typeof import('element-plus/es')['ElInfiniteScroll']
vLoading: typeof import('element-plus/es')['ElLoadingDirective']
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论