RMO-Front/src/views/LearningCenter.vue

235 lines
7.5 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<LearningCenterCases v-if="route.path.endsWith('/cases')" />
<LearningCenterVideos v-else-if="route.path === '/knowledge/learning-center/videos'" />
<PageContainer v-else>
<div class="learning-center-page">
<PageHeader :title="pageTitle" :description="pageDescription">
<template #actions>
<button type="button" class="btn-training-apply" @click="showTrainingModal = true">
预约培训申请
</button>
</template>
</PageHeader>
<div class="page-body">
<section class="section">
<div class="container">
<!-- 学习中心概要介绍 -->
<div class="learning-overview">
<p class="overview-intro">
学习中心是 RMO 知识资源体系中的核心模块面向申办者持有人研究中心及保险从业者提供药物临床试验责任保险与风险管理的系统化学习资源通过案例学习培训视频与考试测评帮助从业者掌握法规要求责任界定保险配置及理赔实务提升专业能力与合规水平
</p>
<div class="module-cards">
<RouterLink to="/knowledge/learning-center/cases" class="module-card">
<div class="module-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" />
<polyline points="14 2 14 8 20 8" />
<line x1="16" y1="13" x2="8" y2="13" />
<line x1="16" y1="17" x2="8" y2="17" />
<polyline points="10 9 9 9 8 9" />
</svg>
</div>
<h3 class="module-title">案例学习</h3>
<p class="module-desc">
基于司法裁判文书及公开报道的真实案例涵盖申办者责任知情同意书约束因果关系认定格式条款解释及赔偿比例酌定等核心议题帮助理解药物临床试验责任保险与赔偿的法律逻辑
</p>
<span class="module-link">进入案例学习 </span>
</RouterLink>
<RouterLink to="/knowledge/learning-center/videos" class="module-card">
<div class="module-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polygon points="23 7 16 12 23 17 23 7" />
<rect x="1" y="5" width="15" height="14" rx="2" ry="2" />
</svg>
</div>
<h3 class="module-title">培训视频</h3>
<p class="module-desc">
系统化培训视频对应 PPTX 课件涵盖申办者责任本质赔偿金额测算风险管理理赔流程与案例ICF 解读药害救济国际经验保险要素纠纷处理及投保定价等主题助力专业能力提升
</p>
<span class="module-link">进入培训视频 </span>
</RouterLink>
<RouterLink to="/knowledge/learning-center/exam" class="module-card">
<div class="module-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M9 11l3 3L22 4" />
<path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11" />
</svg>
</div>
<h3 class="module-title">考试中心</h3>
<p class="module-desc">
在线测评与认证考试检验学习成果支持从业者获得专业认证功能建设中敬请期待
</p>
<span class="module-link">进入考试中心 </span>
</RouterLink>
</div>
<div class="training-apply-cta">
<p>如需定制化培训或线下讲座欢迎提交预约申请我们将尽快与您联系</p>
<button type="button" class="btn btn-primary" @click="showTrainingModal = true">
预约培训申请
</button>
</div>
</div>
</div>
</section>
</div>
</div>
<TrainingReservationModal v-model:open="showTrainingModal" />
</PageContainer>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue'
import { useRoute } from 'vue-router'
import PageContainer from '@/components/PageContainer.vue'
import PageHeader from '@/components/PageHeader.vue'
import LearningCenterCases from './LearningCenterCases.vue'
import LearningCenterVideos from './LearningCenterVideos.vue'
import TrainingReservationModal from '@/components/TrainingReservationModal.vue'
const route = useRoute()
const showTrainingModal = ref(false)
// 从菜单「预约培训申请」进入时自动打开弹窗
watch(
() => route.query.apply,
(val) => {
if (val === 'training') showTrainingModal.value = true
},
{ immediate: true }
)
const pageTitle = '学习中心'
const pageDescription = '案例学习、培训视频与考试中心,助力药物临床试验责任与保险风险管理能力提升'
</script>
<style scoped>
.learning-center-page {
min-height: 60vh;
}
.btn-training-apply {
padding: 0.5rem 1rem;
font-size: 0.9rem;
font-weight: 500;
color: var(--white, #fff);
background: var(--brand-primary, #0ea5e9);
border: none;
border-radius: 8px;
cursor: pointer;
white-space: nowrap;
}
.btn-training-apply:hover {
background: var(--brand-primary-dark, #0284c7);
}
.learning-overview {
padding: 2rem 0;
}
.overview-intro {
font-size: 1rem;
line-height: 1.8;
color: var(--text-color);
margin: 0 0 2.5rem 0;
}
.module-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1.5rem;
margin-bottom: 2.5rem;
}
.module-card {
display: flex;
flex-direction: column;
background: var(--white);
border: 1px solid var(--border-color);
border-radius: 12px;
padding: 1.5rem;
text-decoration: none;
color: inherit;
transition: box-shadow 0.2s, border-color 0.2s;
}
.module-card:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
border-color: var(--brand-primary, #0ea5e9);
}
.module-icon {
width: 48px;
height: 48px;
color: var(--brand-primary, #0ea5e9);
margin-bottom: 1rem;
}
.module-icon svg {
width: 100%;
height: 100%;
}
.module-title {
font-size: 1.15rem;
font-weight: 600;
color: var(--text-color);
margin: 0 0 0.5rem 0;
}
.module-desc {
font-size: 0.9375rem;
line-height: 1.65;
color: var(--text-secondary, #555);
margin: 0 0 1rem 0;
flex: 1;
}
.module-link {
font-size: 0.9rem;
font-weight: 500;
color: var(--brand-primary, #0ea5e9);
}
.training-apply-cta {
padding: 1.5rem;
background: var(--bg-color, #f8fafc);
border-radius: 12px;
text-align: center;
}
.training-apply-cta p {
margin: 0 0 1rem 0;
font-size: 0.9375rem;
color: var(--text-secondary, #555);
}
.training-apply-cta .btn {
padding: 0.5rem 1.25rem;
font-size: 0.9rem;
border-radius: 8px;
border: none;
cursor: pointer;
}
.training-apply-cta .btn-primary {
background: var(--brand-primary, #0ea5e9);
color: var(--white, #fff);
}
.training-apply-cta .btn-primary:hover {
background: var(--brand-primary-dark, #0284c7);
}
@media (max-width: 768px) {
.module-cards {
grid-template-columns: 1fr;
}
}
</style>