简历新页面
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
c3b7fd7072
commit
292151f7e1
|
@ -223,6 +223,11 @@ export const constantRoutes = [
|
|||
component: () => import('@/views/reviewers/ReviewersResearch'),
|
||||
hidden: true
|
||||
},
|
||||
{
|
||||
path: '/curriculumVitae',
|
||||
component: () => import('@/views/reviewers/curriculumVitae/index'),
|
||||
hidden: true
|
||||
},
|
||||
{
|
||||
path: '/ReviewersResearchForm',
|
||||
component: () => import('@/views/reviewers/ReviewersResearchForm'),
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
const WHITELIST = ['/', 'researchDetail_m', '/researchForm', '/ReviewersResearch', '/login', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/researchLogin_m', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms']
|
||||
const WHITELIST = ['/', "/curriculumVitae", 'researchDetail_m', '/researchForm', '/ReviewersResearch', '/login', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/researchLogin_m', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms']
|
||||
export default WHITELIST
|
||||
|
|
|
@ -0,0 +1,96 @@
|
|||
<template>
|
||||
<div class="agreement">
|
||||
<div class="title">{{ $t('curriculumVitae:agreement:title') }}</div>
|
||||
<div class="fileBox">
|
||||
<div class="file_title">
|
||||
{{ $t('curriculumVitae:agreement:fileTitle') }}
|
||||
</div>
|
||||
<template v-if="true">
|
||||
<div class="file" v-for="item in [1, 2]" :key="item">
|
||||
<div class="name">简历1</div>
|
||||
<i
|
||||
class="el-icon-view"
|
||||
:title="$t('common:button:preview')"
|
||||
@click.stop="preview"
|
||||
/>
|
||||
<i class="el-icon-delete" :title="$t('common:button:delete')" />
|
||||
</div>
|
||||
</template>
|
||||
<div class="noData" v-else>{{ $t('curriculumVitae:noData') }}</div>
|
||||
<div class="btnBox">
|
||||
<div style="position: relative">
|
||||
<el-button
|
||||
type="primary"
|
||||
size="small"
|
||||
:disabled="loading"
|
||||
:loading="loading"
|
||||
>
|
||||
{{ $t('curriculumVitae:agreement:btn:upload') }}
|
||||
</el-button>
|
||||
<input
|
||||
type="file"
|
||||
name="file"
|
||||
multiple
|
||||
ref="upload"
|
||||
:title="$t('curriculumVitae:agreement:btn:upload')"
|
||||
style="
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
opacity: 0;
|
||||
cursor: pointer;
|
||||
"
|
||||
:accept="faccept.join(',')"
|
||||
@change="($event) => beginScanFiles($event)"
|
||||
/>
|
||||
</div>
|
||||
<el-button type="text">{{ $t('common:button:downloadTpl') }}</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
name: 'agreement',
|
||||
data() {
|
||||
return {
|
||||
faccept: ['.pdf'],
|
||||
loading: false,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
preview() {
|
||||
this.$preview({
|
||||
path: '',
|
||||
type: '',
|
||||
title: '',
|
||||
})
|
||||
},
|
||||
beginScanFiles(e) {
|
||||
let files = e.target.files
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
faccept: ['.pdf'],
|
||||
loading: false,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
preview() {
|
||||
this.$preview({
|
||||
path: '',
|
||||
type: '',
|
||||
title: '',
|
||||
})
|
||||
},
|
||||
beginScanFiles(e) {
|
||||
let files = e.target.files
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
|
@ -0,0 +1,129 @@
|
|||
<template>
|
||||
<div class="certificate">
|
||||
<div class="title">{{ $t('curriculumVitae:certificate:title') }}</div>
|
||||
<div class="fileBox">
|
||||
<!--最高医学学位毕业证书-->
|
||||
<div class="file_title">
|
||||
{{ $t('curriculumVitae:certificate:fileTitle:diploma') }}
|
||||
</div>
|
||||
<div class="file" v-if="true">
|
||||
<div class="name">简历1</div>
|
||||
<i
|
||||
class="el-icon-view"
|
||||
:title="$t('common:button:preview')"
|
||||
@click.stop="preview"
|
||||
/>
|
||||
<i class="el-icon-delete" :title="$t('common:button:delete')" />
|
||||
</div>
|
||||
<div class="noData" v-else>{{ $t('curriculumVitae:noData') }}</div>
|
||||
<!--医师资格证-->
|
||||
<div class="file_title" v-if="true">
|
||||
{{ $t('curriculumVitae:certificate:fileTitle:certificate') }}
|
||||
</div>
|
||||
<div class="noData" v-else>{{ $t('curriculumVitae:noData') }}</div>
|
||||
<div class="file">
|
||||
<div class="name">简历1</div>
|
||||
<i
|
||||
class="el-icon-view"
|
||||
:title="$t('common:button:preview')"
|
||||
@click.stop="preview"
|
||||
/>
|
||||
<i class="el-icon-delete" :title="$t('common:button:delete')" />
|
||||
</div>
|
||||
<!--医师执业证-->
|
||||
<div class="file_title" v-if="true">
|
||||
{{ $t('curriculumVitae:certificate:fileTitle:license') }}
|
||||
</div>
|
||||
<div class="noData" v-else>{{ $t('curriculumVitae:noData') }}</div>
|
||||
<div class="file">
|
||||
<div class="name">简历1</div>
|
||||
<i
|
||||
class="el-icon-view"
|
||||
:title="$t('common:button:preview')"
|
||||
@click.stop="preview"
|
||||
/>
|
||||
<i class="el-icon-delete" :title="$t('common:button:delete')" />
|
||||
</div>
|
||||
<!--大型医用设备上岗证-->
|
||||
<div class="file_title">
|
||||
{{ $t('curriculumVitae:certificate:fileTitle:workPermit') }}
|
||||
</div>
|
||||
<template v-if="true">
|
||||
<div v-for="item in [1, 2]" :key="item">
|
||||
<div class="file_title">
|
||||
{{ $t('curriculumVitae:certificate:fileTitle:CT') }}
|
||||
</div>
|
||||
<div class="file">
|
||||
<div class="name">简历1</div>
|
||||
<i
|
||||
class="el-icon-view"
|
||||
:title="$t('common:button:preview')"
|
||||
@click.stop="preview"
|
||||
/>
|
||||
<i class="el-icon-delete" :title="$t('common:button:delete')" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<div class="noData" v-else>{{ $t('curriculumVitae:noData') }}</div>
|
||||
<div class="btnBox">
|
||||
<div style="position: relative">
|
||||
<el-button
|
||||
type="primary"
|
||||
size="small"
|
||||
:disabled="loading"
|
||||
:loading="loading"
|
||||
>
|
||||
{{ $t('curriculumVitae:certificate:btn:upload') }}
|
||||
</el-button>
|
||||
<input
|
||||
type="file"
|
||||
name="file"
|
||||
multiple
|
||||
ref="upload"
|
||||
:title="$t('curriculumVitae:certificate:btn:upload')"
|
||||
style="
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
opacity: 0;
|
||||
cursor: pointer;
|
||||
"
|
||||
:accept="faccept.join(',')"
|
||||
@change="($event) => beginScanFiles($event)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import PreviewFile from '@/components/PreviewFile/index'
|
||||
export default {
|
||||
name: 'certificate',
|
||||
components: {
|
||||
PreviewFile,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
faccept: ['.pdf'],
|
||||
loading: false,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
preview() {
|
||||
this.$preview({
|
||||
path: '',
|
||||
type: '',
|
||||
title: '',
|
||||
})
|
||||
},
|
||||
beginScanFiles(e) {
|
||||
let files = e.target.files
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
|
@ -0,0 +1,133 @@
|
|||
<template>
|
||||
<div class="curriculum">
|
||||
<div class="title">{{ $t('curriculumVitae:curriculum:title') }}</div>
|
||||
<div class="fileBox">
|
||||
<div class="file_title">
|
||||
{{ $t('curriculumVitae:curriculum:fileTitle:CN') }}
|
||||
</div>
|
||||
<template v-if="true">
|
||||
<div class="file" v-for="item in [1, 2]" :key="item">
|
||||
<div class="name">简历1</div>
|
||||
<i class="el-icon-download" :title="$t('common:button:download')" />
|
||||
<i class="el-icon-delete" :title="$t('common:button:delete')" />
|
||||
<i
|
||||
class="el-icon-circle-check"
|
||||
:title="$t('common:button:default')"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<div class="noData" v-else>{{ $t('curriculumVitae:noData') }}</div>
|
||||
<div class="file_title">
|
||||
{{ $t('curriculumVitae:curriculum:fileTitle:EN') }}
|
||||
</div>
|
||||
<template v-if="true">
|
||||
<div class="file" v-for="item in [1, 2]" :key="item">
|
||||
<div class="name">Resume</div>
|
||||
<i class="el-icon-download" :title="$t('common:button:download')" />
|
||||
<i class="el-icon-delete" :title="$t('common:button:delete')" />
|
||||
<i
|
||||
class="el-icon-circle-check"
|
||||
:title="$t('common:button:default')"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<div class="noData" v-else>{{ $t('curriculumVitae:noData') }}</div>
|
||||
<div class="btnBox">
|
||||
<div style="position: relative">
|
||||
<el-button
|
||||
type="primary"
|
||||
size="small"
|
||||
:disabled="loading"
|
||||
:loading="loading"
|
||||
>
|
||||
{{ $t('curriculumVitae:curriculum:btn:uploadCN') }}
|
||||
</el-button>
|
||||
<input
|
||||
type="file"
|
||||
name="file"
|
||||
multiple
|
||||
ref="uploadCN"
|
||||
:title="$t('curriculumVitae:curriculum:btn:uploadCN')"
|
||||
style="
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
opacity: 0;
|
||||
cursor: pointer;
|
||||
"
|
||||
:accept="faccept.join(',')"
|
||||
@change="($event) => beginScanFiles($event)"
|
||||
/>
|
||||
</div>
|
||||
<el-button type="text">{{ $t('common:button:downloadTpl') }}</el-button>
|
||||
</div>
|
||||
<div class="btnBox">
|
||||
<div style="position: relative">
|
||||
<el-button
|
||||
type="primary"
|
||||
size="small"
|
||||
:disabled="loading"
|
||||
:loading="loading"
|
||||
>
|
||||
{{ $t('curriculumVitae:curriculum:btn:uploadEN') }}
|
||||
</el-button>
|
||||
<input
|
||||
type="file"
|
||||
name="file"
|
||||
multiple
|
||||
ref="uploadEN"
|
||||
:title="$t('curriculumVitae:curriculum:btn:uploadEN')"
|
||||
style="
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
opacity: 0;
|
||||
cursor: pointer;
|
||||
"
|
||||
:accept="faccept.join(',')"
|
||||
@change="($event) => beginScanFiles($event)"
|
||||
/>
|
||||
</div>
|
||||
<el-button type="text">{{ $t('common:button:downloadTpl') }}</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
name: 'curriculum',
|
||||
data() {
|
||||
return {
|
||||
faccept: ['.pdf'],
|
||||
loading: false,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
beginScanFiles(e) {
|
||||
let files = e.target.files
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.file {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
margin-bottom: 10px;
|
||||
.name {
|
||||
width: 70%;
|
||||
white-space: nowrap; /* 文本不会换行,会在同一行内继续,直到遇到<br>标签为止 */
|
||||
text-overflow: ellipsis; /* 当文本溢出包含它的容器时,显示省略号(...)来表示被截断的文本 */
|
||||
overflow: hidden; /* 隐藏溢出容器的文本 */
|
||||
}
|
||||
i {
|
||||
cursor: pointer;
|
||||
margin: 3px;
|
||||
color: #409eff;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,10 @@
|
|||
<template>
|
||||
<div class="info"></div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
name: 'info',
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
|
@ -0,0 +1,220 @@
|
|||
<template>
|
||||
<div class="curriculumVitae">
|
||||
<div class="leftMenu">
|
||||
<div class="title">{{ $t('curriculumVitae:menu:title') }}</div>
|
||||
<el-menu
|
||||
:default-active="activeIndex"
|
||||
class="el-menu-demo"
|
||||
mode="vertical"
|
||||
@select="handleSelect"
|
||||
background-color="#eee"
|
||||
active-text-color="#000"
|
||||
>
|
||||
<el-menu-item index="info">
|
||||
{{ $t('curriculumVitae:menu:info') }}
|
||||
</el-menu-item>
|
||||
<el-menu-item index="summarize">{{
|
||||
$t('curriculumVitae:menu:summarize')
|
||||
}}</el-menu-item>
|
||||
<el-menu-item index="specialty">
|
||||
{{ $t('curriculumVitae:menu:specialty') }}
|
||||
</el-menu-item>
|
||||
<el-menu-item index="EducationalExperience">{{
|
||||
$t('curriculumVitae:menu:EducationalExperience')
|
||||
}}</el-menu-item>
|
||||
<el-menu-item index="ContinuingTraining">{{
|
||||
$t('curriculumVitae:menu:ContinuingTraining')
|
||||
}}</el-menu-item>
|
||||
<el-menu-item index="ScientificResearchProject">{{
|
||||
$t('curriculumVitae:menu:ScientificResearchProject')
|
||||
}}</el-menu-item>
|
||||
<el-menu-item index="clinicalTrials">{{
|
||||
$t('curriculumVitae:menu:clinicalTrials')
|
||||
}}</el-menu-item>
|
||||
<el-menu-item index="treatise">{{
|
||||
$t('curriculumVitae:menu:treatise')
|
||||
}}</el-menu-item>
|
||||
<el-menu-item index="other">{{
|
||||
$t('curriculumVitae:menu:other')
|
||||
}}</el-menu-item>
|
||||
</el-menu>
|
||||
</div>
|
||||
<div class="main">
|
||||
<div class="content">
|
||||
<div class="title">
|
||||
<div>{{ $t('curriculumVitae:content:title') }}</div>
|
||||
<div class="btnBox">
|
||||
<el-button type="text">{{
|
||||
$t('common:button:downloadTpl')
|
||||
}}</el-button>
|
||||
<el-button type="text">{{
|
||||
$t('curriculumVitae:button:importResume')
|
||||
}}</el-button>
|
||||
<el-button type="text">{{ $t('common:button:preview') }}</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box" id="info" style="height: 100vh">info</div>
|
||||
<div class="box" id="summarize" style="height: 100vh">summarize</div>
|
||||
<div class="box" id="specialty" style="height: 100vh">specialty</div>
|
||||
</div>
|
||||
<div class="rightFile">
|
||||
<!--简历附件-->
|
||||
<curriculum />
|
||||
<!--资历证书-->
|
||||
<certificate />
|
||||
<!--协议-->
|
||||
<agreement />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import curriculum from './components/file/curriculum.vue'
|
||||
import certificate from './components/file/certificate.vue'
|
||||
import agreement from './components/file/agreement.vue'
|
||||
export default {
|
||||
components: { curriculum, certificate, agreement },
|
||||
data() {
|
||||
return {
|
||||
activeIndex: 'info',
|
||||
isScrollAuto: true,
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// 监听滚动事件
|
||||
window.addEventListener('scroll', this.onScroll)
|
||||
},
|
||||
destroy() {
|
||||
// 必须移除监听器,不然当该vue组件被销毁了,监听器还在就会出错
|
||||
window.removeEventListener('scroll', this.onScroll)
|
||||
},
|
||||
methods: {
|
||||
handleSelect(key, keyPath) {
|
||||
const navContent = document.getElementById(key)
|
||||
if (navContent) {
|
||||
const scrollTop = navContent.offsetTop
|
||||
document.body.scrollTop = scrollTop
|
||||
document.documentElement.scrollTop = scrollTop
|
||||
}
|
||||
},
|
||||
onScroll() {
|
||||
// 获取所有锚点元素
|
||||
const navContents = document.querySelectorAll('.content .box')
|
||||
// 所有锚点元素的 offsetTop
|
||||
const offsetTopArr = []
|
||||
navContents.forEach((item) => {
|
||||
offsetTopArr.push(item.offsetTop)
|
||||
})
|
||||
// 获取当前文档流的 scrollTop
|
||||
const scrollTop =
|
||||
document.documentElement.scrollTop || document.body.scrollTop
|
||||
// 定义当前点亮的导航下标
|
||||
let navItem = null
|
||||
for (let n = 0; n < offsetTopArr.length; n++) {
|
||||
// 如果 scrollTop 大于等于第 n 个元素的 offsetTop 则说明 n-1 的内容已经完全不可见
|
||||
// 那么此时导航索引就应该是 n 了
|
||||
if (scrollTop >= offsetTopArr[n]) {
|
||||
navItem = navContents[n]
|
||||
}
|
||||
}
|
||||
// 把下标赋值给 vue 的 data
|
||||
this.activeIndex = navItem.id
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.title {
|
||||
line-height: 50px;
|
||||
background-color: #fff;
|
||||
text-align: center;
|
||||
}
|
||||
.leftMenu {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100px;
|
||||
height: 100vh;
|
||||
background-color: #eee;
|
||||
border-right: 1px solid #eee;
|
||||
::v-deep .el-menu {
|
||||
padding: 5px 5px 0;
|
||||
}
|
||||
::v-deep .is-active {
|
||||
background-color: #fff !important;
|
||||
position: relative;
|
||||
&::before {
|
||||
display: block;
|
||||
content: '';
|
||||
width: 5px;
|
||||
height: 15px;
|
||||
background-color: #f00;
|
||||
position: absolute;
|
||||
left: 8px;
|
||||
top: calc(50% - 8px);
|
||||
}
|
||||
}
|
||||
}
|
||||
.main {
|
||||
width: calc(100% - 100px);
|
||||
height: 100vh;
|
||||
margin-left: 100px;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
}
|
||||
.content {
|
||||
width: calc(100% - 300px);
|
||||
padding: 0 50px 0 20px;
|
||||
.title {
|
||||
line-height: 50px;
|
||||
background-color: #fff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
.rightFile {
|
||||
width: 300px;
|
||||
padding-right: 10px;
|
||||
::v-deep .title {
|
||||
line-height: 50px;
|
||||
background-color: #fff;
|
||||
text-align: left;
|
||||
}
|
||||
::v-deep .fileBox {
|
||||
background-color: #eee;
|
||||
padding: 10px;
|
||||
font-size: 14px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
::v-deep .file_title {
|
||||
line-height: 40px;
|
||||
}
|
||||
::v-deep .btnBox {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
::v-deep .noData {
|
||||
color: #909399;
|
||||
text-align: center;
|
||||
}
|
||||
::v-deep .file {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
margin-bottom: 10px;
|
||||
.name {
|
||||
width: 70%;
|
||||
white-space: nowrap; /* 文本不会换行,会在同一行内继续,直到遇到<br>标签为止 */
|
||||
text-overflow: ellipsis; /* 当文本溢出包含它的容器时,显示省略号(...)来表示被截断的文本 */
|
||||
overflow: hidden; /* 隐藏溢出容器的文本 */
|
||||
}
|
||||
i {
|
||||
cursor: pointer;
|
||||
margin: 3px;
|
||||
color: #409eff;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
Loading…
Reference in New Issue