diff --git a/niucloud/app/api/controller/apiController/Contract.php b/niucloud/app/api/controller/apiController/Contract.php index 5538a8de..b84c848d 100644 --- a/niucloud/app/api/controller/apiController/Contract.php +++ b/niucloud/app/api/controller/apiController/Contract.php @@ -107,7 +107,6 @@ class Contract extends BaseApiService 'personnel_id' => $this->member_id, 'sign_file' => $sign_file ]; - try { $service = new ContractService(); $res = $service->signContract($data); diff --git a/niucloud/app/api/controller/apiController/CourseSchedule.php b/niucloud/app/api/controller/apiController/CourseSchedule.php new file mode 100644 index 00000000..db4a4fad --- /dev/null +++ b/niucloud/app/api/controller/apiController/CourseSchedule.php @@ -0,0 +1,216 @@ +all(); + return success((new CourseScheduleService())->getScheduleList($data)); + } + + /** + * 获取课程安排详情 + * @param Request $request + * @return \think\Response + */ + public function getScheduleInfo(Request $request) + { + $data = $this->request->params([ + ["id", 0] + ]); + $result = (new CourseScheduleService())->getScheduleInfo($data['id']); + if (isset($result['code']) && $result['code'] === 0) { + return fail($result['msg']); + } + return success('SUCCESS', $result); + } + + /** + * 创建课程安排 + * @param Request $request + * @return \think\Response + */ + public function createSchedule(Request $request) + { + $data = $request->all(); + $result = (new CourseScheduleService())->createSchedule($data); + if (!$result['code']) { + return fail($result['msg']); + } + return success($result['msg'] ?? '创建成功', $result['data'] ?? []); + } + + /** + * 批量创建课程安排 + * @param Request $request + * @return \think\Response + */ + public function batchCreateSchedule(Request $request) + { + $data = $request->all(); + $result = (new CourseScheduleService())->batchCreateSchedule($data); + if (!$result['code']) { + return fail($result['msg']); + } + return success($result['msg'] ?? '批量创建成功', $result['data'] ?? []); + } + + /** + * 更新课程安排 + * @param Request $request + * @return \think\Response + */ + public function updateSchedule(Request $request) + { + $data = $request->all(); + $result = (new CourseScheduleService())->updateSchedule($data); + if (!$result['code']) { + return fail($result['msg']); + } + return success($result['msg'] ?? '更新成功', $result['data'] ?? []); + } + + /** + * 删除课程安排 + * @param Request $request + * @return \think\Response + */ + public function deleteSchedule(Request $request) + { + $data = $this->request->params([ + ["id", 0] + ]); + $result = (new CourseScheduleService())->deleteSchedule($data['id']); + if (!$result['code']) { + return fail($result['msg']); + } + return success($result['msg'] ?? '删除成功'); + } + + /** + * 获取场地列表 + * @param Request $request + * @return \think\Response + */ + public function getVenueList(Request $request) + { + $data = $request->all(); + return success((new CourseScheduleService())->getVenueList($data)); + } + + /** + * 获取场地可用时间 + * @param Request $request + * @return \think\Response + */ + public function getVenueAvailableTime(Request $request) + { + $data = $this->request->params([ + ["venue_id", 0], + ["date", ""] + ]); + return success((new CourseScheduleService())->getVenueAvailableTime($data)); + } + + /** + * 检查教练时间冲突 + * @param Request $request + * @return \think\Response + */ + public function checkCoachConflict(Request $request) + { + $data = $this->request->params([ + ["coach_id", 0], + ["date", ""], + ["time_slot", ""], + ["schedule_id", 0] // 排除当前正在编辑的课程安排 + ]); + return success((new CourseScheduleService())->checkCoachConflict($data)); + } + + /** + * 获取课程安排统计 + * @param Request $request + * @return \think\Response + */ + public function getScheduleStatistics(Request $request) + { + $data = $request->all(); + return success((new CourseScheduleService())->getScheduleStatistics($data)); + } + + /** + * 学员加入课程安排 + * @param Request $request + * @return \think\Response + */ + public function joinSchedule(Request $request) + { + $data = $this->request->params([ + ["schedule_id", 0], + ["student_id", 0], + ["course_type", 0], // 0-正常, 1-加课, 2-补课, 3-等待位 + ["resources_id", 0] + ]); + $result = (new CourseScheduleService())->joinSchedule($data); + if (!$result['code']) { + return fail($result['msg']); + } + return success($result['msg'] ?? '添加成功', $result['data'] ?? []); + } + + /** + * 学员退出课程安排 + * @param Request $request + * @return \think\Response + */ + public function leaveSchedule(Request $request) + { + $data = $this->request->params([ + ["schedule_id", 0], + ["student_id", 0], + ["remark", ""] + ]); + $result = (new CourseScheduleService())->leaveSchedule($data); + if (!$result['code']) { + return fail($result['msg']); + } + return success($result['msg'] ?? '操作成功'); + } + + /** + * 获取筛选选项 + * @param Request $request + * @return \think\Response + */ + public function getFilterOptions(Request $request) + { + $data = $request->all(); + return success((new CourseScheduleService())->getFilterOptions($data)); + } +} \ No newline at end of file diff --git a/niucloud/app/api/controller/apiController/CourseScheduleController.php b/niucloud/app/api/controller/apiController/CourseScheduleController.php new file mode 100644 index 00000000..e468031c --- /dev/null +++ b/niucloud/app/api/controller/apiController/CourseScheduleController.php @@ -0,0 +1,217 @@ +request->get(); + $service = new CourseScheduleService(); + return success('获取成功', $service->getScheduleList($data)); + } + + /** + * 获取课程安排详情 + */ + public function getScheduleInfo() + { + $scheduleId = $this->request->get('schedule_id', 0); + if (empty($scheduleId)) { + return fail('课程安排ID不能为空'); + } + + $service = new CourseScheduleService(); + $result = $service->getScheduleInfo($scheduleId); + + if (isset($result['code']) && $result['code'] == 0) { + return fail($result['msg'] ?? '获取课程安排详情失败'); + } + + return success('获取成功', $result); + } + + /** + * 创建课程安排 + */ + public function createSchedule() + { + $data = $this->request->post(); + $service = new CourseScheduleService(); + $result = $service->createSchedule($data); + + if ($result['code'] == 1) { + return success($result['msg'], $result['data']); + } else { + return fail($result['msg']); + } + } + + /** + * 批量创建课程安排 + */ + public function batchCreateSchedule() + { + $data = $this->request->post(); + $service = new CourseScheduleService(); + $result = $service->batchCreateSchedule($data); + + if ($result['code'] == 1) { + return success($result['msg'], $result['data']); + } else { + return fail($result['msg']); + } + } + + /** + * 更新课程安排 + */ + public function updateSchedule() + { + $data = $this->request->post(); + $scheduleId = $data['schedule_id'] ?? 0; + + if (empty($scheduleId)) { + return fail('课程安排ID不能为空'); + } + + $service = new CourseScheduleService(); + $result = $service->updateSchedule($scheduleId, $data); + + if ($result['code'] == 1) { + return success($result['msg'], $result['data']); + } else { + return fail($result['msg']); + } + } + + /** + * 删除课程安排 + */ + public function deleteSchedule() + { + $scheduleId = $this->request->post('schedule_id', 0); + if (empty($scheduleId)) { + return fail('课程安排ID不能为空'); + } + + $service = new CourseScheduleService(); + $result = $service->deleteSchedule($scheduleId); + + if ($result['code'] == 1) { + return success($result['msg']); + } else { + return fail($result['msg']); + } + } + + /** + * 获取场地列表 + */ + public function getVenueList() + { + $data = $this->request->get(); + $service = new CourseScheduleService(); + return success('获取成功', $service->getVenueList($data)); + } + + /** + * 获取场地可用时间 + */ + public function getVenueAvailableTime() + { + $venueId = $this->request->get('venue_id', 0); + $date = $this->request->get('date', ''); + + if (empty($venueId)) { + return fail('场地ID不能为空'); + } + + if (empty($date)) { + return fail('日期不能为空'); + } + + $service = new CourseScheduleService(); + return success('获取成功', $service->getVenueAvailableTime($venueId, $date)); + } + + /** + * 检查教练时间冲突 + */ + public function checkCoachConflict() + { + $data = $this->request->get(); + $service = new CourseScheduleService(); + return success('检查完成', $service->checkCoachConflict($data)); + } + + /** + * 获取课程安排统计 + */ + public function getScheduleStatistics() + { + $data = $this->request->get(); + $service = new CourseScheduleService(); + return success('获取成功', $service->getScheduleStatistics($data)); + } + + /** + * 学员加入课程安排 + */ + public function joinSchedule() + { + $data = $this->request->post(); + $service = new CourseScheduleService(); + $result = $service->joinSchedule($data); + + if ($result['code'] == 1) { + return success($result['msg'], $result['data']); + } else { + return fail($result['msg']); + } + } + + /** + * 学员退出课程安排 + */ + public function leaveSchedule() + { + $data = $this->request->post(); + $service = new CourseScheduleService(); + $result = $service->leaveSchedule($data); + + if ($result['code'] == 1) { + return success($result['msg']); + } else { + return fail($result['msg']); + } + } + + /** + * 获取筛选选项(教练、课程、班级等) + */ + public function getFilterOptions() + { + $data = $this->request->get(); + $service = new CourseScheduleService(); + return success('获取成功', $service->getFilterOptions($data)); + } +} \ No newline at end of file diff --git a/niucloud/app/api/route/route.php b/niucloud/app/api/route/route.php index fadae038..557d895c 100644 --- a/niucloud/app/api/route/route.php +++ b/niucloud/app/api/route/route.php @@ -292,6 +292,34 @@ Route::group(function () { //员工端-更新学员课程人员配置 Route::post('updateStudentCoursePersonnel', 'apiController.Course/updateStudentCoursePersonnel'); + // 课程安排相关接口 + //员工端-获取课程安排列表 + Route::get('courseSchedule/list', 'apiController.CourseSchedule/getScheduleList'); + //员工端-获取课程安排详情 + Route::get('courseSchedule/info', 'apiController.CourseSchedule/getScheduleInfo'); + //员工端-创建课程安排 + Route::post('courseSchedule/create', 'apiController.CourseSchedule/createSchedule'); + //员工端-批量创建课程安排 + Route::post('courseSchedule/batchCreate', 'apiController.CourseSchedule/batchCreateSchedule'); + //员工端-更新课程安排 + Route::post('courseSchedule/update', 'apiController.CourseSchedule/updateSchedule'); + //员工端-删除课程安排 + Route::post('courseSchedule/delete', 'apiController.CourseSchedule/deleteSchedule'); + //员工端-获取场地列表 + Route::get('courseSchedule/venues', 'apiController.CourseSchedule/getVenueList'); + //员工端-获取场地可用时间 + Route::get('courseSchedule/venueAvailableTime', 'apiController.CourseSchedule/getVenueAvailableTime'); + //员工端-检查教练时间冲突 + Route::get('courseSchedule/checkCoachConflict', 'apiController.CourseSchedule/checkCoachConflict'); + //员工端-获取课程安排统计 + Route::get('courseSchedule/statistics', 'apiController.CourseSchedule/getScheduleStatistics'); + //员工端-学员加入课程安排 + Route::post('courseSchedule/joinSchedule', 'apiController.CourseSchedule/joinSchedule'); + //员工端-学员退出课程安排 + Route::post('courseSchedule/leaveSchedule', 'apiController.CourseSchedule/leaveSchedule'); + //员工端-获取筛选选项 + Route::get('courseSchedule/filterOptions', 'apiController.CourseSchedule/getFilterOptions'); + diff --git a/niucloud/app/service/api/apiService/CourseScheduleService.php b/niucloud/app/service/api/apiService/CourseScheduleService.php new file mode 100644 index 00000000..9da286bd --- /dev/null +++ b/niucloud/app/service/api/apiService/CourseScheduleService.php @@ -0,0 +1,567 @@ +buildScheduleWhere($data); + + // 分页参数 + $page = intval($data['page'] ?? 1); + $limit = intval($data['limit'] ?? 20); + $offset = ($page - 1) * $limit; + + // 基础查询 + $query = Db::name($this->prefix . 'course_schedule') + ->alias('cs') + ->leftJoin($this->prefix . 'course c', 'cs.course_id = c.id') + ->leftJoin($this->prefix . 'venue v', 'cs.venue_id = v.id') + ->leftJoin($this->prefix . 'campus cap', 'cs.campus_id = cap.id') + ->leftJoin($this->prefix . 'personnel coach', 'cs.coach_id = coach.id') + ->leftJoin($this->prefix . 'personnel edu', 'cs.education_id = edu.id') + ->where($where) + ->where('cs.deleted_at', 0); + + // 获取总数 + $total = $query->count(); + + // 获取列表数据 + $list = $query->field([ + 'cs.*', + 'c.course_name', + 'c.course_type', + 'c.duration as course_duration', + 'c.session_count', + 'c.single_session_count', + 'v.venue_name', + 'v.capacity as venue_capacity', + 'cap.campus_name', + 'coach.name as coach_name', + 'coach.head_img as coach_avatar', + 'edu.name as education_name' + ]) + ->order('cs.course_date DESC, cs.time_slot ASC') + ->limit($offset, $limit) + ->select() + ->toArray(); + + // 处理列表数据 + foreach ($list as &$item) { + // 解析时间段 + $item['time_info'] = $this->parseTimeSlot($item['time_slot']); + + // 获取参与学员信息 + $item['students'] = $this->getScheduleStudents($item['id']); + + // 获取助教信息 + $item['assistants'] = $this->getScheduleAssistants($item['assistant_ids']); + + // 计算已报名人数 + $item['enrolled_count'] = count($item['students']); + + // 计算剩余容量 + $item['remaining_capacity'] = max(0, ($item['available_capacity'] ?? $item['venue_capacity']) - $item['enrolled_count']); + + // 格式化状态 + $item['status_text'] = $this->getStatusText($item['status']); + + // 格式化创建方式 + $item['created_by_text'] = $item['created_by'] == 'manual' ? '手动安排' : '系统创建'; + + // 处理图片路径 + $item['coach_avatar'] = $item['coach_avatar'] ? $this->formatImageUrl($item['coach_avatar']) : ''; + } + + return [ + 'list' => $list, + 'total' => $total, + 'page' => $page, + 'limit' => $limit, + 'pages' => ceil($total / $limit) + ]; + + } catch (\Exception $e) { + return [ + 'list' => [], + 'total' => 0, + 'page' => 1, + 'limit' => $limit ?? 20, + 'pages' => 0, + 'error' => $e->getMessage() + ]; + } + } + + /** + * 构建查询条件 + * @param array $data 筛选参数 + * @return array 条件数组 + */ + private function buildScheduleWhere($data) + { + $where = []; + + // 日期范围筛选 + if (!empty($data['start_date'])) { + $where[] = ['cs.course_date', '>=', $data['start_date']]; + } + if (!empty($data['end_date'])) { + $where[] = ['cs.course_date', '<=', $data['end_date']]; + } + + // 校区筛选 + if (!empty($data['campus_id'])) { + if (is_array($data['campus_id'])) { + $where[] = ['cs.campus_id', 'in', $data['campus_id']]; + } else { + $where[] = ['cs.campus_id', '=', $data['campus_id']]; + } + } + + // 场地筛选 + if (!empty($data['venue_id'])) { + if (is_array($data['venue_id'])) { + $where[] = ['cs.venue_id', 'in', $data['venue_id']]; + } else { + $where[] = ['cs.venue_id', '=', $data['venue_id']]; + } + } + + // 教练筛选 + if (!empty($data['coach_id'])) { + if (is_array($data['coach_id'])) { + $where[] = ['cs.coach_id', 'in', $data['coach_id']]; + } else { + $where[] = ['cs.coach_id', '=', $data['coach_id']]; + } + } + + // 课程筛选 + if (!empty($data['course_id'])) { + if (is_array($data['course_id'])) { + $where[] = ['cs.course_id', 'in', $data['course_id']]; + } else { + $where[] = ['cs.course_id', '=', $data['course_id']]; + } + } + + // 状态筛选 + if (!empty($data['status'])) { + if (is_array($data['status'])) { + $where[] = ['cs.status', 'in', $data['status']]; + } else { + $where[] = ['cs.status', '=', $data['status']]; + } + } + + // 教务筛选 + if (!empty($data['education_id'])) { + $where[] = ['cs.education_id', '=', $data['education_id']]; + } + + // 时间段筛选 + if (!empty($data['time_range'])) { + switch ($data['time_range']) { + case 'morning': + $where[] = ['cs.time_slot', 'like', '0%']; + break; + case 'afternoon': + $where[] = ['cs.time_slot', 'like', '1%']; + break; + case 'evening': + $where[] = ['cs.time_slot', 'like', '1[8-9]%']; + break; + } + } + + // 自动排课筛选 + if (isset($data['auto_schedule'])) { + $where[] = ['cs.auto_schedule', '=', $data['auto_schedule']]; + } + + // 创建方式筛选 + if (!empty($data['created_by'])) { + $where[] = ['cs.created_by', '=', $data['created_by']]; + } + + return $where; + } + + /** + * 解析时间段 + * @param string $timeSlot 时间段字符串(格式如:09:00-10:30) + * @return array 解析后的时间段信息 + */ + private function parseTimeSlot($timeSlot) + { + if (strpos($timeSlot, '-') !== false) { + list($startTime, $endTime) = explode('-', $timeSlot); + return [ + 'start_time' => trim($startTime), + 'end_time' => trim($endTime), + 'duration' => $this->calculateDuration(trim($startTime), trim($endTime)) + ]; + } + + return [ + 'start_time' => $timeSlot, + 'end_time' => '', + 'duration' => 60 // 默认1小时 + ]; + } + + /** + * 计算时长(分钟) + * @param string $startTime 开始时间 + * @param string $endTime 结束时间 + * @return int 时长(分钟) + */ + private function calculateDuration($startTime, $endTime) + { + try { + $start = strtotime($startTime); + $end = strtotime($endTime); + return ($end - $start) / 60; + } catch (\Exception $e) { + return 60; // 默认1小时 + } + } + + /** + * 获取课程安排的学员信息 + * @param int $scheduleId 课程安排ID + * @return array 学员信息数组 + */ + private function getScheduleStudents($scheduleId) + { + try { + $students = Db::name($this->prefix . 'person_course_schedule') + ->alias('pcs') + ->leftJoin($this->prefix . 'student s', 'pcs.student_id = s.id') + ->leftJoin($this->prefix . 'customer_resources cr', 'pcs.resources_id = cr.id') + ->leftJoin($this->prefix . 'member m', 'cr.member_id = m.member_id') + ->where('pcs.schedule_id', $scheduleId) + ->where('pcs.deleted_at', 0) + ->field([ + 'pcs.*', + 's.name as student_name', + 'cr.name as resource_name', + 'cr.phone_number', + 'cr.age', + 'cr.gender', + 'm.headimg as avatar' + ]) + ->select() + ->toArray(); + + foreach ($students as &$student) { + $student['name'] = $student['student_name'] ?: $student['resource_name']; + $student['avatar'] = $student['avatar'] ? $this->formatImageUrl($student['avatar']) : ''; + $student['status_text'] = $this->getStudentStatusText($student['status']); + $student['person_type_text'] = $student['person_type'] == 'student' ? '正式学员' : '体验学员'; + $student['course_type_text'] = $this->getCourseTypeText($student['course_type']); + } + + return $students; + } catch (\Exception $e) { + return []; + } + } + + /** + * 获取助教信息 + * @param string $assistantIds 助教ID字符串,使用逗号分隔 + * @return array 助教信息数组 + */ + private function getScheduleAssistants($assistantIds) + { + if (empty($assistantIds)) { + return []; + } + + try { + $ids = explode(',', $assistantIds); + $assistants = Db::name($this->prefix . 'personnel') + ->whereIn('id', $ids) + ->field('id, name, head_img, phone') + ->select() + ->toArray(); + + foreach ($assistants as &$assistant) { + $assistant['head_img'] = $assistant['head_img'] ? $this->formatImageUrl($assistant['head_img']) : ''; + } + + return $assistants; + } catch (\Exception $e) { + return []; + } + } + + /** + * 获取状态文本 + * @param string $status 状态码 + * @return string 状态文本描述 + */ + private function getStatusText($status) + { + $statusMap = [ + 'pending' => '待开始', + 'upcoming' => '即将开始', + 'ongoing' => '进行中', + 'completed' => '已结束' + ]; + + return $statusMap[$status] ?? $status; + } + + /** + * 获取学员状态文本 + * @param int $status 学员状态码 + * @return string 学员状态文本描述 + */ + private function getStudentStatusText($status) + { + $statusMap = [ + 0 => '待上课', + 1 => '已上课', + 2 => '请假' + ]; + + return $statusMap[$status] ?? '未知'; + } + + /** + * 获取课程类型文本 + * @param int $courseType 课程类型码 + * @return string 课程类型文本描述 + */ + private function getCourseTypeText($courseType) + { + $typeMap = [ + 1 => '加课', + 2 => '补课', + 3 => '等待位' + ]; + + return $typeMap[$courseType] ?? '正常课程'; + } + + /** + * 格式化图片URL + * @param string $imagePath 图片路径 + * @return string 格式化后的图片URL + */ + private function formatImageUrl($imagePath) + { + if (empty($imagePath)) { + return ''; + } + + // 如果已经是完整URL,直接返回 + if (strpos($imagePath, 'http') === 0) { + return $imagePath; + } + + // 拼接域名 + $domain = request()->domain(); + return $domain . '/' . ltrim($imagePath, '/'); + } + + /** + * 获取筛选选项(教练、课程、班级等) + * @param array $data 请求参数 + * @return array 筛选选项数据 + */ + public function getFilterOptions($data = []) + { + try { + $result = [ + 'coaches' => [], // 教练列表 + 'courses' => [], // 课程列表 + 'classes' => [], // 班级列表 + 'venues' => [], // 场地列表 + 'campuses' => [], // 校区列表 + 'status_options' => [] // 状态选项 + ]; + + // 获取教练列表 + $result['coaches'] = Db::name($this->prefix . 'personnel') + ->where('is_coach', 1) + ->where('deleted_at', 0) + ->field('id, name, head_img as avatar, phone') + ->select() + ->toArray(); + + foreach ($result['coaches'] as &$coach) { + $coach['avatar'] = $coach['avatar'] ? $this->formatImageUrl($coach['avatar']) : ''; + } + + // 获取课程列表 + $result['courses'] = Db::name($this->prefix . 'course') + ->where('deleted_at', 0) + ->field('id, course_name, course_type, duration') + ->select() + ->toArray(); + + // 获取班级列表 + $result['classes'] = Db::name($this->prefix . 'class') + ->where('deleted_at', 0) + ->field('id, class_name, class_level, total_students') + ->select() + ->toArray(); + + // 获取场地列表 + $result['venues'] = Db::name($this->prefix . 'venue') + ->where('deleted_at', 0) + ->field('id, venue_name, capacity, description') + ->select() + ->toArray(); + + // 获取校区列表 + $result['campuses'] = Db::name($this->prefix . 'campus') + ->where('deleted_at', 0) + ->field('id, campus_name, address') + ->select() + ->toArray(); + + // 状态选项 + $result['status_options'] = [ + ['value' => 'pending', 'label' => '待开始'], + ['value' => 'upcoming', 'label' => '即将开始'], + ['value' => 'ongoing', 'label' => '进行中'], + ['value' => 'completed', 'label' => '已结束'] + ]; + + return $result; + + } catch (\Exception $e) { + return [ + 'coaches' => [], + 'courses' => [], + 'classes' => [], + 'venues' => [], + 'campuses' => [], + 'status_options' => [], + 'error' => $e->getMessage() + ]; + } + } + + /** + * 获取课程安排详情 + * @param int $scheduleId 课程安排ID + * @return array 课程安排详细信息或错误信息 + */ + public function getScheduleInfo($scheduleId) + { + try { + // 查询课程安排信息 + $schedule = Db::name($this->prefix . 'course_schedule') + ->alias('cs') + ->leftJoin($this->prefix . 'course c', 'cs.course_id = c.id') + ->leftJoin($this->prefix . 'venue v', 'cs.venue_id = v.id') + ->leftJoin($this->prefix . 'campus cap', 'cs.campus_id = cap.id') + ->leftJoin($this->prefix . 'personnel coach', 'cs.coach_id = coach.id') + ->leftJoin($this->prefix . 'personnel edu', 'cs.education_id = edu.id') + ->where('cs.id', $scheduleId) + ->where('cs.deleted_at', 0) + ->field([ + 'cs.*', + 'c.course_name', + 'c.course_type', + 'c.duration as course_duration', + 'c.session_count', + 'c.single_session_count', + 'v.venue_name', + 'v.capacity as venue_capacity', + 'cap.campus_name', + 'coach.name as coach_name', + 'coach.head_img as coach_avatar', + 'edu.name as education_name' + ]) + ->find(); + + if (empty($schedule)) { + return ['code' => 0, 'msg' => '课程安排不存在或已被删除']; + } + + // 解析时间段 + $schedule['time_info'] = $this->parseTimeSlot($schedule['time_slot']); + + // 获取参与学员信息 + $schedule['students'] = $this->getScheduleStudents($schedule['id']); + + // 获取助教信息 + $schedule['assistants'] = $this->getScheduleAssistants($schedule['assistant_ids']); + + // 计算已报名人数 + $schedule['enrolled_count'] = count($schedule['students']); + + // 计算剩余容量 + $schedule['remaining_capacity'] = max(0, ($schedule['available_capacity'] ?? $schedule['venue_capacity']) - $schedule['enrolled_count']); + + // 格式化状态 + $schedule['status_text'] = $this->getStatusText($schedule['status']); + + // 格式化创建方式 + $schedule['created_by_text'] = $schedule['created_by'] == 'manual' ? '手动安排' : '系统创建'; + + // 处理图片路径 + $schedule['coach_avatar'] = $schedule['coach_avatar'] ? $this->formatImageUrl($schedule['coach_avatar']) : ''; + + // 获取班级相关信息 + if (!empty($schedule['class_id'])) { + $schedule['class_info'] = Db::name($this->prefix . 'class') + ->where('id', $schedule['class_id']) + ->field('id, class_name, class_level, total_students') + ->find(); + } else { + $schedule['class_info'] = null; + } + + // 获取历史变更记录 + $schedule['change_history'] = Db::name($this->prefix . 'course_schedule_changes') + ->where('schedule_id', $scheduleId) + ->order('created_at DESC') + ->select() + ->toArray(); + + return $schedule; + + } catch (\Exception $e) { + return ['code' => 0, 'msg' => $e->getMessage()]; + } + } +} \ No newline at end of file diff --git a/niucloud/课程安排资料.md b/niucloud/课程安排资料.md new file mode 100644 index 00000000..6d8a4d26 --- /dev/null +++ b/niucloud/课程安排资料.md @@ -0,0 +1,173 @@ +school_campus(校区表) +CREATE TABLE `school_campus` ( +`id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', +`campus_name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '校区名称', +`campus_address` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '校区地址', +`campus_preview_image` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '校区预览图,存储图片路径', +`campus_coordinates` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '校区坐标,格式为经度,纬度', +`campus_introduction` text COLLATE utf8mb4_general_ci COMMENT '校区介绍', +`campus_status` tinyint DEFAULT '1' COMMENT '校区状态:0-禁用,1-启用', +`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '校区创建时间', +`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '校区更新时间', +`delete_time` int NOT NULL DEFAULT '0' COMMENT '逻辑删除字段,0表示未删除,非空表示已删除', +PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='校区表'; +做为基础数据,下面一级就是场地。 + +school_venue(场地表) +CREATE TABLE `school_venue` ( +`id` int NOT NULL AUTO_INCREMENT COMMENT '场地编号', +`campus_id` int NOT NULL COMMENT '校区ID', +`venue_name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '场地名称', +`capacity` int NOT NULL COMMENT '场地可容纳人数上限', +`availability_status` tinyint(1) NOT NULL COMMENT '场地可用状态: 1-可用, 0-不可用', +`time_range_type` enum('range','fixed','all') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '场地可用时间范围类型: range-范围类型, fixed-固定时间范围类型', +`time_range_start` varchar(8) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '范围类型的开始时间', +`time_range_end` varchar(8) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '范围类型的结束时间', +`fixed_time_ranges` json DEFAULT NULL COMMENT '固定时间范围类型的可用时间, 存储为JSON数组', +`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', +`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', +`deleted_at` int DEFAULT '0' COMMENT '逻辑删除时间', +PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='场地表'; +场地表做为课程的容器,主要是用来限制人数,时间,和可用状态。如果场地被设置为不可用,那么该场地下的所有课程都会被取消。其中time_range_type字段决定这个时间范围是范围类型还是固定时间类型。 +这个字段配合time_range_start,time_range_end,fixed_time_ranges这三个字段,可以确定这个场地可用的时间范围。 + +school_course(课程表) +CREATE TABLE `school_course` ( +`id` int NOT NULL AUTO_INCREMENT COMMENT '课程编号', +`course_name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程名称', +`course_type` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程类型', +`duration` int NOT NULL COMMENT '课程时长', +`session_count` int NOT NULL COMMENT '课时数量', +`single_session_count` int NOT NULL DEFAULT '0' COMMENT '单次消课数量', +`gift_session_count` int NOT NULL DEFAULT '0' COMMENT '赠送课时数量', +`price` decimal(10,2) NOT NULL COMMENT '课程价格', +`internal_reminder` int NOT NULL COMMENT '内部提醒课时', +`customer_reminder` int NOT NULL COMMENT '客户提醒课时', +`remarks` text COLLATE utf8mb4_general_ci COMMENT '课程备注', +`created_at` int DEFAULT '0' COMMENT '创建时间', +`updated_at` int DEFAULT '0' COMMENT '更新时间', +`deleted_at` int DEFAULT '0' COMMENT '逻辑删除时间', +`contract_id` int DEFAULT NULL, +PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='课程表'; +课程表主要是用户上课的内容,在排课阶段主要是看用户排的是什么课在哪个课程安排里展示。课程表和课程安排表是一对多的关系,一个课程可以有多个课程安排。但是在一个周期范围内,这个安排的数量始终是不会超过课程表的课时数量的。 +举例来说single_session_count字段表示一次课程安排要消耗多少课时,如果值为 2,session_count课时数量是 10,那么这次课程周期一个用户只能排 5 次课程安排。 + +school_course_schedule(课程安排表) +CREATE TABLE `school_course_schedule` ( +`id` int NOT NULL AUTO_INCREMENT COMMENT '课程安排编号', +`campus_id` int NOT NULL COMMENT '校区ID', +`venue_id` int NOT NULL COMMENT '场地ID', +`course_date` date NOT NULL COMMENT '上课日期', +`time_slot` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '上课时段', +`course_id` int NOT NULL COMMENT '课程ID', +`coach_id` int NOT NULL COMMENT '上课教练ID', +`participants` json DEFAULT NULL COMMENT '参与人员列表,存储为JSON数组,包含学员ID和来源信息', +`student_ids` json DEFAULT NULL COMMENT '上课学生ID列表,存储为JSON数组', +`available_capacity` int DEFAULT NULL COMMENT '根据场地容量判断的可安排学员位置数量', +`status` enum('pending','upcoming','ongoing','completed') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'pending' COMMENT '课程状态: pending-待开始, upcoming-即将开始, ongoing-进行中, completed-已结束', +`auto_schedule` tinyint(1) DEFAULT NULL COMMENT '是否自动排课1是0否', +`created_by` enum('manual','system') COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程安排创建方式: manual-人员安排, system-系统创建', +`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', +`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', +`deleted_at` int DEFAULT '0' COMMENT '逻辑删除时间', +`assistant_ids` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '助教ID列表(逗号分隔)', +`education_id` int DEFAULT NULL COMMENT '教务ID', +PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='课程安排表'; +这个表是在学校层面针对教室的情况做的课程安排情况表。这个表和课程表是一对多的关系,一个课程可以有多个课程安排。而且支持一次配置后自动排课的功能。这个表的主要作用是记录课程安排的情况,包括上课日期,时间段,教练,参与人员等信息。 + +school_person_course_schedule(人员与课程安排关系表) +CREATE TABLE `school_person_course_schedule` ( +`id` int NOT NULL AUTO_INCREMENT COMMENT '关系编号', +`resources_id` int DEFAULT NULL COMMENT '资源ID', +`person_id` int DEFAULT NULL COMMENT '人员ID', +`student_id` int DEFAULT NULL COMMENT '学员ID', +`person_type` enum('student','customer_resource') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '人员类型: student-正式学员, customer_resource-客户资源,teacher教练', +`schedule_id` int NOT NULL COMMENT '课程安排ID', +`course_date` date NOT NULL COMMENT '上课日期', +`schedule_type` tinyint(1) DEFAULT NULL COMMENT '课程安排类型1临时课2固定课', +`course_type` tinyint(1) DEFAULT NULL COMMENT '课程类型1加课2补课3 等待位', +`time_slot` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '上课时段', +`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', +`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', +`deleted_at` int DEFAULT '0' COMMENT '删除', +`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态0待上课1已上课2请假', +`remark` varchar(512) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '请假备注', +PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='人员与课程安排关系表'; +这个表记录着学员和school_course_schedule中安排的关系。这里面有几种情况 1.正式的付费学员上课(临时的)2.临时的体验学员上课 3.正式的付费学员固定这个时段上课的。 +然后这个课程安排的属性还有是正常消耗课时的,还是补课、还是送课。还是这个教室没有位置单纯是等待的课程。 +school_student_courses(学员课程表) +CREATE TABLE `school_student_courses` ( +`id` int NOT NULL AUTO_INCREMENT COMMENT '记录编号', +`student_id` int NOT NULL COMMENT '学员ID', +`course_id` int NOT NULL COMMENT '课程ID', +`total_hours` int NOT NULL COMMENT '总正式课时数', +`gift_hours` int DEFAULT '0' COMMENT '赠送课时数', +`start_date` date NOT NULL COMMENT '课程开始日期', +`end_date` date NOT NULL COMMENT '课程结束日期', +`use_total_hours` int NOT NULL DEFAULT '0' COMMENT '已使用课包课时数', +`use_gift_hours` int NOT NULL DEFAULT '0' COMMENT '已使用课包赠送课时数', +`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', +`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', +`single_session_count` int DEFAULT NULL COMMENT '单次消课数量', +`status` tinyint(1) DEFAULT NULL COMMENT '课程状态1有效2过期3等待期4延期', +`resource_id` int DEFAULT NULL COMMENT '资源ID', +`main_coach_id` int DEFAULT NULL COMMENT '主教练ID', +`assistant_ids` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '助教ID列表(逗号分隔)', +`education_id` int DEFAULT NULL COMMENT '教务ID', +PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='学员课程表'; +这个是一个学员在一个课程周期里可以上课的课时记录以及课时有效期记录,在这个周期范围内为这个学员服务的教练和助教信息。这个表的主要作用是记录学员的课程信息,包括总课时数,赠送课时数,开始和结束日期等信息。这个表和人员与课程安排关系表是一对多的关系,一个学员可以有多个课程安排。 + +school_student_course_usage(学员课程使用记录表) +CREATE TABLE `school_student_course_usage` ( +`id` int NOT NULL AUTO_INCREMENT COMMENT '记录编号', +`student_course_id` int NOT NULL COMMENT '学员课程ID(关联到student_courses表)', +`used_hours` int NOT NULL COMMENT '本次使用的课时数', +`usage_date` date NOT NULL COMMENT '课时使用日期', +`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', +`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', +PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='学员课时消费记录表'; +这个表记录了学员在某个课程周期内使用的课时数,这个表和学员课程表是一对多的关系,一个学员可以有多个课时使用记录。 +school_class(班级表) +CREATE TABLE `school_class` ( +`id` int NOT NULL AUTO_INCREMENT COMMENT '班级编号', +`campus_id` int NOT NULL COMMENT '校区ID', +`campus_name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '校区名称', +`class_name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '班级名称', +`head_coach` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '班继续 +级主教练', +`age_group` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '班级授课年龄段', +`class_type` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '班级类型', +`assistant_coach` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '班级助教', +`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', +`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', +`deleted_at` int DEFAULT '0' COMMENT '逻辑删除时间', +`status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '班级状态(1开启 2关闭)', +`sort_order` int NOT NULL COMMENT '班级排序', +`remarks` text COLLATE utf8mb4_general_ci COMMENT '班级备注', +`educational_id` int NOT NULL DEFAULT '0' COMMENT '教务id', +PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='班级表'; +学员报名时会分配班级,默认班级里的主教练和助教会被分配到学员课程表里。班级表主要是记录班级的信息,包括班级名称,主教练,助教,授课年龄段等信息。这个表和学员课程表是一对多的关系,一个班级可以有多个学员。 +school_class_resources_rel(班级学员关系表) +CREATE TABLE `school_class_resources_rel` ( +`id` int NOT NULL AUTO_INCREMENT, +`class_id` int NOT NULL COMMENT '班级id', +`resource_id` int DEFAULT NULL COMMENT '资源id', +`campus_id` int DEFAULT NULL COMMENT '校区id', +`source_id` int DEFAULT NULL COMMENT '数据id', +`source_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '数据资源类型student是学员,temporary是非正式学员', +`join_time` int DEFAULT NULL COMMENT '加入时间', +`out_time` int DEFAULT NULL COMMENT '离开时间', +`status` tinyint DEFAULT NULL COMMENT '状态1新入2续费3过期4转班5转校', +`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', +`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', +PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='班级和资源关系表'; +这个表记录了班级和资源的关系,包括班级id,资源id,校区id,数据id,数据资源类型,加入时间,离开时间,状态等信息。这个表和班级表是一对多的关系,一个班级可以有多个资源。 \ No newline at end of file diff --git a/uniapp/api/apiRoute.js b/uniapp/api/apiRoute.js index dfe43deb..4bca4098 100644 --- a/uniapp/api/apiRoute.js +++ b/uniapp/api/apiRoute.js @@ -397,8 +397,62 @@ export default { return await http.post('/updateStudentCoursePersonnel', data); }, -// 获取订单支付二维码 + // 获取订单支付二维码 async getOrderPayQrcode(data = {}) { return await http.get('/getQrcode', data); }, + + //↓↓↓↓↓↓↓↓↓↓↓↓-----课程安排相关接口-----↓↓↓↓↓↓↓↓↓↓↓↓ + // 获取课程安排列表 + async getCourseScheduleList(data = {}) { + return await http.get('/courseSchedule/list', data); + }, + // 获取课程安排详情 + async getCourseScheduleInfo(data = {}) { + return await http.get('/courseSchedule/info', data); + }, + // 创建课程安排 + async createCourseSchedule(data = {}) { + return await http.post('/courseSchedule/create', data); + }, + // 批量创建课程安排 + async batchCreateCourseSchedule(data = {}) { + return await http.post('/courseSchedule/batchCreate', data); + }, + // 更新课程安排 + async updateCourseSchedule(data = {}) { + return await http.post('/courseSchedule/update', data); + }, + // 删除课程安排 + async deleteCourseSchedule(data = {}) { + return await http.post('/courseSchedule/delete', data); + }, + // 获取场地列表 + async getCourseScheduleVenues(data = {}) { + return await http.get('/courseSchedule/venues', data); + }, + // 获取场地可用时间 + async getVenueAvailableTime(data = {}) { + return await http.get('/courseSchedule/venueAvailableTime', data); + }, + // 检查教练时间冲突 + async checkCoachConflict(data = {}) { + return await http.get('/courseSchedule/checkCoachConflict', data); + }, + // 获取课程安排统计 + async getCourseScheduleStatistics(data = {}) { + return await http.get('/courseSchedule/statistics', data); + }, + // 学员加入课程安排 + async joinCourseSchedule(data = {}) { + return await http.post('/courseSchedule/joinSchedule', data); + }, + // 学员退出课程安排 + async leaveCourseSchedule(data = {}) { + return await http.post('/courseSchedule/leaveSchedule', data); + }, + // 获取筛选选项 + async getCourseScheduleFilterOptions(data = {}) { + return await http.get('/courseSchedule/filterOptions', data); + }, } \ No newline at end of file diff --git a/uniapp/common/axios.js b/uniapp/common/axios.js index 42f1b0f2..908c444b 100644 --- a/uniapp/common/axios.js +++ b/uniapp/common/axios.js @@ -152,19 +152,11 @@ export default { uni.showLoading({ title: '加载中...' }); - - console.log('请求配置:', interceptedConfig); - console.log('请求URL:', interceptedConfig.url); - console.log('请求方法:', interceptedConfig.method); - console.log('请求数据:', interceptedConfig.data); - uni.request({ ...interceptedConfig, success: (res) => { try { - console.log('原始响应数据:', res); const response = responseInterceptor(res); - console.log('处理后的响应数据:', response); resolve(response); } catch (error) { console.error('请求处理失败:', error); diff --git a/uniapp/common/util.js b/uniapp/common/util.js index e8613bdb..401acbe5 100644 --- a/uniapp/common/util.js +++ b/uniapp/common/util.js @@ -1,4 +1,4 @@ -import {img_domian} from "./config"; +import {img_domian,Api_url} from "./config"; import marketApi from '@/api/apiRoute.js'; function formatTime(time) { @@ -326,6 +326,67 @@ async function getDict(dictKey) { } } +/** + * 上传文件通用方法 + * @param {string} filePath 文件路径 + * @param {Function} successCallback 成功回调 + * @param {Function} errorCallback 失败回调 + */ +export function uploadFile(filePath, successCallback, errorCallback) { + const token = uni.getStorageSync('token') || ''; + + uni.uploadFile({ + url: Api_url + '/file/image', // 上传地址 + filePath: filePath, + name: 'file', + header: { + 'token': token + }, + success: (res) => { + let response; + try { + // 去除 BOM 字符并解析 JSON + response = JSON.parse(res.data.replace(/\ufeff/g, '') || '{}'); + } catch (e) { + uni.showToast({ title: '响应格式错误', icon: 'none' }); + if (errorCallback) errorCallback(e); + return; + } + + if (response.code === 1) { + const fileData = { + url: response.data.url, + extname: response.data.ext, + name: response.data.name + }; + + if (successCallback) { + successCallback(fileData); + } + } else if (response.code === 401) { + uni.showToast({ title: response.msg, icon: 'none' }); + setTimeout(() => { + uni.navigateTo({ url: '/pages/student/login/login' }); + }, 1000); + } else { + uni.showToast({ title: response.msg || '上传失败', icon: 'none' }); + if (errorCallback) errorCallback(response); + } + }, + fail: (err) => { + uni.showToast({ title: err.errMsg || '网络异常', icon: 'none' }); + if (errorCallback) errorCallback(err); + } + }); +} +/** + * 获取服务器上的资源完整 url + * @return {string} 完整的资源 URL + */ +function getResourceUrl(resource) { + //如果没有 http 协议,则加上 http 协议+服务域名 + return resource.indexOf('http') === -1 ? 'https://' + img_domian + resource : resource; +} module.exports = { loginOut, openHomeView, @@ -336,5 +397,6 @@ module.exports = { hexToRgba, img, formatToDateTime, - getDict + getDict, + uploadFile } diff --git a/uniapp/components/AQ/AQUplodeImgMulti.vue b/uniapp/components/AQ/AQUplodeImgMulti.vue index da3793e7..fc43ad76 100644 --- a/uniapp/components/AQ/AQUplodeImgMulti.vue +++ b/uniapp/components/AQ/AQUplodeImgMulti.vue @@ -159,12 +159,8 @@ import {Api_url} from "../../common/config"; header: { 'token': `${token}`,//请求头设置token }, - // formData: { - // 'age': '我是自定义参数' - // }, success: (uploadFileRes) => { let res = JSON.parse(uploadFileRes.data.replace(/\ufeff/g, "") || "{}") - console.log('上传成功1',res); if (res.code == 1){ let _arr = {} // 下面3个值是uni-app规定的一个不能少 @@ -173,7 +169,6 @@ import {Api_url} from "../../common/config"; _arr.name = res.data.name console.log('xxx',_arr) this.fileList.push(_arr) -console.log('上传成功2',_arr); this.filePathArr.push(res.data.url) //上传成功 this.emitUploadSuccess(this.filePathArr) diff --git a/uniapp/components/CommentList.vue b/uniapp/components/CommentList.vue deleted file mode 100644 index 369033b7..00000000 --- a/uniapp/components/CommentList.vue +++ /dev/null @@ -1,240 +0,0 @@ - - - - - \ No newline at end of file diff --git a/uniapp/components/J-skeleton/J-skeleton.vue b/uniapp/components/J-skeleton/J-skeleton.vue deleted file mode 100644 index 05c56a98..00000000 --- a/uniapp/components/J-skeleton/J-skeleton.vue +++ /dev/null @@ -1,166 +0,0 @@ - - - - - diff --git a/uniapp/components/J-skeleton/README.md b/uniapp/components/J-skeleton/README.md deleted file mode 100644 index 77c64e19..00000000 --- a/uniapp/components/J-skeleton/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# skeleton -感谢原作者 https://ext.dcloud.net.cn/plugin?id=852 - -自己项目非常需要骨架,正好原作者发布了1.0 根据自己项目 自己修改了下。 - -目前仅支持: -1.轮播图 -2.分类栏 -3.头像 -4.文章条 -5.动态心情 - -以上是根据自己项目修改的,后续再拓展,或者自己根据自己项目修改,原作者写的还是很灵活的,修改方便! - - -## 属性说明 - -|属性名|类型|默认值|说明| -| -- | -- | --|--| -| loading | Boolean | true | 是否显示占位图 | -| flexType | String | flex-start | 排列方式 center 居中 √ space-between 两端对齐 √ space-around 子元素拉手分布 √ flex-start 居左 flex-end 居右 | -| imgTitle | Boolean | false | 轮播图占位图 | -| showAvatar | Boolean | true | 是否显示头像占位图 | -| nameRow | Number | 1 | 显示头像圆1个 | -| avatarSize | String | 50px | 头像站占位图大小 | -| avatarShape | String | round | 头像形状,可选值:round, square | -| showTitle | Boolean | true | 是否显示标题占位图 | -| titleWidth | String | 40% | 标题占位图宽度 | -| row | Number| 3 | 标题段落占位图行数 | -| animate | Boolean | true | 是否开启动画 | - -## 使用示例 - -```html - - 我是段落1 - -``` - -```javascript -import Skeleton from '../components/skeleton/index.vue' -export default { - components: { - Skeleton - }, - data() { - return { - loading: true, - skeleton1 : { - avatarSize: '52px', - row: 3, - showTitle: true, - } - } - }, - created() { - this.reloadData() - }, - methods: { - reloadData() { - this.loading = true - setTimeout(() => { - this.loading = false - }, 3000) - }, - }, -} -``` - -## 效果图 - -![](http://images.alisali.cn/img_20191014113211.png) diff --git a/uniapp/components/aui-dialog/aui-dialog.vue b/uniapp/components/aui-dialog/aui-dialog.vue deleted file mode 100644 index 0dab18c0..00000000 --- a/uniapp/components/aui-dialog/aui-dialog.vue +++ /dev/null @@ -1,438 +0,0 @@ - - - - - diff --git a/uniapp/components/aui-dialog/common/aui/css/aui.css b/uniapp/components/aui-dialog/common/aui/css/aui.css deleted file mode 100644 index e094c8fb..00000000 --- a/uniapp/components/aui-dialog/common/aui/css/aui.css +++ /dev/null @@ -1,292 +0,0 @@ -.aui-content{ - width: 100%; - height: 100vh; - /* #ifndef MP */ - height: -webkit-calc(100vh - 44px); - height: calc(100vh - 44px); - /* #endif */ - background: #EFEFEF; - overflow-y: scroll; - padding: 0; - box-sizing: border-box; - position: relative; -} -/* 横向分割线 */ -.row-before{position: relative;} -.row-before:before{content: ''; width: 100%; height: 1px !important; background: rgba(100,100,100,.3); -ms-transform: scaleY(.3); -webkit-transform: scaleY(.3); transform: scaleY(.3); position: absolute; top: 0; right: 0; left: auto; z-index: 1;} -.row-after{position: relative;} -.row-after:after{content: ''; width: 100%; height: 1px !important; background: rgba(100,100,100,.3); -ms-transform: scaleY(.3); -webkit-transform: scaleY(.3); transform: scaleY(.3); position: absolute; bottom: 0; right: 0; left: auto; z-index: 1;} -/* 纵向分割线 */ -.col-before{position: relative;} -.col-before:before{content: ''; width: 1px !important; height: 100%; background: rgba(100,100,100,.3); -ms-transform: scaleX(.3); -webkit-transform: scaleX(.3); transform: scaleX(.3); position: absolute; top: 0; left: 0; z-index: 1;} -.col-after{position: relative;} -.col-after:after{content: ''; width: 1px !important; height: 100%; background: rgba(100,100,100,.3); -ms-transform: scaleX(.3); -webkit-transform: scaleX(.3); transform: scaleX(.3); position: absolute; top: 0; right: 0; z-index: 1;} -/*按钮边框线*/ -.border{position: relative;} -.border:after{content: ''; width: -webkit-calc(200% - 2px); width: calc(200% - 2px); height: -webkit-calc(200% - 2px); height: calc(200% - 2px); border-radius: 3px; border: 1px solid rgba(100,100,100,.3); position: absolute; left: -50%; top: -50%; -ms-transform: scale(.5, .5); -webkit-transform: scale(.5, .5); transform: scale(.5, .5); z-index: 1;} -.aui-lists{ - width: 100%; -} -.aui-list{ - width: 100%; - height: 55px; - font-size: 0; - padding: 0 15px; - background: #FFFFFF; - box-sizing: border-box; - position: relative; - z-index: 1; -} -.aui-list:after{ - content: ''; - width: 100%; - height: 1px; - background: rgba(100,100,100,.3); - -ms-transform: scaleY(.3); - -webkit-transform: scaleY(.3); - transform: scaleY(.3); - position: absolute; - bottom: 0; - left: 0; -} -.aui-list:last-child:after{ - display: none; -} -.aui-list-title{ - width: 100%; - height: 44px; - line-height: 44px; - font-size: 14px; - padding: 0 15px; - box-sizing: border-box; - color: #999; - display: inline-block; -} -.aui-list-left{ - height: 100%; - line-height: 55px; - font-size: 15px; - color: #333; - display: inline-block; - vertical-align: top; -} -.aui-list-right{ - height: 100%; - display: inline-block; - vertical-align: top; - float: right; -} -.aui-list-right .aui-btn-right{ - height: 55px; - text-align: center; - line-height: 55px; - font-size: 14px; - display: inline-block; - color: #aaa; - vertical-align: top; - -} -.aui-btn{ - width: -webkit-calc(100% - 30px); - width: calc(100% - 30px); - height: 50px; - line-height: 50px; - text-align: center; - border: none; - color: #333; - font-size: 15px; - border-radius: 5px; - margin: 0 15px 15px 15px; - padding: 0 10px; - transition: background-color .2s; - box-sizing: border-box; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - position: relative; -} -.aui-btn-blue{ - background: #197DE0; - color: #FFF; -} - -/* 遮罩层样式 */ -.aui-mask{ - width: 100%; - height: 100%; - background: rgba(0,0,0,.6); - -ms-animation: aui-fade-in .2s ease-out forwards; - -webkit-animation: aui-fade-in .2s ease-out forwards; - animation: aui-fade-in .2s ease-out forwards; - position: fixed; - top: 0px; - left: 0px; - z-index: 998; -} - -/* 动画设计 */ -/* fade-in */ -@-ms-keyframes aui-fade-in{ - 0%{opacity: 0;} - 100%{opacity: 1;} -} -@-webkit-keyframes aui-fade-in{ - 0%{opacity: 0;} - 100%{opacity: 1;} -} -@keyframes aui-fade-in{ - 0%{opacity: 0;} - 100%{opacity: 1;} -} -/* fade-out */ -@-ms-keyframes aui-fade-out{ - 0%{opacity: 1;} - 100%{opacity: 0;} -} -@-webkit-keyframes aui-fade-out{ - 0%{opacity: 1;} - 100%{opacity: 0;} -} -@keyframes aui-fade-out{ - 0%{opacity: 1;} - 100%{opacity: 0;} -} -/* aui-scale-in */ -@-ms-keyframes aui-scale-in{ - 0%{-ms-transform: scale(0.8); -webkit-transform: scale(0.8); transform: scale(0.8);} - 100%{-ms-transform: scale(1); -webkit-transform: scale(1); transform: scale(1);} -} -@-webkit-keyframes aui-scale-in{ - 0%{-ms-transform: scale(0.8); -webkit-transform: scale(0.8); transform: scale(0.8);} - 100%{-ms-transform: scale(1); -webkit-transform: scale(1); transform: scale(1);} -} -@keyframes aui-scale-in{ - 0%{-ms-transform: scale(0.8); -webkit-transform: scale(0.8); transform: scale(0.8);} - 100%{-ms-transform: scale(1); -webkit-transform: scale(1); transform: scale(1);} -} -/* aui-scale-out */ -@-ms-keyframes aui-scale-out{ - 0%{-ms-transform: scale(1); -webkit-transform: scale(1); transform: scale(1);} - 100%{-ms-transform: scale(0.8); -webkit-transform: scale(0.8); transform: scale(0.8);} -} -@-webkit-keyframes aui-scale-out{ - 0%{-ms-transform: scale(1); -webkit-transform: scale(1); transform: scale(1);} - 100%{-ms-transform: scale(0.8); -webkit-transform: scale(0.8); transform: scale(0.8);} -} -@keyframes aui-scale-out{ - 0%{-ms-transform: scale(1); -webkit-transform: scale(1); transform: scale(1);} - 100%{-ms-transform: scale(0.8); -webkit-transform: scale(0.8); transform: scale(0.8);} -} - -/* aui-scale-in-tosmall */ -@-ms-keyframes aui-scale-in-tosmall{ - 0%{-ms-transform: scale(1.2); -webkit-transform: scale(1.2); transform: scale(1.2);} - 100%{-ms-transform: scale(1); -webkit-transform: scale(1); transform: scale(1);} -} -@-webkit-keyframes aui-scale-in-tosmall{ - 0%{-ms-transform: scale(1.2); -webkit-transform: scale(1.2); transform: scale(1.2);} - 100%{-ms-transform: scale(1); -webkit-transform: scale(1); transform: scale(1);} -} -@keyframes aui-scale-in-tosmall{ - 0%{-ms-transform: scale(1.2); -webkit-transform: scale(1.2); transform: scale(1.2);} - 100%{-ms-transform: scale(1); -webkit-transform: scale(1); transform: scale(1);} -} - -/* aui-scale-in-tosmall-dialog */ -@-ms-keyframes aui-scale-in-tosmall-dialog{ - 0%{-ms-transform: translate3d(-50%,-50%,0) scale(1.16); -webkit-transform: translate3d(-50%,-50%,0) scale(1.16); transform: translate3d(-50%,-50%,0) scale(1.16); opacity: 0;} - 100%{-ms-transform: translate3d(-50%,-50%,0) scale(1); -webkit-transform: translate3d(-50%,-50%,0) scale(1); transform: translate3(-50%,-50%,0) scale(1); opacity: 1;} -} -@-webkit-keyframes aui-scale-in-tosmall-dialog{ - 0%{-ms-transform: translate3d(-50%,-50%,0) scale(1.16); -webkit-transform: translate3d(-50%,-50%,0) scale(1.16); transform: translate3d(-50%,-50%,0) scale(1.16); opacity: 0;} - 100%{-ms-transform: translate3d(-50%,-50%,0) scale(1); -webkit-transform: translate3d(-50%,-50%,0) scale(1); transform: translate3(-50%,-50%,0) scale(1); opacity: 1;} -} -@keyframes aui-scale-in-tosmall-dialog{ - 0%{-ms-transform: translate3d(-50%,-50%,0) scale(1.16); -webkit-transform: translate3d(-50%,-50%,0) scale(1.16); transform: translate3d(-50%,-50%,0) scale(1.16); opacity: 0;} - 100%{-ms-transform: translate3d(-50%,-50%,0) scale(1); -webkit-transform: translate3d(-50%,-50%,0) scale(1); transform: translate3(-50%,-50%,0) scale(1); opacity: 1;} -} -/* aui-scale-out-tosmall-dialog */ -@-ms-keyframes aui-scale-out-tosmall-dialog{ - 0%{-ms-transform: translate3d(-50%,-50%,0) scale(1); -webkit-transform: translate3d(-50%,-50%,0) scale(1); transform: translate3d(-50%,-50%,0) scale(1); opacity: 1;} - 100%{-ms-transform: translate3d(-50%,-50%,0) scale(0.8); -webkit-transform: translate3d(-50%,-50%,0) scale(0.8); transform: translate3(-50%,-50%,0) scale(0.8); opacity: 0;} -} -@-webkit-keyframes aui-scale-out-tosmall-dialog{ - 0%{-ms-transform: translate3d(-50%,-50%,0) scale(1); -webkit-transform: translate3d(-50%,-50%,0) scale(1); transform: translate3d(-50%,-50%,0) scale(1); opacity: 1;} - 100%{-ms-transform: translate3d(-50%,-50%,0) scale(0.8); -webkit-transform: translate3d(-50%,-50%,0) scale(0.8); transform: translate3(-50%,-50%,0) scale(0.8); opacity: 0;} -} -@keyframes aui-scale-out-tosmall-dialog{ - 0%{-ms-transform: translate3d(-50%,-50%,0) scale(1); -webkit-transform: translate3d(-50%,-50%,0) scale(1); transform: translate3d(-50%,-50%,0) scale(1); opacity: 1;} - 100%{-ms-transform: translate3d(-50%,-50%,0) scale(0.8); -webkit-transform: translate3d(-50%,-50%,0) scale(0.8); transform: translate3(-50%,-50%,0) scale(0.8); opacity: 0;} -} -/* aui-slide-up */ -@-ms-keyframes aui-slide-up{ - 0%{bottom: -40vh;} - 100%{bottom: 10px;} -} -@-webkit-keyframes aui-slide-up{ - 0%{bottom: -40vh;} - 100%{bottom: 10px;} -} -@keyframes aui-slide-up{ - 0%{bottom: -40vh;} - 100%{bottom: 10px;} -} - -/* aui-slide-down */ -@-ms-keyframes aui-slide-down{ - 0%{bottom: 10px;} - 100%{bottom: -40vh;} -} -@-webkit-keyframes aui-slide-down{ - 0%{bottom: 10px;} - 100%{bottom: -40vh;} -} -@keyframes aui-slide-down{ - 0%{bottom: 10px;} - 100%{bottom: -40vh;} -} - -/* aui-slide-up-screen */ -@-ms-keyframes aui-slide-up-screen{ - 0%{bottom: -60vh;} - 100%{bottom: 0px;} -} -@-webkit-keyframes aui-slide-up-screen{ - 0%{bottom: -60vh;} - 100%{bottom: 0px;} -} -@keyframes aui-slide-up-screen{ - 0%{bottom: -60vh;} - 100%{bottom: 0px;} -} - -/* aui-slide-down-screen */ -@-ms-keyframes aui-slide-down-screen{ - 0%{bottom: 0px;} - 100%{bottom: -60vh;} -} -@-webkit-keyframes aui-slide-down-screen{ - 0%{bottom: 0px;} - 100%{bottom: -60vh;} -} -@keyframes aui-slide-down-screen{ - 0%{bottom: 0px;} - 100%{bottom: -60vh;} -} - -@-webkit-keyframes aui-slide-up_to_middle { - 0%{opacity: 0; top: -50vh; -ms-transform: translate(0,0); -webkit-transform: translate(0,0); transform: translate(0,0);} - 100%{opacity: 1; top: 45%; -ms-transform: translate(0, -50%); -webkit-transform: translate(0, -50%); transform: translate(0, -50%);} -} -@keyframes aui-slide-up_to_middle { - 0%{opacity: 0; top: -50vh; -ms-transform: translate(0,0); -webkit-transform: translate(0,0); transform: translate(0,0);} - 100%{opacity: 1; top: 45%; -ms-transform: translate(0, -50%); -webkit-transform: translate(0, -50%); transform: translate(0, -50%);} -} -@-webkit-keyframes aui-slide-middle_to_up { - 0%{opacity: 1; top: 45%; -ms-transform: translate(0, -50%); -webkit-transform: translate(0, -50%); transform: translate(0, -50%);} - 100%{opacity: 0; top: -50vh; -ms-transform: translate(0,0); -webkit-transform: translate(0,0); transform: translate(0,0);} -} -@keyframes aui-slide-middle_to_up { - 0%{opacity: 1; top: 45%; -ms-transform: translate(0, -50%); -webkit-transform: translate(0, -50%); transform: translate(0, -50%);} - 100%{opacity: 0; top: -50vh; -ms-transform: translate(0,0); -webkit-transform: translate(0,0); transform: translate(0,0);} -} \ No newline at end of file diff --git a/uniapp/components/aui-dialog/common/aui/css/aui.iconfont.css b/uniapp/components/aui-dialog/common/aui/css/aui.iconfont.css deleted file mode 100644 index e479f071..00000000 --- a/uniapp/components/aui-dialog/common/aui/css/aui.iconfont.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:"iconfont";src:url('//at.alicdn.com/t/font_1135293_z1315ov8k2t.eot?t=1589338239928');src:url('//at.alicdn.com/t/font_1135293_z1315ov8k2t.eot?t=1589338239928#iefix') format('embedded-opentype'),url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),url('//at.alicdn.com/t/font_1135293_z1315ov8k2t.woff?t=1589338239928') format('woff'),url('//at.alicdn.com/t/font_1135293_z1315ov8k2t.ttf?t=1589338239928') format('truetype'),url('//at.alicdn.com/t/font_1135293_z1315ov8k2t.svg?t=1589338239928#iconfont') format('svg')}.iconfont{font-family:"iconfont" !important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icondaojishi:before{content:"\e65e"}.iconCSS:before{content:"\e622"}.iconqiu:before{content:"\e615"}.iconradio:before{content:"\e613"}.iconradio1:before{content:"\e799"}.iconzhutise:before{content:"\e65a"}.icondatepicker1:before{content:"\e642"}.icondatepicker:before{content:"\e629"}.iconloading5:before{content:"\e635"}.iconloading7:before{content:"\e611"}.iconloading_r:before{content:"\e612"}.iconrenlianshibie:before{content:"\e798"}.iconweibiaoti-zhuanhuan-:before{content:"\e610"}.iconxingzhuang:before{content:"\e607"}.iconhuatong:before{content:"\e659"}.iconbiaoqing1:before{content:"\e797"}.iconicon-:before{content:"\e6db"}.iconjianpan:before{content:"\e670"}.iconyuyin:before{content:"\e630"}.iconluyin:before{content:"\e64b"}.iconjianpanshanchu:before{content:"\e64e"}.iconxuanxiangqia1:before{content:"\e60a"}.iconxuanxiangqialiebiao:before{content:"\e625"}.iconxialaliebiao:before{content:"\e7a7"}.iconcopy:before{content:"\e604"}.iconjiantieban:before{content:"\e605"}.iconjurassic_paste:before{content:"\e796"}.iconerweima:before{content:"\e600"}.icontupiancaijian:before{content:"\e631"}.icontupianshangchuan:before{content:"\e636"}.iconzujian-xialaxuankuang:before{content:"\e620"}.iconxuanxiangqia:before{content:"\e654"}.iconxing:before{content:"\e652"}.iconAPP:before{content:"\e601"}.iconjs:before{content:"\e6bf"}.iconshilidaima:before{content:"\e640"}.iconshouye1:before{content:"\e60f"}.icontime1:before{content:"\e614"}.iconyanjing:before{content:"\e63b"}.iconkaiyanjing:before{content:"\e6a8"}.iconsearch:before{content:"\e69e"}.iconhtbarrowright02:before{content:"\e6b4"}.iconclose1:before{content:"\e603"}.icondizhi:before{content:"\e60e"}.iconqianniudaidise:before{content:"\e78d"}.iconquestions:before{content:"\e78e"}.iconsupply:before{content:"\e78f"}.icontools:before{content:"\e790"}.iconint:before{content:"\e791"}.iconcommodity:before{content:"\e792"}.iconzhtn:before{content:"\e793"}.iconTop:before{content:"\e6ca"}.iconleft2:before{content:"\e651"}.iconleft3:before{content:"\e794"}.iconright3:before{content:"\e795"}.iconshut_down:before{content:"\e6a2"}.iconwithdraw:before{content:"\e6a4"}.iconeye_protection:before{content:"\e6a1"}.iconnickname:before{content:"\e6a5"}.iconproblem:before{content:"\e6a7"}.icondown:before{content:"\e703"}.icontop:before{content:"\e653"}.iconbianji:before{content:"\e62c"}.iconweibo:before{content:"\e62f"}.iconyidiandiantubiao03:before{content:"\e606"}.iconqq:before{content:"\e6a0"}.iconweixin:before{content:"\e6b1"}.iconright:before{content:"\e608"}.iconpengyouquan:before{content:"\e667"}.icontop1:before{content:"\e609"}.iconloading:before{content:"\e68f"}.iconLC_icon_down_line_circle:before{content:"\e657"}.iconadd:before{content:"\e656"}.iconup_s8:before{content:"\e65b"}.iconmore:before{content:"\e60b"}.iconloading2:before{content:"\e6a6"}.iconright1:before{content:"\e6c6"}.iconjian:before{content:"\e6aa"}.iconqq-copy:before{content:"\e658"}.icontupian:before{content:"\e691"}.iconleft:before{content:"\e626"}.iconadd1:before{content:"\e62b"}.iconset:before{content:"\e689"}.iconaddress:before{content:"\e602"}.icondown1:before{content:"\e6ac"}.iconjian1:before{content:"\e68e"}.iconguolv:before{content:"\e634"}.icondelete:before{content:"\e60c"}.iconaddress1:before{content:"\e60d"}.iconmore1:before{content:"\e617"}.icondown2:before{content:"\e6e9"}.iconimage:before{content:"\e6f5"}.iconimage1:before{content:"\e674"}.iconleft1:before{content:"\e675"}.icontop2:before{content:"\e676"}.iconshangchuan:before{content:"\e6a3"}.iconadd2:before{content:"\e6b3"}.iconLoading1:before{content:"\e65d"}.iconjian2:before{content:"\e62e"}.iconaddress2:before{content:"\e66b"}.iconshouye:before{content:"\e669"}.iconaccessory:before{content:"\e6dd"}.iconactivity:before{content:"\e6de"}.iconactivity_fill:before{content:"\e6df"}.iconadd3:before{content:"\e6e0"}.iconaddition_fill:before{content:"\e6e1"}.iconaddition:before{content:"\e6e2"}.iconaddpeople_fill:before{content:"\e6e3"}.iconaddpeople:before{content:"\e6e4"}.iconaddressbook_fill:before{content:"\e6e5"}.iconaddressbook:before{content:"\e6e6"}.iconbarrage_fill:before{content:"\e6e7"}.iconbarrage:before{content:"\e6e8"}.iconbrowse_fill:before{content:"\e6ea"}.iconbrowse:before{content:"\e6eb"}.iconbrush:before{content:"\e6ec"}.iconbrush_fill:before{content:"\e6ed"}.iconbusinesscard_fill:before{content:"\e6ee"}.iconbusinesscard:before{content:"\e6ef"}.iconcamera_fill:before{content:"\e6f0"}.iconcamera:before{content:"\e6f1"}.iconclock_fill:before{content:"\e6f2"}.iconclock:before{content:"\e6f3"}.iconclose:before{content:"\e6f4"}.iconcollection_fill:before{content:"\e6f6"}.iconcollection:before{content:"\e6f7"}.iconcomputer_fill:before{content:"\e6f8"}.iconcomputer:before{content:"\e6f9"}.iconcoordinates_fill:before{content:"\e6fa"}.iconcoordinates:before{content:"\e6fb"}.iconcoupons_fill:before{content:"\e6fc"}.iconcoupons:before{content:"\e6fd"}.iconcreatetask_fill:before{content:"\e6fe"}.iconcreatetask:before{content:"\e6ff"}.iconcustomerservice_fill:before{content:"\e700"}.iconcustomerservice:before{content:"\e701"}.icondelete_fill:before{content:"\e702"}.icondelete1:before{content:"\e704"}.icondocument:before{content:"\e705"}.icondocument_fill:before{content:"\e706"}.icondynamic_fill:before{content:"\e707"}.icondynamic:before{content:"\e708"}.iconeditor:before{content:"\e709"}.iconeit:before{content:"\e70a"}.iconemoji_fill:before{content:"\e70b"}.iconemoji:before{content:"\e70c"}.iconempty:before{content:"\e70d"}.iconempty_fill:before{content:"\e70e"}.iconenter:before{content:"\e70f"}.iconenterinto:before{content:"\e710"}.iconenterinto_fill:before{content:"\e711"}.iconfeedback_fill:before{content:"\e712"}.iconfeedback:before{content:"\e713"}.iconflag_fill:before{content:"\e714"}.iconflag:before{content:"\e715"}.iconflashlight:before{content:"\e716"}.iconflashlight_fill:before{content:"\e717"}.iconflip:before{content:"\e718"}.iconflip_fill:before{content:"\e719"}.iconfullscreen:before{content:"\e71a"}.icongroup:before{content:"\e71b"}.icongroup_fill:before{content:"\e71c"}.iconheadlines_fill:before{content:"\e71d"}.iconheadlines:before{content:"\e71e"}.iconhomepage_fill:before{content:"\e71f"}.iconhomepage:before{content:"\e720"}.iconintegral_fill:before{content:"\e721"}.iconintegral:before{content:"\e722"}.iconinteractive_fill:before{content:"\e723"}.iconinteractive:before{content:"\e724"}.iconkeyboard:before{content:"\e725"}.iconlabel:before{content:"\e726"}.iconlabel_fill:before{content:"\e727"}.iconlike_fill:before{content:"\e728"}.iconlike:before{content:"\e729"}.iconlive_fill:before{content:"\e72a"}.iconlive:before{content:"\e72b"}.iconlock_fill:before{content:"\e72c"}.iconlock:before{content:"\e72d"}.iconmail:before{content:"\e72e"}.iconmail_fill:before{content:"\e72f"}.iconmanage_fill:before{content:"\e730"}.iconmanage:before{content:"\e731"}.iconmessage:before{content:"\e732"}.iconmessage_fill:before{content:"\e733"}.iconmine:before{content:"\e734"}.iconmine_fill:before{content:"\e735"}.iconmobilephone_fill:before{content:"\e736"}.iconmobilephone:before{content:"\e737"}.iconmore2:before{content:"\e738"}.iconnarrow:before{content:"\e739"}.iconoffline_fill:before{content:"\e73a"}.iconoffline:before{content:"\e73b"}.iconorder_fill:before{content:"\e73c"}.iconorder:before{content:"\e73d"}.iconother:before{content:"\e73e"}.iconpeople_fill:before{content:"\e73f"}.iconpeople:before{content:"\e740"}.iconpicture_fill:before{content:"\e741"}.iconpicture:before{content:"\e742"}.iconplay:before{content:"\e743"}.iconplay_fill:before{content:"\e744"}.iconplayon_fill:before{content:"\e745"}.iconplayon:before{content:"\e746"}.iconpraise_fill:before{content:"\e747"}.iconpraise:before{content:"\e748"}.iconprompt_fill:before{content:"\e749"}.iconprompt:before{content:"\e74a"}.iconqrcode_fill:before{content:"\e74b"}.iconqrcode:before{content:"\e74c"}.iconredpacket_fill:before{content:"\e74d"}.iconredpacket:before{content:"\e74e"}.iconrefresh:before{content:"\e74f"}.iconremind_fill:before{content:"\e750"}.iconremind:before{content:"\e751"}.iconreturn:before{content:"\e752"}.iconright2:before{content:"\e753"}.iconscan:before{content:"\e754"}.iconselect_fill:before{content:"\e755"}.iconselect:before{content:"\e756"}.iconsend:before{content:"\e757"}.iconservice_fill:before{content:"\e758"}.iconservice:before{content:"\e759"}.iconsetup_fill:before{content:"\e75a"}.iconsetup:before{content:"\e75b"}.iconshare_fill:before{content:"\e75c"}.iconshare:before{content:"\e75d"}.iconshielding_fill:before{content:"\e75e"}.iconshielding:before{content:"\e75f"}.iconsmallscreen_fill:before{content:"\e760"}.iconsmallscreen:before{content:"\e761"}.iconstealth_fill:before{content:"\e762"}.iconstealth:before{content:"\e763"}.iconsuccess_fill:before{content:"\e764"}.iconsuccess:before{content:"\e765"}.iconsuspend:before{content:"\e766"}.iconswitch:before{content:"\e767"}.iconsystemprompt_fill:before{content:"\e768"}.iconsystemprompt:before{content:"\e769"}.icontailor:before{content:"\e76a"}.icontask:before{content:"\e76b"}.icontask_fill:before{content:"\e76c"}.icontasklist_fill:before{content:"\e76d"}.icontasklist:before{content:"\e76e"}.icontext:before{content:"\e76f"}.icontime_fill:before{content:"\e770"}.icontime:before{content:"\e771"}.icontranslation_fill:before{content:"\e772"}.icontranslation:before{content:"\e773"}.icontrash:before{content:"\e774"}.icontrash_fill:before{content:"\e775"}.iconundo:before{content:"\e776"}.iconunlock_fill:before{content:"\e777"}.iconunlock:before{content:"\e778"}.iconvideo:before{content:"\e779"}.iconvideo_fill:before{content:"\e77a"}.iconwarning_fill:before{content:"\e77b"}.iconwarning:before{content:"\e77c"}.iconworkbench_fill:before{content:"\e77d"}.iconworkbench:before{content:"\e77e"}.iconsearch1:before{content:"\e77f"}.iconsearchfill:before{content:"\e780"}.iconqianniu:before{content:"\e781"}.iconpublishgoods_fill:before{content:"\e782"}.iconshop_fill:before{content:"\e783"}.icontransaction_fill:before{content:"\e784"}.iconpackup:before{content:"\e785"}.iconunfold:before{content:"\e786"}.iconwangwang:before{content:"\e787"}.iconfinancial_fill:before{content:"\e788"}.iconmarketing_fill:before{content:"\e789"}.iconshake:before{content:"\e78a"}.icondecoration_fill:before{content:"\e78b"}.iconbudaidise:before{content:"\e78c"} diff --git a/uniapp/components/aui-dialog/common/aui/js/aui.js b/uniapp/components/aui-dialog/common/aui/js/aui.js deleted file mode 100644 index efa3c8fb..00000000 --- a/uniapp/components/aui-dialog/common/aui/js/aui.js +++ /dev/null @@ -1,55 +0,0 @@ -const aui = { - console: function(str){ - console.log(str); - }, - /***打开新页面 - @param {string} url 页面路径 - @param {Object} opts 参数 {id: ''} - @example: aui.openWin("index.html", {id: 1}) - */ - openWin(url, opts){ - var _this = this; - var str = '?'; - for(var i in opts){ - if(_this.isDefine(opts[i])){ - str += i + '=' + opts[i] + '&'; - } - } - uni.navigateTo({ - url: _this.isDefine(opts) ? url + str : url - }) - }, - /***关闭页面 - @example: aui.closeWin() - */ - closeWin(callback){ - //直接关闭页面,并向后台发送数据 - if(typeof callback == "function"){ - if(window.addEventListener) { - window.addEventListener("beforeunload", callback, false); - } else { - window.attachEvent("onbeforeunload", callback, false); - } - } - uni.navigateBack({ - delta: 1 - }); - }, - /***判断字符串是否为空 - @param {string} str 变量 - @example: aui.isDefine("变量"); - */ - isDefine(str){ - if (str == null || str == "" || str == "undefined" || str == undefined || str == "null" || str == "(null)" || str == 'NULL' || typeof (str) == 'undefined'){ - return false; - }else{ - str = str + ""; - str = str.replace(/\s/g, ""); - if (str == ""){return false;} - return true; - } - }, -} -export { - aui -} \ No newline at end of file diff --git a/uniapp/components/coolc-coupon/coolc-coupon.vue b/uniapp/components/coolc-coupon/coolc-coupon.vue deleted file mode 100644 index 820d07c6..00000000 --- a/uniapp/components/coolc-coupon/coolc-coupon.vue +++ /dev/null @@ -1,181 +0,0 @@ - - - - - diff --git a/uniapp/components/custom-modal/example.vue b/uniapp/components/custom-modal/example.vue deleted file mode 100644 index d10b26b1..00000000 --- a/uniapp/components/custom-modal/example.vue +++ /dev/null @@ -1,234 +0,0 @@ - - - - - \ No newline at end of file diff --git a/uniapp/components/modal/modal.vue b/uniapp/components/modal/modal.vue deleted file mode 100644 index 8538f4f4..00000000 --- a/uniapp/components/modal/modal.vue +++ /dev/null @@ -1,393 +0,0 @@ - - - - - diff --git a/uniapp/components/schedule/ScheduleDetail.vue b/uniapp/components/schedule/ScheduleDetail.vue new file mode 100644 index 00000000..fdeab7f8 --- /dev/null +++ b/uniapp/components/schedule/ScheduleDetail.vue @@ -0,0 +1,517 @@ + + + + + \ No newline at end of file diff --git a/uniapp/components/uni-icons/icons.js b/uniapp/components/uni-icons/icons.js deleted file mode 100644 index 1f5a7789..00000000 --- a/uniapp/components/uni-icons/icons.js +++ /dev/null @@ -1,96 +0,0 @@ -export default { - 'contact': '\ue100', - 'person': '\ue101', - 'personadd': '\ue102', - 'contact-filled': '\ue130', - 'person-filled': '\ue131', - 'personadd-filled': '\ue132', - 'phone': '\ue200', - 'email': '\ue201', - 'chatbubble': '\ue202', - 'chatboxes': '\ue203', - 'phone-filled': '\ue230', - 'email-filled': '\ue231', - 'chatbubble-filled': '\ue232', - 'chatboxes-filled': '\ue233', - 'weibo': '\ue260', - 'weixin': '\ue261', - 'pengyouquan': '\ue262', - 'chat': '\ue263', - 'qq': '\ue264', - 'videocam': '\ue300', - 'camera': '\ue301', - 'mic': '\ue302', - 'location': '\ue303', - 'mic-filled': '\ue332', - 'speech': '\ue332', - 'location-filled': '\ue333', - 'micoff': '\ue360', - 'image': '\ue363', - 'map': '\ue364', - 'compose': '\ue400', - 'trash': '\ue401', - 'upload': '\ue402', - 'download': '\ue403', - 'close': '\ue404', - 'redo': '\ue405', - 'undo': '\ue406', - 'refresh': '\ue407', - 'star': '\ue408', - 'plus': '\ue409', - 'minus': '\ue410', - 'circle': '\ue411', - 'checkbox': '\ue411', - 'close-filled': '\ue434', - 'clear': '\ue434', - 'refresh-filled': '\ue437', - 'star-filled': '\ue438', - 'plus-filled': '\ue439', - 'minus-filled': '\ue440', - 'circle-filled': '\ue441', - 'checkbox-filled': '\ue442', - 'closeempty': '\ue460', - 'refreshempty': '\ue461', - 'reload': '\ue462', - 'starhalf': '\ue463', - 'spinner': '\ue464', - 'spinner-cycle': '\ue465', - 'search': '\ue466', - 'plusempty': '\ue468', - 'forward': '\ue470', - 'back': '\ue471', - 'left-nav': '\ue471', - 'checkmarkempty': '\ue472', - 'home': '\ue500', - 'navigate': '\ue501', - 'gear': '\ue502', - 'paperplane': '\ue503', - 'info': '\ue504', - 'help': '\ue505', - 'locked': '\ue506', - 'more': '\ue507', - 'flag': '\ue508', - 'home-filled': '\ue530', - 'gear-filled': '\ue532', - 'info-filled': '\ue534', - 'help-filled': '\ue535', - 'more-filled': '\ue537', - 'settings': '\ue560', - 'list': '\ue562', - 'bars': '\ue563', - 'loop': '\ue565', - 'paperclip': '\ue567', - 'eye': '\ue568', - 'arrowup': '\ue580', - 'arrowdown': '\ue581', - 'arrowleft': '\ue582', - 'arrowright': '\ue583', - 'arrowthinup': '\ue584', - 'arrowthindown': '\ue585', - 'arrowthinleft': '\ue586', - 'arrowthinright': '\ue587', - 'pulldown': '\ue588', - 'closefill': '\ue589', - 'sound': '\ue590', - 'scan': '\ue612' -} diff --git a/uniapp/components/uni-icons/uni-icons.vue b/uniapp/components/uni-icons/uni-icons.vue deleted file mode 100644 index 85b41805..00000000 --- a/uniapp/components/uni-icons/uni-icons.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - diff --git a/uniapp/components/uni-nav-bar/uni-nav-bar.vue b/uniapp/components/uni-nav-bar/uni-nav-bar.vue index 7eb8e74a..6cb13734 100644 --- a/uniapp/components/uni-nav-bar/uni-nav-bar.vue +++ b/uniapp/components/uni-nav-bar/uni-nav-bar.vue @@ -42,13 +42,11 @@ diff --git a/uniapp/pages/coach/schedule/README.md b/uniapp/pages/coach/schedule/README.md new file mode 100644 index 00000000..dc9aa09f --- /dev/null +++ b/uniapp/pages/coach/schedule/README.md @@ -0,0 +1,175 @@ +# 课程安排表组件 + +## 功能特性 + +### 📅 完整的课程表视图 +- **时间轴显示**:11:00-17:00 每小时时间段 +- **周视图**:显示一周7天的课程安排 +- **双向滚动**:支持水平(日期)和垂直(时间)滚动 +- **响应式布局**:适配微信小程序端 + +### 🔍 智能筛选功能 +- **顶部快捷筛选**:时间、老师、教室、班级 +- **详细筛选弹窗**:支持多选条件组合筛选 +- **实时统计**:显示总课程数和未点名课程数 + +### 🎨 主题样式 +- **暗黑主题**:#292929 背景色 +- **绿色主色调**:#29d3b4 强调色 +- **层次化设计**:清晰的视觉层级 + +### 📱 交互体验 +- **日期导航**:支持上一周/下一周切换 +- **课程类型**:普通课程、私教课程、活动课程区分显示 +- **点击交互**:支持单元格点击添加课程 +- **悬浮按钮**:快速添加课程 + +## 使用方法 + +### 1. 页面导航 +```javascript +// 跳转到课程安排表 +this.$navigateTo({ + url: '/pages/coach/schedule/schedule_table' +}) +``` + +### 2. 数据结构 + +#### 课程数据格式 +```javascript +{ + id: 1, // 课程ID + date: '2025-07-02', // 日期 + time: '11:00', // 时间 + courseName: '花花-丁颖', // 课程名称 + students: '小鱼-周子', // 学员 + teacher: '燕子-符', // 老师 + status: '燕菜', // 状态 + type: 'normal', // 类型:normal/private/activity + duration: 1 // 持续时间(小时) +} +``` + +#### 筛选选项格式 +```javascript +{ + teacherOptions: [ + { id: 1, name: '张老师' } + ], + classroomOptions: [ + { id: 1, name: '教室1' } + ], + classOptions: [ + { id: 1, name: '花花-丁颖' } + ] +} +``` + +### 3. 自定义配置 + +#### 修改时间段 +```javascript +// 在 data 中修改 timeSlots +timeSlots: [ + { time: '09:00', value: 9 }, + { time: '10:00', value: 10 }, + // ... 更多时间段 +] +``` + +#### 修改表格宽度 +```javascript +// 调整表格总宽度(rpx) +tableWidth: 1200 +``` + +### 4. API 接口集成 + +#### 获取课程数据 +```javascript +async loadCourses() { + try { + const res = await apiRoute.getCourseSchedule({ + startDate: this.currentWeekStart, + endDate: this.getWeekEndDate() + }) + this.courses = res.data + } catch (error) { + console.error('加载课程失败:', error) + } +} +``` + +#### 添加课程 +```javascript +async addCourse(courseData) { + try { + const res = await apiRoute.addCourseSchedule(courseData) + if (res.code === 1) { + this.loadCourses() // 重新加载数据 + } + } catch (error) { + console.error('添加课程失败:', error) + } +} +``` + +## 性能优化建议 + +### 1. 数据懒加载 +- 只加载当前周的数据 +- 切换周时再加载新数据 + +### 2. 滚动优化 +- 使用 `scroll-view` 组件的惯性滚动 +- 避免在滚动事件中进行复杂计算 + +### 3. 渲染优化 +- 使用 `v-show` 替代 `v-if` 进行显示隐藏 +- 合理使用 `key` 属性优化列表渲染 + +## 扩展功能 + +### 1. 课程详情 +```javascript +// 点击课程查看详情 +handleCourseClick(course) { + this.$navigateTo({ + url: `/pages/coach/course/info?id=${course.id}` + }) +} +``` + +### 2. 拖拽排课 +```javascript +// 可以集成拖拽功能实现课程时间调整 +// 使用 movable-view 组件或手势事件 +``` + +### 3. 批量操作 +```javascript +// 支持批量选择和操作课程 +// 添加多选模式 +``` + +## 注意事项 + +1. **微信小程序兼容性**:使用了 `scroll-view` 组件,确保在微信小程序中正常滚动 +2. **数据更新**:切换日期时需要重新加载数据 +3. **内存管理**:大量数据时考虑虚拟滚动优化 +4. **网络状态**:处理网络异常情况,提供离线缓存 + +## troubleshooting + +### 滚动不流畅 +- 检查 `scroll-view` 的高度设置 +- 减少滚动事件中的计算量 + +### 数据不更新 +- 确保数据是响应式的 +- 检查 Vue 数据绑定是否正确 + +### 样式错位 +- 检查 flex 布局设置 +- 确保单元格宽度一致 \ No newline at end of file diff --git a/uniapp/pages/coach/schedule/schedule_detail.vue b/uniapp/pages/coach/schedule/schedule_detail.vue new file mode 100644 index 00000000..b3d6158c --- /dev/null +++ b/uniapp/pages/coach/schedule/schedule_detail.vue @@ -0,0 +1,481 @@ + + + + + \ No newline at end of file diff --git a/uniapp/pages/coach/schedule/schedule_table.vue b/uniapp/pages/coach/schedule/schedule_table.vue new file mode 100644 index 00000000..72cb7c34 --- /dev/null +++ b/uniapp/pages/coach/schedule/schedule_table.vue @@ -0,0 +1,1066 @@ + + + + + + \ No newline at end of file diff --git a/uniapp/pages/coach/student/student_list.vue b/uniapp/pages/coach/student/student_list.vue index e59dcaf3..22bf29b2 100644 --- a/uniapp/pages/coach/student/student_list.vue +++ b/uniapp/pages/coach/student/student_list.vue @@ -1,5 +1,9 @@ @@ -48,7 +109,28 @@ }, data() { return { - studentList: [] + studentList: [], + showSearch: false, + showCoursePicker: false, + showClassPicker: false, + searchForm: { + name: '', + phone: '', + lessonCount: '', + leaveCount: '', + courseIndex: -1, + classIndex: -1, + }, + courseList: [ + { name: '英语基础班' }, + { name: '数学提高班' }, + { name: '编程兴趣班' }, + ], + classList: [ + { name: '一班' }, + { name: '二班' }, + { name: '三班' }, + ], } }, onLoad() { @@ -69,63 +151,64 @@ icon: 'none' }); } - - // 使用模拟数据 - // this.studentList = [ - // { - // id: 1, - // name: '张三', - // avatar: '/static/icon-img/avatar.png', - // campus: '总部校区', - // remainingCourses: 10, - // expiryDate: '2023-12-31' - // }, - // { - // id: 2, - // name: '李四', - // avatar: '/static/icon-img/avatar.png', - // campus: '西区校区', - // remainingCourses: 5, - // expiryDate: '2023-11-15' - // }, - // { - // id: 3, - // name: '王五', - // avatar: '/static/icon-img/avatar.png', - // campus: '东区校区', - // remainingCourses: 15, - // expiryDate: '2024-01-20' - // }, - // { - // id: 4, - // name: '赵六', - // avatar: '/static/icon-img/avatar.png', - // campus: '南区校区', - // remainingCourses: 8, - // expiryDate: '2023-11-30' - // }, - // { - // id: 5, - // name: '刘七', - // avatar: '/static/icon-img/avatar.png', - // campus: '北区校区', - // remainingCourses: 20, - // expiryDate: '2024-02-15' - // }, - // { - // id: 6, - // name: '陈八', - // avatar: '/static/icon-img/avatar.png', - // campus: '总部校区', - // remainingCourses: 3, - // expiryDate: '2023-10-30' - // } - // ]; }, goToDetail(student) { uni.navigateTo({ url: `/pages/market/clue/clue_info?resource_sharing_id=`+student.resource_sharing_id }); + }, + getRemainingCourses(item) { + const totalHours = (item.total_hours || 0) + + (item.gift_hours || 0); + const usedHours = (item.use_total_hours || + 0) + (item.use_gift_hours || 0); + return totalHours - usedHours; + }, + + // 输入处理方法 + onNameInput(e) { + this.searchForm.name = e; + }, + onPhoneInput(e) { + this.searchForm.phone = e; + }, + onLessonCountInput(e) { + this.searchForm.lessonCount = e; + }, + onLeaveCountInput(e) { + this.searchForm.leaveCount = e; + }, + + // 选择器变更处理 + onCourseChange(e) { + this.searchForm.courseIndex = e.detail.value; + }, + onClassChange(e) { + this.searchForm.classIndex = e.detail.value; + }, + + // 关闭搜索窗口 + closeSearch() { + this.showSearch = false; + }, + + doSearch() { + // 这里可以根据 searchForm 的内容进行筛选或请求 + this.showSearch = false; + + // 提示正在搜索 + uni.showLoading({ + title: '搜索中...' + }); + + // 模拟搜索过程 + setTimeout(() => { + uni.hideLoading(); + uni.showToast({ + title: '搜索功能待实现', + icon: 'none' + }); + }, 800); } } } @@ -134,7 +217,27 @@ \ No newline at end of file diff --git a/uniapp/pages/common/contract/contract_detail.vue b/uniapp/pages/common/contract/contract_detail.vue index f536eee7..361e770a 100644 --- a/uniapp/pages/common/contract/contract_detail.vue +++ b/uniapp/pages/common/contract/contract_detail.vue @@ -174,7 +174,7 @@ export default { id: this.contractId }) - if (response.data.code === 1) { + if (response.code === 1) { this.contractData = response.data.data || {} } else { uni.showToast({ diff --git a/uniapp/pages/common/contract/contract_sign.vue b/uniapp/pages/common/contract/contract_sign.vue index 6e09572e..0529df3a 100644 --- a/uniapp/pages/common/contract/contract_sign.vue +++ b/uniapp/pages/common/contract/contract_sign.vue @@ -113,6 +113,7 @@ @@ -1115,7 +1164,7 @@ .action-buttons { display: flex; align-items: center; - + .btn-item { width: 60rpx; height: 60rpx; @@ -1123,7 +1172,7 @@ align-items: center; justify-content: center; margin-left: 20rpx; - + .btn-icon { width: 40rpx; height: 40rpx; @@ -1163,98 +1212,114 @@ background-color: #292929; } } - .course_box_top{ + + .course_box_top { width: 100%; height: 60%; } - .course_box_centre{ + + .course_box_centre { margin: auto; width: 95%; height: 4rpx; background: #F5F5F8; } - .course_box_below{ + + .course_box_below { width: 100%; height: 40%; display: flex; justify-content: space-between; } + .course_box_top_top { display: flex; align-items: center; gap: 20rpx; - + .pic { width: 44rpx; height: 44rpx; border-radius: 50%; } - + .name { color: #333333; font-size: 28rpx; } } - .course_box_top_below{ + + .course_box_top_below { display: flex; align-items: center; justify-content: space-between; } - .course_box_top_below-left{ + + .course_box_top_below-left { display: flex; align-items: center; padding-top: 16rpx; font-size: 24rpx; } + .drop-image-x { width: 20rpx; height: 20rpx; } + .title-x { font-size: 28rpx; color: #333333; padding-left: 10rpx; } - .course_box_top_below-right{ + + .course_box_top_below-right { padding-top: 16rpx; font-size: 24rpx; display: flex; align-items: center; } + .drop-image-star { width: 40rpx; height: 40rpx; } - .selected-text{ + + .selected-text { color: #1CD188; display: flex; align-items: center; } - .text{ + + .text { color: #333333; display: flex; align-items: center; } - .basic-message{ + + .basic-message { color: #fff; padding: 16rpx 60rpx; display: flex; justify-content: space-between; } - .basic-message-div{ + + .basic-message-div { width: 92%; margin: auto; background: #555555; border-radius: 16rpx; padding: 16rpx 0; } - .basic-message-div-txt{ + + .basic-message-div-txt { display: flex; justify-content: space-between; color: #FFFFFF; padding: 14rpx 30rpx; } - .bottom-label{ + + .bottom-label { width: 100%; height: 150rpx; background: #fff; @@ -1266,7 +1331,7 @@ align-items: center; padding: 0 30rpx; } - + // 自定义弹窗样式 .custom-popup-dialog { width: 650rpx; @@ -1274,52 +1339,52 @@ background-color: #fff; overflow: hidden; } - + .dialog-header { padding: 30rpx; text-align: center; border-bottom: 1px solid #eee; } - + .dialog-title { font-size: 32rpx; font-weight: bold; color: #333; } - + .dialog-content { padding: 30rpx; } - + .dialog-footer { display: flex; border-top: 1px solid #eee; } - + .dialog-btn { flex: 1; padding: 25rpx 0; text-align: center; font-size: 30rpx; } - + .cancel-btn { color: #666; border-right: 1px solid #eee; } - + .confirm-btn { color: #29D3B4; font-weight: bold; } - + // 备注文本框样式 .remark-textarea-container { width: 100%; position: relative; padding: 10rpx 0; } - + .remark-textarea { width: 100%; height: 240rpx; @@ -1330,7 +1395,7 @@ background-color: #f8f8f8; box-sizing: border-box; } - + .remark-count { position: absolute; bottom: 20rpx; @@ -1338,19 +1403,20 @@ font-size: 24rpx; color: #999; } - + // 备注按钮样式 .remark-btn { - background-color: #29D3B4 !important; - color: white !important; - margin: 0 !important; - padding: 0 20rpx !important; - height: 60rpx !important; + background-color: #29D3B4 !important; + color: white !important; + margin: 0 !important; + padding: 0 20rpx !important; + height: 60rpx !important; line-height: 60rpx !important; font-size: 24rpx !important; border-radius: 30rpx !important; } - .follow-records-list{ + + .follow-records-list { width: 92%; background: #434544; border-radius: 16rpx; @@ -1359,7 +1425,8 @@ color: #fff; position: relative; } - .same-community{ + + .same-community { width: 120rpx; background: #3d4a55; color: #1e62a9; @@ -1370,7 +1437,8 @@ text-align: center; border-radius: 40rpx 70rpx 70rpx 12rpx; } - .coeducation{ + + .coeducation { width: 120rpx; background: #3d4a55; color: #2e9380; @@ -1381,7 +1449,8 @@ text-align: center; border-radius: 40rpx 70rpx 70rpx 12rpx; } - .same-community{ + + .same-community { width: 120rpx; background: #40504c; color: #1e62a9; @@ -1392,13 +1461,15 @@ text-align: center; border-radius: 40rpx 70rpx 70rpx 12rpx; } - .search{ + + .search { width: 92%; margin: auto; display: flex; margin-top: 20rpx; } - .selected{ + + .selected { background: #294e48; border-radius: 16rpx; padding: 12rpx 8rpx; @@ -1406,7 +1477,8 @@ color: #29d3b4; margin-left: 5rpx; } - .not-selected{ + + .not-selected { margin-left: 5rpx; background: #ffffff; border: 4rpx #959595 solid; @@ -1414,6 +1486,7 @@ padding: 12rpx 8rpx; text-align: center; } + .call-record-item { width: 100%; background: #434544; @@ -1423,52 +1496,60 @@ color: #fff; position: relative; } + .call-record-header { display: flex; justify-content: space-between; align-items: center; } + .call-name { font-size: 28rpx; font-weight: bold; } + .call-time { font-size: 24rpx; color: #999; } + .call-record-content { display: flex; justify-content: space-between; align-items: center; } + .call-detail { display: flex; align-items: center; } + .call-label { font-size: 24rpx; color: #999; margin-right: 10rpx; } + .call-remark { margin-top: 10rpx; } + .call-remark-content { font-size: 24rpx; color: #fff; } - + // 通话记录样式 .call-log { width: 100%; padding: 0 20rpx; box-sizing: border-box; } - + .call-record-wrapper { margin-bottom: 20rpx; } - + .call-record-item { width: 100%; background: #3D3D3D; @@ -1477,7 +1558,7 @@ color: #fff; box-sizing: border-box; } - + .call-record-header { display: flex; justify-content: space-between; @@ -1486,42 +1567,42 @@ border-bottom: 1px solid #4A4A4A; padding-bottom: 10rpx; } - + .call-name { font-size: 28rpx; font-weight: bold; color: #fff; } - + .call-time { font-size: 24rpx; color: #999; } - + .call-record-content { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10rpx; } - + .call-detail { display: flex; align-items: center; } - + .call-label { font-size: 24rpx; color: #999; margin-right: 10rpx; } - + .call-remark { margin-top: 10rpx; padding-top: 10rpx; border-top: 1px solid #4A4A4A; } - + .call-remark-content { font-size: 24rpx; color: #fff; @@ -1530,12 +1611,12 @@ width: 90%; vertical-align: top; } - + // 课程信息样式 .course-info { padding: 20rpx; } - + .course-item { background: #3D3D3D; border-radius: 16rpx; @@ -1543,7 +1624,7 @@ margin-bottom: 20rpx; color: #fff; } - + .course-header { display: flex; justify-content: space-between; @@ -1552,42 +1633,42 @@ padding-bottom: 15rpx; border-bottom: 1px solid #4A4A4A; } - + .course-title { font-size: 32rpx; font-weight: bold; color: #fff; } - + .course-status { padding: 8rpx 16rpx; border-radius: 12rpx; font-size: 24rpx; color: #fff; } - + .status-active { background: #29d3b4; } - + .status-expired { background: #ff6b6b; } - + .status-completed { background: #999; } - + .status-default { background: #666; } - + .course-progress { display: flex; align-items: center; margin-bottom: 20rpx; } - + .progress-bar { flex: 1; height: 12rpx; @@ -1596,51 +1677,51 @@ overflow: hidden; margin-right: 20rpx; } - + .progress-fill { height: 100%; background: linear-gradient(to right, #29d3b4, #1ea08e); border-radius: 6rpx; transition: width 0.3s ease; } - + .progress-text { font-size: 26rpx; color: #29d3b4; min-width: 120rpx; text-align: right; } - + .course-details { margin-bottom: 20rpx; } - + .detail-row { display: flex; justify-content: space-between; margin-bottom: 15rpx; font-size: 28rpx; } - + .detail-label { color: #999; } - + .detail-value { color: #fff; } - + .course-actions { text-align: center; padding-top: 15rpx; border-top: 1px solid #4A4A4A; } - + .action-btn { color: #29d3b4; font-size: 28rpx; } - + .empty-course { display: flex; flex-direction: column; @@ -1648,19 +1729,19 @@ justify-content: center; padding: 100rpx 0; } - + .empty-img { width: 200rpx; height: 200rpx; opacity: 0.5; margin-bottom: 30rpx; } - + .empty-text { color: #999; font-size: 28rpx; } - + // 教练配置编辑弹窗样式 .popup-container { width: 90vw; @@ -1670,7 +1751,7 @@ box-shadow: 0 10rpx 40rpx rgba(0, 0, 0, 0.3); overflow: hidden; } - + .popup-header { display: flex; justify-content: space-between; @@ -1679,12 +1760,12 @@ background: #29d3b4; color: #fff; } - + .popup-title { font-size: 36rpx; font-weight: bold; } - + .popup-close { font-size: 40rpx; width: 60rpx; @@ -1695,12 +1776,12 @@ border-radius: 50%; background: rgba(255, 255, 255, 0.2); } - + .popup-footer { display: flex; border-top: 1px solid #eee; } - + .popup-btn { flex: 1; padding: 30rpx; @@ -1708,20 +1789,20 @@ font-size: 32rpx; font-weight: bold; } - + .cancel-btn { color: #666; border-right: 1px solid #eee; } - + .confirm-btn { color: #29d3b4; } - + .popup-btn:active { background: #f5f5f5; } - + .course-edit-container { width: 100%; max-height: 60vh; @@ -1729,12 +1810,12 @@ padding: 30rpx 20rpx; box-sizing: border-box; } - + .edit-section { margin-bottom: 40rpx; width: 100%; } - + .section-title { font-size: 32rpx; font-weight: bold; @@ -1743,7 +1824,7 @@ padding-bottom: 15rpx; border-bottom: 2px solid #29d3b4; } - + .coach-list { width: 100%; max-height: 300rpx; @@ -1752,7 +1833,7 @@ border-radius: 12rpx; background: #fff; } - + .coach-item { display: flex; justify-content: space-between; @@ -1764,26 +1845,26 @@ min-height: 80rpx; box-sizing: border-box; } - + .coach-item:last-child { border-bottom: none; } - + .coach-item.selected { background: #f0f9ff; border-left: 4rpx solid #29d3b4; } - + .coach-item:active { background: #f5f5f5; } - + .coach-name { font-size: 30rpx; color: #333; flex: 1; } - + .coach-check { color: #29d3b4; font-size: 36rpx; diff --git a/uniapp/pages/market/clue/order_list.vue b/uniapp/pages/market/clue/order_list.vue index cf671517..6e36bf6f 100644 --- a/uniapp/pages/market/clue/order_list.vue +++ b/uniapp/pages/market/clue/order_list.vue @@ -57,7 +57,18 @@ 支付时间: {{ v.payment_time || '' }} - + + + + + + 合同签订 + + + + 发票下载 + + @@ -259,7 +270,13 @@ 支付二维码 + + + + + + @@ -298,6 +315,7 @@ export default { isReachedBottom: false,//防止重复加载|true=不可加载|false=可加载 showCustomModal: false, qrcode: 'https://www.baidu.com', + qrcodeImage:'', //筛选条件 filteredData: { page: 1,//当前页码 @@ -842,6 +860,7 @@ export default { // 这里调用扫码支付相关接口 apiRoute.getOrderPayQrcode({ order_id: orderData.id }).then(res => { this.qrcode = res.data.code_url + this.qrcodeImage = res.data.qrcode_url this.showCustomModal = true }) }, @@ -884,8 +903,70 @@ export default { }) }, - handleButtonClick(){ - + // 处理按钮点击 + handleButtonClick() { + this.showCustomModal = false + uni.showToast({ + title: '二维码已发送', + icon: 'success' + }) + }, + + // 处理合同签订 + handleContractSign(orderData) { + console.log('处理合同签订:', orderData) + // 防止事件冒泡触发卡片点击 + event.stopPropagation() + + // 显示加载中 + uni.showLoading({ + title: '加载中...' + }) + + // 这里根据实际情况调用合同签订相关接口 + setTimeout(() => { + uni.hideLoading() + + // 跳转到合同签订页面 + uni.navigateTo({ + url: `/pages/market/clue/contract_sign?order_id=${orderData.id}` + }).catch(err => { + // 如果页面不存在,则显示提示 + console.error('导航错误:', err) + uni.showToast({ + title: '合同签订功能开发中', + icon: 'none' + }) + }) + }, 500) + }, + + // 处理发票下载 + handleInvoiceDownload(orderData) { + console.log('处理发票下载:', orderData) + // 防止事件冒泡触发卡片点击 + event.stopPropagation() + + // 检查订单是否有发票 + if (!orderData.invoice_url) { + uni.showToast({ + title: '暂无电子发票', + icon: 'none' + }) + return + } + + // 显示加载中 + uni.showLoading({ + title: '准备下载...' + }) + + // 调用发票下载方法 + this.downloadFile(orderData.invoice_url || this.$util.img(orderData.file_data)) + + setTimeout(() => { + uni.hideLoading() + }, 1000) } }, } @@ -977,6 +1058,33 @@ export default { width: 100%; } } + + // 按钮操作区域样式 + .action-buttons { + display: flex; + justify-content: space-between; + margin-top: 30rpx; + padding-top: 20rpx; + border-top: 1px solid #555; + + .action-btn { + display: flex; + align-items: center; + justify-content: center; + flex: 1; + padding: 16rpx 0; + + text { + margin-left: 10rpx; + color: #29D3B4; + font-size: 28rpx; + } + + &.contract-btn { + border-right: 1px solid #555; + } + } + } } } diff --git a/uniapp/pages/test/dict_test.vue b/uniapp/pages/test/dict_test.vue deleted file mode 100644 index 85e703e3..00000000 --- a/uniapp/pages/test/dict_test.vue +++ /dev/null @@ -1,263 +0,0 @@ - - - - - \ No newline at end of file