Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mp-enterprise-people-recruitment-h5
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
彭佳妮(贵阳日报)
mp-enterprise-people-recruitment-h5
Commits
3cfc9148
Commit
3cfc9148
authored
Oct 28, 2024
by
李明环(东信)
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
职位发布初步修改完成
parent
199d91ea
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
544 additions
and
160 deletions
+544
-160
common.js
src/api/common.js
+1
-1
postion.js
src/api/postion.js
+1
-1
town.json
src/assets/town.json
+0
-0
index.vue
src/components/filter/index.vue
+312
-0
form-item.vue
src/components/form/form-item.vue
+1
-0
step1.vue
src/pages/recommend/releasePostion/step1.vue
+17
-33
step2.vue
src/pages/recommend/releasePostion/step2.vue
+0
-1
step3.vue
src/pages/recommend/releasePostion/step3.vue
+18
-31
step4.vue
src/pages/recommend/releasePostion/step4.vue
+78
-16
step5.vue
src/pages/recommend/releasePostion/step5.vue
+0
-1
store.js
src/pages/recommend/releasePostion/store.js
+80
-50
utils.js
src/utils/utils.js
+36
-26
No files found.
src/api/common.js
View file @
3cfc9148
...
@@ -4,7 +4,7 @@ export const getUploadToken = params => instance.post("/common/file/getUploadTok
...
@@ -4,7 +4,7 @@ export const getUploadToken = params => instance.post("/common/file/getUploadTok
// 获取枚举
// 获取枚举
export
const
getDictDataApi
=
params
=>
instance
.
post
(
"/common/dict/getDictData"
,
params
);
export
const
getDictDataApi
=
params
=>
instance
.
post
(
"/common/dict/getDictData"
,
params
);
// 获取省市区树状数据
// 获取省市区树状数据
export
const
getTreeListApi
=
params
=>
instance
.
post
(
"/dict/dictProvinceCityDistrict/getTreeList"
,
params
);
export
const
getTreeListApi
=
params
=>
instance
.
post
Form
(
"/dict/dictProvinceCityDistrict/getTreeList"
,
params
);
// 获取岗位列表
// 获取岗位列表
export
const
dictJobTypeApi
=
params
=>
instance
.
post
(
"/dict/dictJobType/getTree"
,
params
);
export
const
dictJobTypeApi
=
params
=>
instance
.
post
(
"/dict/dictJobType/getTree"
,
params
);
// 获取岗位列表类型(1职位,2政策,3动态)
// 获取岗位列表类型(1职位,2政策,3动态)
...
...
src/api/postion.js
View file @
3cfc9148
import
instance
from
"@/utils/request"
;
import
instance
from
"@/utils/request"
;
// 创建岗位
// 创建岗位
export
const
createJobApi
=
params
=>
instance
.
post
(
"/
company/job/create
"
,
params
);
export
const
createJobApi
=
params
=>
instance
.
post
(
"/
b/position/add
"
,
params
);
//更新岗位
//更新岗位
export
const
updateJobApi
=
params
=>
instance
.
post
(
"/company/job/update"
,
params
);
export
const
updateJobApi
=
params
=>
instance
.
post
(
"/company/job/update"
,
params
);
...
...
src/assets/town.json
0 → 100644
View file @
3cfc9148
This source diff could not be displayed because it is too large. You can
view the blob
instead.
src/components/filter/index.vue
0 → 100644
View file @
3cfc9148
<
template
>
<div
class=
"filter"
>
<div
class=
"menu"
>
<p
v-for=
"v in menuList"
:class=
"
{ active: v.active }" :key="v.name" @click="onClickMenu(v)">
{{
v
.
name
}}
</p>
</div>
<div
class=
"content"
>
<!-- 学历要求 -->
<div
class=
"filter-item education"
>
<p
class=
"title"
>
学历要求
</p>
<div
class=
"filter-select"
>
<div
class=
"select-item"
:class=
"
{ active: v.active }"
@click="onClickEducation(v)"
v-for="(v, i) in educationList"
:key="i"
>
{{
v
.
text
}}
</div>
</div>
</div>
<!-- 年龄要求 -->
<div
class=
"filter-item age"
>
<p
class=
"title"
style=
"margin-bottom: 0"
>
年龄要求
</p>
<wd-slider
v-model=
"age"
hide-min-max
inactive-color=
"rgba(31, 134, 255,0.3)"
active-color=
"rgba(31, 134, 255,1)"
/>
</div>
<!-- 性别要求 -->
<div
class=
"filter-item gender"
>
<p
class=
"title"
>
性别要求
</p>
<div
class=
"filter-select"
>
<div
class=
"select-item"
:class=
"
{ active: v.active }"
@click="onClickGender(v)"
v-for="(v, i) in genderList"
:key="i"
>
{{
v
.
text
}}
</div>
</div>
</div>
<!-- 工作年限要求 -->
<div
class=
"filter-item workYear"
>
<p
class=
"title"
>
工作年限要求
</p>
<div
class=
"filter-select"
>
<div
class=
"select-item"
:class=
"
{ active: v.active }"
@click="onClickWorkYear(v)"
v-for="(v, i) in workYearList"
:key="i"
>
{{
v
.
text
}}
</div>
</div>
</div>
<!-- 专业要求 -->
<div
class=
"filter-item major"
>
<p
class=
"title"
>
专业要求
</p>
<div
class=
"filter-select"
>
<div
class=
"select-item"
:class=
"
{ active: v.active }"
@click="onClickMajor(v)"
v-for="(v, i) in dictJobTypeList"
:key="i"
>
{{
v
.
name
}}
</div>
</div>
</div>
</div>
<div
class=
"bottom-wrap"
>
<button
class=
"cancel"
@
click=
"onCancel"
>
取消
</button>
<button
class=
"confirm"
@
click=
"onConfirm"
>
确认
</button>
</div>
</div>
</
template
>
<
script
setup
>
import
{
getEumData
}
from
"@/utils/utils"
;
import
{
dictJobTypeApi
}
from
"@/api/common"
;
// 导航
const
menuList
=
ref
([]);
const
onClickMenu
=
data
=>
{
menuList
.
value
.
forEach
(
v
=>
(
v
.
active
=
false
));
data
.
active
=
true
;
document
.
querySelector
(
".filter"
).
querySelector
(
`.
${
data
.
className
}
`
).
scrollIntoView
();
};
// 学历
const
educationList
=
ref
([]);
const
onClickEducation
=
v
=>
{
educationList
.
value
.
forEach
(
v
=>
(
v
.
active
=
false
));
v
.
active
=
true
;
};
// 年龄
const
age
=
ref
([
0
,
100
]);
// 性别
const
genderList
=
ref
([]);
const
onClickGender
=
v
=>
{
genderList
.
value
.
forEach
(
v
=>
(
v
.
active
=
false
));
v
.
active
=
true
;
};
// 工作年限
const
workYearList
=
ref
([]);
const
onClickWorkYear
=
v
=>
{
workYearList
.
value
.
forEach
(
v
=>
(
v
.
active
=
false
));
v
.
active
=
true
;
};
// 专业
const
dictJobTypeList
=
ref
([]);
const
onClickMajor
=
v
=>
{
dictJobTypeList
.
value
.
forEach
(
v
=>
(
v
.
active
=
false
));
v
.
active
=
true
;
};
// 初始化数据
const
initData
=
async
()
=>
{
uni
.
showLoading
({
title
:
"加载中..."
,
mask
:
true
});
/* 初始化菜单 */
menuList
.
value
=
[
{
active
:
true
,
name
:
"学历"
,
className
:
"education"
},
{
active
:
false
,
name
:
"年龄"
,
className
:
"age"
},
{
active
:
false
,
name
:
"性别"
,
className
:
"gender"
},
{
active
:
false
,
name
:
"工作年限"
,
className
:
"workYear"
},
{
active
:
false
,
name
:
"专业"
,
className
:
"major"
}
];
/* 初始化数据 */
educationList
.
value
=
await
getEumData
(
"EnumEducationRequirement"
);
genderList
.
value
=
await
getEumData
(
"EnumGenderRequirement"
);
workYearList
.
value
=
[
{
text
:
"不限"
,
min
:
null
,
max
:
null
},
{
text
:
"1年"
,
min
:
0
,
max
:
1
},
{
text
:
"2~3年"
,
min
:
2
,
max
:
3
},
{
text
:
"4~5年"
,
min
:
4
,
max
:
5
},
{
text
:
"5~10年"
,
min
:
5
,
max
:
10
},
{
text
:
"10年以上"
,
min
:
10
,
max
:
null
}
];
const
dictJobType
=
await
dictJobTypeApi
({});
dictJobTypeList
.
value
=
dictJobType
.
data
;
// uni.hideLoading();
};
initData
();
/*
接受两个方法
1. 确认 接收数据
2. 取消
*/
const
emit
=
defineEmits
([
"confirm"
,
"cancel"
]);
// 2. 取消
const
onCancel
=
()
=>
{
emit
(
"cancel"
);
};
// 1. 确认 接收数据
const
onConfirm
=
()
=>
{
console
.
log
(
educationList
.
value
.
find
(
v
=>
v
.
active
),
genderList
.
value
.
find
(
v
=>
v
.
active
),
workYearList
.
value
.
find
(
v
=>
v
.
active
),
dictJobTypeList
.
value
.
find
(
v
=>
v
.
active
)
);
emit
(
"confirm"
);
};
</
script
>
<
style
lang=
"scss"
scoped
>
.filter
{
position
:
absolute
;
inset
:
0
;
z-index
:
66666666
;
display
:
flex
;
background-color
:
#ffffff
;
.menu
{
width
:
200rpx
;
height
:
100%
;
background-color
:
#e8f2ff
;
p
{
padding
:
32rpx
24rpx
;
font-size
:
32rpx
;
color
:
#1b2026
;
}
.active
{
padding-left
:
16rpx
;
color
:
#1f86ff
;
background-color
:
#ffffff
;
border-left
:
8rpx
solid
#1f86ff
;
}
}
.content
{
flex
:
1
;
padding
:
32rpx
;
padding-bottom
:
80rpx
;
overflow-y
:
auto
;
.filter-item
{
margin-bottom
:
66rpx
;
.title
{
margin-bottom
:
24rpx
;
font-size
:
24rpx
;
font-weight
:
600
;
line-height
:
36rpx
;
color
:
#1b2026
;
}
.filter-select
{
display
:
grid
;
grid-template-columns
:
1fr
1fr
;
gap
:
16rpx
22rpx
;
.select-item
{
box-sizing
:
border-box
;
height
:
60rpx
;
font-size
:
24rpx
;
line-height
:
60rpx
;
color
:
#1b2026
;
text-align
:
center
;
background
:
#f0f4fa
;
border
:
2rpx
solid
#f0f4fa
;
border-radius
:
8rpx
;
}
.active
{
color
:
#1f86ff
;
border-color
:
#1f86ff
;
}
}
:deep
(
.wd-slider
)
{
height
:
auto
;
padding-top
:
36rpx
;
.wd-slider__bar-wrapper
{
margin
:
12rpx
;
background
:
red
;
}
.wd-slider__button-wrapper
{
top
:
50%
;
width
:
20rpx
;
.wd-slider__button
{
width
:
20rpx
;
height
:
20rpx
;
background
:
#1f86ff
;
border
:
0
;
box-shadow
:
none
;
}
.wd-slider__label
{
bottom
:
16rpx
;
left
:
50%
;
width
:
auto
;
color
:
#1f86ff
;
background-color
:
transparent
;
transform
:
translateX
(
-50%
);
}
}
}
}
}
.bottom-wrap
{
position
:
absolute
;
bottom
:
0
;
left
:
0
;
box-sizing
:
border-box
;
display
:
flex
;
justify-content
:
space-between
;
width
:
100%
;
padding
:
16rpx
64rpx
;
background-color
:
#ffffff
;
button
{
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
width
:
294rpx
;
height
:
80rpx
;
margin
:
0
;
border
:
0
;
}
.cancel
{
color
:
#1f86ff
;
background
:
#e8f2ff
;
}
.confirm
{
color
:
#ffffff
;
background
:
#1f86ff
;
}
}
}
</
style
>
src/components/form/form-item.vue
View file @
3cfc9148
...
@@ -34,6 +34,7 @@ const iconPath = new URL(`../../static/image/icon/${props.icon}.png`, import.met
...
@@ -34,6 +34,7 @@ const iconPath = new URL(`../../static/image/icon/${props.icon}.png`, import.met
margin-top
:
32rpx
;
margin-top
:
32rpx
;
border-bottom
:
2rpx
solid
rgb
(
31
35
41
/
15%
);
border-bottom
:
2rpx
solid
rgb
(
31
35
41
/
15%
);
.title
{
.title
{
height
:
36rpx
;
margin-bottom
:
32rpx
;
margin-bottom
:
32rpx
;
font-size
:
32rpx
;
font-size
:
32rpx
;
font-weight
:
600
;
font-weight
:
600
;
...
...
src/pages/recommend/releasePostion/step1.vue
View file @
3cfc9148
<
template
>
<
template
>
<div
class=
"page"
>
<div
class=
"page"
>
<NavBar
:showIcon=
"true"
:showTitle=
"false"
title=
""
backgroundBox=
"#FFFFFF"
></NavBar>
<NavBar
:showIcon=
"true"
:showTitle=
"false"
title=
""
backgroundBox=
"#FFFFFF"
></NavBar>
<!--
<Filter
/>
-->
<view
class=
"title"
>
<view
class=
"title"
>
<view
class=
"t1"
>
1/5填写职位信息
</view>
<view
class=
"t1"
>
1/5填写职位信息
</view>
<view
class=
"t2"
>
选择对应的职位并填写职位信息
</view>
<view
class=
"t2"
>
选择对应的职位并填写职位信息
</view>
</view>
</view>
<view
class=
"content"
>
<view
class=
"content"
>
<selectbox
:options=
"
typeOptions"
v-model=
"typeValu
e"
></selectbox>
<selectbox
:options=
"
EnumWorkMode"
label-key=
"text"
value-key=
"code"
v-model=
"pinias.formData.workMod
e"
></selectbox>
<form-row>
<form-row>
<form-item
title=
"职位类型"
>
<form-item
title=
"职位类型"
>
<wd-col-picker
<wd-col-picker
...
@@ -18,20 +19,20 @@
...
@@ -18,20 +19,20 @@
value-key=
"id"
value-key=
"id"
use-default-slot
use-default-slot
>
>
<view
:class=
"`inner flex-between $
{pinias.formData.jobType
Text
? '' : 'placeholder'}`">
<view
:class=
"`inner flex-between $
{pinias.formData.jobType
Name
? '' : 'placeholder'}`">
{{
pinias
.
formData
.
jobType
Text
||
"请选择职位类型"
}}
{{
pinias
.
formData
.
jobType
Name
||
"请选择职位类型"
}}
</view>
</view>
</wd-col-picker>
</wd-col-picker>
</form-item>
</form-item>
</form-row>
</form-row>
<form-row>
<form-row>
<form-item
title=
"职位标题"
icon=
"edit"
>
<form-item
title=
"职位标题"
icon=
"edit"
>
<input
type=
"text"
placeholder=
"输入职位标题如“财务总监”"
/>
<input
type=
"text"
v-model=
"pinias.formData.name"
placeholder=
"输入职位标题如“财务总监”"
/>
</form-item>
</form-item>
</form-row>
</form-row>
<form-row>
<form-row>
<form-item
title=
"职位描述"
:border=
"false"
icon=
""
>
<form-item
title=
"职位描述"
:border=
"false"
icon=
""
>
<textarea></textarea>
<textarea
v-model=
"pinias.formData.positionDesc"
placeholder=
"请输入你的职位描述"
></textarea>
</form-item>
</form-item>
</form-row>
</form-row>
<!--
<view
class=
"switch"
>
<!--
<view
class=
"switch"
>
...
@@ -54,8 +55,8 @@
...
@@ -54,8 +55,8 @@
value-key=
"id"
value-key=
"id"
use-default-slot
use-default-slot
>
>
<view
:class=
"`inner flex-between $
{pinias.formData.jobType
Text
? '' : 'placeholder'}`">
<view
:class=
"`inner flex-between $
{pinias.formData.jobType
Name
? '' : 'placeholder'}`">
{{
pinias
.
formData
.
jobType
Text
||
"请选择职位类型"
}}
{{
pinias
.
formData
.
jobType
Name
||
"请选择职位类型"
}}
<view
class=
"arrow"
></view>
<view
class=
"arrow"
></view>
</view>
</view>
</wd-col-picker>
</wd-col-picker>
...
@@ -77,7 +78,7 @@
...
@@ -77,7 +78,7 @@
custom-class=
"textarea"
custom-class=
"textarea"
show-word-limit
show-word-limit
maxlength=
"500"
maxlength=
"500"
v-model=
"pinias.formData.
job
Desc"
v-model=
"pinias.formData.
position
Desc"
placeholder=
"请输入你的职位描述"
placeholder=
"请输入你的职位描述"
/>
/>
</view>
-->
</view>
-->
...
@@ -96,6 +97,7 @@
...
@@ -96,6 +97,7 @@
</
template
>
</
template
>
<
script
setup
>
<
script
setup
>
// import Filter from "@/components/filter/index.vue";
import
{
getEumData
}
from
"@/utils/utils"
;
import
{
getEumData
}
from
"@/utils/utils"
;
import
{
ref
}
from
"vue"
;
import
{
ref
}
from
"vue"
;
import
{
dictJobTypeApi
}
from
"@/api/common"
;
import
{
dictJobTypeApi
}
from
"@/api/common"
;
...
@@ -118,6 +120,7 @@ onLoad(option => {
...
@@ -118,6 +120,7 @@ onLoad(option => {
});
});
/* 兼职全职枚举 */
/* 兼职全职枚举 */
const
EnumWorkMode
=
ref
([]);
const
EnumWorkMode
=
ref
([]);
const
workModeValue
=
ref
();
const
getEnumWorkMode
=
async
()
=>
{
const
getEnumWorkMode
=
async
()
=>
{
EnumWorkMode
.
value
=
await
getEumData
(
"EnumWorkMode"
);
EnumWorkMode
.
value
=
await
getEumData
(
"EnumWorkMode"
);
};
};
...
@@ -154,39 +157,20 @@ const columnChange = ({ selectedItem, resolve, finish }) => {
...
@@ -154,39 +157,20 @@ const columnChange = ({ selectedItem, resolve, finish }) => {
}
}
};
};
const
handleConfirm
=
({
selectedItems
,
value
})
=>
{
const
handleConfirm
=
({
selectedItems
,
value
})
=>
{
const
taget
=
_
.
last
(
selectedItems
);
pinias
.
setFormDataKey
(
"jobTypeName"
,
selectedItems
[
1
].
name
);
pinias
.
setFormDataKey
(
"jobType
Text"
,
taget
.
name
);
pinias
.
setFormDataKey
(
"jobType
Pid"
,
selectedItems
[
1
].
id
);
pinias
.
setFormDataKey
(
"jobType
"
,
taget
.
id
);
pinias
.
setFormDataKey
(
"jobType
ParentId"
,
selectedItems
[
0
]
.
id
);
};
};
const
next
=
()
=>
{
const
next
=
()
=>
{
xma
.
hideKeyboard
();
xma
.
hideKeyboard
();
if
(
validateForm
(
pinias
.
formData
,
[
"jobType"
,
"jobTypeText"
,
"jobName"
,
"jobDesc"
]))
{
console
.
log
(
pinias
.
formData
);
if
(
validateForm
(
pinias
.
formData
,
[
"jobTypePid"
,
"jobTypeName"
,
"name"
,
"positionDesc"
]))
{
uni
.
navigateTo
({
uni
.
navigateTo
({
url
:
"/pages/recommend/releasePostion/step2"
url
:
"/pages/recommend/releasePostion/step2"
});
});
}
}
};
};
/* 类型 */
const
typeValue
=
ref
(
1
);
const
typeOptions
=
[
{
label
:
"全职"
,
value
:
1
},
{
label
:
"兼职"
,
value
:
2
},
{
label
:
"见习"
,
value
:
3
},
{
label
:
"实习"
,
value
:
4
}
];
</
script
>
</
script
>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
...
...
src/pages/recommend/releasePostion/step2.vue
View file @
3cfc9148
...
@@ -85,7 +85,6 @@ let salaryText = ref("");
...
@@ -85,7 +85,6 @@ let salaryText = ref("");
const
value
=
ref
([]);
const
value
=
ref
([]);
const
columns
=
ref
([]);
const
columns
=
ref
([]);
let
my
=
ref
(
pinias
.
formData
.
negotiableSalary
==
1
);
let
my
=
ref
(
pinias
.
formData
.
negotiableSalary
==
1
);
console
.
log
(
pinias
.
formData
.
settlementType
,
"pinias.formData.settlementType"
);
const
show
=
ref
(
false
);
const
show
=
ref
(
false
);
let
multiple
=
1
;
let
multiple
=
1
;
/* 兼职薪资基准 */
/* 兼职薪资基准 */
...
...
src/pages/recommend/releasePostion/step3.vue
View file @
3cfc9148
...
@@ -32,7 +32,7 @@
...
@@ -32,7 +32,7 @@
<wd-tabbar
<wd-tabbar
@
tap=
"next"
@
tap=
"next"
custom-style=
"display: flex;justify-content: center !important;"
custom-style=
"display: flex;justify-content: center !important;
z-index:9;
"
fixed
fixed
placeholder
placeholder
safeAreaInsetBottom
safeAreaInsetBottom
...
@@ -47,36 +47,13 @@ import { ref } from "vue";
...
@@ -47,36 +47,13 @@ import { ref } from "vue";
import
AddressSelect
from
"@/components/form/address-select.vue"
;
import
AddressSelect
from
"@/components/form/address-select.vue"
;
import
{
getTreeListApi
}
from
"@/api/common"
;
import
{
getTreeListApi
}
from
"@/api/common"
;
import
{
useReleasePostionStore
}
from
"./store"
;
import
{
useReleasePostionStore
}
from
"./store"
;
import
town
from
"@/assets/town.json"
;
/* tab */
/* tab */
const
pinias
=
useReleasePostionStore
();
const
pinias
=
useReleasePostionStore
();
const
showTab
=
ref
(
true
);
const
showTab
=
ref
(
true
);
const
address
=
ref
(
""
);
const
address
=
ref
(
""
);
import
{
validateForm
}
from
"@/utils/utils"
;
import
{
validateForm
}
from
"@/utils/utils"
;
const
getLocaltion
=
()
=>
{
showTab
.
value
=
false
;
xma
.
chooseLocation
({
success
:
res
=>
{
console
.
log
(
res
);
if
(
res
.
errMsg
==
"chooseLocation:ok"
)
{
address
.
value
=
res
.
name
;
}
pinias
.
setFormDataKey
(
"locationLongitude"
,
res
.
longitude
||
106.647169
);
pinias
.
setFormDataKey
(
"locationLatitude"
,
res
.
latitude
||
26.615808
);
pinias
.
setFormDataKey
(
"address"
,
res
.
name
||
"华贵保险大厦"
);
showTab
.
value
=
true
;
/*
address: "长岭南路178号"
distance: 124
errMsg: "chooseLocation:ok"
latitude: 26.615808
longitude: 106.647169
name: "华贵保险大厦"
*/
}
});
};
// 地区选择
// 地区选择
/* 获取省市区 */
/* 获取省市区 */
const
cityOpstion
=
ref
([]);
const
cityOpstion
=
ref
([]);
...
@@ -84,23 +61,33 @@ const cityValue = ref([]);
...
@@ -84,23 +61,33 @@ const cityValue = ref([]);
const
cityText
=
ref
(
""
);
const
cityText
=
ref
(
""
);
let
citySelectedItems
=
[];
let
citySelectedItems
=
[];
getTreeListApi
().
then
(
res
=>
{
getTreeListApi
(
{
provinceName
:
"贵州省"
}
).
then
(
res
=>
{
cityOpstion
.
value
.
push
(
res
.
data
);
cityOpstion
.
value
.
push
(
res
.
data
[
0
].
children
);
});
});
const
columnChangeCity
=
({
selectedItem
,
resolve
,
finish
})
=>
{
const
columnChangeCity
=
({
selectedItem
,
resolve
,
finish
})
=>
{
if
(
selectedItem
.
children
)
{
if
(
selectedItem
.
children
)
{
console
.
log
(
selectedItem
.
children
);
resolve
(
selectedItem
.
children
);
resolve
(
selectedItem
.
children
);
}
else
{
}
else
{
finish
();
// 选择街道
if
(
selectedItem
.
children
===
null
&&
town
[
selectedItem
.
code
])
{
resolve
(
town
[
selectedItem
.
code
].
map
((
v
,
i
)
=>
({
...
v
,
code
:
i
})));
}
else
{
finish
();
}
}
}
};
};
const
handleConfirmCity
=
({
selectedItems
})
=>
{
const
handleConfirmCity
=
({
selectedItems
})
=>
{
cityText
.
value
=
selectedItems
.
map
(
v
=>
v
.
name
).
join
(
"-"
);
cityText
.
value
=
selectedItems
.
map
(
v
=>
v
.
name
).
join
(
"-"
);
citySelectedItems
=
selectedItems
;
citySelectedItems
=
selectedItems
;
const
[
province
,
city
,
district
]
=
selectedItems
;
const
[
city
,
district
,
street
]
=
selectedItems
;
console
.
log
([
province
,
city
,
district
]);
pinias
.
formData
.
address
=
selectedItems
.
map
(
v
=>
v
.
name
).
join
(
""
);
pinias
.
formData
.
provinceCode
=
520000
;
pinias
.
formData
.
cityCode
=
city
.
code
;
pinias
.
formData
.
districtCode
=
district
.
code
;
pinias
.
formData
.
street
=
street
.
name
;
/*
params.provinceCode = province.code;
/*params.provinceCode = province.code;
params.provinceName = province.name;
params.provinceName = province.name;
params.cityCode = city.code;
params.cityCode = city.code;
params.cityName = city.name;
params.cityName = city.name;
...
...
src/pages/recommend/releasePostion/step4.vue
View file @
3cfc9148
...
@@ -36,12 +36,12 @@
...
@@ -36,12 +36,12 @@
>
>
<view
:class=
"`inner flex-between $
{educationText ? '' : 'placeholder'}`">
<view
:class=
"`inner flex-between $
{educationText ? '' : 'placeholder'}`">
<view
class=
"flex-align-center"
bind:tap=
"onShowIdentitySelect"
>
<view
class=
"flex-align-center"
bind:tap=
"onShowIdentitySelect"
>
{{
educationText
||
"请选择学历
要求
"
}}
{{
educationText
||
"请选择学历"
}}
</view>
</view>
</view>
</view>
</wd-picker>
</wd-picker>
</form-item>
</form-item>
<form-item
title=
"
学历
要求"
>
<form-item
title=
"
年龄
要求"
>
<wd-col-picker
<wd-col-picker
v-model=
"value"
v-model=
"value"
:columns=
"columns"
:columns=
"columns"
...
@@ -50,7 +50,7 @@
...
@@ -50,7 +50,7 @@
use-default-slot
use-default-slot
>
>
<view
:class=
"`inner flex-between $
{ageText ? '' : 'placeholder'}`" bind:tap="onOpen">
<view
:class=
"`inner flex-between $
{ageText ? '' : 'placeholder'}`" bind:tap="onOpen">
{{
ageText
||
"请选择年龄
要求
"
}}
{{
ageText
||
"请选择年龄
范围
"
}}
</view>
</view>
</wd-col-picker>
</wd-col-picker>
</form-item>
</form-item>
...
@@ -109,30 +109,57 @@
...
@@ -109,30 +109,57 @@
</view>
-->
</view>
-->
<form-row
:fill=
"false"
>
<form-row
:fill=
"false"
>
<form-item
title=
"专业技术职称"
icon=
"edit"
>
<form-item
title=
"专业技术职称"
icon=
"edit"
>
<input
type=
"text"
/>
<input
type=
"text"
v-model=
"majorInputValue"
placeholder=
"请填写职称"
/>
</form-item>
<form-item
title=
""
>
<wd-picker
:columns=
"levelOptions"
value-key=
"text"
label-key=
"text"
v-model=
"majorSelectValue"
use-default-slot
>
<view
:class=
"`inner flex-between $
{majorSelectValue ? '' : 'placeholder'}`">
<view
class=
"flex-align-center"
bind:tap=
"onShowIdentitySelect"
>
{{
majorSelectValue
||
"请选择职业等级"
}}
</view>
</view>
</wd-picker>
</form-item>
</form-item>
<form-item
title=
""
>
</form-item>
</form-row>
</form-row>
<form-row
:fill=
"false"
>
<form-row
:fill=
"false"
>
<form-item
title=
"职业资格/技能等级证书"
icon=
"edit"
>
<form-item
title=
"职业资格/技能等级证书"
icon=
"edit"
>
<input
type=
"text"
/>
<input
type=
"text"
v-model=
"certificateInputValue"
placeholder=
"请填写职业资格"
/>
</form-item>
<form-item
title=
""
>
<wd-picker
:columns=
"levelOptions"
value-key=
"text"
label-key=
"text"
v-model=
"certificateSelectValue"
use-default-slot
>
<view
:class=
"`inner flex-between $
{certificateSelectValue ? '' : 'placeholder'}`">
<view
class=
"flex-align-center"
bind:tap=
"onShowIdentitySelect"
>
{{
certificateSelectValue
||
"请选择职业资格等级"
}}
</view>
</view>
</wd-picker>
</form-item>
</form-item>
<form-item
title=
""
>
</form-item>
</form-row>
</form-row>
<form-row>
<form-row>
<form-item
title=
"特种作业证"
icon=
"edit"
>
<form-item
title=
"特种作业证"
icon=
"edit"
>
<input
type=
"text
"
/>
<input
v-model=
"pinias.formData.specialCertificates"
type=
"text"
placeholder=
"请填写特种作业证
"
/>
</form-item>
</form-item>
</form-row>
</form-row>
</view>
</view>
<wd-tabbar
<wd-tabbar
@
tap=
"next"
custom-style=
"display: flex;justify-content: center !important;z-index:1;"
custom-style=
"display: flex;justify-content: center !important;z-index:1;"
fixed
fixed
placeholder
placeholder
safeAreaInsetBottom
safeAreaInsetBottom
>
>
<view
class=
"foot-btn"
>
下一步
</view>
<view
class=
"foot-btn"
@
tap=
"next"
>
下一步
</view>
</wd-tabbar>
</wd-tabbar>
</div>
</div>
</
template
>
</
template
>
...
@@ -143,6 +170,7 @@ import { getEumData, getEnumText } from "@/utils/utils";
...
@@ -143,6 +170,7 @@ import { getEumData, getEnumText } from "@/utils/utils";
import
{
useReleasePostionStore
}
from
"./store"
;
import
{
useReleasePostionStore
}
from
"./store"
;
import
FormItem
from
"@/components/form/form-item.vue"
;
import
FormItem
from
"@/components/form/form-item.vue"
;
import
FormRow
from
"@/components/form/form-row.vue"
;
import
FormRow
from
"@/components/form/form-row.vue"
;
import
{
validateForm
}
from
"@/utils/utils"
;
/* tab */
/* tab */
const
pinias
=
useReleasePostionStore
();
const
pinias
=
useReleasePostionStore
();
const
identityText
=
ref
(
""
);
const
identityText
=
ref
(
""
);
...
@@ -216,13 +244,21 @@ const handleConfirm = ({ value, selectedItem }) => {
...
@@ -216,13 +244,21 @@ const handleConfirm = ({ value, selectedItem }) => {
}
}
};
};
const
next
=
()
=>
{
/* 等级选择项 */
console
.
log
(
pinias
.
formData
);
const
levelOptions
=
ref
([
"初级"
,
"中级"
,
"高级"
,
"高级以上"
]
);
uni
.
navigateTo
(
{
const
getEnumCertificatesLevel
=
async
()
=>
{
url
:
"/pages/recommend/releasePostion/step5"
levelOptions
.
value
=
await
getEumData
(
"EnumCertificatesLevel"
);
}
);
console
.
log
(
levelOptions
.
value
);
};
};
getEnumCertificatesLevel
();
/* 专业 major */
const
majorInputValue
=
ref
(
""
);
const
majorSelectValue
=
ref
(
""
);
/* 证书 certificate */
const
certificateInputValue
=
ref
(
""
);
const
certificateSelectValue
=
ref
(
""
);
/* 特种作业证 specialLicense */
const
specialLicenseValue
=
ref
(
""
);
/* 初始化页面数据 */
/* 初始化页面数据 */
const
initViewData
=
async
()
=>
{
const
initViewData
=
async
()
=>
{
if
(
pinias
.
formData
.
id
)
{
if
(
pinias
.
formData
.
id
)
{
...
@@ -236,6 +272,32 @@ const initViewData = async () => {
...
@@ -236,6 +272,32 @@ const initViewData = async () => {
}
}
};
};
initViewData
();
initViewData
();
const
next
=
()
=>
{
/* majorInputValue
majorSelectValue
certificateInputValue
certificateSelectValue
specialLicenseValue */
if
(
majorInputValue
.
value
&&
majorSelectValue
.
value
)
pinias
.
formData
.
positionalTitle
=
majorInputValue
.
value
+
"-"
+
majorSelectValue
.
value
;
if
(
certificateInputValue
.
value
&&
certificateSelectValue
.
value
)
pinias
.
formData
.
professionalCertificates
=
certificateInputValue
.
value
+
"-"
+
certificateSelectValue
.
value
;
console
.
log
(
pinias
.
formData
);
if
(
validateForm
(
pinias
.
formData
,
[
"identityRequirement"
,
"educationRequirement"
,
"positionalTitle"
,
"professionalCertificates"
,
"specialCertificates"
])
)
{
uni
.
navigateTo
({
url
:
"/pages/recommend/releasePostion/step5"
});
}
};
</
script
>
</
script
>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
...
...
src/pages/recommend/releasePostion/step5.vue
View file @
3cfc9148
...
@@ -120,7 +120,6 @@ const submit = () => {
...
@@ -120,7 +120,6 @@ const submit = () => {
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
@import
"./common.scss"
;
@import
"./common.scss"
;
.foot-btn
{
.foot-btn
{
position
:
fixed
;
position
:
fixed
;
display
:
flex
;
display
:
flex
;
...
...
src/pages/recommend/releasePostion/store.js
View file @
3cfc9148
import
{
defineStore
}
from
"pinia"
;
import
{
defineStore
}
from
"pinia"
;
import
{
reactive
,
ref
}
from
"vue"
;
import
{
reactive
,
ref
}
from
"vue"
;
export
const
useReleasePostionStore
=
defineStore
(
"useReleasePostionStore"
,
()
=>
{
export
const
useReleasePostionStore
=
defineStore
(
"useReleasePostionStore"
,
()
=>
{
let
formData
=
ref
(
{
/*
let formData = ref( {
workMode: 1,
workMode: 1,
jobName: "",
jobName: "",
jobType: 1,
jobType: 1,
...
@@ -29,51 +29,81 @@ export const useReleasePostionStore = defineStore("useReleasePostionStore", ()=>
...
@@ -29,51 +29,81 @@ export const useReleasePostionStore = defineStore("useReleasePostionStore", ()=>
locationLatitude: 0,
locationLatitude: 0,
contactPerson: "",
contactPerson: "",
contactPhone: ""
contactPhone: ""
})
}) */
function
setFormDataKey
(
key
,
data
)
{
const
formData
=
ref
({
formData
.
value
[
key
]
=
data
;
workMode
:
1
,
}
name
:
""
,
function
resetForm
()
{
jobTypeId
:
1
,
jobTypePid
:
""
,
formData
.
value
=
{
jobTypeName
:
""
,
workMode
:
1
,
postitDesc
:
""
,
jobName
:
""
,
negotiableSalary
:
0
,
jobType
:
1
,
settlementType
:
4
,
jobTypeText
:
""
,
minSalary
:
1
,
jobDesc
:
""
,
maxSalary
:
1
,
negotiableSalary
:
0
,
benefits
:
""
,
settlementType
:
4
,
identityRequirement
:
1
,
minSalary
:
0
,
educationRequirement
:
1
,
maxSalary
:
0
,
minAgeRequirement
:
1
,
benefits
:
""
,
maxAgeRequirement
:
1
,
identityRequirement
:
1
,
recruitmentNumber
:
1
,
educationRequirement
:
1
,
accommodation
:
1
,
minAgeRequirement
:
16
,
provinceCode
:
""
,
maxAgeRequirement
:
60
,
cityCode
:
""
,
recruitmentNumber
:
1
,
districtCode
:
""
,
accommodation
:
1
,
street
:
""
,
provinceCode
:
""
,
address
:
""
,
cityCode
:
""
,
contactPerson
:
""
,
districtCode
:
""
,
contactPhone
:
""
,
town
:
""
,
articleId
:
""
,
street
:
""
,
positionalTitle
:
""
,
address
:
""
,
professionalCertificates
:
""
,
locationLongitude
:
0
,
specialCertificates
:
"xx证书-中级"
locationLatitude
:
0
,
});
contactPerson
:
""
,
function
setFormDataKey
(
key
,
data
)
{
contactPhone
:
""
formData
.
value
[
key
]
=
data
;
};
}
console
.
log
(
'this.formthis.formDatathis.formDatathis.formDatathis.formDataData'
,
formData
.
value
);
function
resetForm
()
{
}
formData
.
value
=
{
function
setForm
(
data
)
{
workMode
:
1
,
formData
.
value
=
data
;
name
:
""
,
console
.
log
(
"this.formData"
,
formData
.
value
);
jobTypeId
:
1
,
}
jobTypePid
:
""
,
return
{
jobTypeName
:
""
,
formData
,
postitDesc
:
""
,
setFormDataKey
,
negotiableSalary
:
0
,
resetForm
,
settlementType
:
4
,
setForm
minSalary
:
1
,
}
maxSalary
:
1
,
benefits
:
""
,
identityRequirement
:
1
,
educationRequirement
:
1
,
minAgeRequirement
:
1
,
maxAgeRequirement
:
1
,
recruitmentNumber
:
1
,
accommodation
:
1
,
provinceCode
:
""
,
cityCode
:
""
,
districtCode
:
""
,
street
:
""
,
address
:
""
,
contactPerson
:
""
,
contactPhone
:
""
,
articleId
:
""
,
positionalTitle
:
""
,
professionalCertificates
:
""
,
specialCertificates
:
"xx证书-中级"
};
console
.
log
(
"this.formthis.formDatathis.formDatathis.formDatathis.formDataData"
,
formData
.
value
);
}
function
setForm
(
data
)
{
formData
.
value
=
data
;
console
.
log
(
"this.formData"
,
formData
.
value
);
}
return
{
formData
,
setFormDataKey
,
resetForm
,
setForm
};
});
});
src/utils/utils.js
View file @
3cfc9148
...
@@ -49,7 +49,7 @@ export const navigateTo = (url, type = "navigateTo") => {
...
@@ -49,7 +49,7 @@ export const navigateTo = (url, type = "navigateTo") => {
});
});
};
};
export
const
formatTimestamp
=
(
timestamp
,
formatString
=
"YYYY-MM-DD hh:mm:ss"
)
=>
{
export
const
formatTimestamp
=
(
timestamp
,
formatString
=
"YYYY-MM-DD hh:mm:ss"
)
=>
{
const
date
=
new
Date
(
timestamp
);
const
date
=
new
Date
(
timestamp
);
const
year
=
date
.
getFullYear
();
const
year
=
date
.
getFullYear
();
const
month
=
(
"0"
+
(
date
.
getMonth
()
+
1
)).
slice
(
-
2
);
const
month
=
(
"0"
+
(
date
.
getMonth
()
+
1
)).
slice
(
-
2
);
...
@@ -66,12 +66,12 @@ export const formatTimestamp = (timestamp, formatString = "YYYY-MM-DD hh:mm:ss")
...
@@ -66,12 +66,12 @@ export const formatTimestamp = (timestamp, formatString = "YYYY-MM-DD hh:mm:ss")
.
replace
(
/hh/g
,
hour
)
.
replace
(
/hh/g
,
hour
)
.
replace
(
/mm/g
,
minute
)
.
replace
(
/mm/g
,
minute
)
.
replace
(
/ss/g
,
second
);
.
replace
(
/ss/g
,
second
);
}
}
;
export
const
validateForm
=
(
formData
,
requiredFields
)
=>
{
export
const
validateForm
=
(
formData
,
requiredFields
)
=>
{
const
phoneRegex
=
/^1
[
3-9
]\d{9}
$/
;
// 正则表达式匹配中国大陆手机号码
const
phoneRegex
=
/^1
[
3-9
]\d{9}
$/
;
// 正则表达式匹配中国大陆手机号码
for
(
const
field
of
requiredFields
)
{
for
(
const
field
of
requiredFields
)
{
if
(
field
===
"contactPhone"
||
field
===
"phone"
)
{
if
(
field
===
"contactPhone"
||
field
===
"phone"
)
{
if
(
!
formData
[
field
]
||
!
phoneRegex
.
test
(
formData
[
field
]))
{
if
(
!
formData
[
field
]
||
!
phoneRegex
.
test
(
formData
[
field
]))
{
uni
.
showToast
({
uni
.
showToast
({
title
:
`请填写正确电话号码!`
,
title
:
`请填写正确电话号码!`
,
...
@@ -81,39 +81,49 @@ export const validateForm=(formData,requiredFields) =>{
...
@@ -81,39 +81,49 @@ export const validateForm=(formData,requiredFields) =>{
return
false
;
return
false
;
}
}
}
else
if
(
!
formData
[
field
])
{
}
else
if
(
!
formData
[
field
])
{
console
.
log
(
field
);
uni
.
showToast
({
uni
.
showToast
({
title
:
`请填写
${
title
:
`请填写
${
field
===
"jobTypeText"
field
===
"jobTypeText"
?
"职位类型"
?
"职位类型"
:
field
===
"
job
Desc"
:
field
===
"
postit
Desc"
?
"职位描述"
?
"职位描述"
:
field
===
"jobName"
:
field
===
"jobName"
?
"职位名称"
?
"职位名称"
:
field
===
'address'
:
field
===
"address"
?
'工作地址'
?
"工作地址"
:
field
===
'identityRequirement'
:
field
===
"identityRequirement"
?
'身份要求'
?
"身份要求"
:
field
===
'educationRequirement'
:
field
===
"educationRequirement"
?
'学历要求'
?
"学历要求"
:
field
===
'maxAgeRequirement'
:
field
===
"maxAgeRequirement"
?
'年龄要求'
?
"年龄要求"
:
field
===
'contactPerson'
:
field
===
"contactPerson"
?
'联系人'
?
"联系人"
:
field
===
'jobType'
:
field
===
"jobType"
?
'职位类型'
?
"职位类型"
:
field
===
'position'
:
field
===
"maxAgeRequirement"
?
'职位'
?
"年龄"
:
field
===
'name'
:
field
===
"position"
?
'姓名'
?
"职位"
:
field
===
'avatarPath'
:
field
===
"name"
?
'头像'
?
"名字"
:
""
:
field
===
"positionalTitle"
?
"专业技术职称"
:
field
===
"professionalCertificates"
?
"职业等级证书"
:
field
===
"specialCertificates"
?
"特种作业证书"
:
field
===
"avatarPath"
?
"头像"
:
"表单"
}
!`
,
}
!`
,
icon
:
"none"
,
icon
:
"none"
,
duration
:
2000
duration
:
2000
});
});
return
false
;
return
false
;
}
}
}
}
return
true
;
return
true
;
}
}
;
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment