Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
R
recruit-sys
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
李文光
recruit-sys
Commits
3e6bc5e4
Commit
3e6bc5e4
authored
Sep 10, 2026
by
李文光
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
style(jobs): 重构岗位详情概览布局
parent
f42e88bd
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
209 additions
and
89 deletions
+209
-89
JobDetail.vue
vue-app/src/components/jobs/JobDetail.vue
+209
-89
No files found.
vue-app/src/components/jobs/JobDetail.vue
View file @
3e6bc5e4
...
@@ -543,54 +543,71 @@ const mainAction = async () => {
...
@@ -543,54 +543,71 @@ const mainAction = async () => {
<
el
-
tab
-
pane
label
=
"概览"
name
=
"overview"
>
<
el
-
tab
-
pane
label
=
"概览"
name
=
"overview"
>
<
div
class
=
"job-detail-content"
>
<
div
class
=
"job-detail-content"
>
<
div
class
=
"job-detail-main"
>
<
div
class
=
"job-detail-main"
>
<
article
class
=
"
card
"
>
<
article
class
=
"
job-document"
aria
-
labelledby
=
"job-document-title
"
>
<
div
class
=
"card-head
"
>
<
header
class
=
"job-document-header
"
>
<
div
>
<
div
class
=
"job-document-toolbar"
>
<
span
class
=
"section-kicker"
>
岗位说明
<
/span
>
<
span
>
岗位说明书
<
/span
>
<
h3
>
这个岗位在招什么人
<
/h3
>
<
el
-
button
link
@
click
=
"editJob"
>
编辑
<
/el-button
>
<
/div
>
<
/div
>
<
el
-
button
link
@
click
=
"editJob"
>
修改
<
/el-button
>
<
h2
id
=
"job-document-title"
>
{{
job
.
title
}}
<
/h2
>
<
/div
>
<
p
class
=
"job-document-subtitle"
>
<
p
class
=
"job-jd-summary"
>
{{
job
.
department
||
'部门待补充'
}}
·
{{
job
.
recruitType
||
'社招'
}}
{{
job
.
jd
||
'还没有岗位说明。先补充岗位背景与核心职责,后续匹配才会更准确。'
}}
<
template
v
-
if
=
"job.level"
>
·
{{
job
.
level
}}
<
/template
>
<
/p
>
<
/p
>
<
div
class
=
"job-criteria-list"
>
<
/header
>
<
div
>
<
dl
class
=
"job-document-meta"
>
<
b
>
核心职责
<
/b
>
<
p
>
{{
job
.
responsibilities
||
'暂未填写'
}}
<
/p
>
<
/div
>
<
div
>
<
div
>
<
b
>
任职要求
<
/b
>
<
dt
>
薪资范围
<
/dt
>
<
p
>
{{
job
.
requirements
||
job
.
mustHave
||
'暂未填写'
}}
<
/p
>
<
dd
>
{{
job
.
salaryRange
||
'待补充'
}}
<
/dd
>
<
/div
>
<
/div
>
<
div
>
<
b
>
加分项
<
/b
>
<
p
>
{{
job
.
niceToHave
||
'暂未填写'
}}
<
/p
>
<
/div
>
<
/div
>
<
div
class
=
"job-base-grid"
>
<
div
v
-
if
=
"job.level"
>
<
div
v
-
if
=
"job.level"
>
<
span
>
职级
<
/span><strong>{{ job.level
}}
</
strong
>
<
dt
>
职级
<
/dt
>
<
dd
>
{{
job
.
level
}}
<
/dd
>
<
/div
>
<
/div
>
<
div
v
-
if
=
"job.workLocation"
>
<
div
v
-
if
=
"job.workLocation"
>
<
span
>
工作地点
<
/span><strong>{{ job.workLocation
}}
</
strong
>
<
dt
>
工作地点
<
/dt
>
<
dd
>
{{
job
.
workLocation
}}
<
/dd
>
<
/div
>
<
/div
>
<
div
v
-
if
=
"job.recruitType"
>
<
div
>
<
span
>
招聘类型
<
/span><strong>{{ job.recruitType
}}
</
strong
>
<
dt
>
招聘人数
<
/dt
>
<
/div
>
<
dd
>
{{
Number
(
job
.
headcount
||
0
)
}}
人
<
/dd
>
<
div
v
-
if
=
"job.hireReason"
>
<
span
>
招聘原因
<
/span><strong>{{ job.hireReason
}}
</
strong
>
<
/div
>
<
/div
>
<
div
v
-
if
=
"job.startDate"
>
<
div
v
-
if
=
"job.startDate"
>
<
span
>
到岗时间
<
/span><strong>{{ job.startDate
}}
</
strong
>
<
dt
>
到岗时间
<
/dt
>
<
dd
>
{{
job
.
startDate
}}
<
/dd
>
<
/div
>
<
/div
>
<
div
v
-
if
=
"job.reportTo"
>
<
div
v
-
if
=
"job.reportTo"
>
<
span
>
汇报对象
<
/span><strong>{{ job.reportTo
}}
</
strong
>
<
dt
>
汇报对象
<
/dt
>
<
/div
>
<
dd
>
{{
job
.
reportTo
}}
<
/dd
>
<
/div
>
<
/div
>
<
/dl
>
<
section
class
=
"job-document-section"
>
<
h3
>
岗位介绍
<
/h3
>
<
p
:
class
=
"{ 'is-empty': !job.jd
}
"
>
{{
job
.
jd
||
'岗位介绍待补充'
}}
<
/p
>
<
/section
>
<
section
class
=
"job-document-section"
>
<
h3
>
岗位职责
<
/h3
>
<
p
:
class
=
"{ 'is-empty': !job.responsibilities
}
"
>
{{
job
.
responsibilities
||
'岗位职责待补充'
}}
<
/p
>
<
/section
>
<
section
class
=
"job-document-section"
>
<
h3
>
任职要求
<
/h3
>
<
p
:
class
=
"{ 'is-empty': !job.requirements && !job.mustHave
}
"
>
{{
job
.
requirements
||
job
.
mustHave
||
'任职要求待补充'
}}
<
/p
>
<
/section
>
<
section
v
-
if
=
"job.niceToHave"
class
=
"job-document-section"
>
<
h3
>
加分项
<
/h3
>
<
p
>
{{
job
.
niceToHave
}}
<
/p
>
<
/section
>
<
footer
class
=
"job-document-footer"
>
<
span
>
JD
版本:
{{
statusLabel
(
job
.
jdVersion
)
}}
<
/span
>
<
span
>
{{
job
.
jdStatus
||
JD_STATUS
.
DRAFT
}}
<
/span
>
<
/footer
>
<
/article
>
<
/article
>
<
/div
>
<
article
class
=
"card"
>
<
aside
class
=
"job-detail-side"
>
<
section
class
=
"job-overview-support candidate-progress-panel"
>
<
div
class
=
"card-head"
>
<
div
class
=
"card-head"
>
<
div
>
<
div
>
<
span
class
=
"section-kicker"
>
候选人
<
/span
>
<
span
class
=
"section-kicker"
>
候选人
<
/span
>
...
@@ -608,13 +625,9 @@ const mainAction = async () => {
...
@@ -608,13 +625,9 @@ const mainAction = async () => {
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
div
v
-
else
class
=
"job-empty-inline"
>
还没有关联候选人。可前往简历库将候选人匹配到此岗位。
<
/div
>
<
div
v
-
else
class
=
"job-empty-inline"
>
还没有关联候选人。可前往简历库将候选人匹配到此岗位。
<
/div
>
<
/article
>
<
/section
>
<
/div
>
<
section
class
=
"job-overview-support management-panel"
>
<
h3
>
招聘管理
<
/h3
>
<
aside
class
=
"job-detail-side"
>
<
article
class
=
"card"
>
<
span
class
=
"section-kicker"
>
状态
<
/span
>
<
h3
>
主数据
<
/h3
>
<
div
class
=
"info-grid"
>
<
div
class
=
"info-grid"
>
<
div
>
<
div
>
<
span
>
审批状态
<
/span><strong>{{ statusLabel
(
job.approvalStatus
)
}}
</
strong
>
<
span
>
审批状态
<
/span><strong>{{ statusLabel
(
job.approvalStatus
)
}}
</
strong
>
...
@@ -631,13 +644,16 @@ const mainAction = async () => {
...
@@ -631,13 +644,16 @@ const mainAction = async () => {
<
div
>
<
div
>
<
span
>
匹配规则
<
/span><strong>{{ statusLabel
(
job.matchRuleStatus
)
}}
</
strong
>
<
span
>
匹配规则
<
/span><strong>{{ statusLabel
(
job.matchRuleStatus
)
}}
</
strong
>
<
/div
>
<
/div
>
<
div
v
-
if
=
"job.hireReason"
>
<
span
>
招聘原因
<
/span><strong>{{ job.hireReason
}}
</
strong
>
<
/div
>
<
/div
>
<
/div
>
<
div
class
=
"job-quick-links"
>
<
div
class
=
"job-quick-links"
>
<
el
-
button
link
@
click
=
"editJob"
>
编辑岗位信息
→
<
/el-button
>
<
el
-
button
link
@
click
=
"editJob"
>
编辑岗位信息
→
<
/el-button
>
<
el
-
button
link
@
click
=
"activeTab = 'flow'"
>
更新
JD
与招聘标准
→
<
/el-button
>
<
el
-
button
link
@
click
=
"activeTab = 'flow'"
>
更新
JD
与招聘标准
→
<
/el-button
>
<
el
-
button
link
@
click
=
"activeTab = 'publish'"
>
确认发布与渠道状态
→
<
/el-button
>
<
el
-
button
link
@
click
=
"activeTab = 'publish'"
>
确认发布与渠道状态
→
<
/el-button
>
<
/div
>
<
/div
>
<
/
article
>
<
/
section
>
<
/aside
>
<
/aside
>
<
/div
>
<
/div
>
<
/el-tab-pane
>
<
/el-tab-pane
>
...
@@ -1180,82 +1196,186 @@ const mainAction = async () => {
...
@@ -1180,82 +1196,186 @@ const mainAction = async () => {
.
job
-
detail
-
content
{
.
job
-
detail
-
content
{
display
:
grid
;
display
:
grid
;
grid
-
template
-
columns
:
1
fr
320
px
;
grid
-
template
-
columns
:
minmax
(
560
px
,
780
px
)
300
px
;
gap
:
16
px
;
align
-
items
:
start
;
justify
-
content
:
start
;
gap
:
32
px
;
background
:
var
(
--
panel
);
padding
:
32
px
40
px
;
color
:
var
(
--
ink
);
overflow
-
wrap
:
anywhere
;
}
}
.
job
-
detail
-
main
{
.
job
-
detail
-
main
{
min
-
width
:
0
;
max
-
width
:
780
px
;
width
:
100
%
;
justify
-
self
:
start
;
}
.
job
-
detail
-
side
{
position
:
sticky
;
top
:
20
px
;
min
-
width
:
0
;
padding
-
top
:
12
px
;
display
:
flex
;
display
:
flex
;
flex
-
direction
:
column
;
flex
-
direction
:
column
;
gap
:
16
px
;
gap
:
16
px
;
}
}
.
card
-
head
{
.
job
-
document
{
max
-
width
:
780
px
;
margin
-
inline
:
auto
;
font
-
size
:
15
px
;
line
-
height
:
1.85
;
letter
-
spacing
:
0
;
}
.
job
-
document
-
toolbar
{
display
:
flex
;
display
:
flex
;
align
-
items
:
center
;
justify
-
content
:
space
-
between
;
justify
-
content
:
space
-
between
;
align
-
items
:
flex
-
start
;
gap
:
16
px
;
color
:
var
(
--
muted
);
h3
{
font
-
size
:
13
px
;
margin
:
4
px
0
0
;
}
font
-
size
:
16
px
;
}
.
section
-
kicker
{
.
job
-
document
-
header
{
font
-
size
:
12
px
;
h2
{
color
:
var
(
--
blue
);
margin
:
12
px
0
8
px
;
font
-
size
:
26
px
;
line
-
height
:
1.4
;
}
}
}
.
job
-
jd
-
summary
{
.
job
-
document
-
subtitle
{
margin
:
0
;
color
:
var
(
--
muted
);
color
:
var
(
--
muted
);
line
-
height
:
1.7
;
font
-
size
:
14
px
;
}
}
}
.
job
-
criteria
-
list
{
.
job
-
document
-
meta
{
display
:
grid
;
display
:
grid
;
grid
-
template
-
columns
:
repeat
(
3
,
1
fr
);
grid
-
template
-
columns
:
repeat
(
2
,
minmax
(
0
,
1
fr
));
gap
:
14
px
;
gap
:
12
px
32
px
;
padding
-
block
:
24
px
;
margin
:
0
0
32
px
;
border
-
bottom
:
1
px
solid
var
(
--
line
);
font
-
size
:
14
px
;
>
div
{
>
div
{
background
:
var
(
--
bg
);
display
:
grid
;
padding
:
12
px
;
grid
-
template
-
columns
:
5
em
minmax
(
0
,
1
fr
);
border
-
radius
:
8
px
;
gap
:
12
px
;
}
b
{
dt
{
font
-
size
:
13
px
;
color
:
var
(
--
muted
);
}
dd
{
margin
:
0
;
}
}
.
job
-
document
-
section
{
margin
-
block
:
32
px
;
h3
{
margin
:
0
0
14
px
;
padding
-
bottom
:
10
px
;
border
-
bottom
:
1
px
solid
var
(
--
line
);
font
-
size
:
18
px
;
font
-
weight
:
600
;
line
-
height
:
1.5
;
}
}
p
{
p
{
margin
:
6
px
0
0
;
margin
:
0
;
color
:
var
(
--
muted
);
font
-
size
:
13
px
;
white
-
space
:
pre
-
line
;
white
-
space
:
pre
-
line
;
}
}
.
is
-
empty
{
color
:
var
(
--
muted
);
font
-
size
:
14
px
;
}
}
}
}
.
job
-
base
-
grid
{
.
job
-
document
-
footer
{
display
:
grid
;
display
:
flex
;
grid
-
template
-
columns
:
repeat
(
3
,
1
fr
);
flex
-
wrap
:
wrap
;
gap
:
14
px
;
gap
:
8
px
20
px
;
margin
-
top
:
14
px
;
color
:
var
(
--
muted
);
font
-
size
:
12
px
;
padding
-
block
:
8
px
24
px
;
}
>
div
{
.
job
-
overview
-
support
{
background
:
var
(
--
bg
);
border
:
1
px
solid
var
(
--
line
);
padding
:
10
px
12
px
;
border
-
radius
:
8
px
;
border
-
radius
:
8
px
;
padding
:
18
px
;
background
:
color
-
mix
(
in
srgb
,
var
(
--
bg
)
62
%
,
var
(
--
panel
));
span
{
>
h3
{
display
:
block
;
margin
:
0
0
16
px
;
color
:
var
(
--
muted
);
font
-
size
:
16
px
;
font
-
size
:
12
px
;
}
}
}
strong
{
.
candidate
-
progress
-
panel
{
margin
-
top
:
0
;
}
.
management
-
panel
{
.
job
-
quick
-
links
{
margin
-
top
:
18
px
;
padding
-
top
:
14
px
;
border
-
top
:
1
px
solid
var
(
--
line
);
}
}
@
media
(
max
-
width
:
640
px
)
{
.
job
-
detail
-
content
{
display
:
block
;
display
:
block
;
margin
-
top
:
4
px
;
padding
:
24
px
16
px
;
font
-
size
:
14
px
;
}
.
job
-
detail
-
side
{
position
:
static
;
padding
-
top
:
0
;
}
.
management
-
panel
{
margin
-
top
:
16
px
;
}
.
job
-
document
{
font
-
size
:
16
px
;
}
.
job
-
document
-
header
h2
{
font
-
size
:
22
px
;
}
}
.
job
-
document
-
meta
{
grid
-
template
-
columns
:
minmax
(
0
,
1
fr
);
gap
:
10
px
;
}
}
.
card
-
head
{
display
:
flex
;
justify
-
content
:
space
-
between
;
align
-
items
:
flex
-
start
;
h3
{
margin
:
4
px
0
0
;
font
-
size
:
16
px
;
}
.
section
-
kicker
{
font
-
size
:
12
px
;
color
:
var
(
--
blue
);
}
}
}
}
...
...
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