|
@@ -1,10 +1,114 @@
|
|
|
-<!-- -->
|
|
|
+<!-- 学生详情 -->
|
|
|
<template>
|
|
|
- <div>学生详情</div>
|
|
|
+ <div v-if="Object.keys(info).length" class="d-flex justify-center mb-8">
|
|
|
+ <div style="width: 940px;background: #fff;" class="px-8 pb-12 pt-3 my-n3 mr-3">
|
|
|
+ <!-- 基本信息 -->
|
|
|
+ <baseInfo class="mt-5" :data="info"></baseInfo>
|
|
|
+ <!-- 基本信息 -->
|
|
|
+ <other :data="info"></other>
|
|
|
+ </div>
|
|
|
+ <div class="operate pa-3">
|
|
|
+ <v-list>
|
|
|
+ <v-list-subheader class="title">操作</v-list-subheader>
|
|
|
+ <v-list-item
|
|
|
+ v-for="(item, i) in operateItems" :key="'操作' + i"
|
|
|
+ color="primary"
|
|
|
+ :prepend-icon="item.icon"
|
|
|
+ :title="item.text"
|
|
|
+ @click="handleClick(item)"
|
|
|
+ >
|
|
|
+ </v-list-item>
|
|
|
+ </v-list>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <Loading :visible="loading"></Loading>
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
defineOptions({name: 'studentList-student-details'})
|
|
|
+import baseInfo from './components/baseInfo.vue'
|
|
|
+import other from './components/other.vue'
|
|
|
+import { ref } from 'vue'
|
|
|
+import { stuDetail, certificateList, recommendationList } from '@/api/school'
|
|
|
+import Snackbar from '@/plugins/snackbar'
|
|
|
+import { useRoute } from 'vue-router'; const route = useRoute()
|
|
|
+
|
|
|
+const operateItems = [
|
|
|
+ { text: '上传推荐信', key:'letter', icon: 'mdi-circle-medium' },
|
|
|
+ { text: '颁发实习证书', key:'certificate', icon: 'mdi-circle-medium' },
|
|
|
+]
|
|
|
+
|
|
|
+// 获取人才详情
|
|
|
+const info = ref({
|
|
|
+ student: {
|
|
|
+ studentName: '莫秋妮',
|
|
|
+ studentSex: '男',
|
|
|
+ studentBirthday: '2000-01-01 00:00:00',
|
|
|
+ schoolDepartmentName: '上海交通大学',
|
|
|
+ majorName: '野生动物与自然保护区管理',
|
|
|
+ schoolClassName: '1班',
|
|
|
+ },
|
|
|
+ studentBiographicalNotes: {
|
|
|
+ fileUrl: 'https://minio.huomiaoer.com/dev/data/a613722d-f0cc-404b-88b7-4f92dbed5264/ba9e680f-6bba-4fb9-8df6-1fd723b286ed.jpg',
|
|
|
+ }
|
|
|
+})
|
|
|
+const loading = ref(false)
|
|
|
+const { id: studentId } = route.params
|
|
|
+
|
|
|
+const getCvDetail = async () => {
|
|
|
+ if (!studentId) {
|
|
|
+ Snackbar.warning('缺少学生id')
|
|
|
+ setTimeout(() => {
|
|
|
+ window.close()
|
|
|
+ }, 2000)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ loading.value = true
|
|
|
+ const data = await stuDetail({ studentId })
|
|
|
+ info.value = data
|
|
|
+ await getInternshipCertificate()
|
|
|
+ await getRecommendation()
|
|
|
+ loading.value = false
|
|
|
+}
|
|
|
+getCvDetail()
|
|
|
+
|
|
|
+// 实习证书
|
|
|
+const getInternshipCertificate = async () => {
|
|
|
+ const query = {
|
|
|
+ size: 999,
|
|
|
+ current: 1,
|
|
|
+ studentId
|
|
|
+ }
|
|
|
+ const data = await certificateList(query)
|
|
|
+ info.value.certificate = data.records.length > 0 ? data.records.reverse()[0].studentInternshipCertificate : {}
|
|
|
+ loading.value = false
|
|
|
+}
|
|
|
+
|
|
|
+// 学生推荐信
|
|
|
+const getRecommendation = async () => {
|
|
|
+ const query = {
|
|
|
+ page: {
|
|
|
+ size: 9999,
|
|
|
+ current: 1
|
|
|
+ },
|
|
|
+ entity: {
|
|
|
+ studentId
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const data = await recommendationList(query)
|
|
|
+ info.value.commendation = data.records.length > 0 ? data.records.reverse()[0].entity : {}
|
|
|
+}
|
|
|
+
|
|
|
+const handleClick = (item) => {
|
|
|
+ console.log('handleClick->item:', item)
|
|
|
+}
|
|
|
+
|
|
|
</script>
|
|
|
<style lang="scss" scoped>
|
|
|
+.operate {
|
|
|
+ width: 240px;
|
|
|
+ height: 500px; // 272px
|
|
|
+ position: sticky;
|
|
|
+ top: 60px;
|
|
|
+}
|
|
|
</style>
|