Browse Source

Merge branch 'master' of http://gitlab.frkj.cc/php/zhjwxt

# Conflicts:
#	uniapp/pages-market/clue/add_clues.vue
master
于宏哲PHP 7 months ago
parent
commit
5000aa31e8
  1. BIN
      doc/副本课程协议—月卡篮球(1).docx
  2. 14
      niucloud/app/api/controller/apiController/Contract.php
  3. 27
      niucloud/app/common.php
  4. 1388
      niucloud/app/service/admin/document/DocumentTemplateService.php
  5. 36
      niucloud/app/service/api/apiService/ContractSignFormService.php
  6. 541
      uniapp/pages-coach/coach/schedule/schedule_table.vue
  7. 12
      uniapp/pages/common/home/index.vue

BIN
doc/副本课程协议—月卡篮球(1).docx

Binary file not shown.

14
niucloud/app/api/controller/apiController/Contract.php

@ -488,15 +488,23 @@ class Contract extends BaseApiService
$fillData[$placeholder] = $defaultValue; $fillData[$placeholder] = $defaultValue;
} }
// 调用DocumentTemplateService生成Word文档 // 调试信息:记录填充数据
Log::info('准备的填充数据', [
'contract_sign_id' => $contract_sign_id,
'fill_data_count' => count($fillData),
'fill_data' => $fillData
]);
// 调用DocumentTemplateService的新XML字符串方法生成Word文档
$documentService = new \app\service\admin\document\DocumentTemplateService(); $documentService = new \app\service\admin\document\DocumentTemplateService();
$generateData = [ $generateData = [
'template_id' => $contractSign['contract_id'], 'template_id' => $contractSign['contract_id'],
'fill_data' => $fillData, 'fill_data' => $fillData,
'output_filename' => $contract['contract_name'] . '_' . $contractSign['student_id'] . '_' . date('YmdHis') . '.docx' 'output_filename' => $contract['contract_name'] . '_' . $contractSign['student_id'] . '_' . date('YmdHis') . '.docx',
'use_direct_values' => true // 直接使用已处理的值,不进行二次处理
]; ];
$result = $documentService->generateDocument($generateData); $result = $documentService->generateDocumentByXmlString($generateData);
// 更新school_contract_sign表的sign_file字段和status字段 // 更新school_contract_sign表的sign_file字段和status字段
$updateResult = Db::table('school_contract_sign') $updateResult = Db::table('school_contract_sign')

27
niucloud/app/common.php

@ -1672,6 +1672,33 @@ function get_current_week()
return date('W'); return date('W');
} }
/**
* 获取当前年份(别名函数,兼容配置中的函数名)
* @return string
*/
function current_year()
{
return get_current_year();
}
/**
* 获取当前月份(别名函数,兼容配置中的函数名)
* @return string
*/
function current_month()
{
return get_current_month();
}
/**
* 获取当前日(别名函数,兼容配置中的函数名)
* @return string
*/
function current_day()
{
return get_current_day();
}
/** /**
* 获取当前季度 * 获取当前季度
* @return string * @return string

1388
niucloud/app/service/admin/document/DocumentTemplateService.php

File diff suppressed because it is too large

36
niucloud/app/service/api/apiService/ContractSignFormService.php

@ -636,14 +636,43 @@ class ContractSignFormService extends BaseApiService
private function getSignSpecificFormFields($contract_sign_id, $student) private function getSignSpecificFormFields($contract_sign_id, $student)
{ {
try { try {
// 从document_data_source_config表获取该签署关系专属的字段配置 // 先获取签署记录以得到合同ID
$sign_record = Db::table('school_contract_sign')
->where('id', $contract_sign_id)
->find();
if (!$sign_record) {
Log::error('签署记录不存在', ['contract_sign_id' => $contract_sign_id]);
return [];
}
$contract_id = $sign_record['contract_id'];
// 优先获取该签署关系专属的字段配置
$configs = Db::table('school_document_data_source_config') $configs = Db::table('school_document_data_source_config')
->where('contract_sign_id', $contract_sign_id) ->where('contract_sign_id', $contract_sign_id)
->select() ->select()
->toArray(); ->toArray();
// 如果该签署记录没有专属配置,则获取合同模板的基础配置
if (empty($configs)) { if (empty($configs)) {
Log::warning('该签署记录无字段配置', ['contract_sign_id' => $contract_sign_id]); Log::info('该签署记录无专属配置,使用合同模板基础配置', [
'contract_sign_id' => $contract_sign_id,
'contract_id' => $contract_id
]);
$configs = Db::table('school_document_data_source_config')
->where('contract_id', $contract_id)
->whereNull('contract_sign_id')
->select()
->toArray();
}
if (empty($configs)) {
Log::warning('该合同无字段配置', [
'contract_sign_id' => $contract_sign_id,
'contract_id' => $contract_id
]);
return []; return [];
} }
@ -736,8 +765,9 @@ class ContractSignFormService extends BaseApiService
switch ($table_name) { switch ($table_name) {
case 'school_student': case 'school_student':
case 'students': // 兼容配置中的简化表名
// 学员表:使用CoreFieldMappingService进行字段映射和转义 // 学员表:使用CoreFieldMappingService进行字段映射和转义
$service = new CoreFieldMappingService($config['table_name'], ['id' => $student['id']]); $service = new CoreFieldMappingService('school_student', ['id' => $student['id']]);
// 配置枚举映射 // 配置枚举映射
$service->setFieldEnums([ $service->setFieldEnums([

541
uniapp/pages-coach/coach/schedule/schedule_table.vue

@ -56,111 +56,45 @@
<!-- 课程表主体 --> <!-- 课程表主体 -->
<view class="schedule-main"> <view class="schedule-main">
<!-- 左侧冻结列 --> <!-- 统一滚动区域 -->
<view class="frozen-column"> <scroll-view
<!-- 左上角标题 --> class="schedule-scroll"
<view class="time-header-cell"> scroll-x
<template v-if="activeFilter === 'time' || activeFilter === ''">时间</template> scroll-y
<template v-else-if="activeFilter === 'teacher'">教练</template> :style="{ height: scrollViewHeight + 'px' }"
<template v-else-if="activeFilter === 'classroom'">教室</template> :enable-flex="true"
<template v-else-if="activeFilter === 'class'">班级</template> :enhanced="isH5"
</view> :scroll-anchoring="false"
:bounces="false"
<!-- 左侧冻结内容 --> :scroll-with-animation="false"
<scroll-view :show-scrollbar="false"
class="frozen-content-scroll" @scroll="onScroll"
scroll-y >
:scroll-top="scrollTop" <view class="schedule-container-inner" :style="{ width: (tableWidth + 120) + 'rpx', minWidth: '1380rpx' }">
:enable-flex="true" <!-- 表头行 -->
:scroll-anchoring="false" <view class="schedule-header-row">
:enhanced="true" <!-- 左上角标题 -->
:bounces="false" <view class="time-header-cell">
:scroll-with-animation="false" <template v-if="activeFilter === 'time' || activeFilter === ''">时间</template>
> <template v-else-if="activeFilter === 'teacher'">教练</template>
<view class="frozen-content"> <template v-else-if="activeFilter === 'classroom'">教室</template>
<!-- 时间模式 --> <template v-else-if="activeFilter === 'class'">班级</template>
<template v-if="activeFilter === 'time' || activeFilter === ''">
<view
:class="['frozen-cell', !timeSlot.available ? 'time-unavailable' : '']"
v-for="(timeSlot, timeIndex) in timeSlots"
:key="timeIndex"
:ref="`frozenCell_${timeIndex}`"
>
{{ timeSlot.time }}
</view>
</template>
<!-- 教练模式 -->
<template v-else-if="activeFilter === 'teacher'">
<view
class="frozen-cell"
v-for="(teacher, index) in teacherOptions"
:key="teacher.id"
:ref="`frozenCell_${index}`"
>
{{ teacher.name }}
</view>
</template>
<!-- 教室模式 -->
<template v-else-if="activeFilter === 'classroom'">
<view
class="frozen-cell"
v-for="(venue, index) in venues"
:key="venue.id"
:ref="`frozenCell_${index}`"
>
{{ venue.name }}
</view>
</template>
<!-- 班级模式 -->
<template v-else-if="activeFilter === 'class'">
<view
class="frozen-cell"
v-for="(cls, index) in classOptions"
:key="cls.id"
:ref="`frozenCell_${index}`"
>
{{ cls.name }}
</view>
</template>
</view>
</scroll-view>
</view>
<!-- 右侧内容区域 -->
<view class="schedule-content-area">
<!-- 合并的滚动区域表头+内容 -->
<scroll-view
class="schedule-scroll"
scroll-x
scroll-y
:scroll-top="scrollTop"
:enable-flex="true"
:scroll-anchoring="false"
:enhanced="true"
:bounces="false"
:scroll-with-animation="false"
@scroll="onScroll"
>
<view class="schedule-container-inner" :style="{ width: tableWidth + 'rpx', minWidth: '1260rpx' }">
<!-- 表头 -->
<view class="date-header-container">
<!-- 日期列 -->
<view
class="date-header-cell"
v-for="(date, index) in weekDates"
:key="index"
>
<view class="date-week">{{ date.weekName }}</view>
<view class="date-day">{{ date.dateStr }}</view>
<view class="date-courses">{{ date.courseCount }}节课</view>
</view>
</view> </view>
<!-- 内容网格 --> <!-- 日期列 -->
<view class="schedule-grid"> <view
class="date-header-cell"
v-for="(date, index) in weekDates"
:key="index"
>
<view class="date-week">{{ date.weekName }}</view>
<view class="date-day">{{ date.dateStr }}</view>
<view class="date-courses">{{ date.courseCount }}节课</view>
</view>
</view>
<!-- 内容网格 -->
<view class="schedule-grid">
<!-- 时间模式内容 --> <!-- 时间模式内容 -->
<template v-if="activeFilter === 'time' || activeFilter === ''"> <template v-if="activeFilter === 'time' || activeFilter === ''">
<view <view
@ -169,6 +103,12 @@
:key="timeIndex" :key="timeIndex"
:ref="`scheduleRow_${timeIndex}`" :ref="`scheduleRow_${timeIndex}`"
> >
<!-- 左侧时间列 -->
<view :class="['left-column-cell', !timeSlot.available ? 'time-unavailable' : '']">
{{ timeSlot.time }}
</view>
<!-- 课程单元格 -->
<view <view
:class="['course-cell',!timeSlot.available ? 'cell-unavailable' : '']" :class="['course-cell',!timeSlot.available ? 'cell-unavailable' : '']"
v-for="(date, dateIndex) in weekDates" v-for="(date, dateIndex) in weekDates"
@ -234,6 +174,12 @@
:key="teacher.id" :key="teacher.id"
:ref="`scheduleRow_${teacherIndex}`" :ref="`scheduleRow_${teacherIndex}`"
> >
<!-- 左侧教练列 -->
<view class="left-column-cell">
{{ teacher.name }}
</view>
<!-- 课程单元格 -->
<view <view
class="course-cell" class="course-cell"
v-for="(date, dateIndex) in weekDates" v-for="(date, dateIndex) in weekDates"
@ -299,6 +245,12 @@
:key="venue.id" :key="venue.id"
:ref="`scheduleRow_${venueIndex}`" :ref="`scheduleRow_${venueIndex}`"
> >
<!-- 左侧教室列 -->
<view class="left-column-cell">
{{ venue.name }}
</view>
<!-- 课程单元格 -->
<view <view
class="course-cell" class="course-cell"
v-for="(date, dateIndex) in weekDates" v-for="(date, dateIndex) in weekDates"
@ -364,6 +316,12 @@
:key="cls.id" :key="cls.id"
:ref="`scheduleRow_${clsIndex}`" :ref="`scheduleRow_${clsIndex}`"
> >
<!-- 左侧班级列 -->
<view class="left-column-cell">
{{ cls.name }}
</view>
<!-- 课程单元格 -->
<view <view
class="course-cell" class="course-cell"
v-for="(date, dateIndex) in weekDates" v-for="(date, dateIndex) in weekDates"
@ -420,10 +378,9 @@
</view> </view>
</view> </view>
</template> </template>
</view>
</view> </view>
</scroll-view> </view>
</view> </scroll-view>
</view> </view>
<!-- 筛选弹窗 --> <!-- 筛选弹窗 -->
@ -554,11 +511,10 @@ export default {
selectedClasses: [], selectedClasses: [],
// //
scrollTop: 0,
scrollTimer: null, // scrollTimer: null, //
// // -
tableWidth: 1500, // 7 (7*180+120=1380rpx) tableWidth: 1260, // 7 (7*180=1260rpx)120rpx
// //
timeSlots: [], timeSlots: [],
@ -591,6 +547,12 @@ export default {
selectedScheduleId: null, selectedScheduleId: null,
showScheduleDetail: false, showScheduleDetail: false,
//
isH5: false,
//
scrollViewHeight: 0,
// //
filterParams: { filterParams: {
start_date: '', start_date: '',
@ -644,12 +606,20 @@ export default {
}, },
mounted() { mounted() {
//
// #ifdef H5
this.isH5 = true
// #endif
this.initCurrentWeek() this.initCurrentWeek()
this.initTimeSlots() this.initTimeSlots()
// //
this.handleResize() this.handleResize()
// scroll-view
this.calculateScrollViewHeight()
// //
this.loadFilterOptions().then(() => { this.loadFilterOptions().then(() => {
this.loadScheduleList() this.loadScheduleList()
@ -679,6 +649,72 @@ export default {
}, },
methods: { methods: {
// - HH:mm
normalizeTime(timeStr) {
if (!timeStr) return '';
//
const cleanTime = String(timeStr).trim();
// HH:mm
if (/^\d{2}:\d{2}$/.test(cleanTime)) {
return cleanTime;
}
// H:mm
if (/^\d{1}:\d{2}$/.test(cleanTime)) {
return '0' + cleanTime;
}
// HH:m
if (/^\d{2}:\d{1}$/.test(cleanTime)) {
return cleanTime.slice(0, 3) + '0' + cleanTime.slice(3);
}
// H:m
if (/^\d{1}:\d{1}$/.test(cleanTime)) {
const [hour, minute] = cleanTime.split(':');
return `0${hour}:0${minute}`;
}
//
try {
const [hour, minute] = cleanTime.split(':');
const h = parseInt(hour).toString().padStart(2, '0');
const m = parseInt(minute || 0).toString().padStart(2, '0');
return `${h}:${m}`;
} catch (e) {
console.warn('时间格式解析失败:', timeStr);
return cleanTime;
}
},
// -
isTimeInSlot(courseTime, slotTime) {
const normalizedCourseTime = this.normalizeTime(courseTime);
const normalizedSlotTime = this.normalizeTime(slotTime);
if (!normalizedCourseTime || !normalizedSlotTime) return false;
//
if (normalizedCourseTime === normalizedSlotTime) return true;
// -
const slotIndex = this.timeSlots.findIndex(slot =>
this.normalizeTime(slot.time) === normalizedSlotTime
);
if (slotIndex >= 0 && slotIndex < this.timeSlots.length - 1) {
const currentSlotTime = this.normalizeTime(this.timeSlots[slotIndex].time);
const nextSlotTime = this.normalizeTime(this.timeSlots[slotIndex + 1].time);
//
return normalizedCourseTime >= currentSlotTime && normalizedCourseTime < nextSlotTime;
}
return false;
},
// //
initCurrentWeek() { initCurrentWeek() {
const today = new Date() const today = new Date()
@ -857,8 +893,8 @@ export default {
getCoursesByTimeAndDate(time, date) { getCoursesByTimeAndDate(time, date) {
const matchedCourses = this.courses.filter(course => { const matchedCourses = this.courses.filter(course => {
if (course.date !== date) return false if (course.date !== date) return false
// // 使
return course.time === time return this.isTimeInSlot(course.time, time)
}) })
return matchedCourses return matchedCourses
}, },
@ -933,8 +969,7 @@ export default {
this.filterParams.venue_id = ''; this.filterParams.venue_id = '';
this.filterParams.class_id = ''; this.filterParams.class_id = '';
// //
this.scrollTop = 0;
// //
this.loadScheduleList(); this.loadScheduleList();
@ -956,9 +991,8 @@ export default {
this.applyFilters() this.applyFilters()
this.closeFilterModal() this.closeFilterModal()
// //
await this.loadScheduleList() await this.loadScheduleList()
this.scrollTop = 0
// //
if (this.selectedTimeRange !== '' || this.selectedVenueId !== null) { if (this.selectedTimeRange !== '' || this.selectedVenueId !== null) {
@ -1146,34 +1180,35 @@ export default {
if (res.code === 1) { if (res.code === 1) {
// //
this.courses = res.data.list.map(item => ({ this.courses = res.data.list.map(item => {
id: item.id, //
date: item.course_date, const rawTime = item.time_info?.start_time || item.time_slot?.split('-')[0] || '';
time: item.time_info?.start_time || item.time_slot?.split('-')[0], const normalizedTime = this.normalizeTime(rawTime);
courseName: item.course_name || '未命名课程',
students: `已报名${item.enrolled_count || 0}`, return {
teacher: item.coach_name || '待分配', id: item.id,
teacher_id: item.coach_id, // ID date: item.course_date,
status: item.status_text || '待定', time: normalizedTime, // 使
type: this.getCourseType(item), courseName: item.course_name || '未命名课程',
venue: item.venue_name || '待分配', students: `已报名${item.enrolled_count || 0}`,
venue_id: item.venue_id, // ID teacher: item.coach_name || '待分配',
campus_name: item.campus_name || '', // teacher_id: item.coach_id, // ID
class_id: item.class_id, // ID status: item.status_text || '待定',
class_name: item.class_name || '', // type: this.getCourseType(item),
duration: item.time_info?.duration || 60, venue: item.venue_name || '待分配',
time_slot: item.time_slot, venue_id: item.venue_id, // ID
raw: item, // campus_name: item.campus_name || '', //
})) class_id: item.class_id, // ID
class_name: item.class_name || '', //
duration: item.time_info?.duration || 60,
time_slot: item.time_slot,
raw: item, //
}
})
// //
this.updateLeftColumnData(); this.updateLeftColumnData();
//
this.$nextTick(() => {
this.syncRowHeights();
});
} else { } else {
uni.showToast({ uni.showToast({
title: res.msg || '加载课程安排列表失败', title: res.msg || '加载课程安排列表失败',
@ -1266,61 +1301,18 @@ export default {
}, },
// // -
syncRowHeights() {
this.$nextTick(() => {
try {
let itemCount = 0;
//
if (this.activeFilter === 'time' || this.activeFilter === '') {
itemCount = this.timeSlots.length;
} else if (this.activeFilter === 'teacher') {
itemCount = this.teacherOptions.length;
} else if (this.activeFilter === 'classroom') {
itemCount = this.venues.length;
} else if (this.activeFilter === 'class') {
itemCount = this.classOptions.length;
}
//
for (let i = 0; i < itemCount; i++) {
const scheduleRow = this.$refs[`scheduleRow_${i}`];
const frozenCell = this.$refs[`frozenCell_${i}`];
if (scheduleRow && scheduleRow[0] && frozenCell && frozenCell[0]) {
//
const rightRowHeight = scheduleRow[0].$el ?
scheduleRow[0].$el.offsetHeight :
scheduleRow[0].offsetHeight;
//
if (frozenCell[0].$el) {
frozenCell[0].$el.style.minHeight = rightRowHeight + 'px';
} else if (frozenCell[0].style) {
frozenCell[0].style.minHeight = rightRowHeight + 'px';
}
}
}
} catch (error) {
console.warn('高度同步失败:', error);
}
});
},
// -
onScroll(e) { onScroll(e) {
// 使 //
//
if (this.scrollTimer) { if (this.scrollTimer) {
clearTimeout(this.scrollTimer) clearTimeout(this.scrollTimer)
} }
this.scrollTimer = setTimeout(() => { this.scrollTimer = setTimeout(() => {
// //
if (e.detail.scrollTop !== undefined && e.detail.scrollTop !== this.scrollTop) { // /
this.scrollTop = e.detail.scrollTop }, 16)
}
}, 16) // 60fps
}, },
// //
@ -1523,6 +1515,36 @@ export default {
// API // API
}, },
// scroll-view
calculateScrollViewHeight() {
uni.getSystemInfo({
success: (res) => {
//
let screenHeight = res.screenHeight || res.windowHeight
//
// + + +
let otherHeight = 0
// #ifdef H5
otherHeight = 200 // H5200px
// #endif
// #ifdef MP-WEIXIN
otherHeight = 160 // 160px (rpx)
// #endif
// scroll-view
this.scrollViewHeight = screenHeight - otherHeight
//
if (this.scrollViewHeight < 300) {
this.scrollViewHeight = 300
}
}
})
},
// //
handleResize() { handleResize() {
// //
@ -1545,12 +1567,15 @@ export default {
// #endif // #endif
if (width <= 375) { if (width <= 375) {
this.tableWidth = 1220 // 7*160+100=1220rpx this.tableWidth = 1120 // 7*160=1120rpx (160rpx)
} else if (width <= 768) { } else if (width <= 768) {
this.tableWidth = 1400 this.tableWidth = 1260 // 7*180=1260rpx
} else { } else {
this.tableWidth = 1500 this.tableWidth = 1260 // 7*180=1260rpx
} }
// scroll-view
this.calculateScrollViewHeight()
}, },
// //
@ -1666,24 +1691,32 @@ export default {
.schedule-main { .schedule-main {
flex: 1; flex: 1;
position: relative; position: relative;
display: flex;
overflow: hidden; overflow: hidden;
height: 0; /* 配合flex: 1 确保高度计算正确 */
} }
// //
.frozen-column { .schedule-container-inner {
width: 120rpx;
position: relative;
z-index: 3;
background-color: #292929;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
box-shadow: 4rpx 0 8rpx rgba(0, 0, 0, 0.1); min-width: 1380rpx; /* 左列120rpx + 7天 * 180rpx = 1380rpx */
flex-shrink: 0; }
//
.schedule-header-row {
display: flex;
background: #434544;
border-bottom: 2px solid #29d3b4;
position: sticky;
top: 0;
z-index: 10;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.3);
} }
//
.time-header-cell { .time-header-cell {
width: 120rpx; width: 120rpx;
min-width: 120rpx;
min-height: 120rpx; min-height: 120rpx;
padding: 20rpx 10rpx; padding: 20rpx 10rpx;
color: #29d3b4; color: #29d3b4;
@ -1691,75 +1724,13 @@ export default {
font-weight: 500; font-weight: 500;
text-align: center; text-align: center;
border-right: 1px solid #555; border-right: 1px solid #555;
border-bottom: 2px solid #29d3b4;
background-color: #434544; background-color: #434544;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
word-wrap: break-word; word-wrap: break-word;
overflow-wrap: break-word; overflow-wrap: break-word;
} flex-shrink: 0;
.frozen-content-scroll {
flex: 1;
overflow: hidden;
/* 优化滚动性能 */
-webkit-overflow-scrolling: touch;
scroll-behavior: auto;
overscroll-behavior: none;
}
.frozen-content {
width: 100%;
}
.frozen-cell {
width: 120rpx;
min-height: 120rpx;
padding: 20rpx 10rpx;
color: #999;
font-size: 24rpx;
text-align: center;
border-right: 1px solid #434544;
border-bottom: 1px solid #434544;
background: #3a3a3a;
display: flex;
align-items: center;
justify-content: center;
word-wrap: break-word;
overflow-wrap: break-word;
&.time-unavailable {
background: #2a2a2a;
color: #555;
opacity: 0.5;
}
}
//
.schedule-content-area {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
}
//
.schedule-container-inner {
display: flex;
flex-direction: column;
min-width: 1260rpx; /* 7天 * 180rpx = 1260rpx */
}
.date-header-container {
display: flex;
background: #434544;
border-bottom: 2px solid #29d3b4;
position: sticky;
top: 0;
z-index: 10;
/* 确保完全覆盖下方内容 */
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.3);
} }
.date-header-cell { .date-header-cell {
@ -1796,16 +1767,23 @@ export default {
// //
.schedule-scroll { .schedule-scroll {
flex: 1; flex: 1;
overflow: scroll; height: 100%;
width: 100%;
min-height: 0; /* 关键:允许flex子项收缩 */
/* 优化滚动性能 */ /* 优化滚动性能 */
-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling: touch;
scroll-behavior: auto; scroll-behavior: auto;
overscroll-behavior: none; overscroll-behavior: none;
/* 小程序端专用优化 */
// #ifdef MP-WEIXIN
scroll-behavior: smooth;
// #endif
} }
.schedule-grid { .schedule-grid {
width: 100%; width: 100%;
min-width: 1260rpx; /* 7天 * 180rpx = 1260rpx */ min-width: 1380rpx; /* 左列120rpx + 7天 * 180rpx = 1380rpx */
} }
// //
@ -1815,6 +1793,32 @@ export default {
border-bottom: 1px solid #434544; border-bottom: 1px solid #434544;
} }
// (///)
.left-column-cell {
width: 120rpx;
min-width: 120rpx;
min-height: 120rpx;
padding: 20rpx 10rpx;
color: #999;
font-size: 24rpx;
text-align: center;
border-right: 1px solid #434544;
border-bottom: 1px solid #434544;
background: #3a3a3a;
display: flex;
align-items: center;
justify-content: center;
word-wrap: break-word;
overflow-wrap: break-word;
flex-shrink: 0;
&.time-unavailable {
background: #2a2a2a;
color: #555;
opacity: 0.5;
}
}
.course-cell { .course-cell {
width: 180rpx; width: 180rpx;
min-width: 180rpx; min-width: 180rpx;
@ -1849,12 +1853,15 @@ export default {
// //
@media screen and (max-width: 375px) { @media screen and (max-width: 375px) {
.time-column-fixed { .left-column-cell {
width: 100rpx; width: 100rpx;
min-width: 100rpx;
font-size: 22rpx;
} }
.time-header-cell, .time-cell { .time-header-cell {
width: 100rpx; width: 100rpx;
min-width: 100rpx;
font-size: 22rpx; font-size: 22rpx;
} }

12
uniapp/pages/common/home/index.vue

@ -106,12 +106,12 @@
path: '/pages/common/dashboard/webview', path: '/pages/common/dashboard/webview',
params: { type: 'campus_data' } params: { type: 'campus_data' }
}, },
{ // {
title: '报销管理', // title: '',
icon: 'wallet-filled', // icon: 'wallet-filled',
path: '/pages-market/reimbursement/list', // path: '/pages-market/reimbursement/list',
params: { type: 'reimbursement' } // params: { type: 'reimbursement' }
} // }
] ]
} }
}, },

Loading…
Cancel
Save