提交 a1d48a04 authored 作者: 刘旭's avatar 刘旭

更新代码

上级 7ac70def
......@@ -13,15 +13,19 @@
"dependencies": {
"@element-plus/icons-vue": "^2.1.0",
"@types/node": "^20.4.4",
"@vue-office/docx": "^1.3.1",
"@vue-office/pdf": "^1.5.5",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.4.0",
"dayjs": "^1.11.10",
"element-plus": "^2.3.8",
"mockjs": "^1.1.0",
"pinia": "^2.1.4",
"pinia-plugin-persistedstate": "^3.2.0",
"sass": "^1.64.1",
"vue": "^3.3.4",
"vue-demi": "^0.14.6",
"vue-dompurify-html": "^4.1.4",
"vue-router": "4",
"vue-scrollto": "^2.20.0"
......
......@@ -11,6 +11,12 @@ dependencies:
'@types/node':
specifier: ^20.4.4
version: 20.4.4
'@vue-office/docx':
specifier: ^1.3.1
version: 1.3.1(vue-demi@0.14.6)(vue@3.3.4)
'@vue-office/pdf':
specifier: ^1.5.5
version: 1.5.5(vue-demi@0.14.6)(vue@3.3.4)
'@wangeditor/editor':
specifier: ^5.1.23
version: 5.1.23
......@@ -20,6 +26,9 @@ dependencies:
axios:
specifier: ^1.4.0
version: 1.4.0
dayjs:
specifier: ^1.11.10
version: 1.11.10
element-plus:
specifier: ^2.3.8
version: 2.3.8(vue@3.3.4)
......@@ -38,6 +47,9 @@ dependencies:
vue:
specifier: ^3.3.4
version: 3.3.4
vue-demi:
specifier: ^0.14.6
version: 0.14.6(vue@3.3.4)
vue-dompurify-html:
specifier: ^4.1.4
version: 4.1.4(vue@3.3.4)
......@@ -998,6 +1010,36 @@ packages:
'@volar/language-core': 1.9.1
dev: true
/@vue-office/docx@1.3.1(vue-demi@0.14.6)(vue@3.3.4):
resolution: {integrity: sha512-S0FJl3EZOuvqrWq7Cb060KSDVB4fDAlNBh6HI3JBoI7ZwyvG8FTmrfZWwx7svBb/+m70XBp6iM5p6YUsKGsYHQ==}
requiresBuild: true
peerDependencies:
'@vue/composition-api': ^1.7.1
vue: ^2.0.0 || >=3.0.0
vue-demi: ^0.13.11
peerDependenciesMeta:
'@vue/composition-api':
optional: true
dependencies:
vue: 3.3.4
vue-demi: 0.14.6(vue@3.3.4)
dev: false
/@vue-office/pdf@1.5.5(vue-demi@0.14.6)(vue@3.3.4):
resolution: {integrity: sha512-WjybKkhKl0zKtmtxTC7Z0ws6cZCjWtZ96KowZ1JgNClUrXz8Y3oT69c3kJzVL4RnHnz5ApMUaa4gTrhb4VreQw==}
requiresBuild: true
peerDependencies:
'@vue/composition-api': ^1.7.1
vue: ^2.0.0 || >=3.0.0
vue-demi: ^0.13.11
peerDependenciesMeta:
'@vue/composition-api':
optional: true
dependencies:
vue: 3.3.4
vue-demi: 0.14.6(vue@3.3.4)
dev: false
/@vue/compiler-core@3.3.4:
resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==}
dependencies:
......@@ -1109,7 +1151,7 @@ packages:
'@types/web-bluetooth': 0.0.16
'@vueuse/metadata': 9.13.0
'@vueuse/shared': 9.13.0(vue@3.3.4)
vue-demi: 0.14.5(vue@3.3.4)
vue-demi: 0.14.6(vue@3.3.4)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
......@@ -1122,7 +1164,7 @@ packages:
/@vueuse/shared@9.13.0(vue@3.3.4):
resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
dependencies:
vue-demi: 0.14.5(vue@3.3.4)
vue-demi: 0.14.6(vue@3.3.4)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
......@@ -1573,8 +1615,8 @@ packages:
type: 1.2.0
dev: false
/dayjs@1.11.9:
resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==}
/dayjs@1.11.10:
resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==}
dev: false
/de-indent@1.0.2:
......@@ -1666,7 +1708,7 @@ packages:
'@types/lodash-es': 4.17.8
'@vueuse/core': 9.13.0(vue@3.3.4)
async-validator: 4.2.5
dayjs: 1.11.9
dayjs: 1.11.10
escape-html: 1.0.3
lodash: 4.17.21
lodash-es: 4.17.21
......@@ -2686,7 +2728,7 @@ packages:
'@vue/devtools-api': 6.5.0
typescript: 5.1.6
vue: 3.3.4
vue-demi: 0.14.5(vue@3.3.4)
vue-demi: 0.14.6(vue@3.3.4)
dev: false
/pkg-types@1.0.3:
......@@ -3247,8 +3289,8 @@ packages:
fsevents: 2.3.2
dev: true
/vue-demi@0.14.5(vue@3.3.4):
resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==}
/vue-demi@0.14.6(vue@3.3.4):
resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
......@@ -3269,7 +3311,7 @@ packages:
dependencies:
dompurify: 3.0.6
vue: 3.3.4
vue-demi: 0.14.5(vue@3.3.4)
vue-demi: 0.14.6(vue@3.3.4)
transitivePeerDependencies:
- '@vue/composition-api'
dev: false
......
......@@ -52,7 +52,7 @@
class="flx-align-center"
style="color: #177cfa"
>
<el-avatar :src="baseURL + '/' + personalInfo?.F_LQKJ_Photos" />
<el-avatar :src="baseURL + '/' + personalInfo?.FPHOTOS" />
<span
style="margin-left: 8px; width: 95px"
class="nowrap-ellipsis"
......
<template>
<div class="layout-container">
<el-container>
<el-header>
<el-header ref="headerRef">
<Headers />
</el-header>
<el-main>
<el-main :style="{ minHeight: minHeight + 'px' }">
<keep-alive>
<router-view></router-view>
</keep-alive>
</el-main>
<div class="footer">
<div ref="footerRef" class="footer">
<Footer />
</div>
</el-container>
......@@ -19,6 +19,14 @@
<script setup lang="ts">
import Headers from './headers.vue'
import Footer from './footer.vue'
const headerRef: any = ref(null)
const footerRef: any = ref(null)
const minHeight: any = ref(200)
onMounted(() => {
const viewportHeight = window.innerHeight
minHeight.value = viewportHeight - headerRef.value.$el.offsetHeight - footerRef.value.offsetHeight
})
</script>
<style lang="scss" scoped>
......
<template>
<div class="search-group">
<el-autocomplete
v-model="searchValue"
:placeholder="placeholder"
class="input-with-select"
:value-key="valueKey"
:fetch-suggestions="querySearchAsync"
@select="handleSelect"
@change="handleChange"
>
<template #prefix>
<el-select v-model="selectValue" placeholder="">
<el-option
v-for="(item, index) in selectOptions"
:key="index"
:label="item.label"
:value="item.value"
/>
</el-select>
</template>
<template #suffix>
<el-icon size="25" style="cursor: pointer" @click="handleChange"><i-ep-Search /></el-icon>
</template>
</el-autocomplete>
</div>
</template>
<script setup lang="ts">
const props = defineProps({
valueKey: {
type: String,
default: 'JobName'
},
placeholder: {
type: String,
default: '请输入搜索关键字'
},
selectOptions: {
type: Array,
default: () => [
{ label: '找工作', value: 1 },
{ label: '找企业', value: 2 }
]
} as any,
list: {
type: Array,
default: () => []
} as any
})
let timeout: ReturnType<typeof setTimeout>
const searchValue = ref()
const selectValue = ref(1)
const emits = defineEmits(['searchChange', 'querySearchAsync'])
const querySearchAsync = async (queryString: string, cb: (arg: any) => void) => {
emits('querySearchAsync', searchValue.value)
clearTimeout(timeout)
timeout = setTimeout(() => {
cb(props.list)
}, 100)
}
const handleSelect = (item: Record<string, any>) => {
emits('searchChange', item.JobName)
}
const handleChange = () => {
emits('searchChange', searchValue.value)
}
defineExpose({ searchValue })
</script>
<style lang="scss" scoped>
.search-group {
width: 920px;
height: 62px;
:deep(.el-autocomplete) {
height: 100%;
width: 100%;
.el-input {
height: 100%;
.el-input__wrapper {
border-radius: 29px;
padding: 0 46px 0 35px;
.el-select {
width: 86px;
.el-input__wrapper {
border-radius: 0;
padding: 0;
}
}
}
}
}
:deep(.input-with-select .el-input-group__prepend) {
width: 70px;
height: 100%;
padding-left: 40px;
border: none;
border-bottom-left-radius: 29px;
border-top-left-radius: 29px;
background-color: #fff;
font-weight: 500;
font-size: 16px;
line-height: 60px;
font-family: Source Han Sans CN;
color: #666;
.el-input__wrapper {
box-shadow: none;
&.is-focus {
box-shadow: none !important;
}
&:hover {
box-shadow: none !important;
}
}
.el-select {
border: 0;
}
}
:deep(.input-with-select > .el-input__wrapper) {
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;
margin-top: 1px;
&.is-focus {
box-shadow: none !important;
outline: 0;
}
&:hover {
box-shadow: none !important;
}
}
:deep(.el-input-group__append) {
padding-right: 45px;
border: none;
border-bottom-right-radius: 29px;
border-top-right-radius: 29px;
background-color: #fff;
}
}
</style>
......@@ -20,7 +20,6 @@ defineProps({
const emits = defineEmits(['change'])
const change = (row: any) => {
// console.log(row)
emits('change', row)
}
</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"
:action="action"
:data="data"
:accept="fileAccept"
multiple
:headers="{ Authorization: globalStore.token }"
:show-file-list="false"
:before-upload="handleBeforeUpload"
:on-success="handleAvatarSuccess"
>
<div class="flx-center-column">
<div class="upload-title">拖拽文件到这里或点击上传简历</div>
......@@ -18,14 +22,56 @@
</template>
<script setup lang="ts">
defineProps({
import type { UploadProps } from 'element-plus'
import { useGlobalStore } from '@/stores/modules/global'
const globalStore = useGlobalStore()
const props = defineProps({
show: {
type: Boolean,
default: false
},
action: {
type: String,
default: ''
},
data: {
type: Object,
default: () => {}
},
fileAccept: {
type: String,
default: '.pdf,.doc,.docx,.jpg,.png'
},
message: {
type: String,
default: ''
}
})
const emits = defineEmits(['update:show'])
const emits = defineEmits(['update:show', 'init'])
const handleBeforeUpload = (file: any) => {
const isLt20M = file.size / 1024 / 1024 < 20
if (!isLt20M) {
ElMessage.warning('文件大小超过20MB限制')
}
return isLt20M
}
const handleAvatarSuccess: UploadProps['onSuccess'] = res => {
if (res.code === 200) {
ElNotification.success({
title: props.message,
message: '上传成功'
})
emits('init')
handleClose()
} else {
ElMessage.error(res.msg)
}
}
const handleClose = () => {
emits('update:show', false)
......
<template>
<el-dialog :modelValue="show" :title="title" @close="handleClose">
<div style="display: flex; justify-content: center; width: 100%">
<vue-office-docx
v-if="suffix === 'docx'"
:src="url"
style="height: 100vh"
@rendered="rendered"
/>
<iframe
v-else-if="suffix === 'doc'"
class="child"
frameborder="0"
:src="
'http://view.xdocin.com/xdoc?_xdoc=' + encodeURIComponent('http://192.168.1.168' + url)
"
/>
<vue-office-pdf
v-else-if="suffix === 'pdf'"
:src="url"
@rendered="renderedHandler"
@error="errorHandler"
/>
<img v-else :src="url" style="min-width: 725px" />
</div>
</el-dialog>
</template>
<script setup lang="ts">
//引入VueOfficeDocx组件
import VueOfficeDocx from '@vue-office/docx'
import VueOfficePdf from '@vue-office/pdf'
//引入相关样式
import '@vue-office/docx/lib/index.css'
defineProps({
show: {
type: Boolean,
default: false
},
suffix: {
type: String,
default: ''
},
url: {
type: String,
default: ''
},
title: {
type: String,
default: ''
}
})
const emits = defineEmits(['update:show'])
// docx 渲染进度
const rendered = () => {
console.log('渲染完成')
}
// docx 渲染pdf
const renderedHandler = () => {
console.log('渲染完成')
}
const errorHandler = () => {
console.log('渲染完成')
}
const handleClose = () => {
emits('update:show', false)
}
</script>
<style lang="scss" scoped>
.child {
width: 100%;
height: calc(100vh - 70px);
border: 0;
}
</style>
......@@ -52,6 +52,10 @@ const routes = [
component: () => import('@/views/recruitmentManagement/positionDetail.vue')
},
{
path: '/recruitmentManagement/addAdmin',
component: () => import('@/views/recruitmentManagement/addAdmin.vue')
},
{
path: '/specialRecruitment',
component: () => import('@/views/specialRecruitment/index.vue')
},
......
......@@ -31,6 +31,13 @@ export const getCompanyInfo = (data: any) => {
)
}
// 企业查询企业信息
export const getAdminCompanyInfo = () => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeEnterpriseInfoQY,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc'
)
}
// 企业修改企业信息
export const editCompanyInfo = (data: any) => {
return request.post(
......@@ -47,13 +54,27 @@ export const getCompanyPositionList = (data: any) => {
)
}
// 企业端岗位管理列表
// 预览企业端岗位管理内容
export const getCompanyPositionDetail = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeJobContent,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 查询企业端岗位管理内容
export const getEditPositionDetail = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeJobContentUp,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 删除企业端岗位
export const deleteCompanyPosition = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.DelteJobs,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 个人用户查询详细岗位列表
export const getUserPostionList = (data: any) => {
......@@ -77,3 +98,23 @@ export const addAdmin = (data: any) => {
data
)
}
// 个人用户查看简历信息
export const getResume = () => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeResumeInfoGR,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc'
)
}
// 个人用户修改简历信息
export const updateResume = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.UpdateResumeInfo,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 个人用户删除简历信息
export const deleteResume = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.DeleteResumeInfo,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
......@@ -8,14 +8,18 @@
border-radius: 12px;
margin: 17px 0 19px;
}
.el-input {
:deep(.el-autocomplete) {
width: 869px;
height: 62px;
margin-bottom: 24px;
:deep(.el-input__wrapper) {
border-radius: 29px;
padding: 0 45px;
.el-input {
width: 869px;
height: 62px;
margin-bottom: 24px;
.el-input__wrapper {
border-radius: 29px;
padding: 0 45px;
}
}
}
}
......
......@@ -2,11 +2,20 @@
<div v-loading="loading" class="policy-container flx-center">
<div class="container">
<img :src="baseURL + '/' + policyData.posterUrl" height="560" style="width: 100%" />
<el-input v-model="searchValue" placeholder="搜索关键词" @change="search">
<el-autocomplete
v-model="searchValue"
value-key="FTITLE"
:fetch-suggestions="querySearchAsync"
placeholder="搜索关键词"
@select="search"
>
<template #suffix>
<el-icon size="24" style="cursor: pointer" @click="search"><i-ep-Search /></el-icon>
<el-icon size="24" style="cursor: pointer" @click="querySearchAsync"
><i-ep-Search
/></el-icon>
</template>
</el-input>
</el-autocomplete>
<div class="flx-justify-between" style="margin-bottom: 64px; align-items: start">
<policy
title="南山就业政策公告"
......@@ -44,9 +53,30 @@ const policyData: any = reactive({
activityData: [] as any,
activityParams: { pageIndex: 1, pageSize: 10, total: 10 }
})
let timeout: ReturnType<typeof setTimeout>
const querySearchAsync = async (queryString: string, cb: (arg: any) => void) => {
const res: any = await getPolicyList({
pageIndex: 1,
pageSize: 10,
Type: 2,
FTITLE: searchValue.value
})
if (res.code === 200) {
let results = res.data
clearTimeout(timeout)
timeout = setTimeout(() => {
cb(results)
}, 500)
}
}
const search = () => {
console.log(searchValue.value)
const search = (item: Record<string, any>) => {
if (!searchValue.value) return
router.push({
path: '/commonDetail',
query: { FID: item.FID, FormType: 'B', FTITLE: item.FTITLE }
})
}
const seeMore = async (Type: number) => {
......@@ -75,7 +105,6 @@ const handleChange = (row: any) => {
const init = async () => {
const res: any = await getPolicy(queryList.value)
if (res.code === 200) {
console.log(res)
policyData.posterUrl = res.data?.HbData?.[0].FPOSTERPICTURE
policyData.noticeData = res.data?.GgData
policyData.activityData = res.data?.HdData
......
<template>
<div class="admin-container">
<div class="container">
<div class="content">
<div class="title">添加管理员</div>
<el-form
ref="formRef"
:model="state.form"
:rules="state.rules"
label-width="100px"
label-position="left"
hide-required-asterisk
>
<el-form-item label="姓名:" prop="FUserName">
<el-input v-model="state.form.FUserName" placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="手机号:" prop="FUserPhoneS">
<el-input v-model="state.form.FUserPhoneS" placeholder="请输入手机号" />
</el-form-item>
<el-form-item label="职位:" prop="FJobTitle">
<el-input v-model="state.form.FJobTitle" placeholder="请输入职位" />
</el-form-item>
</el-form>
</div>
<div class="confirm">
<span @click="submit">确定</span>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { addAdmin } from '@/services/api/recruitmentManagement'
const router = useRouter()
const state = reactive({
form: {
FUserName: '',
FUserPhoneS: '',
FJobTitle: ''
},
rules: {
FUserPhoneS: [
{ required: true, message: '请输入手机号', trigger: 'blur' },
{
pattern: /^1[3|4|5|6|7|8][0-9]\d{8}$/,
message: '手机号码格式不正确',
trigger: 'blur'
}
],
FUserName: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
FJobTitle: [{ required: true, message: '请输入职位', trigger: 'blur' }]
}
})
const formRef = ref()
const submit = async () => {
formRef.value.validate(async (valid: boolean, fields: any) => {
if (valid) {
ElMessageBox.confirm('确定添加管理员?', '添加管理员', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
})
.then(async () => {
let data = {
Parmeter: {
IsDeleteEntry: 'false',
Model: {
FID: 0, //无需填写
F_LQKJ_EnterpriseUserEntity: [
{
FEntryID: 0,
FUserPhoneS: '', //手机号
FUserName: '', //名称
FJobTitle: '' //职位
}
]
}
}
}
data.Parmeter.Model.F_LQKJ_EnterpriseUserEntity[0] = {
...data.Parmeter.Model.F_LQKJ_EnterpriseUserEntity[0],
...state.form
}
console.log(data.Parmeter.Model)
const res: any = await addAdmin(data)
if (res.code === 200) {
ElNotification({
title: '添加管理员',
message: res.msg,
type: 'success'
})
router.back()
}
})
.catch(() => {})
}
})
}
</script>
<style lang="scss" scoped>
.admin-container {
display: flex;
justify-content: center;
margin: 24px 0 46px;
.container {
width: 1316px;
.content {
padding: 24px 36px;
background: #ffffff;
box-shadow: 0px 1px 25px 0px rgba(0, 0, 0, 0.05);
border-radius: 8px;
display: flex;
align-items: center;
flex-direction: column;
.title {
font-size: 24px;
font-weight: 500;
color: #177cfa;
text-align: center;
margin-bottom: 16px;
}
.el-form {
width: 600px;
margin-top: 20px;
}
}
.confirm {
display: flex;
justify-content: center;
text-align: center;
span {
display: block;
font-size: 20px;
font-weight: 500;
color: #ffffff;
margin-top: 36px;
width: 160px;
height: 52px;
line-height: 52px;
background: linear-gradient(90deg, #177cfa 0%, #177cfa 100%);
border-radius: 8px;
cursor: pointer;
}
}
}
}
</style>
......@@ -6,6 +6,7 @@
:rules="state.rules"
hide-required-asterisk
label-position="top"
:disabled="disabled"
>
<el-row :gutter="8">
<el-col v-for="(item, index) in state.list" :key="index" :span="item.span">
......@@ -27,6 +28,13 @@
</template>
<script setup lang="ts">
defineProps({
disabled: {
type: Boolean,
default: false
}
})
const formRef = ref()
const state = reactive({
form: {
......@@ -90,7 +98,7 @@ const state = reactive({
],
FDateApproval: [{ required: true, message: '请输入核准日期', trigger: 'blur' }],
FRegistrationAuthority: [{ required: true, message: '请输入登记机关', trigger: 'blur' }],
FPreviouslyName: [{ required: true, message: '请输入曾用名', trigger: 'blur' }],
// FPreviouslyName: [{ required: true, message: '请输入曾用名', trigger: 'blur' }],
FFIndustryGS: [{ required: true, message: '请输入所属行业', trigger: 'blur' }],
FBusinessScope: [{ required: true, message: '请输入经营范围', trigger: 'blur' }]
}
......@@ -105,7 +113,7 @@ const formCheck = async () => {
}
defineExpose({
form: state.form,
...toRefs(state),
formCheck
})
</script>
......
<template>
<div v-show="show" class="edit-expected-position">
<el-form :model="userInfoData" label-position="top">
<el-form
ref="formRef"
:model="form"
:rules="rules"
hide-required-asterisk
label-position="top"
@close="handleClose"
>
<el-row :gutter="28">
<el-col :span="12">
<el-form-item label="学校名称">
<el-input v-model="userInfoData.name" size="large" placeholder="请输入学校名称" />
<el-form-item label="学校名称" prop="FLearningName">
<el-input v-model="form.FLearningName" size="large" placeholder="请输入学校名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学制类型">
<el-form-item label="学制类型" prop="FTypeSchooling">
<el-select
v-model="userInfoData.region"
v-model="form.FTypeSchooling"
size="large"
placeholder="请选择学制类型"
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
<el-option label="全日制" value="A" />
<el-option label="非全日制" value="B" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学历">
<el-form-item label="学历" prop="FEducationBackground">
<el-select
v-model="userInfoData.region"
v-model="form.FEducationBackground"
size="large"
placeholder="请选择学历"
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
<el-option
v-for="item in informationData?.Degree2"
:key="item.FNUMBER"
:label="item.FDATAVALUE"
:value="item.FNUMBER"
/>
</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 label="专业" prop="FSpecialty">
<el-input v-model="form.FSpecialty" size="large" placeholder="请输入专业" />
</el-form-item>
</el-col>
<el-col :span="12" class="flx-align-center">
<el-form-item label="在校时间">
<el-col :span="12" class="flx-align-center" style="display: flex; align-items: end">
<el-form-item label="在校时间" prop="FStartTime">
<el-date-picker
v-model="userInfoData.date"
type="date"
v-model="form.FStartTime"
type="month"
placeholder="入学时间"
size="large"
:disabled-date="disabledDate"
/>
<span style="margin: 0 16px"></span>
</el-form-item>
<span style="margin: 0 16px 28px"></span>
<el-form-item label="" prop="FEndTime">
<el-date-picker
v-model="userInfoData.date1"
type="date"
v-model="form.FEndTime"
type="month"
placeholder="毕业时间"
size="large"
:disabled-date="disabledDate"
/>
</el-form-item>
</el-col>
......@@ -64,7 +79,7 @@
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
v-model="form.FSchoolExperience_Tag"
type="textarea"
show-word-limit
:maxlength="300"
......@@ -76,7 +91,7 @@
<el-col>
<el-form-item label="毕业设计/论文题目(选填)">
<el-input
v-model="userInfoData.textareaVal"
v-model="form.FThesisTitle"
size="large"
placeholder="请输入毕业设计/论文题目"
/>
......@@ -88,7 +103,7 @@
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
v-model="form.FThesisDescription_Tag"
type="textarea"
show-word-limit
:maxlength="600"
......@@ -98,10 +113,17 @@
</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" style="width: 100px" @click="handleClose">取消</el-button>
<el-button size="large" type="primary" style="width: 100px" @click="onConfirm"
>完成</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
<el-icon
v-show="form.FEntryID"
color="#177CFA"
style="margin-left: 30px"
@click="delResume"
><i-ep-DeleteFilled
/></el-icon>
</el-col>
</el-row>
</el-form>
......@@ -109,16 +131,131 @@
</template>
<script setup lang="ts">
import { updateResume, deleteResume } from '@/services/api/recruitmentManagement'
defineProps({
show: {
type: Boolean,
default: false
},
informationData: {
type: Object,
default: () => {}
}
})
const emits = defineEmits(['update:show'])
const emits = defineEmits(['update:show', 'init'])
const formRef = ref()
const form: any = ref({
FEntryID: 0,
FLearningName: '', //学校名称
FTypeSchooling: '', //学制类型
FEducationBackground: '', //学历
FSpecialty: '', //专业
FStartTime: '', //开始时间(日期)
FEndTime: '', //结束时间(日期)
FSchoolExperience: '', //无需填写
FSchoolExperience_Tag: '', //在校经历
FThesisTitle: '', //毕业设计/论文题目
FThesisDescription: '', //无需填写
FThesisDescription_Tag: '' //毕业设计/论文描述
})
const rules = {
FLearningName: [{ required: true, message: '请输入学校名称', trigger: 'blur' }],
FTypeSchooling: [{ required: true, message: '请输入学制类型', trigger: 'blur' }],
FEducationBackground: [{ required: true, message: '请输入学历', trigger: 'blur' }],
FSpecialty: [{ required: true, message: '请输入专业', trigger: 'blur' }],
FStartTime: [{ required: true, message: '请选择开始时间', trigger: 'change' }],
FEndTime: [{ required: true, message: '请选择结束时间', trigger: 'change' }]
}
const disabledDate = (time: Date) => {
return time.getTime() > Date.now()
}
const filterChange = () => {
let data = {
Parmeter: {
NeedUpDateFields: [
'FLearningName',
'FTypeSchooling',
'FEducationBackground',
'FSpecialty',
'FStartTime',
'FEndTime',
'FSchoolExperience',
'FSchoolExperience_Tag',
'FThesisTitle',
'FThesisDescription',
'FThesisDescription_Tag'
],
IsDeleteEntry: 'false',
Model: {
FID: 0,
F_LQKJ_EducationalExperEntryS: [
{
FEntryID: 0,
FLearningName: '', //学校名称
FTypeSchooling: '', //学制类型
FEducationBackground: {
FNumber: ''
}, //学历
FSpecialty: '', //专业
FStartTime: '', //开始时间(日期)
FEndTime: '', //结束时间(日期)
FSchoolExperience: '', //无需填写
FSchoolExperience_Tag: '', //在校经历
FThesisTitle: '', //毕业设计/论文题目
FThesisDescription: '', //无需填写
FThesisDescription_Tag: '' //毕业设计/论文描述
}
]
}
}
}
data.Parmeter.Model.F_LQKJ_EducationalExperEntryS[0] = {
...data.Parmeter.Model.F_LQKJ_EducationalExperEntryS[0],
...form.value,
FEducationBackground: { FNumber: form.value.FEducationBackground }
}
return data
}
const onConfirm = async () => {
await formRef.value?.validate(async (valid: boolean) => {
if (valid) {
let data = filterChange()
const res: any = await updateResume(data)
if (res.code === 200) {
ElNotification.success({
title: `${form.value.FEntryID ? '更新' : '添加'}教育经历`,
message: '更新成功'
})
handleClose()
emits('init')
}
}
})
}
const userInfoData: any = ref({})
const delResume = async () => {
const res: any = await deleteResume({ Type: 'D', ID: form.value.FEntryID })
if (res.code === 200) {
handleClose()
emits('init')
}
}
const handleClose = () => {
formRef.value?.resetFields()
emits('update:show', false)
}
defineExpose({
form
})
</script>
<style lang="scss" scoped>
......
<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" />
<el-form
ref="formRef"
:model="form.Parmeter.Model"
:rules="rules"
hide-required-asterisk
@close="handleClose"
>
<el-form-item label="" prop="FPersonalStrengths">
<el-input
v-model="form.Parmeter.Model.FPersonalStrengths"
type="textarea"
show-word-limit
:maxlength="500"
:rows="8"
/>
</el-form-item>
</el-form>
<div class="edit-resume-btn">
<el-button size="large" style="width: 100px" @click="emits('update:show', false)"
>取消</el-button
<el-button size="large" style="width: 100px" @click="handleClose">取消</el-button>
<el-button size="large" type="primary" style="width: 100px" @click="onConfirm"
>完成</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
</div>
</div>
</template>
<script setup lang="ts">
import { updateResume } from '@/services/api/recruitmentManagement'
defineProps({
show: {
type: Boolean,
......@@ -19,9 +37,49 @@ defineProps({
}
})
const emits = defineEmits(['update:show'])
const emits = defineEmits(['update:show', 'init'])
const form: any = ref({
Parmeter: {
NeedUpDateFields: ['FPersonalStrengths'],
IsDeleteEntry: 'false',
Model: {
FID: 0,
FPersonalStrengths: ''
}
}
})
const rules = {
FPersonalStrengths: [{ required: true, message: '个人优势不能为空', trigger: 'blur' }]
}
const formRef = ref()
const onConfirm = async () => {
await formRef.value?.validate(async (valid: boolean) => {
if (valid) {
const res: any = await updateResume(form.value)
if (res.code === 200) {
ElNotification.success({
title: '更新个人优势',
message: '更新成功'
})
handleClose()
emits('init')
}
}
})
}
const handleClose = () => {
formRef.value?.resetFields()
emits('update:show', false)
}
const textareaVal = ref()
defineExpose({
form
})
</script>
<style lang="scss" scoped>
......
......@@ -23,10 +23,12 @@
<el-divider direction="vertical" />
<span class="position-label">{{ item.FEXPERIENCE }}</span>
<el-divider direction="vertical" />
<span class="position-label">{{ item.FRECRUITSNUMBER }}</span>
<span class="position-label">招聘{{ item.FRECRUITSNUMBER }}</span>
<el-divider direction="vertical" />
<span class="position-label"
>{{ item.FMINIMUMWAGE }}-{{ item.FMAXIMUMSALARY }}.{{ item.FMONTHLYSALARY }}</span
>{{ item.FMINIMUMWAGE }}-{{ item.FMAXIMUMSALARY }}.{{
item.FMONTHLYSALARY.replace('月', '')
}}</span
>
<el-divider direction="vertical" />
<span class="position-label">{{ '全职' }}</span>
......@@ -38,13 +40,13 @@
<span @click="updateStatus(item)">{{
item.FPOSITIONSTATUS === 'A' ? '关闭' : '开放'
}}</span>
<span>编辑</span>
<span @click="updatePosition(item.FID)">编辑</span>
<span @click="preview(item.FID)">预览</span>
<span @click="deletePosition(item)">删除</span>
</div>
</div>
</div>
<el-empty v-else description="暂无未添加" />
<el-empty v-else description="暂未添加职位" />
<el-pagination
background
layout="->, prev, pager, next"
......@@ -62,7 +64,8 @@ import { positionList } from '../config/index'
import {
getCompanyPositionList,
updatePositionStatus,
getCompanyPositionDetail
getCompanyPositionDetail,
deleteCompanyPosition
} from '@/services/api/recruitmentManagement'
import previewPosition from './previewPosition.vue'
......@@ -88,6 +91,10 @@ const toEditPosition = () => {
router.push('/recruitmentManagement/editPosition')
}
const updatePosition = (FID: string) => {
router.push({ path: '/recruitmentManagement/editPosition', query: { FID } })
}
const preview = (FID: string) => {
initCompanyPositionDetail(FID)
setTimeout(() => {
......@@ -125,14 +132,11 @@ const deletePosition = (row: any) => {
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' ? '开放职位成功' : '关闭职位成功')
// }
const res: any = await deleteCompanyPosition({ FID: row.FID })
if (res.code === 200) {
initCompanyPositionList()
ElMessage.success('删除职位成功')
}
})
.catch(() => {})
}
......@@ -149,7 +153,7 @@ const initCompanyPositionList = async () => {
const res: any = await getCompanyPositionList(positionQuery.value)
// console.log(res)
if (res.code === 200) {
positionData.value = res.data
positionData.value = res.data || []
total.value = res.total
loading.value = false
}
......
<template>
<el-dialog :modelValue="show" title="简历预览" width="70%" :before-close="handleClose">
<div class="resumen-content">
<div class="resumen-content-header">
<img :src="baseURL + '/' + data?.FPhotosUrl" />
<div>
<div class="resumen-content-header__tp">
<span class="name">{{ data?.Jbdata.FName }}</span>
<span>{{ data?.Jbdata.Age + '岁' }}</span>
<el-divider direction="vertical" />
<span>{{ data?.Jbdata.FSex === '0' ? '男' : '女' }}</span>
<el-divider direction="vertical" />
<span>{{
data?.Jbdata.FGoWorkCount > 10 ? '10年以上经验' : data?.Jbdata.FGoWorkCount + '年'
}}</span>
<el-divider direction="vertical" />
<span>{{ data?.Jbdata.FEducationBackground }}</span>
<el-divider direction="vertical" />
<span>{{ selectDepartRemain(data?.Jbdata.FDepartRemain) }}</span>
</div>
<pre>{{ data?.Jbdata.FPersonalStrengths }}</pre>
</div>
</div>
<!-- 期望职位 -->
<div class="resumen-content-footer">
<div style="display: flex; margin-bottom: 56px">
<div class="resume-label">期望职位</div>
<div class="flx-align-center">
<span>{{ data?.Qzdata[0].FDesiredPositionName }}</span>
<el-divider direction="vertical" />
<span
>{{ data?.Qzdata[0].FExpectSalaryMinName }}-{{
data?.Qzdata[0].FExpectSalaryMaxName
}}</span
>
<el-divider direction="vertical" />
<span>{{ data?.Qzdata[0].FExpectTheIndustryName }}</span>
<span class="round"></span>
<span>{{ data?.Qzdata[0].FWorkCity }}</span>
</div>
</div>
<!-- 工作经历 -->
<div style="display: flex; margin-bottom: 32px">
<div class="resume-label">工作经历</div>
<div class="flx-direction-column" style="flex: 1">
<div v-for="item in data?.Gzdata" :key="item.FEntryID">
<div class="flx-justify-between">
<div class="flx-align-center" style="height: 44px">
<span>{{ item.FCompanyName }}</span>
<el-divider direction="vertical" />
<span>{{ item.FPosition }}</span>
<el-divider direction="vertical" />
<span>{{ item.FDepartment }}</span>
</div>
<span style="color: #666666"
>{{ dayjs(item.FStartDate).format('YYYY.MM') }}-{{
dayjs(item.FEndDate).format('YYYY.MM')
}}</span
>
</div>
<pre>{{ item.FJobContent_Tag }}</pre>
<div class="flx-align-center" style="margin: 16px 0 24px">
<span
v-for="tag in item.FPossessSkills !== ' ' ? item.FPossessSkills.split(',') : []"
:key="tag"
class="tag-label"
>{{ tag }}</span
>
</div>
</div>
</div>
</div>
<!-- 项目经历 -->
<div style="display: flex; margin-bottom: 56px">
<div class="resume-label">项目经历</div>
<div class="flx-direction-column" style="flex: 1">
<div v-for="item in data?.Xmdata" :key="item.FEntryID">
<div class="flx-justify-between">
<div class="flx-align-center" style="height: 44px">
<span>{{ item.FProjectName }}</span>
<el-divider direction="vertical" />
<span>{{ item.FProjectRole }}</span>
</div>
<span style="color: #666666"
>{{ dayjs(item.FStartDate).format('YYYY.MM') }}-{{
dayjs(item.FEndDate).format('YYYY.MM')
}}</span
>
</div>
<pre>{{ item.FProjectDescription_Tag }}</pre>
</div>
</div>
</div>
<!-- 教育经历 -->
<div style="display: flex; margin-bottom: 56px">
<div class="resume-label">教育经历</div>
<div class="flx-direction-column" style="flex: 1">
<div v-for="item in data?.Jydata" :key="item.FEntryID">
<div class="flx-justify-between">
<div class="flx-align-center" style="height: 44px">
<img
src="@/assets/img/icon-resume5.png"
width="28"
height="28"
style="margin-right: 25px"
/>
<span>{{ item.FLearningName }}</span>
<el-divider direction="vertical" />
<span>{{ item.FSpecialty }}</span>
<el-divider direction="vertical" />
<span>{{ item.FEducationBackgroundName }}</span>
</div>
<span style="color: #666666"
>{{ dayjs(item.FStartTime).format('YYYY.MM') }}-{{
dayjs(item.FEndTime).format('YYYY.MM')
}}</span
>
</div>
</div>
</div>
</div>
<div style="display: flex; margin-bottom: 56px">
<div class="resume-label">资格证书</div>
<div class="flx-direction-column" style="flex: 1">
<div
v-for="item in data?.Fjdata"
:key="item.FEntryID"
class="flx-align-center"
style="height: 44px; color: #177cfa; cursor: pointer"
>
{{ item.FATTACHMENTNAME }}
</div>
</div>
</div>
<div style="display: flex; margin-bottom: 56px">
<div class="resume-label">简历附件</div>
<div class="flx-direction-column" style="flex: 1">
<div
v-for="item in data?.Jldata"
:key="item.FEntryID"
class="flx-align-center"
style="height: 44px; color: #177cfa; cursor: pointer"
>
{{ item.FATTACHMENTNAME }}
</div>
</div>
</div>
</div>
</div>
</el-dialog>
</template>
<script setup lang="ts">
import { jobStatus } from '../config'
import { baseURL } from '@/services'
import dayjs from 'dayjs'
defineProps({
show: {
type: Boolean,
defualt: false
},
data: {
type: Object,
default: () => {}
}
})
const emits = defineEmits(['update:show'])
const selectDepartRemain = (departRemain: string) => {
let row = jobStatus.find((item: any) => item.value === departRemain)
return row ? row.label : jobStatus[3]
}
const handleClose = () => {
emits('update:show', false)
}
</script>
<style lang="scss" scoped>
.resumen-content {
padding: 0 44px;
color: #222222;
font-size: 16px;
.resumen-content-header {
display: flex;
margin-bottom: 48px;
img {
width: 82px;
height: 115px;
margin-right: 30px;
}
.resumen-content-header__tp {
display: flex;
align-items: center;
height: 36px;
.name {
font-size: 18px;
color: #000000;
font-weight: 500;
margin-right: 24px;
}
}
pre {
// display: -webkit-box;
// -webkit-line-clamp: 3;
// -webkit-box-orient: vertical;
// overflow: hidden;
// text-overflow: ellipsis;
}
}
.resumen-content-footer {
.resume-label {
width: 146px;
min-width: 146px;
height: 44px;
line-height: 44px;
text-align: center;
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;
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;
}
}
}
pre {
white-space: pre-wrap;
}
</style>
<template>
<div v-show="show" class="edit-expected-position">
<el-form :model="userInfoData" label-position="top">
<el-form
ref="formRef"
:model="form"
:rules="rules"
hide-required-asterisk
label-position="top"
@close="handleClose"
>
<el-row :gutter="28">
<el-col :span="12">
<el-form-item label="项目名称">
<el-input v-model="userInfoData.name" size="large" placeholder="请输入项目名称" />
<el-form-item label="项目名称" prop="FProjectName">
<el-input v-model="form.FProjectName" 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 label="项目角色" prop="FProjectRole">
<el-input v-model="form.FProjectRole" size="large" placeholder="请输入项目角色">
</el-input>
</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 label="项目链接(选填)" prop="">
<el-input v-model="form.FProjectLink" size="large" placeholder="请输入项目链接" />
</el-form-item>
</el-col>
<el-col :span="12" class="flx-align-center">
<el-form-item label="项目开始时间">
<el-col :span="12" class="flx-align-center" style="display: flex; align-items: end">
<el-form-item label="项目开始时间" prop="FProjectStartDate">
<el-date-picker
v-model="userInfoData.date"
type="date"
v-model="form.FProjectStartDate"
type="month"
placeholder="项目开始时间"
size="large"
:disabled-date="disabledDate"
/>
<span style="margin: 0 16px"></span>
</el-form-item>
<span style="margin: 0 16px 28px"></span>
<el-form-item label="" prop="FProjectEndDate">
<el-date-picker
v-model="userInfoData.date1"
type="date"
v-model="form.FProjectEndDate"
type="month"
placeholder="项目结束时间"
size="large"
:disabled-date="disabledDate"
:shortcuts="shortcuts"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="项目描述">
<el-form-item label="项目描述" prop="FProjectDescription_Tag">
<div class="text-header">
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
v-model="form.FProjectDescription_Tag"
type="textarea"
show-word-limit
:maxlength="1600"
......@@ -60,26 +65,18 @@
/>
</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" style="width: 100px" @click="handleClose">取消</el-button>
<el-button size="large" type="primary" style="width: 100px" @click="onConfirm"
>完成</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
<el-icon
v-show="form.FEntryID"
color="#177CFA"
style="margin-left: 30px"
@click="delResume"
><i-ep-DeleteFilled
/></el-icon>
</el-col>
</el-row>
</el-form>
......@@ -87,6 +84,7 @@
</template>
<script setup lang="ts">
import { updateResume, deleteResume } from '@/services/api/recruitmentManagement'
defineProps({
show: {
type: Boolean,
......@@ -94,9 +92,118 @@ defineProps({
}
})
const emits = defineEmits(['update:show'])
const form = ref({
FEntryID: 0,
FProjectStartDate: '', //开始时间
FProjectEndDate: '', //结束时间
FProjectName: '', //项目名称
FProjectDescription: '', //无需填写
FProjectDescription_Tag: '', //项目描述
FProjectPerformance: '', //无需填写
FProjectPerformance_Tag: '', //项目业绩
FProjectLink: '', //跳转链接
FProjectRole: '' //项目角色
})
const shortcuts = [
{
text: '至今',
value: new Date(new Date().getFullYear(), new Date().getMonth())
}
]
const formRef = ref()
const disabledDate = (time: Date) => {
return time.getTime() > Date.now()
}
const rules = {
FProjectStartDate: [{ required: true, message: '请输入开始时间', trigger: 'blur' }],
FProjectEndDate: [{ required: true, message: '请输入结束时间', trigger: 'blur' }],
FProjectName: [{ required: true, message: '请输入项目名称', trigger: 'blur' }],
FProjectDescription_Tag: [{ required: true, message: '请输入项目描述', trigger: 'blur' }],
FProjectRole: [{ required: true, message: '请输入项目角色', trigger: 'blur' }]
}
const emits = defineEmits(['update:show', 'init'])
const delResume = async () => {
const res: any = await deleteResume({ Type: 'C', ID: form.value.FEntryID })
if (res.code === 200) {
handleClose()
emits('init')
}
}
const filterChange = () => {
let data = {
Parmeter: {
NeedUpDateFields: [
'FProjectStartDate',
'FProjectEndDate',
'FProjectName',
'FProjectDescription',
'FProjectDescription_Tag',
'FProjectPerformance',
'FProjectPerformance_Tag',
'FProjectLink',
'FProjectRole'
],
IsDeleteEntry: 'false',
Model: {
FID: 0,
F_LQKJ_ProjectExperienceEntityS: [
{
FEntryID: form.value.FEntryID ? form.value.FEntryID : 0,
FProjectStartDate: '', //开始时间
FProjectEndDate: '', //结束时间
FProjectName: '', //项目名称
FProjectDescription: '', //无需填写
FProjectDescription_Tag: '', //项目描述
FProjectPerformance: '', //无需填写
FProjectPerformance_Tag: '', //项目业绩
FProjectLink: '', //跳转链接
FProjectRole: '' //项目角色
}
]
}
}
}
data.Parmeter.Model.F_LQKJ_ProjectExperienceEntityS[0] = {
...data.Parmeter.Model.F_LQKJ_ProjectExperienceEntityS[0],
...form.value
}
const userInfoData: any = ref({})
return data
}
const onConfirm = async () => {
console.log('’kkkk')
await formRef.value?.validate(async (valid: boolean) => {
if (valid) {
let data = filterChange()
const res: any = await updateResume(data)
if (res.code === 200) {
ElNotification.success({
title: `${form.value.FEntryID ? '更新' : '添加'}项目经历`,
message: '更新成功'
})
handleClose()
emits('init')
}
}
})
}
const handleClose = () => {
formRef.value?.resetFields()
emits('update:show', false)
}
defineExpose({
form
})
</script>
<style lang="scss" scoped>
......
<template>
<div v-show="show" class="edit-user-info">
<div class="edit-user__info">编辑个人信息</div>
<el-form :model="userInfoData" label-position="top">
<el-form
ref="formRef"
:model="form.Model"
:rules="rules"
label-position="top"
hide-required-asterisk
@close="handleClose"
>
<el-row :gutter="28">
<el-col :span="12">
<el-form-item label="姓名">
<el-input v-model="userInfoData.name" size="large" />
<el-form-item label="姓名" prop="FName">
<el-input v-model="form.Model.FName" size="large" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前求职状态">
<el-form-item label="当前求职状态" prop="FDepartRemain">
<el-select
v-model="userInfoData.region"
v-model="form.Model.FDepartRemain"
size="large"
placeholder=" "
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
<el-option
v-for="(item, index) in jobStatus"
:key="index"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别">
<el-form-item label="性别" prop="FSex">
<div class="sex">
<span :class="radioBtn === '男' ? 'active' : ''" @click="radioBtn = '男'"></span>
<span :class="radioBtn === '女' ? 'active' : ''" @click="radioBtn = '女'"></span>
<span :class="form.Model.FSex === '0' ? 'active' : ''" @click="form.Model.FSex = '0'"
></span
>
<span :class="form.Model.FSex === '1' ? 'active' : ''" @click="form.Model.FSex = '1'"
></span
>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="我的牛人身份">
<el-form-item label="我的牛人身份" prop="FMyIdentity">
<el-select
v-model="userInfoData.region"
v-model="form.Model.FMyIdentity"
size="large"
placeholder=" "
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
<el-option label="职场人" value="0" />
<el-option label="学生" value="1" />
</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 label="出生年月" prop="FBornDate">
<el-date-picker
v-model="form.Model.FBornDate"
type="date"
placeholder="选择日期"
:disabled-date="disabledDate"
size="large"
style="width: 100%"
/>
</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 label="电话" prop="FUserPhone">
<el-input v-model="form.Model.FUserPhone" 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 label="参加工作时间" prop="FGoWorkDate">
<el-date-picker
v-model="form.Model.FGoWorkDate"
type="date"
placeholder="选择日期"
:disabled-date="disabledDate"
size="large"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="微信号 (选填)">
<el-input v-model="userInfoData.name" size="large" />
<el-input v-model="form.Model.FWechat" size="large" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="邮箱 (选填)">
<el-input v-model="userInfoData.name" size="large" />
<el-input v-model="form.Model.FEmail" 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" style="width: 100px" @click="handleClose">取消</el-button>
<el-button size="large" type="primary" style="width: 100px" @click="onConfirm"
>完成</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
</el-col>
</el-row>
</el-form>
......@@ -79,6 +108,9 @@
</template>
<script setup lang="ts">
import { updateResume } from '@/services/api/recruitmentManagement'
import { jobStatus } from '../config'
defineProps({
show: {
type: Boolean,
......@@ -86,10 +118,87 @@ defineProps({
}
})
const emits = defineEmits(['update:show'])
const emits = defineEmits(['update:show', 'init'])
const form: any = ref({
NeedUpDateFields: [
'FName',
'FEmail',
'FSex',
'FGoWorkDate',
'FBornDate',
'FBornDate',
'FDepartRemain',
'FWechat',
'FPersonalStrengths_Tag',
'FPhotos',
'FMyIdentity'
],
IsDeleteEntry: 'false',
Model: {
FID: 0,
FName: '', //姓名
FEmail: '', //邮箱
FSex: '0', //性别
FGoWorkDate: '', //参加工作时间
FBornDate: '', //出生日期
FDepartRemain: '', //离职在职情况
FWechat: '', //微信号
FPhotos: '', //照片
FMyIdentity: '', //我的牛人身份
FUserPhone: ''
}
})
const rules = {
FName: [{ required: true, message: '姓名不能为空', trigger: 'blur' }],
FEmail: [
{ required: true, message: '邮箱不能为空', trigger: 'blur' },
{ type: 'email', message: '请输入有效的邮箱地址', trigger: 'blur' }
],
FSex: [{ required: true, message: '性别不能为空', trigger: 'change' }],
FGoWorkDate: [{ required: true, message: '参加工作时间不能为空', trigger: 'blur' }],
FBornDate: [{ required: true, message: '出生日期不能为空', trigger: 'blur' }],
FDepartRemain: [{ required: true, message: '离职在职情况不能为空', trigger: 'blur' }],
FWechat: [{ required: true, message: '微信号不能为空', trigger: 'blur' }],
FPhotos: [{ required: true, message: '照片不能为空', trigger: 'blur' }],
FMyIdentity: [{ required: true, message: '我的牛人身份不能为空', trigger: 'blur' }],
FUserPhone: [
{ required: true, message: '手机号不能为空', trigger: 'blur' },
{ pattern: /^1[3456789]\d{9}$/, message: '请输入有效的手机号', trigger: 'blur' }
]
}
const userInfoData: any = ref({})
const radioBtn = ref('男')
const formRef = ref()
const disabledDate = (time: Date) => {
return time.getTime() > Date.now()
}
const onConfirm = async () => {
await formRef.value?.validate(async (valid: boolean) => {
if (valid) {
const res: any = await updateResume({ Parmeter: form.value })
if (res.code === 200) {
ElNotification.success({
title: '更新个人信息',
message: '更新成功'
})
handleClose()
emits('init')
}
}
})
}
const handleClose = () => {
formRef.value?.resetFields()
emits('update:show', false)
}
defineExpose({
form
})
</script>
<style lang="scss" scoped>
......
......@@ -59,3 +59,10 @@ export const resumeList = [
{ name: '上传简历' },
{ name: '上传附件' }
]
export const jobStatus = [
{ label: '离职求职中', value: '0' },
{ label: '在职求职中', value: '1' },
{ label: '在职考虑中', value: '2' },
{ label: '待业', value: '3' }
]
......@@ -19,10 +19,11 @@
accept="image/*"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:disabled="!state.isAdd"
>
<img
v-if="state.form.FLogo"
:src="baseURL + '/' + state.form.FLogo"
:src="baseURL + '/' + state.imgUrl"
class="avatar"
width="56"
height="56"
......@@ -31,7 +32,7 @@
</el-upload>
</el-form-item>
<el-form-item label="公司名称">
<span>货拉拉科技</span>
<span>{{ state.isAdd ? state.form.FName : userInfoStore.companyInfo?.FNAME }}</span>
</el-form-item>
<el-form-item label="公司类型" prop="FIndustry">
<div class="flx-direction-column">
......@@ -47,7 +48,11 @@
<span
v-for="item in state.informationData?.Trade"
:key="item.FNUMBER"
:style="{ color: state.form.FIndustry === item.FNUMBER ? '#177CFA' : '' }"
:style="{
color: state.form.FIndustry === item.FNUMBER ? '#177CFA !important' : '',
cursor: !state.isAdd ? 'no-drop' : ''
}"
:class="state.isAdd ? '' : 'disabled-hover'"
@click="handleChange('Trade', item.FNUMBER)"
>{{ item.FDATAVALUE }}</span
>
......@@ -68,7 +73,7 @@
<span
v-for="item in state.informationData?.Member"
:key="item.FNUMBER"
:style="{ color: state.form.FScaleS === item.FNUMBER ? '#177CFA' : '' }"
:style="{ color: state.form.FScaleS === item.FNUMBER ? '#177CFA ' : '' }"
@click="handleChange('Member', item.FNUMBER)"
>{{ item.FDATAVALUE }}</span
>
......@@ -112,7 +117,11 @@
<span
v-for="item in state.streetList"
:key="item.FNUMBER"
:style="{ color: state.form.FSubstreet === item.FNUMBER ? '#177CFA' : '' }"
:style="{
color: state.form.FSubstreet === item.FNUMBER ? '#177CFA !important' : '',
cursor: !state.isAdd ? 'no-drop' : ''
}"
:class="state.isAdd ? '' : 'disabled-hover'"
@click="handleChange('Street', item.FNUMBER)"
>{{ item.FNAME }}</span
>
......@@ -120,7 +129,7 @@
</div>
</el-form-item>
<el-form-item label="工商信息">
<businessInfo ref="businessInfoRef" />
<businessInfo ref="businessInfoRef" :disabled="!state.isAdd" />
</el-form-item>
<el-form-item label="公司地址" prop="FAddresss">
<el-input v-model="state.form.FAddresss" placeholder="请填写真实有效的公司地址" />
......@@ -137,7 +146,7 @@
</el-form>
</div>
<div class="confirm">
<span v-show="!state.isAdd">确定</span>
<span v-show="!state.isAdd" @click="submit">确定</span>
<span v-show="state.isAdd" @click="submit">提交审核</span>
</div>
</div>
......@@ -146,13 +155,17 @@
<script setup lang="ts">
import { getInformation } from '@/services/api/common'
import { getAdminCompanyInfo, editCompanyInfo } from '@/services/api/recruitmentManagement'
import { getStreet } from '@/services/api/streetOfficeSpecialTopic'
import { enterpriseRegisters } from '@/services/api/login'
import businessInfo from './components/businessInfo.vue'
import { baseURL } from '@/services'
import { useUserInfoStore } from '@/stores/modules/userInfo'
import businessInfo from './components/businessInfo.vue'
const route = useRoute()
const router = useRouter()
const userInfoStore = useUserInfoStore()
const formRef = ref()
const businessInfoRef = ref()
const state = reactive({
......@@ -230,6 +243,7 @@ const state = reactive({
},
informationData: {} as any,
streetList: [] as any,
imgUrl: '',
tradeAcive: false,
memberAcive: false,
financingAcive: false,
......@@ -239,8 +253,8 @@ const state = reactive({
})
const handleAvatarSuccess = (res: any) => {
console.log(res)
state.form.FLogo = res.data.Url
state.form.FLogo = res.data.FileId
state.imgUrl = res.data.Url
}
const filterName = (list: any[] = [], FNUMBER: string) => {
......@@ -249,58 +263,111 @@ const filterName = (list: any[] = [], FNUMBER: string) => {
}
const submit = async () => {
await businessInfoRef.value?.formCheck()
let business = true
if (state.isAdd) business = await businessInfoRef.value?.formCheck()
formRef.value.validate(async (valid: boolean, fields: any) => {
if (valid) {
ElMessageBox.confirm('确定提交审核?', '提交审核', {
if (!business) return ElMessage.warning('请填写完整公司信息')
ElMessageBox.confirm(`确定提交审核?`, `提交审核`, {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
})
.then(async () => {
let data = {
Parmeter: {
IsDeleteEntry: 'true',
Model: { ...state.Parmeter.Model, ...businessInfoRef.value.form, ...state.form }
if (state.isAdd) {
let data = {
Parmeter: {
IsDeleteEntry: 'true',
Model: { ...state.Parmeter.Model, ...businessInfoRef.value.form, ...state.form }
}
}
data.Parmeter.Model.FIndustry = { FNumber: state.form.FIndustry }
data.Parmeter.Model.FScaleS = { FNumber: state.form.FScaleS }
data.Parmeter.Model.FFinancingS = { FNumber: state.form.FFinancingS }
data.Parmeter.Model.FSubstreet = { FNUMBER: state.form.FSubstreet }
data.Parmeter.Model.F_LQKJ_EnterpriseUserEntity[0].FUserPhoneS = state.form.FUserPhone
const res: any = await enterpriseRegisters(data)
if (res.code === 200) {
ElNotification({
title: '企业注册',
message: res.msg,
type: 'success'
})
router.back()
}
} else {
let data = {
Parmeter: {
NeedUpDateFields: [
'FAddresss',
'FFinancingS',
'FScaleS',
'FCompanyProfile',
'FCorporateWelfare'
],
IsDeleteEntry: 'false',
Model: {
FID: 0, //无需填写
FAddresss: state.form.FAddresss, //地址
FFinancingS: {
//融资情况
FNumber: state.form.FFinancingS
},
FScaleS: {
//公司规模
FNumber: state.form.FScaleS
},
FCompanyProfile: state.form.FCompanyProfile, //公司介绍
FCorporateWelfare: state.form.FCorporateWelfare //公司福利
}
}
}
const res: any = await editCompanyInfo(data)
if (res.code === 200) {
ElNotification({
title: '企业编辑',
message: res.msg,
type: 'success'
})
router.back()
}
}
data.Parmeter.Model.FIndustry = { FNumber: state.form.FIndustry }
data.Parmeter.Model.FScaleS = { FNumber: state.form.FScaleS }
data.Parmeter.Model.FFinancingS = { FNumber: state.form.FFinancingS }
data.Parmeter.Model.FSubstreet = { FNUMBER: state.form.FSubstreet }
data.Parmeter.Model.F_LQKJ_EnterpriseUserEntity[0].FUserPhoneS = state.form.FUserPhone
const res: any = await enterpriseRegisters(data)
if (res.code === 200) {
ElNotification({
title: '企业注册',
message: res.msg,
type: 'success'
})
router.back()
}
})
.catch(() => {})
}
} else ElMessage.warning('请填写完整公司信息')
})
}
const handleChange = async (type: string, FNUMBER: string) => {
switch (type) {
case 'Trade':
if (!state.isAdd) return
state.form.FIndustry = FNUMBER
break
case 'Member':
if (!state.isAdd) return
state.form.FScaleS = FNUMBER
break
case 'Financing':
state.form.FFinancingS = FNUMBER
break
default:
if (!state.isAdd) return
state.form.FSubstreet = FNUMBER
break
}
}
const initAdminCompanyInfo = async () => {
const res: any = await getAdminCompanyInfo()
if (res.code === 200) {
businessInfoRef.value.form = res.data?.gsData
state.imgUrl = res.data?.FLogoUrl
state.form = { ...state.form, ...res.data }
console.log(res)
}
}
const init = async () => {
const res: any = await getInformation({
AuxiliaryS: ['EDUCATION', 'Financing', 'Member', 'Trade']
......@@ -309,10 +376,7 @@ const init = async () => {
const street: any = await getStreet()
if (street.code === 200) {
state.streetList = street.data
state.streetList.map((item: any, i: number) => {
const result = item.FNAME.match(/(.+)专题/)
result && result.length > 1 ? (item.FNAME = result[1] + '办') : ''
})
state.streetList.map((item: any, i: number) => (item.FNAME = item.FNAME + '办'))
}
}
......@@ -322,6 +386,8 @@ onMounted(() => {
state.isAdd = true
state.form.FName = companyName
state.form.FUserPhone = phone
} else {
initAdminCompanyInfo()
}
init()
})
......
<template>
<div class="flx-center" style="flex-direction: column">
<div class="container">
<div class="title">编辑公司信息</div>
<div class="title">{{ FID ? '编辑职位' : '发布职位' }}</div>
<el-form
ref="formRef"
:model="state.form"
......@@ -52,7 +52,6 @@
:options="state.cascaderOptions"
:props="state.cascaderProps"
placeholder="请选择职位类型"
@change="handleChange"
/>
</el-form-item>
</div>
......@@ -158,9 +157,21 @@
+ 关键词
</el-button>
</el-form-item>
<el-form-item label="工作地点:" prop="FWorkPlace">
<el-input v-model="state.form.FWorkPlace" placeholder="请输入工作地点" />
</el-form-item>
<div class="flx-align-center">
<el-form-item label="工作地点:" prop="addr" style="width: 56.5%">
<el-cascader
ref="cascaderAddr"
v-model="state.form.addr"
:options="cityData"
:props="cityProps"
placeholder="请选择工作城市"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="" prop="FWorkPlace" class="empty-label" style="width: 43.5%">
<el-input v-model="state.form.FWorkPlace" placeholder="请输入详细工作地点" />
</el-form-item>
</div>
<p style="margin-left: 110px">请填写真实有效地址,若查实造假,将受到平台处罚。</p>
</div>
</div>
......@@ -171,21 +182,32 @@
<el-button style="background-color: #cccccc; color: #ffffff" @click="router.back()"
>取消</el-button
>
<el-button type="primary" style="background-color: #177cfa" @click="submit"
>保存并发布</el-button
>
<el-button type="primary" style="background-color: #177cfa" @click="submit">{{
!FID ? '发布' : '保存并发布'
}}</el-button>
</div>
</div>
</template>
<script setup lang="ts">
import { getInformation } from '@/services/api/common'
import { getPosition, postPosition } from '@/services/api/recruitmentManagement'
import {
getPosition,
postPosition,
getEditPositionDetail
} from '@/services/api/recruitmentManagement'
import { useUserInfoStore } from '@/stores/modules/userInfo'
import { CascaderProps } from 'element-plus'
import cityData from '@/assets/json/pca-code.json'
const route = useRoute()
const router = useRouter()
const userInfoStore = useUserInfoStore()
const cityProps = {
value: 'name',
label: 'name',
children: 'children'
}
const state = reactive({
form: {
......@@ -208,7 +230,8 @@ const state = reactive({
FJobKeywords: [], //职位关键词
FRecruitsNumber: null, //招聘人数
FMonthlySalary: '', //月薪数
FPublisher: '' //发布人(无需填写)
FPublisher: '', //发布人(无需填写)
addr: []
} as any,
rules: {
FName: [{ required: true, message: '请输入职位描述', trigger: 'blur' }],
......@@ -219,10 +242,11 @@ const state = reactive({
FExperience: [{ required: true, message: '请选择经验', trigger: 'change' }],
FMinimumWage: [{ required: true, message: '请选择最低薪资', trigger: 'change' }],
FMaximumSalary: [{ required: true, message: '请选择最高薪资', trigger: 'change' }],
FWorkPlace: [{ required: true, message: '请输入工作地址', trigger: 'blur' }],
FWorkPlace: [{ required: true, message: '请输入详细工作地址', trigger: 'blur' }],
FJobKeywords: [{ required: true, message: '请输入职位关键词', trigger: 'blur' }],
FRecruitsNumber: [{ required: true, message: '请输入招聘人数', trigger: 'blur' }],
FMonthlySalary: [{ required: true, message: '请选择月薪数', trigger: 'change' }]
FMonthlySalary: [{ required: true, message: '请选择月薪数', trigger: 'change' }],
addr: [{ required: true, message: '请选择工作城市', trigger: 'change' }]
},
inputValue: '',
inputVisible: false,
......@@ -236,14 +260,14 @@ const state = reactive({
lowSalary: [] as any,
tallSalary: [] as any
})
let initTallSalary: any = []
const formRef = ref()
const InputRef = ref()
const handleChange = (value: any) => {
console.log(value, 'dsada')
}
const cascaderAddr = ref()
const FID = ref()
const positionDetailData = ref()
// 控制工资范围
const salaryChange = (Val: string) => {
......@@ -286,7 +310,7 @@ const handleInputConfirm = () => {
const handleResult = () => {
let data = {
Type: 0,
Type: FID.value ? 1 : 0,
Parmeter: {
NeedUpDateFields: [
'FName',
......@@ -328,9 +352,10 @@ const handleResult = () => {
}
}
}
const { form } = state
data.Parmeter.Model = { ...data.Parmeter.Model, ...form }
const { Model } = data.Parmeter
const { Model }: any = data.Parmeter
Model.FJobType = { FNumber: form.FJobType.slice(-1)[0] }
Model.FEducationalBackground = { FNumber: form.FEducationalBackground }
......@@ -338,9 +363,11 @@ const handleResult = () => {
Model.FMonthlySalary = { FNumber: form.FMonthlySalary }
Model.FMinimumWage = { FNumber: form.FMinimumWage }
Model.FMaximumSalary = { FNumber: form.FMaximumSalary === '~' ? '' : form.FMaximumSalary }
Model.FWorkPlace = form.addr.join('/') + '/' + form.FWorkPlace
Model.FJobKeywords = form.FJobKeywords.join(',')
console.log(data)
if (FID.value) Model.FID = FID.value
delete Model.addr
// console.log(data)
return data
}
......@@ -365,6 +392,53 @@ const submit = () => {
})
}
const initCompanyPositionDetail = async (FID: string) => {
const res: any = await getEditPositionDetail({ FID })
if (res.code === 200) {
const {
FEDUCATIONALBACKGROUND,
FEXPERIENCE,
FJOBDESCRIPTION_Tag,
FJOBKEYWORDS,
FJOBTYPE,
FMAXIMUMSALARY,
FMINIMUMWAGE,
FMONTHLYSALARY,
FRECRUITSNUMBER,
FWORKPLACE,
FPositionStatus,
JobName,
FRECRUITMENTTYPE
} = res.data
const addr = FWORKPLACE?.split('/') || []
state.form = {
FID: 0, //新增为0
FName: JobName, //岗位名称
FDocumentStatus: 'C', //(无需填写)
FCompany: {
FNUMBER: ''
}, //所属公司(无需填写)
FEducationalBackground: FEDUCATIONALBACKGROUND, //学历要求
FPositionStatus: FPositionStatus, //岗位状态(无需填写)
FJobType: FJOBTYPE, //岗位类型
FJobDescription: '', // 无需填写
FJobDescription_Tag: FJOBDESCRIPTION_Tag, // 岗位描述
FRecruitmentType: FRECRUITMENTTYPE, //招聘类型
FExperience: FEXPERIENCE, //经验
FMinimumWage: FMINIMUMWAGE, //最低薪资
FMaximumSalary: FMAXIMUMSALARY, //最高薪资
FWorkPlace: addr.slice(-1)[0], //工作地址
FJobKeywords: FJOBKEYWORDS, //职位关键词
FRecruitsNumber: FRECRUITSNUMBER, //招聘人数
FMonthlySalary: FMONTHLYSALARY, //月薪数
FPublisher: '', //发布人(无需填写)
addr: addr.slice(0, 3)
}
salaryChange(FMINIMUMWAGE)
positionDetailData.value = res.data
}
}
const init = async () => {
const res: any = await getPosition()
if (res.code === 200) {
......@@ -383,9 +457,15 @@ const init = async () => {
})
initTallSalary = info.data?.Salary
}
const { FID: id }: any = route.query
if (id) {
FID.value = Number(id)
await initCompanyPositionDetail(id)
}
}
init()
onMounted(async () => {
await init()
})
</script>
<style lang="scss" scoped>
......
......@@ -45,7 +45,7 @@
</div>
<div class="flx-align-center">
<span class="btn" @click="toEditCompany">编辑公司信息</span>
<span class="btn" @click="toAddAdministrator">添加管理员</span>
<span class="btn" @click="toAddAdmin">添加管理员</span>
<span class="btn" @click="toAddAdministrator">退出登录</span>
</div>
</div>
......@@ -93,6 +93,11 @@ watch(
const toEditCompany = () => {
router.push('/recruitmentManagement/editCompany')
}
const toAddAdmin = () => {
router.push('/recruitmentManagement/addAdmin')
}
const toAddAdministrator = () => {
userInfoStore.$reset()
globalStore.$reset()
......
<template>
<div class="main-container">
<search style="margin: 25px 0" @search-change="searchChange" />
<!-- <search style="margin: 25px 0" @search-change="searchChange" /> -->
<autocomplete
style="margin: 25px 0"
:list="querySearch"
placeholder="搜索关键字"
@search-change="searchChange"
@query-search-async="querySearchAsync"
/>
<div class="banner-group">
<div style="width: 444px; box-sizing: border-box" @mouseover="mouseover" @mouseout="mouseout">
<div class="job-menu">
......@@ -156,10 +163,10 @@
<script setup lang="ts">
import { baseURL } from '@/services'
import { getPosition } from '@/services/api/recruitmentManagement'
import { getPosition, getUserPostionList } from '@/services/api/recruitmentManagement'
import { getStreet } from '@/services/api/streetOfficeSpecialTopic'
import { useUserInfoStore } from '@/stores/modules/userInfo'
import search from '@/components/search.vue'
import autocomplete from '@/components/autocomplete.vue'
const router = useRouter()
const userInfoStore = useUserInfoStore()
......@@ -167,6 +174,7 @@ const menuList = ref([] as any)
const FDATAVALUE = ref()
const streetList = ref()
const querySearch = ref([])
const tabsList = [
{ label: '市场', name: 0 },
......@@ -197,6 +205,17 @@ const handleClick = (tab: string) => {
router.push({ path: '/recruitmentManagement/enterprise' })
}
const querySearchAsync = async (searchVal: string) => {
const res: any = await getUserPostionList({
pageIndex: 1,
pageSize: 10,
Filter: { FNAME: searchVal }
})
if (res.code === 200) {
querySearch.value = res.data || []
}
}
const searchChange = (searchValue: string) => {
router.push({ path: '/recruitmentManagement/personal', query: { searchValue } })
}
......
......@@ -3,11 +3,13 @@
<div class="container">
<div class="personal-filter flx-direction-column">
<div class="personal-header">
<search
ref="searchRef"
placeholder="搜索关键字"
<autocomplete
ref="autocompleteRef"
style="margin-bottom: 22px"
:list="querySearch"
placeholder="搜索关键字"
@search-change="searchChange"
@query-search-async="querySearchAsync"
/>
<el-tabs v-model="activeName">
<el-tab-pane label="所属街道办" name="0"></el-tab-pane>
......@@ -127,21 +129,21 @@ import { getStreet } from '@/services/api/streetOfficeSpecialTopic'
import { getInformation } from '@/services/api/common'
import { getUserPostionList } from '@/services/api/recruitmentManagement'
import { baseURL } from '@/services'
import search from '@/components/search.vue'
import customSelect from '@/components/customSelect.vue'
import dragUpload from '@/components/dragUpload.vue'
import info from './components/info.vue'
import router from '@/routers'
const route = useRoute()
const router = useRouter()
const activeName = ref('0')
const searchRef = ref()
const autocompleteRef = ref()
const loading = ref(true)
const filterLoading = ref(true)
const dragShow = ref(false)
const streetList = ref([] as any)
const informationData = ref()
const querySearch = ref([])
const queryList = ref({
pageIndex: 1,
......@@ -161,6 +163,17 @@ const total = ref(0)
const userPostionList: any = ref([])
const querySearchAsync = async (searchVal: string) => {
const res: any = await getUserPostionList({
pageIndex: 1,
pageSize: 10,
Filter: { FNAME: searchVal }
})
if (res.code === 200) {
querySearch.value = res.data || []
}
}
const searchChange = (searchValue: string) => {
queryList.value.Filter.FNAME = searchValue
initUserPostionList()
......@@ -222,8 +235,7 @@ const init = async () => {
streetList.value = street.data.sort((a: any, b: any) => a.FSERIALNUMBER - b.FSERIALNUMBER)
streetList.value.map((item: any, i: number) => {
item.active = false
const result = item.FNAME.match(/(.+)专题/)
result && result.length > 1 ? (item.FNAME = result[1] + '办') : ''
item.FNAME + '办'
})
streetList.value.unshift({
FNAME: '全部',
......@@ -253,7 +265,7 @@ const init = async () => {
onMounted(() => {
const { searchValue } = route.query
searchRef.value.searchValue = searchValue
autocompleteRef.value.searchValue = searchValue
init()
})
</script>
......
......@@ -64,6 +64,9 @@
color: #177cfa;
}
}
.disabled-hover {
color: #666666 !important;
}
}
:deep(.el-textarea__inner),
......
......@@ -113,6 +113,7 @@
[id^='show-position'] {
cursor: pointer;
padding: 14px 32px;
margin-top: 16px;
&:hover {
padding: 14px 32px;
......@@ -124,6 +125,7 @@
[id^='show-work'] {
cursor: pointer;
padding: 14px 32px;
box-sizing: border-box;
&:hover {
padding: 14px 32px;
......@@ -132,6 +134,19 @@
}
}
[id^='show-img'] {
position: relative;
cursor: pointer;
padding: 30px 32px;
font-size: 12px;
&:hover {
padding: 30px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-advantage'] {
cursor: pointer;
padding: 14px 32px;
......@@ -249,5 +264,16 @@
}
}
}
#edit-img0 {
position: absolute;
color: #177cfa;
cursor: pointer;
display: none;
font-size: 14px;
}
}
pre {
white-space: pre-wrap;
}
}
......@@ -14,7 +14,11 @@
</div>
</div>
<div style="margin-bottom: 360px">
<contentBlock v-loading="subLoading" :list="skillTrainData?.JcAqData" />
<contentBlock
v-loading="subLoading"
:list="skillTrainData?.JcAqData"
@change="toCommonDtail"
/>
</div>
</div>
</div>
......@@ -26,6 +30,7 @@ import { getSkillTraining, getSkillTrainingList } from '@/services/api/skillTrai
import contentBlock from '@/components/contentBlock.vue'
const route = useRoute()
const router = useRouter()
const loading = ref(true)
const subLoading = ref(true)
const queryList = ref({ pageIndex: 1, pageSize: 10, type: 'A' })
......@@ -43,6 +48,13 @@ const handleChange = (row: any) => {
initSkillTrainingList()
}
const toCommonDtail = (row: any) => {
router.push({
path: '/commonDetail',
query: { FID: row.FID, FormType: 'C', FTITLE: row.FTITLE }
})
}
const initSkillTrainingList = async () => {
subLoading.value = true
const res: any = await getSkillTrainingList(queryList.value)
......
......@@ -12,7 +12,7 @@
<img :src="baseURL + '/' + item.FSTREETPICTURE" width="318" height="130" />
<div
class="recruit-item-detail"
:class="item.FID == streetAcive ? 'recruit-item-detail-active' : ''"
:class="item.FID == streetActive ? 'recruit-item-detail-active' : ''"
>
{{ item.FNAME }}
</div>
......@@ -136,14 +136,14 @@ const streetData = ref([
prop: 'FCONTACTNUMBER'
}
])
const streetAcive = ref()
const streetActive = ref()
const streetOverview = ref()
const streetDetail: any = ref()
const overviewDetail: any = ref()
watch(
() => streetAcive.value,
() => streetActive.value,
(newVal: any) => {
streetDetail.value = streetList.value.find((item: any) => item.FID == newVal)
overviewDetail.value = streetDetail.value?.FSTREETOVERVIEW
......@@ -156,7 +156,7 @@ watch(
)
const change = (FID: string) => {
streetAcive.value = FID
streetActive.value = FID
}
const streeChange = (index: number) => {
......@@ -171,10 +171,11 @@ const streeChange = (index: number) => {
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)
streetList.value = res.data
.map((item: any) => ({ ...item, FNAME: item.FNAME + '专题' }))
.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
streetActive.value = FID || streetList.value[0]?.FID || null
}
}
......
......@@ -7,10 +7,12 @@ export {}
declare module 'vue' {
export interface GlobalComponents {
Autocomplete: typeof import('./../src/components/autocomplete.vue')['default']
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']
ElAutocomplete: typeof import('element-plus/es')['ElAutocomplete']
ElAvatar: typeof import('element-plus/es')['ElAvatar']
ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
......@@ -54,6 +56,7 @@ declare module 'vue' {
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']
IEpDeleteFilled: typeof import('~icons/ep/delete-filled')['default']
IEpEditPen: typeof import('~icons/ep/edit-pen')['default']
IEpLocation: typeof import('~icons/ep/location')['default']
IEpLocationFilled: typeof import('~icons/ep/location-filled')['default']
......@@ -63,6 +66,7 @@ declare module 'vue' {
IEpSearch: typeof import('~icons/ep/search')['default']
IEpView: typeof import('~icons/ep/view')['default']
Policy: typeof import('./../src/components/policy.vue')['default']
PreviewFile: typeof import('./../src/components/previewFile.vue')['default']
QqMap: typeof import('./../src/components/qqMap.vue')['default']
RichTextEditor: typeof import('./../src/components/RichTextEditor.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
......@@ -71,7 +75,6 @@ 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']
}
}
......@@ -80,14 +80,41 @@ export default defineConfig({
}
}
},
// build: {
// minify: 'terser',
// terserOptions: {
// compress: {
// //生产环境时移除console.log()
// drop_console: true,
// drop_debugger: true
// }
// }
// },
build: {
outDir: 'dist',
sourcemap: false,
minify: 'terser',
chunkSizeWarningLimit: 1500,
emptyOutDir: true,
terserOptions: {
compress: {
//生产环境时移除console.log()
drop_console: true,
drop_debugger: true
}
},
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
return id.toString().split('node_modules/')[1].split('/')[0].toString()
}
},
chunkFileNames: chunkInfo => {
const facadeModuleId = chunkInfo.facadeModuleId ? chunkInfo.facadeModuleId.split('/') : []
const fileName = facadeModuleId[facadeModuleId.length - 2] || '[name]'
return `js/${fileName}/[name].[hash].js`
}
}
}
}
})
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论