调整点名页面逻辑

This commit is contained in:
ywyonui 2025-06-20 18:38:22 +08:00
parent ca8b6e0880
commit 08fea8a1f1
8 changed files with 715 additions and 166 deletions

View File

@ -41,6 +41,11 @@ export const fractionRuleApi1 = async () => {
);
};
// 查询教师信息
export const jsdfindJsByPhoneApi = async (params: any) => {
return await get("/api/js/findJsByPhone", params);
};
// 选课列表
export const jsdXkListApi = async (params: any) => {
return await get("/mobile/js/xk/list", params);

View File

@ -0,0 +1,6 @@
import { get, post } from "@/utils/request";
//字典接口
export const dmBeforeMinuteApi = async () => {
return await get("/api/comConfig/getDmBeforeMinute");
};

View File

@ -385,16 +385,16 @@
}
},
{
"path": "pages/base/groupTeaching/zhujiao",
"path": "pages/base/groupTeaching/xkList",
"style": {
"navigationBarTitleText": "zhujiao",
"navigationBarTitleText": "选课列表",
"enablePullDownRefresh": false
}
},
{
"path": "pages/base/groupTeaching/zhujiaoDetails",
"path": "pages/base/groupTeaching/xkkcDetail",
"style": {
"navigationBarTitleText": "zhujiaoDetails"
"navigationBarTitleText": "选课课程详情"
}
},
{
@ -412,7 +412,13 @@
}
},
{
"path": "pages/base/groupTeaching/studentRollCall",
"path": "pages/base/groupTeaching/dmXkList",
"style": {
"navigationBarTitleText": "选课列表"
}
},
{
"path": "pages/base/groupTeaching/dmXkkcDetail",
"style": {
"navigationBarTitleText": "学生点名",
"enablePullDownRefresh": false

View File

@ -0,0 +1,525 @@
<template>
<view class="interest-course">
<!-- 选课信息头部 - 固定部分 -->
<view class="selection-header">
<view class="header-content">
<view class="title-section" @click="clickShowXkSelector">
<view class="title">
<text v-if="xkData && xkData.xkmc">{{ xkData.xkmc }}</text>
<text v-else>选课信息</text>
</view>
<view class="switch-btn" v-if="xkList.length > 1">切换</view>
</view>
</view>
</view>
<!-- 可滚动的内容区域 -->
<view class="scrollable-content">
<!-- 课程网格列表 -->
<view class="course-list" v-if="xkkcList && xkkcList.length > 0">
<view v-for="(xkkc, index) in xkkcList" :key="xkkc.id || index" class="course-item">
<view class="course-name">{{ xkkc.kcmc }}</view>
<view class="course-info-item">
<view class="info-label">上课周期类型</view>
<view class="info-data">{{ xkkc.skzqlx }}</view>
</view>
<view class="course-info-item">
<view class="info-label">上课周期</view>
<view class="info-data">{{ xkkc.skzqmc }}</view>
</view>
<view class="course-info-item">
<view class="info-label">上课开始时间</view>
<view class="info-data">{{ xkkc.skkstime }}</view>
</view>
<view class="course-info-item">
<view class="info-label">上课结束时间</view>
<view class="info-data">{{ xkkc.skjstime }}</view>
</view>
<view class="course-info-item">
<view class="info-label">开课地点</view>
<view class="info-data">{{ xkkc.kcdd }}</view>
</view>
<view class="course-info-item">
<view class="info-label">上课人数</view>
<view class="info-data">{{ xkkc.hasNum || 0 }} | {{ xkkc.maxNum || 0 }}</view>
</view>
<view class="course-btn-group">
<view class="dm-btn" @click.stop="goDm(xkkc)">点名</view>
</view>
</view>
</view>
<!-- 暂无数据提示 -->
<view v-else class="empty-course-list">
<view class="empty-icon">
<u-icon name="list" size="50" color="#C8C9CC"></u-icon>
</view>
<view class="empty-text">暂无课程数据</view>
</view>
</view>
<view>
<!-- 俱乐部选择弹窗 -->
<u-popup :show="showXkFlag" @close="showXkFlag = false" mode="bottom" round="10">
<view class="xk-selector">
<view class="selector-header">
<text class="selector-title">选择俱乐部</text>
<u-icon name="close" size="20" @click="showXkFlag = false"></u-icon>
</view>
<view class="xk-list">
<view v-for="(xk, index) in xkList" :key="index" class="xk-item" :class="{
'xk-item-active': xkData.id === xk.id
}" @click="switchXk(xk)">
<view class="xk-info">
<text class="xk-name">{{ xk.xkmc }}</text>
<text class="xk-type">{{ xk.xkmc }}</text>
</view>
<u-icon v-if="xkData.id === xk.id" name="checkmark" color="#409EFF" size="20"></u-icon>
</view>
</view>
</view>
</u-popup>
</view>
</view>
</template>
<script setup lang="ts">
import {
ref,
onBeforeUnmount,
onMounted,
} from "vue";
import { useUserStore } from "@/store/modules/user";
import { useDataStore } from "@/store/modules/data";
import { jsdXkListApi } from "@/api/base/server";
import { dmBeforeMinuteApi } from "@/api/system/config/index";
import dayjs from "dayjs";
const { getJs } = useUserStore();
const { getData, setData } = useDataStore();
const wdNameList = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"];
//
const showXkFlag = ref(false);
const xkList = ref<any>([]);
const xkData = ref();
const courseInfo = ref<any>({});
//
const xkkcList = ref<any[]>([]);
const dmBeforeMinute = ref<number>(0);
onMounted(async () => {
uni.showLoading({
title: "加载中...",
});
await loadCourseList();
await loadDmBeforeMinute();
uni.hideLoading();
});
//
const loadCourseList = async () => {
const res = await jsdXkListApi({
jsId: getJs.id
});
if (res.resultCode == 1) {
if (res.result && res.result.length) {
xkList.value = res.result;
switchXk(res.result[0]);
} else {
xkList.value = [];
xkData.value = {};
xkkcList.value = [];
}
}
};
//
const loadDmBeforeMinute = async () => {
const res = await dmBeforeMinuteApi();
if (res.resultCode == 1) {
// res.resultintnumberdmBeforeMinute
dmBeforeMinute.value = parseInt(res.result);
}
}
//
function clickShowXkSelector() {
if (xkList.value.length > 1) {
showXkFlag.value = true;
}
}
//
function switchXk(xk: any) {
xkData.value = xk;
xkkcList.value = xk.xkkcs;
showXkFlag.value = false;
for (let i = 0; i < xk.xkkcs.length; i++) {
let xkkc = xk.xkkcs[i];
//
switch (xkkc.skzqlx) {
case '每天':
xkkc.skzqmc = "每天";
break;
case '每周':
const daysOfWeek = xkkc.skzq.split(',').map(Number);
// wdNameListdaysOfWeek
xkkc.skzqmc = daysOfWeek.map((day: number) => wdNameList[day - 1]).join(',');
break;
case '每月':
const daysOfMonth = xkkc.skzq.split(',').map(Number);
//
xkkc.skzqmc = daysOfMonth.map((day: number) => day + "号").join(',');
break;
}
}
//
uni.showToast({
title: `已切换到${xk.xkmc}`,
icon: "none",
});
}
//
const goDm = (xkkc: any) => {
const now = dayjs();
let wDay = now.day();
if (wDay === 0) {
wDay = 7;
}
let mDay = now.date();
const strDate = now.format('YYYY-MM-DD') + ' ';
let dmFlag = false;
let msg = "";
//
switch (xkkc.skzqlx) {
case '每天':
dmFlag = true;
break;
case '每周':
const daysOfWeek = xkkc.skzq.split(',').map(Number);
dmFlag = daysOfWeek.includes(wDay);
// wdNameListdaysOfWeek
xkkc.skzqmc = daysOfWeek.map((day: number) => wdNameList[day - 1]).join(',');
break;
case '每月':
const daysOfMonth = xkkc.skzq.split(',').map(Number);
dmFlag = daysOfMonth.includes(mDay);
//
xkkc.skzqmc = daysOfMonth.map((day: number) => day + "号").join(',');
break;
}
//
if (dmFlag) {
// xkkc.skkstimedmBeforeMinute
const startTime = dayjs(strDate + xkkc.skkstime).subtract(dmBeforeMinute.value, 'minute').format('YYYY-MM-DD HH:mm:ss');
const endTime = dayjs(strDate + xkkc.skjstime, 'YYYY-MM-DD HH:mm:ss');
dmFlag = now.isBefore(endTime) && now.isAfter(startTime)
} else {
msg = "没到点名日期";
}
if (dmFlag) {
setData(xkkc);
uni.navigateTo({
url: `/pages/base/groupTeaching/dmXkkcDetail`,
});
} else {
if (msg === "") {
msg = "没到点名时间";
}
uni.showToast({
title: msg,
icon: 'none',
duration: 2000
});
}
};
//
onBeforeUnmount(() => {
});
</script>
<style lang="scss" scoped>
.interest-course {
min-height: 100%;
background-color: #f5f7fa;
display: flex;
flex-direction: column;
height: 100%;
overflow: hidden;
}
.nav-bar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 15px;
height: 44px;
background-color: #fff;
.nav-left {
width: 40px;
height: 40px;
display: flex;
align-items: center;
}
.nav-title {
font-size: 18px;
font-weight: 500;
color: #333;
}
.nav-right {
width: 40px;
display: flex;
justify-content: flex-end;
}
}
.selection-header {
background: linear-gradient(135deg, #4a90e2, #2879ff);
padding: 20px 15px;
color: #fff;
border-radius: 0 0 15px 15px;
box-shadow: 0 4px 12px rgba(40, 121, 255, 0.2);
position: sticky;
top: 0;
left: 0;
right: 0;
z-index: 10;
.header-content {
display: flex;
flex-direction: column;
gap: 15px;
.title-section {
display: flex;
align-items: center;
.title {
flex: 1 0 1px;
font-size: 24px;
font-weight: bold;
}
.subtitle {
font-size: 14px;
opacity: 0.8;
}
.switch-btn {
padding: 5px 15px;
background-color: rgba(255, 255, 255, 0.2);
color: #fff;
border-radius: 15px;
font-size: 15px;
}
}
}
}
//
.scrollable-content {
flex: 1;
overflow-y: auto;
-webkit-overflow-scrolling: touch; // iOS
}
.course-list {
padding: 15px 15px 0 15px;
.course-item {
position: relative;
width: 100%;
margin-bottom: 15px;
background-color: #fff;
border-radius: 8px;
padding: 15px;
box-sizing: border-box;
border: 1px solid transparent;
transition: all 0.3s ease;
// &:nth-child(odd) {
// margin-right: 10px;
// }
// &:nth-child(even) {
// margin-left: 10px;
// }
&.selected {
border: 1px solid #3fbf72;
background-color: rgba(63, 191, 114, 0.05);
box-shadow: 0 2px 8px rgba(63, 191, 114, 0.15);
}
.course-name {
font-size: 16px;
font-weight: 500;
color: #333;
margin-bottom: 10px;
}
.course-btn-group {
display: flex;
.dm-btn {
flex: 1 0 1px;
display: inline-block;
color: #2879ff;
font-size: 14px;
}
}
.course-info-item {
display: flex;
margin-bottom: 12px;
font-size: 12px;
.info-label {
color: #949AA4;
flex: 0 0 100px;
}
.info-data {
flex: 1 0 1px;
}
}
}
}
/* 学生选择器弹窗样式 */
.xk-selector {
background-color: #ffffff;
border-top-left-radius: 12px;
border-top-right-radius: 12px;
padding-bottom: 20px;
.selector-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px;
border-bottom: 1px solid #f2f2f2;
.selector-title {
font-size: 16px;
font-weight: 500;
color: #303133;
}
}
.xk-list {
padding: 0 15px;
.xk-item {
display: flex;
align-items: center;
padding: 15px 0;
border-bottom: 1px solid #f2f2f2;
&:last-child {
border-bottom: none;
}
&-active {
background-color: rgba(64, 158, 255, 0.05);
}
.xk-info {
flex: 1;
margin-left: 12px;
.xk-name {
font-size: 15px;
font-weight: 500;
color: #303133;
margin-bottom: 4px;
}
.xk-type {
font-size: 13px;
color: #303133;
margin-bottom: 4px;
}
.xk-class {
font-size: 13px;
color: #606266;
}
}
}
}
}
/* 全局图片样式 */
.w-full {
width: 100%;
}
.h-full {
height: 100%;
}
//
.empty-course-list {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60px 20px;
text-align: center;
.empty-icon {
margin-bottom: 20px;
background-color: #f5f6f7;
width: 80px;
height: 80px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.empty-text {
font-size: 18px;
font-weight: 500;
color: #303133;
margin-bottom: 8px;
}
.empty-desc {
font-size: 14px;
color: #909399;
max-width: 80%;
line-height: 1.5;
}
}
/* 选课已结束样式 */
.enrollment-ended {
display: flex;
align-items: center;
justify-content: center;
background-color: rgba(255, 255, 255, 0.2);
border-radius: 8px;
padding: 12px 15px;
font-size: 16px;
font-weight: 500;
color: #fff;
gap: 8px;
}
</style>

View File

@ -47,13 +47,13 @@
<view class="avatar-container mr-8">
<image
class="student-avatar"
:src="xs.avatar || '/static/images/default-avatar.png'"
:src="xs.xmtx || '/static/images/default-avatar.png'"
mode="aspectFill"
></image>
</view>
<view class="flex-1 overflow-hidden">
<view class="flex-row items-center mb-3">
<text class="font-14 font-bold mr-5 text-ellipsis">{{ xs.xm }}</text>
<text class="font-14 font-bold mr-5 text-ellipsis">{{ xs.xsxm }}</text>
<view
class="status-tag"
:class="getStatusClass(xs.xszt)"
@ -154,7 +154,7 @@ const getStatusClass = (status: string) => {
};
//
const fetchStatusOptions = async () => {
const loadStatusOptions = async () => {
try {
// pid763939514
const res = await dicApi({pid: 763939514});
@ -177,9 +177,45 @@ const fetchStatusOptions = async () => {
}
};
const loadXsList = async () => {
const res = await jsdXkXsListApi({
xkkcId: xkkc.value.id
});
if (res && res.resultCode === 1) {
xsList.value = res.result || [];
let sd = 0;
let qj = 0;
let qq = 0;
//
for (let i = 0; i < xsList.value.length; i++) {
const xs = xsList.value[i];
switch (xs.xszt) {
case "正常":
sd++;
break;
case "请假":
qj++;
break;
case "缺勤":
qq++;
break;
default:
break;
}
}
numInfo.value = {
zg: xsList.value.length,
yd: xsList.value.length - qj,
sd: sd,
qj: qj,
qq: qj
};
}
};
//
const openStatusPicker = (student: any) => {
curXs.value = student;
const openStatusPicker = (xs: any) => {
curXs.value = xs;
statusPickerVisible.value = true;
};
@ -187,12 +223,12 @@ const openStatusPicker = (student: any) => {
const confirmStatus = (e: any) => {
if (curXs.value && e.value && e.value[0]) {
const selectedStatus = statusOptions.value.find(
(option: any) => option.value === e.value[0]
(option: any) => option.value === e.value[0].value
);
if (selectedStatus) {
//
curXs.value.status = selectedStatus.text;
curXs.value.xszt = selectedStatus.text;
}
}
statusPickerVisible.value = false;
@ -215,7 +251,13 @@ const contactParent = (student: any) => {
};
//
const submit = () => {
const submit = async () => {
const res = await jsdXkdmListApi({
jsId: js.value.id,
xkkcId: xkkc.value.id,
dmtime: now,
xkdmList: xsList.value
});
uni.showToast({
title: "提交成功",
icon: "success",
@ -223,8 +265,9 @@ const submit = () => {
};
//
onMounted(() => {
fetchStatusOptions();
onMounted(async () => {
await loadXsList();
await loadStatusOptions();
});
</script>

View File

@ -45,7 +45,6 @@
</view>
<view class="course-btn-group">
<view class="detail-btn" @click.stop="goDetail(xkkc)">详情</view>
<view v-if="xkkc.dmFlag" class="dm-btn" @click.stop="goDm(xkkc)">点名</view>
</view>
</view>
</view>
@ -98,7 +97,6 @@ import dayjs from "dayjs";
const { getJs } = useUserStore();
const { getData, setData } = useDataStore();
const { sign_file } = getData;
const wdNameList = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"];
@ -119,29 +117,24 @@ onMounted(() => {
});
//
const loadCourseList = () => {
const loadCourseList = async () => {
uni.showLoading({
title: "加载中...",
});
jsdXkListApi({
const res = await jsdXkListApi({
jsId: getJs.id
})
.then((res) => {
if (res.resultCode == 1) {
if (res.result && res.result.length) {
xkList.value = res.result;
switchXk(res.result[0]);
} else {
xkList.value = [];
xkData.value = {};
xkkcList.value = [];
}
uni.hideLoading();
}
})
.catch(() => {
uni.hideLoading();
});
});
if (res.resultCode == 1) {
if (res.result && res.result.length) {
xkList.value = res.result;
switchXk(res.result[0]);
} else {
xkList.value = [];
xkData.value = {};
xkkcList.value = [];
}
}
uni.hideLoading();
};
//
@ -155,43 +148,26 @@ function clickShowXkSelector() {
function switchXk(xk: any) {
xkData.value = xk;
xkkcList.value = xk.xkkcs;
const now = dayjs();
let wDay = now.day();
if (wDay === 0) {
wDay = 7;
}
let mDay = now.date();
const strDate = now.format('YYYY-MM-DD') + ' ';
for (let i = 0; i < xk.xkkcs.length; i++) {
let xkkc = xk.xkkcs[i];
xkkc.dmFlag = false;
//
switch (xkkc.skzqlx) {
case '每天':
xkkc.dmFlag = true;
break;
case '每周':
const daysOfWeek = xkkc.skzq.split(',').map(Number);
xkkc.dmFlag = daysOfWeek.includes(wDay);
// wdNameListdaysOfWeek
xkkc.skzqmc = daysOfWeek.map((day: number) => wdNameList[day - 1]).join(',');
break;
case '每月':
const daysOfMonth = xkkc.skzq.split(',').map(Number);
xkkc.dmFlag = daysOfMonth.includes(mDay);
//
xkkc.skzqmc = daysOfMonth.map((day: number) => day + "号").join(',');
break;
}
//
if (xkkc.dmFlag) {
//
const startTime = dayjs(strDate + xkkc.skkstime, 'YYYY-MM-DD HH:mm:ss');
const endTime = dayjs(strDate + xkkc.skjstime, 'YYYY-MM-DD HH:mm:ss');
xkkc.dmFlag = now.isBefore(endTime) && now.isAfter(startTime)
}
}
showXkFlag.value = false;
showXkFlag.value = false;
for (let i = 0; i < xk.xkkcs.length; i++) {
let xkkc = xk.xkkcs[i];
//
switch (xkkc.skzqlx) {
case '每天':
xkkc.skzqmc = "每天";
break;
case '每周':
const daysOfWeek = xkkc.skzq.split(',').map(Number);
// wdNameListdaysOfWeek
xkkc.skzqmc = daysOfWeek.map((day: number) => wdNameList[day - 1]).join(',');
break;
case '每月':
const daysOfMonth = xkkc.skzq.split(',').map(Number);
//
xkkc.skzqmc = daysOfMonth.map((day: number) => day + "号").join(',');
break;
}
}
//
uni.showToast({
title: `已切换到${xk.xkmc}`,
@ -203,20 +179,10 @@ function switchXk(xk: any) {
const goDetail = (xkkc: any) => {
setData(xkkc);
uni.navigateTo({
url: `/pages/base/groupTeaching/zhujiaoDetails`,
url: `/pages/base/groupTeaching/xkkcDetail`,
});
};
//
const goDm = (xkkc: any) => {
setData(xkkc);
uni.navigateTo({
url: `/pages/base/groupTeaching/studentRollCall`,
});
};
//
onBeforeUnmount(() => {
});
@ -355,14 +321,6 @@ onBeforeUnmount(() => {
color: #2879ff;
font-size: 14px;
}
.dm-btn {
flex: 1 0 1px;
display: inline-block;
color: #2879ff;
font-size: 14px;
text-align: right;
}
}
.course-info-item {

View File

@ -1,44 +1,46 @@
<template>
<BasicLayout>
<template #top>
<view class="flex-row items-center white-bg-color p-15 r-md">
<view class="flex-col ml-10 flex-1 course-info">
<view class="course-name">{{ xkkc.kcmc }}</view>
<view class="course-info-item">
<view class="info-label">上课周期类型</view>
<view class="info-data">{{ xkkc.skzqlx }}</view>
</view>
<view class="course-info-item">
<view class="info-label">上课周期</view>
<view class="info-data">{{ xkkc.skzqmc }}</view>
</view>
<view class="course-info-item">
<view class="info-label">上课开始时间</view>
<view class="info-data">{{ xkkc.skkstime }}</view>
</view>
<view class="course-info-item">
<view class="info-label">上课结束时间</view>
<view class="info-data">{{ xkkc.skjstime }}</view>
</view>
<view class="course-info-item">
<view class="info-label">开课老师</view>
<view class="info-data">{{ js.jsxm }}</view>
</view>
<view class="course-info-item">
<view class="info-label">开课地点</view>
<view class="info-data">{{ xkkc.kcdd }}</view>
</view>
<view class="course-info-item">
<view class="info-label">上课人数</view>
<view class="info-data">{{ xkkc.hasNum || 0 }} | {{ xkkc.maxNum || 0 }}</view>
</view>
<view class="course-info-item">
<view class="info-label">金额</view>
<view class="info-data cor-FF8D02">¥{{ xkkc.kcje }}</view>
</view>
</view>
</view>
</template>
<!-- <template #top>
</template> -->
<view class="mb-5">
<view class="flex-row items-center white-bg-color p-15 r-md">
<view class="flex-col ml-10 flex-1 course-info">
<view class="course-name">{{ xkkc.kcmc }}</view>
<view class="course-info-item">
<view class="info-label">上课周期类型</view>
<view class="info-data">{{ xkkc.skzqlx }}</view>
</view>
<view class="course-info-item">
<view class="info-label">上课周期</view>
<view class="info-data">{{ xkkc.skzqmc }}</view>
</view>
<view class="course-info-item">
<view class="info-label">上课开始时间</view>
<view class="info-data">{{ xkkc.skkstime }}</view>
</view>
<view class="course-info-item">
<view class="info-label">上课结束时间</view>
<view class="info-data">{{ xkkc.skjstime }}</view>
</view>
<view class="course-info-item">
<view class="info-label">开课老师</view>
<view class="info-data">{{ js.jsxm }}</view>
</view>
<view class="course-info-item">
<view class="info-label">开课地点</view>
<view class="info-data">{{ xkkc.kcdd }}</view>
</view>
<view class="course-info-item">
<view class="info-label">上课人数</view>
<view class="info-data">{{ xkkc.hasNum || 0 }} | {{ xkkc.maxNum || 0 }}</view>
</view>
<view class="course-info-item">
<view class="info-label">金额</view>
<view class="info-data cor-FF8D02">¥{{ xkkc.kcje }}</view>
</view>
</view>
</view>
</view>
<view class="p-15">
<BasicForm @register="register">
<template #jxjh>
@ -55,7 +57,7 @@
<template v-for="(item, index) in education.xl" :key="index">
<view class="po-re mb-15">
<BasicForm v-model="item.value" :schema="schema" :formsProps="{ labelWidth: 100 }" />
<view @click="deleteMemberFamily(index as number, item.value)" class="delete-icon">
<view @click="deleteMemberFamily(index as number, item.value)" class="delete-icon mt-5">
<BasicIcon type="clear" size="30" />
</view>
</view>

View File

@ -14,15 +14,15 @@
<view class="teacher-avatar">
<image
class="avatar-image"
:src="teacherData.avatar || '/static/base/default-avatar.png'"
:src="js.headPic || '/static/base/default-avatar.png'"
mode="aspectFill"
></image>
</view>
<view class="teacher-details">
<view class="teacher-name">{{ teacherData.name }}</view>
<view class="teacher-position">{{ teacherData.position }}</view>
<view class="teacher-class">{{ teacherData.className }}</view>
<view class="teacher-name">{{ js.jsxm }}</view>
<view class="teacher-position">{{ js.dzzw }} {{ js.qtzw }}</view>
<view class="teacher-class">{{ js.njz }}</view>
</view>
</view>
@ -30,18 +30,18 @@
<view class="stats-info">
<view class="stat-item">
<text class="stat-label">积分</text>
<text class="stat-value">{{ teacherData.score }}</text>
<text class="stat-value">{{ jsWork.jf }}</text>
</view>
<view class="stat-divider">|</view>
<view class="stat-item">
<text class="stat-label">工作量</text>
<text class="stat-value">{{ teacherData.workload }}课时</text>
<text class="stat-value">{{ jsWork.ks }}课时</text>
</view>
</view>
<!-- 介绍文字 -->
<view class="teacher-intro">
{{ teacherData.introduction }}
{{ js.introduction || "北冥有鱼,其名为鲲。鲲之大,不知其几千里也。" }}
</view>
</view>
@ -88,13 +88,22 @@
</template>
<script lang="ts" setup>
import { findJsAllByPhoneApi } from "@/api/system/login";
import { jsdfindJsByPhoneApi } from "@/api/base/server";
import { useDataStore } from "@/store/modules/data";
import { useUserStore } from "@/store/modules/user";
import { imagUrl } from "@/utils";
import { hideLoading, showLoading } from "@/utils/uniapp";
import { set } from "lodash";
import { reactive, ref } from "vue";
const { logout, getUser, getJs, setJs } = useUserStore();
const js = computed(() => getJs);
//
const jsWork = ref<any>({
jf: 88,
ks: 40
});
interface GridItem {
id: number | string;
@ -111,28 +120,6 @@ interface Section {
items: GridItem[];
}
//
interface TeacherData {
name: string;
position: string;
className: string;
score: number;
workload: number;
introduction: string;
avatar?: string;
}
const { logout, getUser } = useUserStore();
//
const teacherData = reactive<TeacherData>({
name: getUser.loginName,
position: "教研组长",
className: "2014级1班班主任",
score: 48,
workload: 20,
introduction: "北冥有鱼,其名为鲲。鲲之大,不知其几千里也。",
avatar: imagUrl(getUser.profilePhoto),
});
// 退
const handleLogout = () => {
uni.showModal({
@ -214,6 +201,21 @@ const sections = reactive<Section[]>([
show: true,
path: "/pages/view/routine/kefuxuncha/KeFuXunCha",
},
{
id: "r7",
icon: "file-text-fill-2",
text: "选课详情",
show: true,
path: "/pages/base/groupTeaching/xkList",
},
{
id: "r8",
icon: "draftfill",
text: "选课点名",
show: true,
path: "/pages/base/groupTeaching/dmXkList",
},
],
},
{
@ -301,17 +303,19 @@ const getIconBgColor = (index: number) => {
];
return colors[index % colors.length];
};
const { setFile, getFile } = useDataStore();
//
const handleGridItemClick = async (item: GridItem) => {
console.log("Clicked item:", item);
if (item.text == "教师档案") {
showLoading("加载中...");
const res = await findJsAllByPhoneApi({
phone: getUser.telephone,
const res = await jsdfindJsByPhoneApi({
phone: getJs.lxdh,
});
if (res.result.headPic && res.result.headPic.length) {
res.result.headPic = imagUrl(res.result.headPic);
}
setJs(res.result);
hideLoading();
setFile(res.result);
}
setTimeout(() => {
if (item.path) {