调整请假详情查看
This commit is contained in:
parent
b1cf1b9a6f
commit
28ce872052
@ -140,7 +140,5 @@ export const jzXsQjListApi = async (params: any) => {
|
|||||||
* 查询学生请假流程处理历史
|
* 查询学生请假流程处理历史
|
||||||
*/
|
*/
|
||||||
export const jzXsQjActivitiHistoryApi = async (params: any) => {
|
export const jzXsQjActivitiHistoryApi = async (params: any) => {
|
||||||
return await get("/api/activiti/history/historicFlow", params);
|
return await get("/activiti/history/historicFlow", params);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -155,6 +155,13 @@
|
|||||||
"enablePullDownRefresh": false
|
"enablePullDownRefresh": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "pages/base/leave-request/detail",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "请假详情",
|
||||||
|
"enablePullDownRefresh": false
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "pages/base/home/detail",
|
"path": "pages/base/home/detail",
|
||||||
"style": {
|
"style": {
|
||||||
|
|||||||
149
src/pages/base/leave-request/components/progressList.vue
Normal file
149
src/pages/base/leave-request/components/progressList.vue
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
<template>
|
||||||
|
<view class="approval-progress">
|
||||||
|
<view class="progress-title">
|
||||||
|
<!-- <image src="/static/icons/approval.png" class="title-icon"></image> -->
|
||||||
|
<text class="applicant-name">审批进度</text>
|
||||||
|
</view>
|
||||||
|
<view class="divider"></view>
|
||||||
|
<view class="progress-list">
|
||||||
|
<view class="progress-item" v-for="(task, index) in taskList" :key="index">
|
||||||
|
<view class="progress-item-row">
|
||||||
|
<view class="item-avatar">
|
||||||
|
<image
|
||||||
|
:src="task.avatar || '/static/base/home/11222.png'"
|
||||||
|
class="w-full h-full"
|
||||||
|
></image>
|
||||||
|
</view>
|
||||||
|
<view class="item-middle">
|
||||||
|
<text class="item-name">{{ task.name }}</text>
|
||||||
|
<text class="item-detail">{{ task.assignee || '' }}</text>
|
||||||
|
</view>
|
||||||
|
<view class="item-right">
|
||||||
|
<text class="item-time" v-if="task.endTime">{{ task.endTime }}</text>
|
||||||
|
<text class="item-status" v-else>待处理</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="progress-item-line" v-if="index < taskList.length - 1"></view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { jzXsQjActivitiHistoryApi } from "@/api/base/server";
|
||||||
|
// 接收外部传入属性
|
||||||
|
const props = withDefaults(defineProps<{
|
||||||
|
procInstId: string
|
||||||
|
}>(), {
|
||||||
|
procInstId: ''
|
||||||
|
});
|
||||||
|
|
||||||
|
// 工作流
|
||||||
|
const taskList = ref<any[]>([]);
|
||||||
|
|
||||||
|
const loadList = async (procInstId: string) => {
|
||||||
|
const res = await jzXsQjActivitiHistoryApi({ processInstanceId: procInstId });
|
||||||
|
const list = res.result || [];
|
||||||
|
// list反向
|
||||||
|
taskList.value = list.reverse();
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(() => props.procInstId, (newVal, oldVal) => {
|
||||||
|
// 添加回调函数处理逻辑
|
||||||
|
console.log('procInstId changed:', newVal, oldVal);
|
||||||
|
if (newVal) {
|
||||||
|
loadList(newVal);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (props.procInstId) {
|
||||||
|
loadList(props.procInstId);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.approval-progress {
|
||||||
|
margin: 15px;
|
||||||
|
background-color: #fff;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 15px;
|
||||||
|
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
|
||||||
|
|
||||||
|
.progress-title {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
.title-icon {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.applicant-name {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.divider {
|
||||||
|
height: 1px;
|
||||||
|
background-color: #eee;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progress-list {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
.progress-item {
|
||||||
|
.progress-item-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
.item-avatar {
|
||||||
|
flex: 0 0 40px;
|
||||||
|
height: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-middle {
|
||||||
|
margin-left: 16px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-right {
|
||||||
|
flex: 1 0 1px;
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.progress-item-line {
|
||||||
|
width: 1px;
|
||||||
|
height: 30px;
|
||||||
|
background-color: #999;
|
||||||
|
margin: 10px 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.item-name {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-detail {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-time,
|
||||||
|
.item-status {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #999;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -175,12 +175,12 @@ const validateTime = () => {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const submit = () => {
|
const submit = async () => {
|
||||||
const fd = getValue();
|
const fd = await getValue();
|
||||||
if (!validateTime()) {
|
if (!validateTime()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const params = { ...formData, ...fd };
|
const params = { ...fd };
|
||||||
if (props.data && props.data.id) {
|
if (props.data && props.data.id) {
|
||||||
params.id = props.data.id;
|
params.id = props.data.id;
|
||||||
} else {
|
} else {
|
||||||
@ -191,9 +191,12 @@ const submit = () => {
|
|||||||
params.jzId = getUser.jzId; // 家长ID
|
params.jzId = getUser.jzId; // 家长ID
|
||||||
}
|
}
|
||||||
params.flag = 1;
|
params.flag = 1;
|
||||||
|
console.log('提交参数:', params);
|
||||||
jzAddXsQjApi(params).then(() => {
|
jzAddXsQjApi(params).then(() => {
|
||||||
showToast({ title: "提交成功", icon: "success" });
|
showToast({ title: "提交成功", icon: "success" });
|
||||||
navigateBack();
|
uni.reLaunch({
|
||||||
|
url: "/pages/base/home/index"
|
||||||
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -9,15 +9,15 @@
|
|||||||
<view class="card-body">
|
<view class="card-body">
|
||||||
<view class="info-row">
|
<view class="info-row">
|
||||||
<text class="label">请假事由:</text>
|
<text class="label">请假事由:</text>
|
||||||
<text class="value">{{ data.reason }}</text>
|
<text class="value">{{ data.qjsy }}</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="info-row">
|
<view class="info-row">
|
||||||
<text class="label">开始时间:</text>
|
<text class="label">开始时间:</text>
|
||||||
<text class="value">{{ data.startTime }}</text>
|
<text class="value">{{ data.qjkstime }}</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="info-row">
|
<view class="info-row">
|
||||||
<text class="label">结束时间:</text>
|
<text class="label">结束时间:</text>
|
||||||
<text class="value">{{ data.endTime }}</text>
|
<text class="value">{{ data.qjjstime }}</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="card-footer">
|
<view class="card-footer">
|
||||||
@ -54,14 +54,7 @@ const [register, { reload }] = useLayout({
|
|||||||
// 查看详情或新增处理函数
|
// 查看详情或新增处理函数
|
||||||
const goToDetail = (item: any | null) => {
|
const goToDetail = (item: any | null) => {
|
||||||
setData(item);
|
setData(item);
|
||||||
let url = '/pages/base/leave-request/leaveApplication'; // 使用新路径
|
let url = '/pages/base/leave-request/detail';
|
||||||
if (item && item.id) {
|
|
||||||
console.log('View details for:', item);
|
|
||||||
url += `?id=${item.id}`; // 查看详情时传递 ID
|
|
||||||
} else {
|
|
||||||
console.log('Navigating to create new leave application.');
|
|
||||||
// 新增时不传递 ID
|
|
||||||
}
|
|
||||||
uni.navigateTo({ url });
|
uni.navigateTo({ url });
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
184
src/pages/base/leave-request/detail.vue
Normal file
184
src/pages/base/leave-request/detail.vue
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
<template>
|
||||||
|
<BasicLayout>
|
||||||
|
<view class="course-detail">
|
||||||
|
<!-- 请假信息卡片 -->
|
||||||
|
<view class="info-card">
|
||||||
|
<view class="card-header">
|
||||||
|
<text class="applicant-name">{{ qjData.xsxm }}提交的学生请假</text>
|
||||||
|
</view>
|
||||||
|
<view class="divider"></view>
|
||||||
|
<view class="card-body">
|
||||||
|
<view class="info-row">
|
||||||
|
<text class="label">请假类型:</text>
|
||||||
|
<text class="value">{{ qjData.qjlx }}</text>
|
||||||
|
</view>
|
||||||
|
<view class="info-row">
|
||||||
|
<text class="label">开始时间:</text>
|
||||||
|
<text class="value">{{ qjData.qjkstime }}</text>
|
||||||
|
</view>
|
||||||
|
<view class="info-row">
|
||||||
|
<text class="label">结束时间:</text>
|
||||||
|
<text class="value">{{ qjData.qjjstime }}</text>
|
||||||
|
</view>
|
||||||
|
<view class="info-row">
|
||||||
|
<text class="label">请假时长:</text>
|
||||||
|
<text class="value">{{ qjData.qjsc }}</text>
|
||||||
|
</view>
|
||||||
|
<view class="info-row">
|
||||||
|
<text class="label">是否离校:</text>
|
||||||
|
<text class="value">{{ qjData.sflx === 1 ? '是' : '否' }}</text>
|
||||||
|
</view>
|
||||||
|
<view class="info-column">
|
||||||
|
<text class="label">请假事由:</text>
|
||||||
|
<text class="value">{{ qjData.qjsy }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<!-- 审批流程 -->
|
||||||
|
<ProgressList :procInstId="qjData.procInstId" />
|
||||||
|
</view>
|
||||||
|
<template #bottom>
|
||||||
|
<view class="white-bg-color py-5">
|
||||||
|
<view class="flex-row items-center pb-10 pt-5">
|
||||||
|
<u-button
|
||||||
|
text="返回"
|
||||||
|
class="ml-15 mr-7"
|
||||||
|
:plain="true"
|
||||||
|
@click="navigateBack"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
</BasicLayout>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import ProgressList from "./components/progressList.vue"
|
||||||
|
import { navigateBack } from "@/utils/uniapp";
|
||||||
|
import { useDataStore } from "@/store/modules/data";
|
||||||
|
const { getData } = useDataStore();
|
||||||
|
|
||||||
|
// 请假基础数据
|
||||||
|
const qjData = computed(() => getData || {});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.course-detail {
|
||||||
|
background-color: #f5f7fa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-bar {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 15px;
|
||||||
|
height: 44px;
|
||||||
|
background-color: #2879ff;
|
||||||
|
|
||||||
|
.nav-left {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-title {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-right {
|
||||||
|
width: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-card {
|
||||||
|
margin: 15px;
|
||||||
|
background-color: #fff;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 15px;
|
||||||
|
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
|
||||||
|
|
||||||
|
.card-header {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
.applicant-name {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.divider {
|
||||||
|
height: 1px;
|
||||||
|
background-color: #eee;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.card-body {
|
||||||
|
padding: 15px;
|
||||||
|
|
||||||
|
.info-row {
|
||||||
|
display: flex;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #bbb;
|
||||||
|
width: 70px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.value {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #333;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.info-column {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #bbb;
|
||||||
|
flex-shrink: 0;
|
||||||
|
margin-right: 8px;
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.value {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #333;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom-action {
|
||||||
|
padding: 15px;
|
||||||
|
margin-top: 20px;
|
||||||
|
|
||||||
|
.back-btn {
|
||||||
|
width: 100%;
|
||||||
|
height: 44px;
|
||||||
|
line-height: 44px;
|
||||||
|
background-color: #fff;
|
||||||
|
color: #333;
|
||||||
|
border-radius: 22px;
|
||||||
|
font-size: 16px;
|
||||||
|
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -1,385 +0,0 @@
|
|||||||
<template>
|
|
||||||
<BasicLayout>
|
|
||||||
<view class="course-detail">
|
|
||||||
<!-- 课程信息卡片 -->
|
|
||||||
<view class="info-card">
|
|
||||||
<view class="card-title">课程信息</view>
|
|
||||||
<view class="divider"></view>
|
|
||||||
|
|
||||||
<view class="course-info">
|
|
||||||
<image
|
|
||||||
class="course-image"
|
|
||||||
:src="courseDetail.xkkcImg"
|
|
||||||
mode="aspectFill"
|
|
||||||
></image>
|
|
||||||
|
|
||||||
<view class="course-content">
|
|
||||||
<view class="course-name">{{ courseDetail.title }}</view>
|
|
||||||
<view class="course-teacher"
|
|
||||||
>开课老师:{{ courseDetail.teacher }}</view
|
|
||||||
>
|
|
||||||
<view class="course-location"
|
|
||||||
>上课地点:{{ courseDetail.location }}</view
|
|
||||||
>
|
|
||||||
<view class="course-time"
|
|
||||||
>上课时间:{{ courseDetail.studyTime }}</view
|
|
||||||
>
|
|
||||||
<view class="course-price">
|
|
||||||
金额:<text class="price-value">¥{{ courseDetail.price }}</text>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<!-- 老师信息卡片 -->
|
|
||||||
<view class="info-card">
|
|
||||||
<view class="card-title">老师信息</view>
|
|
||||||
<view class="divider"></view>
|
|
||||||
|
|
||||||
<view class="teacher-info">
|
|
||||||
<!-- 教师头部信息区域 -->
|
|
||||||
<view class="teacher-header">
|
|
||||||
<image
|
|
||||||
class="teacher-avatar"
|
|
||||||
:src="teacherInfo.avatar"
|
|
||||||
mode="aspectFill"
|
|
||||||
></image>
|
|
||||||
<view class="teacher-basic-info">
|
|
||||||
<view class="teacher-name">{{ teacherInfo.name }}</view>
|
|
||||||
<view class="teacher-title">课程教师</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<!-- 教师简介区域 -->
|
|
||||||
<view class="teacher-intro-section">
|
|
||||||
<view class="intro-title">教师简介</view>
|
|
||||||
<view class="teacher-intro">
|
|
||||||
<text>{{ teacherInfo.introduction }}</text>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<!-- 教学理念 -->
|
|
||||||
<view class="info-card">
|
|
||||||
<view class="card-title">教学理念</view>
|
|
||||||
<view class="divider"></view>
|
|
||||||
|
|
||||||
<view class="content-section">
|
|
||||||
<text>{{ teachingPhilosophy }}</text>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<!-- 教学计划 -->
|
|
||||||
<view class="info-card">
|
|
||||||
<view class="card-title">教学计划</view>
|
|
||||||
<view class="divider"></view>
|
|
||||||
|
|
||||||
<view class="content-section">
|
|
||||||
<template v-if="teachingPlan && teachingPlan.length > 0">
|
|
||||||
<view
|
|
||||||
v-for="(phase, index) in teachingPlan"
|
|
||||||
:key="index"
|
|
||||||
class="teaching-phase"
|
|
||||||
>
|
|
||||||
<text>{{ phase }}</text>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
<view class="empty-data">
|
|
||||||
<u-icon name="info-circle" color="#C8C9CC" size="18"></u-icon>
|
|
||||||
<text>暂无教学计划</text>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<template #bottom>
|
|
||||||
<view class="white-bg-color py-5">
|
|
||||||
<view class="flex-row items-center pb-10 pt-5">
|
|
||||||
<u-button
|
|
||||||
text="返回"
|
|
||||||
class="ml-15 mr-7"
|
|
||||||
:plain="true"
|
|
||||||
@click="navigateBack"
|
|
||||||
/>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
</BasicLayout>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
import { ref, onMounted, computed } from "vue";
|
|
||||||
import { navigateBack } from "@/utils/uniapp";
|
|
||||||
import { useDataStore } from "@/store/modules/data";
|
|
||||||
import { storeToRefs } from "pinia";
|
|
||||||
import { imagUrl } from "@/utils";
|
|
||||||
import { kcjhFindKcjhByKcIdApi } from "@/api/base/server";
|
|
||||||
|
|
||||||
// 定义课程数据类型
|
|
||||||
interface CourseData {
|
|
||||||
id?: string;
|
|
||||||
kcmc?: string;
|
|
||||||
jsName?: string;
|
|
||||||
kcdd?: string;
|
|
||||||
kcje?: number;
|
|
||||||
studyTime?: string;
|
|
||||||
kcjsms?: string;
|
|
||||||
jxll?: string;
|
|
||||||
remark?: string;
|
|
||||||
xkkcImg?: string;
|
|
||||||
[key: string]: any; // 允许其他字段
|
|
||||||
}
|
|
||||||
|
|
||||||
const useData = useDataStore();
|
|
||||||
const { kcData } = storeToRefs(useData);
|
|
||||||
|
|
||||||
// 教学计划 - 此处假设没有具体教学计划字段,将备注内容拆分为教学计划
|
|
||||||
const teachingPlan = ref<string[]>([]);
|
|
||||||
|
|
||||||
const courseData = kcData.value as CourseData;
|
|
||||||
if (courseData && courseData.id) {
|
|
||||||
kcjhFindKcjhByKcIdApi({
|
|
||||||
xkkcId: courseData.id,
|
|
||||||
}).then((res) => {
|
|
||||||
if (res.resultCode == 1) {
|
|
||||||
teachingPlan.value = res.result.map(
|
|
||||||
(item: any) => item.jhjd + ":" + item.jhms
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// 课程详情数据
|
|
||||||
const courseDetail = computed(() => {
|
|
||||||
const data = (kcData.value as CourseData) || {};
|
|
||||||
return {
|
|
||||||
id: data.id || "",
|
|
||||||
title: data.kcmc || "暂无课程名称",
|
|
||||||
teacher: data.jsName || "暂无教师信息",
|
|
||||||
location: data.kcdd || "暂无地点信息",
|
|
||||||
price: data.kcje || 0,
|
|
||||||
studyTime: data.studyTime || "暂无上课时间",
|
|
||||||
xkkcImg: data.xkkcImg || "/static/images/robot-course.jpg", // 默认图片
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
// 教师信息
|
|
||||||
const teacherInfo = computed(() => {
|
|
||||||
const data = (kcData.value as CourseData) || {};
|
|
||||||
return {
|
|
||||||
name: data.jsName || "暂无教师信息",
|
|
||||||
avatar: imagUrl(data.jstx), // 默认头像
|
|
||||||
introduction: data.kcjsms || "暂无教师介绍",
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
// 教学理念
|
|
||||||
const teachingPhilosophy = computed(() => {
|
|
||||||
const data = (kcData.value as CourseData) || {};
|
|
||||||
return data.jxll || "暂无教学理念信息";
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.course-detail {
|
|
||||||
background-color: #f5f7fa;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-bar {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding: 15px;
|
|
||||||
height: 44px;
|
|
||||||
background-color: #2879ff;
|
|
||||||
|
|
||||||
.nav-left {
|
|
||||||
width: 40px;
|
|
||||||
height: 40px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-title {
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: 500;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-right {
|
|
||||||
width: 40px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.info-card {
|
|
||||||
margin: 15px;
|
|
||||||
background-color: #fff;
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 15px;
|
|
||||||
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
|
|
||||||
|
|
||||||
.card-title {
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #333;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.divider {
|
|
||||||
height: 1px;
|
|
||||||
background-color: #eee;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.course-info {
|
|
||||||
display: flex;
|
|
||||||
|
|
||||||
.course-image {
|
|
||||||
width: 120px;
|
|
||||||
height: 138px;
|
|
||||||
border-radius: 8px;
|
|
||||||
margin-right: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.course-content {
|
|
||||||
flex: 1;
|
|
||||||
|
|
||||||
.course-name {
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #333;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.course-teacher,
|
|
||||||
.course-location {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #666;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.course-time {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #666;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.course-price {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #666;
|
|
||||||
|
|
||||||
.price-value {
|
|
||||||
color: #ff6b00;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.teacher-info {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
|
|
||||||
.teacher-header {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
|
|
||||||
.teacher-avatar {
|
|
||||||
width: 60px;
|
|
||||||
height: 60px;
|
|
||||||
border-radius: 50%;
|
|
||||||
margin-right: 15px;
|
|
||||||
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
|
|
||||||
border: 2px solid #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.teacher-basic-info {
|
|
||||||
.teacher-name {
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: 500;
|
|
||||||
color: #333;
|
|
||||||
margin-bottom: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.teacher-title {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #666;
|
|
||||||
background-color: #f4f7fc;
|
|
||||||
padding: 2px 8px;
|
|
||||||
border-radius: 4px;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.teacher-intro-section {
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
.intro-title {
|
|
||||||
font-size: 15px;
|
|
||||||
font-weight: 500;
|
|
||||||
color: #555;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
padding-left: 8px;
|
|
||||||
border-left: 3px solid #2879ff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.teacher-intro {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #666;
|
|
||||||
line-height: 1.6;
|
|
||||||
background-color: #f8f9fc;
|
|
||||||
padding: 12px;
|
|
||||||
border-radius: 8px;
|
|
||||||
text-align: justify;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.content-section {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #666;
|
|
||||||
line-height: 1.6;
|
|
||||||
|
|
||||||
.teaching-phase {
|
|
||||||
margin-bottom: 10px;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-data {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
padding: 20px 0;
|
|
||||||
color: #909399;
|
|
||||||
font-size: 14px;
|
|
||||||
|
|
||||||
text {
|
|
||||||
margin-left: 8px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.bottom-action {
|
|
||||||
padding: 15px;
|
|
||||||
margin-top: 20px;
|
|
||||||
|
|
||||||
.back-btn {
|
|
||||||
width: 100%;
|
|
||||||
height: 44px;
|
|
||||||
line-height: 44px;
|
|
||||||
background-color: #fff;
|
|
||||||
color: #333;
|
|
||||||
border-radius: 22px;
|
|
||||||
font-size: 16px;
|
|
||||||
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
Loading…
x
Reference in New Issue
Block a user