701 lines
15 KiB
Vue
Raw Normal View History

2025-04-22 10:22:33 +08:00
<template>
<view class="service-page">
<!-- 1. 顶部 Header -->
<view class="header-section">
2025-05-30 17:22:51 +08:00
<view class="header-gradient"></view>
2025-06-10 16:27:34 +08:00
<!-- 退出按钮 -->
<view class="logout-btn" @click="handleLogout">
<text class="logout-text">退出</text>
</view>
<!-- 老师信息 -->
<view class="teacher-info">
<view class="teacher-avatar">
<image
class="avatar-image"
2025-06-23 17:15:11 +08:00
:src="jsTx || '/static/base/default-avatar.png'"
2025-06-10 16:27:34 +08:00
mode="aspectFill"
></image>
</view>
<view class="teacher-details">
2025-06-20 18:38:22 +08:00
<view class="teacher-name">{{ js.jsxm }}</view>
2025-07-26 21:29:04 +08:00
<view class="teacher-position">{{ dzZwLabel }}</view>
<view class="teacher-position">{{ qtZwLabel }}</view>
2025-06-20 18:38:22 +08:00
<view class="teacher-class">{{ js.njz }}</view>
2025-06-10 16:27:34 +08:00
</view>
</view>
<!-- 统计信息 -->
<view class="stats-info">
<view class="stat-item">
<text class="stat-label">积分</text>
2025-06-20 18:38:22 +08:00
<text class="stat-value">{{ jsWork.jf }}</text>
2025-06-10 16:27:34 +08:00
</view>
<view class="stat-divider">|</view>
<view class="stat-item">
<text class="stat-label">工作量</text>
2025-06-20 18:38:22 +08:00
<text class="stat-value">{{ jsWork.ks }}课时</text>
2025-06-10 16:27:34 +08:00
</view>
</view>
<!-- 介绍文字 -->
<view class="teacher-intro">
2025-06-20 18:38:22 +08:00
{{ js.introduction || "北冥有鱼,其名为鲲。鲲之大,不知其几千里也。" }}
2025-05-30 17:22:51 +08:00
</view>
2025-04-22 10:22:33 +08:00
</view>
<!-- 2. 主要内容区域 -->
<view class="main-content">
<!-- 循环渲染功能分区 -->
2025-06-10 16:27:34 +08:00
<view
class="section-block"
v-for="(section, index) in sections"
:key="section.id"
>
2025-04-22 10:22:33 +08:00
<view class="section-title">
2025-06-10 16:27:34 +08:00
<view
class="title-decorator"
:style="{ backgroundColor: getSectionColor(index) }"
></view>
2025-04-22 10:22:33 +08:00
<text>{{ section.title }}</text>
2025-05-30 17:22:51 +08:00
<view class="title-line"></view>
2025-04-22 10:22:33 +08:00
</view>
<view class="section-grid-card">
<template v-for="item in section.items" :key="item.id">
<view
v-if="item.show"
class="grid-item"
@click="handleGridItemClick(item)"
>
2025-06-10 16:27:34 +08:00
<view
class="grid-icon-container"
:style="{ backgroundColor: getIconBgColor(index) }"
>
2025-05-30 17:22:51 +08:00
<image
class="grid-icon"
:src="`/static/base/home/${item.icon}.png`"
mode="aspectFit"
></image>
</view>
2025-04-22 10:22:33 +08:00
<text class="grid-text">{{ item.text }}</text>
</view>
</template>
</view>
</view>
</view>
</view>
</template>
<script lang="ts" setup>
2025-06-20 18:38:22 +08:00
import { jsdfindJsByPhoneApi } from "@/api/base/server";
2025-07-26 21:29:04 +08:00
import { useCommonStore } from "@/store/modules/common";
2025-06-10 16:27:34 +08:00
import { useUserStore } from "@/store/modules/user";
import { imagUrl } from "@/utils";
2025-06-15 21:08:40 +08:00
import { hideLoading, showLoading } from "@/utils/uniapp";
import { set } from "lodash";
2025-06-10 16:27:34 +08:00
import { reactive, ref } from "vue";
2025-06-20 18:38:22 +08:00
const { logout, getUser, getJs, setJs } = useUserStore();
2025-07-26 21:29:04 +08:00
const { getZwListByLx } = useCommonStore();
2025-06-20 18:38:22 +08:00
2025-06-23 17:15:11 +08:00
const jsTx = computed(() => imagUrl(getUser.profilePhoto));
2025-06-20 18:38:22 +08:00
const js = computed(() => getJs);
2025-07-26 21:29:04 +08:00
const dzZwLabel = ref<any>("");
const qtZwLabel = ref<any>("");
2025-06-20 18:38:22 +08:00
// 教师工作信息
const jsWork = ref<any>({
jf: 88,
ks: 40
});
2025-04-22 10:22:33 +08:00
interface GridItem {
id: number | string;
icon: string; // 图标文件名 (不含扩展名)
text: string;
show: boolean; // 是否显示
// 可以添加 permissionKey 等字段
path?: string; // 页面路径
}
interface Section {
id: number | string;
title: string;
items: GridItem[];
}
2025-06-10 16:27:34 +08:00
// 退出登录
const handleLogout = () => {
uni.showModal({
title: "确认退出",
content: "确定要退出登录吗?",
success: (res) => {
if (res.confirm) {
// 清除用户数据
logout();
// 跳转到登录页面
uni.reLaunch({
url: "/pages/system/login/login",
});
}
},
});
};
2025-04-22 10:22:33 +08:00
// 定义功能分区数据
const sections = reactive<Section[]>([
{
id: "routine",
title: "常规",
items: [
2025-06-14 13:09:26 +08:00
// {
// id: 10,
// text: "一师一策",
// icon: "clipboardfill",
// path: "/pages/view/routine/yishiyice/index",
// show: true,
// },
2025-04-22 10:22:33 +08:00
{
id: "r2",
icon: "stack-fill",
text: "教学资源",
show: true,
path: "/pages/view/routine/JiaoXueZiYuan/index",
},
2025-06-14 14:08:44 +08:00
{
id: "r5",
icon: "file-mark-fill",
text: "积分评价",
show: true,
path: "/pages/view/routine/JiFenPingJia/JiFenPingJia",
},
// {
// id: "r3",
// icon: "file-list-3-fil",
// text: "活动资源",
// show: true,
// path: "/pages/view/routine/HuoDongZiYuan/index",
// },
2025-04-22 10:22:33 +08:00
{
id: "r3",
icon: "file-list-3-fil",
2025-06-14 14:08:44 +08:00
text: "工作量",
2025-04-22 10:22:33 +08:00
show: true,
2025-06-14 14:08:44 +08:00
path: "/pages/view/routine/GongZuoLiang/index",
2025-04-22 10:22:33 +08:00
},
2025-07-21 19:49:03 +08:00
2025-06-14 14:08:44 +08:00
// {
// id: "r4",
// icon: "file-paper-2-fill",
// text: "公文流转",
// show: true,
// path: "/pages/view/routine/GongWenLiuZhuan/index",
// },
2025-04-22 10:22:33 +08:00
{
id: "r4",
icon: "file-paper-2-fill",
2025-06-14 14:08:44 +08:00
text: "任教任职",
2025-04-22 10:22:33 +08:00
show: true,
2025-06-14 14:08:44 +08:00
path: "/pages/view/routine/RengJiaoRengZhi/index",
2025-04-22 10:22:33 +08:00
},
2025-07-21 19:49:03 +08:00
{
id: "r9",
icon: "hc-fill",
text: "食堂巡查",
show: true,
path: "/pages/view/routine/ShiTangXunCha/index",
},
2025-04-22 10:22:33 +08:00
{
id: "r6",
icon: "pass-pending-fill",
text: "课服巡查",
show: true,
path: "/pages/view/routine/kefuxuncha/KeFuXunCha",
},
2025-06-20 18:38:22 +08:00
{
id: "r7",
icon: "file-text-fill-2",
2025-07-02 09:11:31 +08:00
text: "课程介绍",
2025-06-20 18:38:22 +08:00
show: true,
path: "/pages/base/groupTeaching/xkList",
},
{
id: "r8",
icon: "draftfill",
text: "选课点名",
show: true,
path: "/pages/base/groupTeaching/dmXkList",
},
2025-07-02 09:11:31 +08:00
{
id: "r8",
icon: "draftfill",
text: "发布接龙",
show: true,
path: "/pages/view/notice/index",
},
2025-07-23 22:32:01 +08:00
{
id: "r10",
icon: "draftfill",
text: "签到发布",
show: true,
path: "/pages/view/routine/qd/index",
},
2025-04-22 10:22:33 +08:00
],
},
{
id: "home-school",
title: "家校",
items: [
{
id: "hs1",
icon: "file-text-fill",
text: "教师课表",
show: true,
path: "/pages/view/homeSchool/JiaoShiKeBiao",
},
{
id: "hs2",
icon: "file-text-fill-2",
text: "班级课表",
show: true,
path: "/pages/view/homeSchool/BanJiKeBiao",
},
{
id: "hs3",
icon: "file-paper-2-fill",
text: "家长通讯录",
show: true,
path: "/pages/view/homeSchool/parentAddressBook/index",
},
2025-07-21 19:49:03 +08:00
/*{
2025-04-22 10:22:33 +08:00
id: "hs4",
icon: "newspaper-fill",
text: "通知列表",
show: true,
path: "/pages/view/notice/index",
2025-07-21 19:49:03 +08:00
},*/
2025-04-22 10:22:33 +08:00
{
id: "hs6",
icon: "filechart2fil",
text: "成绩分析",
show: true,
path: "/pages/view/homeSchool/ChengJiFenXi",
},
],
},
{
id: "hr",
title: "人事",
items: [
{
id: "hr1",
icon: "draftfill",
text: "请假申请",
show: true,
2025-07-25 13:52:59 +08:00
path: "/pages/view/hr/jsQj/index",
2025-04-22 10:22:33 +08:00
},
{
id: "hr2",
icon: "file-user-fill",
text: "教师档案",
show: true,
path: "/pages/view/hr/teacherProfile/index",
},
{
id: "hr3",
icon: "newspaper-fill",
text: "工资条",
show: true,
path: "/pages/view/hr/salarySlip/index",
},
],
},
]);
2025-05-30 17:22:51 +08:00
// 获取分区颜色
const getSectionColor = (index: number) => {
2025-06-10 16:27:34 +08:00
const colors = ["#4F46E5", "#059669", "#DC2626"];
2025-05-30 17:22:51 +08:00
return colors[index % colors.length];
};
// 获取图标背景颜色
const getIconBgColor = (index: number) => {
2025-06-10 16:27:34 +08:00
const colors = [
"rgba(79, 70, 229, 0.1)",
"rgba(5, 150, 105, 0.1)",
"rgba(220, 38, 38, 0.1)",
];
2025-05-30 17:22:51 +08:00
return colors[index % colors.length];
};
2025-04-22 10:22:33 +08:00
// 处理网格项点击事件
2025-06-15 21:08:40 +08:00
const handleGridItemClick = async (item: GridItem) => {
2025-04-22 10:22:33 +08:00
console.log("Clicked item:", item);
2025-06-15 21:08:40 +08:00
if (item.text == "教师档案") {
showLoading("加载中...");
2025-06-20 18:38:22 +08:00
const res = await jsdfindJsByPhoneApi({
phone: getJs.lxdh,
2025-06-15 21:08:40 +08:00
});
2025-06-20 18:38:22 +08:00
if (res.result.headPic && res.result.headPic.length) {
res.result.headPic = imagUrl(res.result.headPic);
}
setJs(res.result);
2025-06-15 21:08:40 +08:00
hideLoading();
2025-04-22 10:22:33 +08:00
}
2025-06-15 21:08:40 +08:00
setTimeout(() => {
if (item.path) {
uni.navigateTo({ url: item.path });
} else {
uni.showToast({ title: `功能 ${item.text} 暂未开放`, icon: "none" });
}
}, 200);
2025-04-22 10:22:33 +08:00
};
2025-07-26 21:29:04 +08:00
// 初始化
onMounted(async () => {
let dzZw: any = [];
let qtZw: any = [];
if (getJs.dzzw && typeof getJs.dzzw == "string") {
dzZw = getJs.dzzw.split(",");
}
if (getJs.qtzw && typeof getJs.qtzw == "string") {
qtZw = getJs.qtzw.split(",");
}
if (dzZw && dzZw.length){
const res = await getZwListByLx({ zwlx: '党政职务' });
dzZwLabel.value = dzZw.map((zwId: string) => {
const zw = res.result.find((zw: any) => zwId == zw.id);
return zw ? zw.zwmc : '';
}).join(', ');
};
if (qtZw && qtZw.length){
const res = await getZwListByLx({ zwlx: '其他职务' });
qtZwLabel.value = qtZw.map((zwId: string) => {
const zw = res.result.find((zw: any) => zwId == zw.id);
return zw ? zw.zwmc : '';
}).join(', ');
};
})
2025-04-22 10:22:33 +08:00
</script>
<style scoped lang="scss">
.service-page {
2025-05-30 17:22:51 +08:00
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
2025-04-22 10:22:33 +08:00
min-height: 100vh;
2025-05-30 17:22:51 +08:00
position: relative;
2025-04-22 10:22:33 +08:00
}
// 顶部 Header
.header-section {
2025-05-30 17:22:51 +08:00
position: relative;
2025-06-10 16:27:34 +08:00
background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 50%, #ec4899 100%);
2025-04-22 10:22:33 +08:00
color: #ffffff;
2025-05-30 17:22:51 +08:00
overflow: hidden;
2025-06-10 16:27:34 +08:00
padding: 40rpx 30rpx 30rpx;
height: auto;
min-height: 320rpx;
2025-05-30 17:22:51 +08:00
.header-gradient {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
2025-06-10 16:27:34 +08:00
background: linear-gradient(
45deg,
rgba(255, 255, 255, 0.1) 0%,
rgba(255, 255, 255, 0.05) 100%
);
2025-05-30 17:22:51 +08:00
z-index: 1;
}
2025-04-22 10:22:33 +08:00
2025-06-10 16:27:34 +08:00
// 退出按钮
.logout-btn {
2025-05-30 17:22:51 +08:00
position: absolute;
2025-06-10 16:27:34 +08:00
top: 40rpx;
right: 30rpx;
z-index: 3;
background: rgba(255, 255, 255, 0.2);
border-radius: 20rpx;
padding: 10rpx 20rpx;
border: 1px solid rgba(255, 255, 255, 0.3);
backdrop-filter: blur(10px);
.logout-text {
color: #ffffff;
font-size: 14px;
font-weight: 500;
}
2025-05-30 17:22:51 +08:00
}
2025-06-10 16:27:34 +08:00
// 老师信息
.teacher-info {
display: flex;
align-items: center;
margin-top: 20rpx;
2025-05-30 17:22:51 +08:00
z-index: 2;
2025-06-10 16:27:34 +08:00
position: relative;
2025-05-30 17:22:51 +08:00
2025-06-10 16:27:34 +08:00
.teacher-avatar {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
overflow: hidden;
border: 3px solid rgba(255, 255, 255, 0.3);
margin-right: 20rpx;
.avatar-image {
width: 100%;
height: 100%;
}
2025-05-30 17:22:51 +08:00
}
2025-06-10 16:27:34 +08:00
.teacher-details {
flex: 1;
.teacher-name {
font-size: 20px;
font-weight: bold;
color: #ffffff;
margin-bottom: 5rpx;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
.teacher-position {
font-size: 14px;
color: rgba(255, 255, 255, 0.9);
margin-bottom: 5rpx;
}
.teacher-class {
font-size: 12px;
color: rgba(255, 255, 255, 0.8);
}
2025-05-30 17:22:51 +08:00
}
2025-04-22 10:22:33 +08:00
}
2025-06-10 16:27:34 +08:00
// 统计信息
.stats-info {
display: flex;
align-items: center;
justify-content: center;
margin-top: 20rpx;
z-index: 2;
position: relative;
.stat-item {
display: flex;
align-items: center;
.stat-label {
font-size: 14px;
color: rgba(255, 255, 255, 0.9);
}
.stat-value {
font-size: 14px;
color: #ffffff;
font-weight: 600;
}
}
.stat-divider {
margin: 0 30rpx;
color: rgba(255, 255, 255, 0.6);
font-size: 14px;
}
}
// 介绍文字
.teacher-intro {
text-align: center;
font-size: 12px;
color: rgba(255, 255, 255, 0.8);
margin-top: 20rpx;
line-height: 1.4;
z-index: 2;
position: relative;
}
2025-04-22 10:22:33 +08:00
}
// 主要内容区域
.main-content {
2025-05-30 17:22:51 +08:00
padding: 20px 15px 40px 15px;
2025-04-22 10:22:33 +08:00
position: relative;
2025-06-10 16:27:34 +08:00
background: linear-gradient(
to bottom,
rgba(255, 255, 255, 0.95) 0%,
rgba(248, 250, 252, 0.98) 100%
);
2025-05-30 17:22:51 +08:00
border-radius: 20px 20px 0 0;
margin-top: -20px;
z-index: 3;
2025-06-10 16:27:34 +08:00
box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.1);
2025-04-22 10:22:33 +08:00
}
// 功能分区块
.section-block {
2025-05-30 17:22:51 +08:00
margin-bottom: 25px;
animation: fadeInUp 0.6s ease-out;
2025-06-10 16:27:34 +08:00
&:nth-child(1) {
animation-delay: 0.1s;
}
&:nth-child(2) {
animation-delay: 0.2s;
}
&:nth-child(3) {
animation-delay: 0.3s;
}
2025-04-22 10:22:33 +08:00
.section-title {
display: flex;
align-items: center;
2025-05-30 17:22:51 +08:00
margin-bottom: 15px;
padding-left: 5px;
position: relative;
2025-04-22 10:22:33 +08:00
.title-decorator {
2025-05-30 17:22:51 +08:00
width: 8px;
height: 8px;
2025-04-22 10:22:33 +08:00
border-radius: 50%;
2025-05-30 17:22:51 +08:00
margin-right: 12px;
2025-06-10 16:27:34 +08:00
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
2025-04-22 10:22:33 +08:00
}
text {
2025-05-30 17:22:51 +08:00
font-size: 20px;
font-weight: 600;
color: #1f2937;
letter-spacing: 0.5px;
}
.title-line {
flex: 1;
height: 1px;
2025-06-10 16:27:34 +08:00
background: linear-gradient(
to right,
rgba(156, 163, 175, 0.3),
transparent
);
2025-05-30 17:22:51 +08:00
margin-left: 15px;
2025-04-22 10:22:33 +08:00
}
}
.section-grid-card {
2025-05-30 17:22:51 +08:00
background: #ffffff;
border-radius: 16px;
padding: 20px 15px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
2025-06-10 16:27:34 +08:00
border: 1px solid rgba(255, 255, 255, 0.8);
2025-05-30 17:22:51 +08:00
backdrop-filter: blur(10px);
2025-04-22 10:22:33 +08:00
display: grid;
2025-05-30 17:22:51 +08:00
grid-template-columns: repeat(3, 1fr);
gap: 20px 15px;
transition: all 0.3s ease;
&:hover {
transform: translateY(-2px);
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);
}
2025-04-22 10:22:33 +08:00
}
}
// 网格项
.grid-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
2025-05-30 17:22:51 +08:00
cursor: pointer;
padding: 10px 5px;
border-radius: 12px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
&:hover {
transform: translateY(-3px) scale(1.05);
background: rgba(79, 70, 229, 0.05);
}
2025-04-22 10:22:33 +08:00
2025-05-30 17:22:51 +08:00
&:active {
transform: translateY(-1px) scale(1.02);
}
.grid-icon-container {
width: 48px;
height: 48px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
2025-04-22 10:22:33 +08:00
margin-bottom: 8px;
2025-05-30 17:22:51 +08:00
transition: all 0.3s ease;
2025-06-10 16:27:34 +08:00
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
2025-05-30 17:22:51 +08:00
.grid-icon {
width: 24px;
height: 24px;
transition: all 0.3s ease;
}
2025-04-22 10:22:33 +08:00
}
.grid-text {
2025-05-30 17:22:51 +08:00
font-size: 14px;
color: #4b5563;
font-weight: 500;
2025-04-22 10:22:33 +08:00
line-height: 1.3;
2025-05-30 17:22:51 +08:00
transition: color 0.3s ease;
}
&:hover .grid-text {
color: #1f2937;
}
&:hover .grid-icon-container {
transform: scale(1.1);
2025-06-10 16:27:34 +08:00
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.15);
2025-05-30 17:22:51 +08:00
}
}
// 动画定义
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
// 响应式优化
@media (max-width: 375px) {
.section-grid-card {
gap: 15px 8px;
padding: 15px 10px;
}
2025-06-10 16:27:34 +08:00
2025-05-30 17:22:51 +08:00
.grid-item {
padding: 8px 3px;
}
2025-06-10 16:27:34 +08:00
2025-05-30 17:22:51 +08:00
.grid-icon-container {
width: 42px;
height: 42px;
2025-06-10 16:27:34 +08:00
2025-05-30 17:22:51 +08:00
.grid-icon {
width: 20px;
height: 20px;
}
2025-04-22 10:22:33 +08:00
}
}
</style>