简历新页面
continuous-integration/drone/push Build is passing Details

uat_us
DESKTOP-6C3NK6N\WXS 2024-10-14 16:28:20 +08:00
parent c3b7fd7072
commit 292151f7e1
7 changed files with 594 additions and 1 deletions

View File

@ -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'),

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -0,0 +1,10 @@
<template>
<div class="info"></div>
</template>
<script>
export default {
name: 'info',
}
</script>
<style lang="scss" scoped>
</style>

View File

@ -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>