From b8f0f151bf90fc9721082645c4d8c9b4cc3fa630 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 14 Aug 2025 11:20:16 +0800 Subject: [PATCH 01/29] update --- app/Console/Commands/AutoSchoolmate.php | 60 +++++++++++++++++++ app/Console/Kernel.php | 2 + .../Admin/CourseContentController.php | 43 +++++++++++++ app/Http/Controllers/Admin/UserController.php | 1 + .../Controllers/Mobile/CourseController.php | 56 +++++++++++++---- .../2025_08_14_103426_alert_courses_table.php | 32 ++++++++++ .../2025_08_14_105924_alert_users_table.php | 33 ++++++++++ routes/api.php | 1 + 8 files changed, 217 insertions(+), 11 deletions(-) create mode 100755 app/Console/Commands/AutoSchoolmate.php create mode 100644 database/migrations/2025_08_14_103426_alert_courses_table.php create mode 100644 database/migrations/2025_08_14_105924_alert_users_table.php diff --git a/app/Console/Commands/AutoSchoolmate.php b/app/Console/Commands/AutoSchoolmate.php new file mode 100755 index 0000000..beefbe8 --- /dev/null +++ b/app/Console/Commands/AutoSchoolmate.php @@ -0,0 +1,60 @@ +where('auto_schoolmate', 1)->get(); + foreach ($courses as $course) { + // 获取报名通过的学员 + $courseSigns = CourseSign::where('course_id', $course->id)->where('status', 1)->get(); + // 用户设置成校友 + User::whereIn('id', $courseSigns->pluck('user_id'))->update(['is_schoolmate' => 1]); + } + return $this->info('更新完成'); + } + +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 1be6ee8..f1b43ea 100755 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -28,6 +28,8 @@ class Kernel extends ConsoleKernel $schedule->command('push_courses')->dailyAt('23:00'); // 更新学员编号 $schedule->command('update_user_no')->dailyAt('00:05'); + // 更新课程校友资格 + $schedule->command('auto_schoolmate')->dailyAt('23:50'); } /** diff --git a/app/Http/Controllers/Admin/CourseContentController.php b/app/Http/Controllers/Admin/CourseContentController.php index 7af167d..803836a 100755 --- a/app/Http/Controllers/Admin/CourseContentController.php +++ b/app/Http/Controllers/Admin/CourseContentController.php @@ -171,6 +171,49 @@ class CourseContentController extends BaseController return parent::save(); } + /** + * @OA\Post( + * path="/api/admin/course-contents/batch-save", + * tags={"排课"}, + * summary="更新或新增", + * @OA\Parameter(name="id", in="query", @OA\Schema(type="integer"), required=true, description="课程ID,多个英文逗号分割"), + * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="验证token"), + * @OA\Parameter(name="course_id", in="query", @OA\Schema(type="integer"), description="课程ID"), + * @OA\Parameter(name="start_time", in="query", @OA\Schema(type="string"), description="开始时间,例如:11:00"), + * @OA\Parameter(name="end_time", in="query", @OA\Schema(type="string"), description="结束时间,例如:11:00"), + * @OA\Parameter(name="date", in="query", @OA\Schema(type="string", format="date"), description="日期"), + * @OA\Parameter(name="teacher_id", in="query", @OA\Schema(type="integer"), description="老师ID"), + * @OA\Parameter(name="address", in="query", @OA\Schema(type="string"), description="地址"), + * @OA\Parameter(name="theme", in="query", @OA\Schema(type="string"), description="主题"), + * @OA\Parameter(name="longitude", in="query", @OA\Schema(type="string"), description="经度"), + * @OA\Parameter(name="latitude", in="query", @OA\Schema(type="string"), description="纬度"), + * @OA\Parameter(name="address_detail", in="query", @OA\Schema(type="string"), description="详细地址"), + * @OA\Parameter(name="file_ids", in="query", @OA\Schema(type="string"), description="文件id数组"), + * @OA\Response( + * response=200, + * description="操作成功" + * ) + * ) + */ + public function batchSave() + { + $all = \request()->all(); + DB::beginTransaction(); + try { + $ids = explode(',', $all['id']); + foreach ($ids as $id) { + $model = $this->model->find($id); + $model->fill($all); + $model->save(); + } + DB::commit(); + return $this->success("更新成功"); + } catch (\Exception $exception) { + DB::rollBack(); + return $this->fail([$exception->getCode(), $exception->getMessage()]); + } + } + /** * @OA\Get( * path="/api/admin/course-contents/destroy", diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index cce36f9..5b2f1bb 100755 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -402,6 +402,7 @@ class UserController extends BaseController * @OA\Parameter(name="company_need_fund", in="query", @OA\Schema(type="integer"), description="公司是否需要融资0否1是"), * @OA\Parameter(name="sign_from", in="query", @OA\Schema(type="string"), description="报名信息来源"), * @OA\Parameter(name="remark", in="query", @OA\Schema(type="string"), description="备注"), + * @OA\Parameter(name="is_black", in="query", @OA\Schema(type="string"), description="是否黑名单0否1是"), * @OA\Parameter(name="has_appointment_total", in="query", @OA\Schema(type="string"), description="预约剩余次数"), * @OA\Response( * response=200, diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index baa9074..42cab33 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -236,6 +236,7 @@ class CourseController extends CommonController * path="/api/mobile/course/my-course-content", * tags={"小程序-课程"}, * summary="我的课表", + * @OA\Parameter(name="date", in="query", @OA\Schema(type="string"), required=false, description="日期"), * @OA\Response( * response=200, * description="操作成功" @@ -244,18 +245,24 @@ class CourseController extends CommonController */ public function myCourseContent() { - $list = CourseContent::with('course.typeDetail', 'teacher', 'courseContentEvaluation')->whereHas('course', function ($query) { - $query->where('course_status', '!=', 40)->where('course_content_status', 1); - $query->whereHas('courseSigns', function ($query) { - $query->where('user_id', $this->getUserId())->where('status', 1)->where(function ($q) { - $q->where('fee_status', 1)->orWhere(function ($q) { - $q->whereHas('course', function ($qry) { - $qry->where('is_fee', 0); + $date = request('date'); + $list = CourseContent::with('course.typeDetail', 'teacher', 'courseContentEvaluation') + ->where(function ($query) use ($date) { + if ($date) { + $query->where('date', $date); + } + })->whereHas('course', function ($query) { + $query->where('course_status', '!=', 40)->where('course_content_status', 1); + $query->whereHas('courseSigns', function ($query) { + $query->where('user_id', $this->getUserId())->where('status', 1)->where(function ($q) { + $q->where('fee_status', 1)->orWhere(function ($q) { + $q->whereHas('course', function ($qry) { + $qry->where('is_fee', 0); + }); }); }); }); - }); - })->orderBy('date')->get(); + })->orderBy('date')->get(); return $this->success(compact('list')); } @@ -492,6 +499,7 @@ class CourseController extends CommonController * path="/api/mobile/course/content-check", * tags={"小程序-课程"}, * summary="签到", + * @OA\Parameter(name="batch_sign", in="query", @OA\Schema(type="string"), required=false, description="是否同日期批量签到0否1是"), * @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="string"), required=false, description="课表id"), * @OA\Parameter(name="longitude", in="query", @OA\Schema(type="string"), required=false, description="longitude"), * @OA\Parameter(name="latitude", in="query", @OA\Schema(type="string"), required=false, description="latitude"), @@ -525,7 +533,8 @@ class CourseController extends CommonController return $this->fail([ResponseCode::ERROR_BUSINESS, '超出打卡范围']); } // 判断当天才能签到 - if (date('Y-m-d') != $courseContent->date) { + $today = date('Y-m-d'); + if ($today != $courseContent->date) { return $this->fail([ResponseCode::ERROR_BUSINESS, '不在签到时间']); } // 不能重复签到 @@ -541,7 +550,32 @@ class CourseController extends CommonController 'longitude' => $all['longitude'], 'latitude' => $all['latitude'], ]); - return $this->success('打卡成功'); + // 同日期课程批量签到 + $batch_sign = request('batch_sign', 0); + if ($batch_sign) { + $courseContentList = CourseContent::where('date', $today) + ->whereHas('course', function ($query) { + $query->where('course_status', '!=', 40)->where('course_content_status', 1); + $query->whereHas('courseSigns', function ($query) { + $query->where('user_id', $this->getUserId())->where('status', 1)->where(function ($q) { + $q->where('fee_status', 1)->orWhere(function ($q) { + $q->whereHas('course', function ($qry) { + $qry->where('is_fee', 0); + }); + }); + }); + }); + })->get(); + foreach ($courseContentList as $courseContent) { + CourseContentCheck::create([ + 'course_content_id' => $courseContent->id, + 'user_id' => $this->getUserId(), + 'longitude' => $all['longitude'], + 'latitude' => $all['latitude'], + ]); + } + } + return $this->success('签到成功'); } /** diff --git a/database/migrations/2025_08_14_103426_alert_courses_table.php b/database/migrations/2025_08_14_103426_alert_courses_table.php new file mode 100644 index 0000000..9f14527 --- /dev/null +++ b/database/migrations/2025_08_14_103426_alert_courses_table.php @@ -0,0 +1,32 @@ +boolean('auto_schoolmate')->default(false)->comment('已审核学员是否自动进入校友库0否1是'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('courses', function (Blueprint $table) { + // + }); + } +}; diff --git a/database/migrations/2025_08_14_105924_alert_users_table.php b/database/migrations/2025_08_14_105924_alert_users_table.php new file mode 100644 index 0000000..868ef19 --- /dev/null +++ b/database/migrations/2025_08_14_105924_alert_users_table.php @@ -0,0 +1,33 @@ +boolean('is_black')->default(0)->comment('是否黑名单'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + // + }); + } +}; diff --git a/routes/api.php b/routes/api.php index 7c26c4b..0d88f95 100755 --- a/routes/api.php +++ b/routes/api.php @@ -54,6 +54,7 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () { Route::get('course-contents/index', [\App\Http\Controllers\Admin\CourseContentController::class, "index"]); Route::get('course-contents/show', [\App\Http\Controllers\Admin\CourseContentController::class, "show"]); Route::post('course-contents/save', [\App\Http\Controllers\Admin\CourseContentController::class, "save"]); + Route::post('course-contents/batch-save', [\App\Http\Controllers\Admin\CourseContentController::class, "batchSave"]); Route::get('course-contents/destroy', [\App\Http\Controllers\Admin\CourseContentController::class, "destroy"]); Route::post('course-contents/excel-show', [\App\Http\Controllers\Admin\CourseContentController::class, "excelShow"]); Route::post('course-contents/import', [\App\Http\Controllers\Admin\CourseContentController::class, "import"]); From d08682bbfe77e2ab9dabd04dfa9e119445525af5 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 14 Aug 2025 11:39:48 +0800 Subject: [PATCH 02/29] update --- .../Admin/SupplyDemandController.php | 56 +++++++++++++++++++ .../Controllers/Mobile/CourseController.php | 1 + ...931_create_course_content_checks_table.php | 2 + routes/api.php | 2 + 4 files changed, 61 insertions(+) diff --git a/app/Http/Controllers/Admin/SupplyDemandController.php b/app/Http/Controllers/Admin/SupplyDemandController.php index 2181644..3e40c56 100755 --- a/app/Http/Controllers/Admin/SupplyDemandController.php +++ b/app/Http/Controllers/Admin/SupplyDemandController.php @@ -6,6 +6,7 @@ use App\Exports\BaseExport; use App\Helpers\ResponseCode; use App\Models\AppointmentType; use App\Models\CustomForm; +use App\Models\Dialogue; use App\Models\Message; use App\Models\SupplyDemand; use App\Models\SupplyDemandType; @@ -336,4 +337,59 @@ class SupplyDemandController extends BaseController ]; } + + /** + * @OA\Get( + * path="/api/admin/supply-demand/message-list", + * tags={"供需信息管理"}, + * summary="消息列表", + * description="", + * @OA\Parameter(name="to_user_id", in="query", @OA\Schema(type="string"), required=true, description="接收人"), + * @OA\Parameter(name="user_id", in="query", @OA\Schema(type="string"), required=true, description="发起人"), + * @OA\Parameter(name="page_size", in="query", @OA\Schema(type="string"), required=false, description="每页显示的条数"), + * @OA\Parameter(name="page", in="query", @OA\Schema(type="string"), required=false, description="页码"), + * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), + * @OA\Response( + * response="200", + * description="暂无" + * ) + * ) + */ + public function messageList() + { + $all = \request()->all(); + $messages = [ + 'to_user_id.required' => '接收人必填', + 'user_id.required' => '接收人必填', + ]; + $validator = Validator::make($all, [ + 'user_id' => 'required', + 'to_user_id' => 'required' + ], $messages); + if ($validator->fails()) { + return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); + } + // 获取会话id + $dialogue = Dialogue::where(function ($query) use ($all) { + $query->where('user_id', $all['user_id'])->where('to_user_id', $all['to_user_id']); + })->orWhere(function ($query) use ($all) { + $query->where('user_id', $all['to_user_id'])->where('to_user_id', $all['user_id']); + })->first(); + if (empty($dialogue)) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '会话不存在']); + } + $message = Message::with([ + 'user' => function ($query) { + $query->select('id', 'nickname', 'name', 'headimgurl', 'username'); + }, + 'toUser' => function ($query) { + $query->select('id', 'nickname', 'name', 'headimgurl', 'username'); + } + ])->where(function ($query) use ($dialogue) { + $query->where('dialogue_id', $dialogue->id); + })->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc') + ->paginate($all['page_size'] ?? 20); + return $this->success(compact('message')); + } + } diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index 42cab33..9c52ee1 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -568,6 +568,7 @@ class CourseController extends CommonController })->get(); foreach ($courseContentList as $courseContent) { CourseContentCheck::create([ + 'course_id' => $courseContent->course_id, 'course_content_id' => $courseContent->id, 'user_id' => $this->getUserId(), 'longitude' => $all['longitude'], diff --git a/database/migrations/2025_06_24_105931_create_course_content_checks_table.php b/database/migrations/2025_06_24_105931_create_course_content_checks_table.php index bb1ddef..42c19a8 100644 --- a/database/migrations/2025_06_24_105931_create_course_content_checks_table.php +++ b/database/migrations/2025_06_24_105931_create_course_content_checks_table.php @@ -15,6 +15,8 @@ return new class extends Migration { Schema::create('course_content_checks', function (Blueprint $table) { $table->id(); + // 课程id + $table->integer('course_id')->nullable()->comment('课程id'); $table->integer('course_content_id')->nullable()->comment('课程排课id'); $table->integer('user_id')->nullable()->comment('用户id'); // 经度 diff --git a/routes/api.php b/routes/api.php index 0d88f95..33aa168 100755 --- a/routes/api.php +++ b/routes/api.php @@ -175,6 +175,8 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () { Route::post('supply-demand/save', [\App\Http\Controllers\Admin\SupplyDemandController::class, "save"]); Route::get('supply-demand/destroy', [\App\Http\Controllers\Admin\SupplyDemandController::class, "destroy"]); Route::get('supply-demand/chart', [\App\Http\Controllers\Admin\SupplyDemandController::class, "chart"]); + Route::get('supply-demand/message-list', [\App\Http\Controllers\Admin\SupplyDemandController::class, "messageList"]); + // 图书管理 Route::get('book/index', [\App\Http\Controllers\Admin\BookController::class, "index"]); From c82a8a83e38cb13a607cdc29d3aa809fcf8c9e4f Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 14 Aug 2025 14:49:10 +0800 Subject: [PATCH 03/29] update --- .../Controllers/Admin/CalendarsController.php | 2 + .../Admin/CourseContentController.php | 2 + .../Controllers/Admin/TeacherController.php | 77 ++++++++++++++++++- .../Controllers/Mobile/CourseController.php | 15 +--- app/Models/Teacher.php | 4 + ...25_06_25_150423_create_calendars_table.php | 4 + .../2025_08_14_103426_alert_courses_table.php | 4 + 7 files changed, 93 insertions(+), 15 deletions(-) diff --git a/app/Http/Controllers/Admin/CalendarsController.php b/app/Http/Controllers/Admin/CalendarsController.php index 79b3d33..777662d 100644 --- a/app/Http/Controllers/Admin/CalendarsController.php +++ b/app/Http/Controllers/Admin/CalendarsController.php @@ -105,6 +105,8 @@ class CalendarsController extends BaseController * @OA\Parameter(name="content", in="query", @OA\Schema(type="string", format="mediumtext"), required=false, description="内容"), * @OA\Parameter(name="start_time", in="query", @OA\Schema(type="string", format="date-time"), required=false, description="开始时间(YYYY-MM-DD HH:MM:SS)"), * @OA\Parameter(name="end_time", in="query", @OA\Schema(type="string", format="date-time"), required=false, description="结束时间(YYYY-MM-DD HH:MM:SS)"), + * @OA\Parameter(name="is_publish", in="query", @OA\Schema(type="string"), required=true, description="是否向用户发布0否1是"), + * @OA\Parameter(name="address", in="query", @OA\Schema(type="string"), required=true, description="地址"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"), * @OA\Response( * response="200", diff --git a/app/Http/Controllers/Admin/CourseContentController.php b/app/Http/Controllers/Admin/CourseContentController.php index 803836a..c01b2f8 100755 --- a/app/Http/Controllers/Admin/CourseContentController.php +++ b/app/Http/Controllers/Admin/CourseContentController.php @@ -160,6 +160,8 @@ class CourseContentController extends BaseController * @OA\Parameter(name="latitude", in="query", @OA\Schema(type="string"), description="纬度"), * @OA\Parameter(name="address_detail", in="query", @OA\Schema(type="string"), description="详细地址"), * @OA\Parameter(name="file_ids", in="query", @OA\Schema(type="string"), description="文件id数组"), + * @OA\Parameter(name="direction", in="query", @OA\Schema(type="string"), description="课程方向"), + * @OA\Parameter(name="remark", in="query", @OA\Schema(type="string"), description="备注"), * @OA\Response( * response=200, * description="操作成功" diff --git a/app/Http/Controllers/Admin/TeacherController.php b/app/Http/Controllers/Admin/TeacherController.php index 8399490..e50bce4 100755 --- a/app/Http/Controllers/Admin/TeacherController.php +++ b/app/Http/Controllers/Admin/TeacherController.php @@ -2,7 +2,10 @@ namespace App\Http\Controllers\Admin; +use App\Exports\BaseExport; +use App\Models\CustomForm; use App\Models\Teacher; +use Maatwebsite\Excel\Facades\Excel; class TeacherController extends BaseController { @@ -38,7 +41,79 @@ class TeacherController extends BaseController */ public function index() { - return parent::index(); + $all = request()->all(); + $list = $this->model->with('courseContents.course')->where(function ($query) use ($all) { + if (isset($all['filter']) && !empty($all['filter'])) { + foreach ($all['filter'] as $condition) { + $key = $condition['key'] ?? null; + $op = $condition['op'] ?? null; + $value = $condition['value'] ?? null; + if (!isset($key) || !isset($op) || !isset($value)) { + continue; + } + // 等于 + if ($op == 'eq') { + $query->where($key, $value); + } + // 不等于 + if ($op == 'neq') { + $query->where($key, '!=', $value); + } + // 大于 + if ($op == 'gt') { + $query->where($key, '>', $value); + } + // 大于等于 + if ($op == 'egt') { + $query->where($key, '>=', $value); + } + // 小于 + if ($op == 'lt') { + $query->where($key, '<', $value); + } + // 小于等于 + if ($op == 'elt') { + $query->where($key, '<=', $value); + } + // 模糊搜索 + if ($op == 'like') { + $query->where($key, 'like', '%' . $value . '%'); + } + // 否定模糊搜索 + if ($op == 'notlike') { + $query->where($key, 'not like', '%' . $value . '%'); + } + // null搜索 + if ($op == 'null') { + $query->whereNull($key); + } + // notnull搜索 + if ($op == 'notnull') { + $query->whereNotNull($key); + } + // 范围搜索 + if ($op == 'range') { + list($from, $to) = explode(',', $value); + if (empty($from) || empty($to)) { + continue; + } + $query->whereBetween($key, [$from, $to]); + } + } + } + })->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc'); + if (isset($all['is_export']) && !empty($all['is_export'])) { + $list = $list->get()->toArray(); + $export_fields = $all['export_fields'] ?? []; + // 导出文件名字 + $tableName = $this->model->getTable(); + $filename = (new CustomForm())->getTableComment($tableName); + return Excel::download(new BaseExport($export_fields, $list, $tableName), $filename . date('YmdHis') . '.xlsx'); + } else { + // 输出 + $list = $list->paginate($all['page_size'] ?? 20); + } + return $this->success($list); } /** diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index 9c52ee1..fc576ea 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -890,29 +890,16 @@ class CourseController extends CommonController if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } -// $startDate = $all['month'] . '-01'; -// $endDate = date('Y-m-t', strtotime($startDate)); $list = Calendar::with('course', 'courseContent') ->where(function ($query) use ($all) { if (isset($all['type'])) { $query->where('type', $all['type']); } })->where('start_time', 'like', '%' . $all['month'] . '%') + ->where('is_publish', 1) ->orderBy('start_time', 'asc') ->get(); -// $range = getDates($startDate, $endDate); -// $list = []; -// foreach ($range as $date) { -// // 查询Calendar模型里start_time和end_time在日期内的数据,其中date是年月日,start_time和end_time是时分秒 -// $list[] = [ -// 'date' => $date, -// 'details' => Calendar::with('course', 'courseContent') -// ->whereDate('start_time', '<=', $date) -// ->whereDate('end_time', '>=', $date) -// ->get() -// ]; -// } return $this->success($list); } diff --git a/app/Models/Teacher.php b/app/Models/Teacher.php index 9aec16c..07378af 100755 --- a/app/Models/Teacher.php +++ b/app/Models/Teacher.php @@ -6,6 +6,10 @@ namespace App\Models; class Teacher extends SoftDeletesModel { + public function courseContents() + { + return $this->hasMany(CourseContent::class, 'teacher_id', 'id'); + } } diff --git a/database/migrations/2025_06_25_150423_create_calendars_table.php b/database/migrations/2025_06_25_150423_create_calendars_table.php index 5526c83..9979fcf 100644 --- a/database/migrations/2025_06_25_150423_create_calendars_table.php +++ b/database/migrations/2025_06_25_150423_create_calendars_table.php @@ -32,6 +32,10 @@ return new class extends Migration { $table->dateTime('end_time')->nullable()->comment('结束时间'); // 链接 $table->string('url')->nullable()->comment('链接'); + // 是否向用户发布 + $table->boolean('is_publish')->nullable()->comment('是否向用户发布'); + // 地址 + $table->string('address')->nullable()->comment('地址'); $table->timestamps(); $table->softDeletes(); }); diff --git a/database/migrations/2025_08_14_103426_alert_courses_table.php b/database/migrations/2025_08_14_103426_alert_courses_table.php index 9f14527..b3f4ad9 100644 --- a/database/migrations/2025_08_14_103426_alert_courses_table.php +++ b/database/migrations/2025_08_14_103426_alert_courses_table.php @@ -15,6 +15,10 @@ return new class extends Migration { Schema::table('courses', function (Blueprint $table) { // 已审核学员是否自动进入校友库 $table->boolean('auto_schoolmate')->default(false)->comment('已审核学员是否自动进入校友库0否1是'); + // 课程方向 + $table->string('direction')->nullable()->comment('课程方向'); + // 备注 + $table->string('remark')->nullable()->comment('备注'); }); } From 8883c2f05d15083c4fbfb9a2506e9816defefc34 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 14 Aug 2025 14:58:42 +0800 Subject: [PATCH 04/29] update --- app/Http/Controllers/Admin/CourseController.php | 3 +++ .../migrations/2025_08_14_103426_alert_courses_table.php | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/app/Http/Controllers/Admin/CourseController.php b/app/Http/Controllers/Admin/CourseController.php index f771f17..19a107d 100755 --- a/app/Http/Controllers/Admin/CourseController.php +++ b/app/Http/Controllers/Admin/CourseController.php @@ -203,6 +203,9 @@ class CourseController extends BaseController * @OA\Parameter(name="image_id", in="query", @OA\Schema(type="integer"), description="图片id"), * @OA\Parameter(name="qun_image_id", in="query", @OA\Schema(type="integer"), description="群图片id"), * @OA\Parameter(name="is_virtual", in="query", @OA\Schema(type="integer"), description="是否虚拟课程0否1是"), + * @OA\Parameter(name="longitude", in="query", @OA\Schema(type="string"), description="经度"), + * @OA\Parameter(name="latitude", in="query", @OA\Schema(type="string"), description="纬度"), + * @OA\Parameter(name="address_detail", in="query", @OA\Schema(type="string"), description="详细地址"), * @OA\Parameter(name="course_content_evaluation_title", in="query", @OA\Schema(type="integer"), description="问卷标题"), * @OA\Parameter(name="course_content_status", in="query", @OA\Schema(type="integer"), description="课表状态:0未发布, 1已发布"), * @OA\Parameter(name="course_content_evaluation_desc", in="query", @OA\Schema(type="integer"), description="问卷描述"), diff --git a/database/migrations/2025_08_14_103426_alert_courses_table.php b/database/migrations/2025_08_14_103426_alert_courses_table.php index b3f4ad9..1d4e46f 100644 --- a/database/migrations/2025_08_14_103426_alert_courses_table.php +++ b/database/migrations/2025_08_14_103426_alert_courses_table.php @@ -19,6 +19,12 @@ return new class extends Migration { $table->string('direction')->nullable()->comment('课程方向'); // 备注 $table->string('remark')->nullable()->comment('备注'); + // 经度 + $table->string('longitude')->nullable()->comment('经度'); + // 纬度 + $table->string('latitude')->nullable()->comment('纬度'); + // 详细地址 + $table->string('address_detail')->nullable()->comment('详细地址'); }); } From 03a730d1e9f025c12b598b43815f772098541284 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 14 Aug 2025 15:47:08 +0800 Subject: [PATCH 05/29] update --- .../Controllers/Mobile/CourseController.php | 80 +++++++++++++++++-- routes/api.php | 4 +- 2 files changed, 76 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index fc576ea..d3b9ca9 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -462,7 +462,8 @@ class CourseController extends CommonController * path="/api/mobile/course/distance", * tags={"小程序-计算距离"}, * summary="签到", - * @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="string"), required=false, description="课表id"), + * @OA\Parameter(name="course_id", in="query", @OA\Schema(type="string"), required=false, description="课程id(二选一)"), + * @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="string"), required=false, description="课表id(二选一)"), * @OA\Parameter(name="longitude", in="query", @OA\Schema(type="string"), required=false, description="longitude"), * @OA\Parameter(name="latitude", in="query", @OA\Schema(type="string"), required=false, description="latitude"), * @OA\Response( @@ -477,20 +478,26 @@ class CourseController extends CommonController $messages = [ 'longitude.required' => '经度必填', 'latitude.required' => '纬度必填', - 'course_content_id.required' => '课程id必填', ]; $validator = Validator::make($all, [ 'longitude' => 'required', 'latitude' => 'required', - 'course_content_id' => 'required' ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } // 获取打卡范围,千米 $content_check_range = Config::getValueByKey('content_check_range'); - $courseContent = CourseContent::find($all['course_content_id']); - $distance = getDistance($courseContent->longitude, $courseContent->latitude, $all['longitude'], $all['latitude']); + if (isset($all['course_id'])) { + $info = Course::find($all['course_id']); + } + if (isset($all['course_content_id'])) { + $info = CourseContent::find($all['course_content_id']); + } + if (!isset($info)) { + return $this->fail([ResponseCode::ERROR_PARAMETER, '数据不存在']); + } + $distance = getDistance($info->longitude, $info->latitude, $all['longitude'], $all['latitude']); return $this->success(compact('distance', 'content_check_range')); } @@ -498,7 +505,7 @@ class CourseController extends CommonController * @OA\Get( * path="/api/mobile/course/content-check", * tags={"小程序-课程"}, - * summary="签到", + * summary="课堂签到", * @OA\Parameter(name="batch_sign", in="query", @OA\Schema(type="string"), required=false, description="是否同日期批量签到0否1是"), * @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="string"), required=false, description="课表id"), * @OA\Parameter(name="longitude", in="query", @OA\Schema(type="string"), required=false, description="longitude"), @@ -515,7 +522,7 @@ class CourseController extends CommonController $messages = [ 'longitude.required' => '经度必填', 'latitude.required' => '纬度必填', - 'course_content_id.required' => '课程id必填', + 'course_content_id.required' => '课表id必填', ]; $validator = Validator::make($all, [ 'longitude' => 'required', @@ -546,6 +553,7 @@ class CourseController extends CommonController } CourseContentCheck::create([ 'course_content_id' => $all['course_content_id'], + 'course_id' => $courseContent->course_id, 'user_id' => $this->getUserId(), 'longitude' => $all['longitude'], 'latitude' => $all['latitude'], @@ -579,6 +587,64 @@ class CourseController extends CommonController return $this->success('签到成功'); } + /** + * @OA\Get( + * path="/api/mobile/course/course-content-check", + * tags={"小程序-课程"}, + * summary="课程签到", + * @OA\Parameter(name="course_id", in="query", @OA\Schema(type="string"), required=false, description="课表id"), + * @OA\Parameter(name="longitude", in="query", @OA\Schema(type="string"), required=false, description="longitude"), + * @OA\Parameter(name="latitude", in="query", @OA\Schema(type="string"), required=false, description="latitude"), + * @OA\Response( + * response=200, + * description="操作成功" + * ) + * ) + */ + public function courseContentCheck() + { + $all = \request()->all(); + $messages = [ + 'longitude.required' => '经度必填', + 'latitude.required' => '纬度必填', + 'course_id.required' => '课表id必填', + ]; + $validator = Validator::make($all, [ + 'longitude' => 'required', + 'latitude' => 'required', + 'course_id' => 'required' + ], $messages); + if ($validator->fails()) { + return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); + } + // 获取打卡范围,千米 + $content_check_range = Config::getValueByKey('content_check_range'); + $course = Course::find($all['course_id']); + $distance = getDistance($course->longitude, $course->latitude, $all['longitude'], $all['latitude']); + if ($distance > $content_check_range) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '超出打卡范围']); + } + // 判断当天才能签到 + $today = date('Y-m-d'); + if ($today != $course->start_date) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '不在签到时间']); + } + // 不能重复签到 + $courseContentCheck = CourseContentCheck::where('course_id', $all['course_id']) + ->where('user_id', $this->getUserId()) + ->first(); + if ($courseContentCheck) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '不能重复签到']); + } + CourseContentCheck::create([ + 'course_id' => $all['course_id'], + 'user_id' => $this->getUserId(), + 'longitude' => $all['longitude'], + 'latitude' => $all['latitude'], + ]); + return $this->success('课程签到成功'); + } + /** * @OA\Get( * path="/api/mobile/course/content-check-list", diff --git a/routes/api.php b/routes/api.php index 33aa168..de06969 100755 --- a/routes/api.php +++ b/routes/api.php @@ -284,8 +284,10 @@ Route::group(["namespace" => "Mobile", "prefix" => "mobile"], function () { Route::get('course/contents', [\App\Http\Controllers\Mobile\CourseController::class, "contents"]); // 计算距离 Route::get('course/distance', [\App\Http\Controllers\Mobile\CourseController::class, "distance"]); - // 签到 + // 课堂签到 Route::get('course/content-check', [\App\Http\Controllers\Mobile\CourseController::class, "contentCheck"]); + // 课程签到 + Route::get('course/course-content-check', [\App\Http\Controllers\Mobile\CourseController::class, "courseContentCheck"]); // 签到列表 Route::get('course/content-check-list', [\App\Http\Controllers\Mobile\CourseController::class, "contentCheckList"]); // 校友库 From 71cb91170f4b6dd480f2aadb00df225f9fc9d5a8 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 14 Aug 2025 15:53:43 +0800 Subject: [PATCH 06/29] update --- app/Http/Controllers/Mobile/CourseController.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index d3b9ca9..295e055 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -620,6 +620,9 @@ class CourseController extends CommonController // 获取打卡范围,千米 $content_check_range = Config::getValueByKey('content_check_range'); $course = Course::find($all['course_id']); + if (empty($course->longitude) || empty($course->latitude)) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '请先设置课程经纬度']); + } $distance = getDistance($course->longitude, $course->latitude, $all['longitude'], $all['latitude']); if ($distance > $content_check_range) { return $this->fail([ResponseCode::ERROR_BUSINESS, '超出打卡范围']); From 3e69f77e619c0dc95e27bb851fdf0a778a7ea71b Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 14 Aug 2025 16:23:20 +0800 Subject: [PATCH 07/29] update --- app/Http/Controllers/Admin/CourseController.php | 6 ------ app/Http/Controllers/Mobile/CourseController.php | 5 ++--- app/Models/Course.php | 5 +++++ ..._105932_create_course_content_evaluation_forms_table.php | 2 ++ routes/api.php | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Admin/CourseController.php b/app/Http/Controllers/Admin/CourseController.php index 19a107d..664c65b 100755 --- a/app/Http/Controllers/Admin/CourseController.php +++ b/app/Http/Controllers/Admin/CourseController.php @@ -206,12 +206,6 @@ class CourseController extends BaseController * @OA\Parameter(name="longitude", in="query", @OA\Schema(type="string"), description="经度"), * @OA\Parameter(name="latitude", in="query", @OA\Schema(type="string"), description="纬度"), * @OA\Parameter(name="address_detail", in="query", @OA\Schema(type="string"), description="详细地址"), - * @OA\Parameter(name="course_content_evaluation_title", in="query", @OA\Schema(type="integer"), description="问卷标题"), - * @OA\Parameter(name="course_content_status", in="query", @OA\Schema(type="integer"), description="课表状态:0未发布, 1已发布"), - * @OA\Parameter(name="course_content_evaluation_desc", in="query", @OA\Schema(type="integer"), description="问卷描述"), - * @OA\Parameter(name="course_content_evaluation_type_id", in="query", @OA\Schema(type="integer"), description="问卷类型id"), - * @OA\Parameter(name="course_content_evaluation_start_time", in="query", @OA\Schema(type="integer"), description="问卷开始时间"), - * @OA\Parameter(name="course_content_evaluation_end_time", in="query", @OA\Schema(type="integer"), description="问卷结束时间"), * @OA\Response( * response=200, * description="操作成功" diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index 295e055..80a1d48 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -223,7 +223,7 @@ class CourseController extends CommonController */ public function myCourse() { - $list = Course::with('typeDetail')->with(['courseSigns' => function ($query) { + $list = Course::with('typeDetail','courseContentEvaluation')->with(['courseSigns' => function ($query) { $query->where('user_id', $this->getUserId()); }])->whereHas('courseSigns', function ($query) { $query->where('user_id', $this->getUserId()); @@ -318,12 +318,10 @@ class CourseController extends CommonController $messages = [ 'course_content_evaluation_id.required' => '问卷id必填', 'data.required' => '表单数据必填', - // 'time_total.required' => '用时必填' ]; $validator = Validator::make($all, [ 'course_content_evaluation_id' => 'required', 'data' => 'required', - // 'time_total' => 'required' ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); @@ -345,6 +343,7 @@ class CourseController extends CommonController return $this->fail([ResponseCode::ERROR_BUSINESS, '您已提交过评价']); } $model = CourseContentEvaluationForm::create([ + 'course_id' => $courseContentEvaluation->course_id, 'course_content_evaluation_id' => $all['course_content_evaluation_id'], 'user_id' => $this->getUserId(), 'time_total' => $all['time_total'] ?? 0, diff --git a/app/Models/Course.php b/app/Models/Course.php index 7fd70be..f0a2bc9 100755 --- a/app/Models/Course.php +++ b/app/Models/Course.php @@ -99,6 +99,11 @@ class Course extends SoftDeletesModel return $this->hasMany(CourseContent::class, 'course_id', 'id'); } + public function courseContentEvaluation() + { + return $this->hasOne(CourseContentEvaluation::class, 'course_id', 'id'); + } + /** * 更新课程报名状态 */ diff --git a/database/migrations/2025_06_30_105932_create_course_content_evaluation_forms_table.php b/database/migrations/2025_06_30_105932_create_course_content_evaluation_forms_table.php index a584fe6..0ce07f5 100644 --- a/database/migrations/2025_06_30_105932_create_course_content_evaluation_forms_table.php +++ b/database/migrations/2025_06_30_105932_create_course_content_evaluation_forms_table.php @@ -14,6 +14,8 @@ return new class extends Migration { { Schema::create('course_content_evaluation_forms', function (Blueprint $table) { $table->id(); + // 课程id + $table->integer('course_id')->nullable()->comment('课程id'); $table->integer('course_content_evaluation_id')->nullable()->comment('课程内容id'); $table->integer('user_id')->nullable()->comment('用户id'); $table->integer('time_total')->nullable()->comment('用时,单位秒'); diff --git a/routes/api.php b/routes/api.php index de06969..728af67 100755 --- a/routes/api.php +++ b/routes/api.php @@ -275,7 +275,7 @@ Route::group(["namespace" => "Mobile", "prefix" => "mobile"], function () { Route::get('course/my-course', [\App\Http\Controllers\Mobile\CourseController::class, "myCourse"]); Route::get('course/my-course-content', [\App\Http\Controllers\Mobile\CourseController::class, "myCourseContent"]); Route::get('course/course-content-detail', [\App\Http\Controllers\Mobile\CourseController::class, "courseContentDetail"]); - Route::post('course/course-content-form', [\App\Http\Controllers\Mobile\CourseController::class, "courseContentForm"]); + Route::post('course/course-form', [\App\Http\Controllers\Mobile\CourseController::class, "courseForm"]); Route::get('course/get-sign', [\App\Http\Controllers\Mobile\CourseController::class, "getSign"]); Route::post('course/update-sign', [\App\Http\Controllers\Mobile\CourseController::class, "updateSign"]); // 获取缴费二维码 From 94b1f6e3f4109bb2b016b74de78d4f270c6a9b22 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 15:02:20 +0800 Subject: [PATCH 08/29] update --- app/Http/Controllers/Admin/OtherController.php | 5 ++--- app/Http/Controllers/Admin/UserController.php | 5 ++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index 7194624..50e268d 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -196,9 +196,8 @@ class OtherController extends CommonController public function test() { - $appointmentModel = Appointment::find(288); - $appointmentConfig = $appointmentModel->site_detail; - $result = (new Appointment())->appointDoor($appointmentModel, $appointmentConfig); + $door = new DoorRepository(); + $result = $door->getAllDoorInfo(); dd($result); } diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 5b2f1bb..3923fcf 100755 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -624,6 +624,7 @@ class UserController extends BaseController * description="", * @OA\Parameter(name="ids", in="query", @OA\Schema(type="string"), required=true, description="英文逗号分隔的id数组"), * @OA\Parameter(name="is_schoolmate", in="query", @OA\Schema(type="string"), required=true, description="是否校友库-0否1是"), + * @OA\Parameter(name="is_black", in="query", @OA\Schema(type="string"), required=true, description="是否黑名单-0否1是"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), * @OA\Response( * response="200", @@ -637,16 +638,18 @@ class UserController extends BaseController $messages = [ 'ids.required' => '编号必填', 'is_schoolmate.required' => '是否校友库必填', + 'is_black.required' => '是否黑名单必填', ]; $validator = Validator::make($all, [ 'ids' => 'required', 'is_schoolmate' => 'required', + 'is_black' => 'required' ], $messages); if ($validator->fails()) { return $this->fail([StarterResponseCode::START_ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } $idsArray = explode(',', $all['ids']); - $this->model->whereIn('id', $idsArray)->update(['is_schoolmate' => $all['is_schoolmate']]); + $this->model->whereIn('id', $idsArray)->update(['is_schoolmate' => $all['is_schoolmate'], 'is_black' => $all['is_black']]); return $this->success('批量更新成功'); } From ba3e9d1a466670a695e73771ab4549bec57aa089 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 15:51:42 +0800 Subject: [PATCH 09/29] update --- app/Console/Commands/AutoSchoolmate.php | 2 +- app/Http/Controllers/Admin/CourseSignController.php | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/Console/Commands/AutoSchoolmate.php b/app/Console/Commands/AutoSchoolmate.php index beefbe8..f492c99 100755 --- a/app/Console/Commands/AutoSchoolmate.php +++ b/app/Console/Commands/AutoSchoolmate.php @@ -52,7 +52,7 @@ class AutoSchoolmate extends Command // 获取报名通过的学员 $courseSigns = CourseSign::where('course_id', $course->id)->where('status', 1)->get(); // 用户设置成校友 - User::whereIn('id', $courseSigns->pluck('user_id'))->update(['is_schoolmate' => 1]); + User::whereIn('id', $courseSigns->pluck('user_id'))->where('is_black',0)->update(['is_schoolmate' => 1]); } return $this->info('更新完成'); } diff --git a/app/Http/Controllers/Admin/CourseSignController.php b/app/Http/Controllers/Admin/CourseSignController.php index f9a966c..612e83e 100755 --- a/app/Http/Controllers/Admin/CourseSignController.php +++ b/app/Http/Controllers/Admin/CourseSignController.php @@ -76,9 +76,6 @@ class CourseSignController extends BaseController if (isset($all['is_vip'])) { $query->where('is_vip', $all['is_vip']); } -// if (isset($all['name'])) { -// $query->where('name', 'like', '%' . $all['name'] . '%'); -// } if (isset($all['company_name'])) { $query->where('company_name', 'like', '%' . $all['company_name'] . '%'); } From e374217963ca14264093b99ba9a958e6dc121d1b Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 15:54:25 +0800 Subject: [PATCH 10/29] update --- app/Models/CourseContent.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/CourseContent.php b/app/Models/CourseContent.php index c28bbe7..7577452 100755 --- a/app/Models/CourseContent.php +++ b/app/Models/CourseContent.php @@ -77,7 +77,7 @@ class CourseContent extends SoftDeletesModel 'secret' => \config('app.applet_secret') ]; $app = Factory::miniProgram($config); - $tmp = $app->app_code->get('/packages/sign/index?course_content_id=' . $courseContentId, [ + $tmp = $app->app_code->get("/packages/sign/index?course_id={$courseContent->course_id}&course_content_id={$courseContentId}", [ // 'env_version' => "release" // 正式版 'env_version' => "trial" // 体验版 ]); From e058a75be2961d0ebfc01f75bbd0b79aa0a9f8af Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 16:07:38 +0800 Subject: [PATCH 11/29] update --- app/Http/Controllers/Admin/UserController.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 3923fcf..2d11a07 100755 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -179,6 +179,7 @@ class UserController extends BaseController * @OA\Parameter(name="is_fee", in="query", @OA\Schema(type="string"), required=true, description="是否缴费0否1是"), * @OA\Parameter(name="has_openid", in="query", @OA\Schema(type="string"), required=true, description="是否绑定小程序0否1是"), * @OA\Parameter(name="year", in="query", @OA\Schema(type="string"), required=true, description="年份"), + * @OA\Parameter(name="is_black", in="query", @OA\Schema(type="string"), required=true, description="是否黑名单0否1是"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), * @OA\Response( * response="200", @@ -241,6 +242,9 @@ class UserController extends BaseController if (isset($all['is_vip'])) { $query->where('is_vip', $all['is_vip']); } + if(isset($all['is_black'])){ + $query->where('is_black', $all['is_black']); + } if (isset($all['type'])) { $type = explode(',', $all['type']); $query->where(function ($q) use ($type) { From 7677efd4eb45f5c52d2b762e9f6da87805eda1df Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 16:10:28 +0800 Subject: [PATCH 12/29] update --- app/Http/Controllers/Admin/UserController.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 2d11a07..c7f842f 100755 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -242,7 +242,7 @@ class UserController extends BaseController if (isset($all['is_vip'])) { $query->where('is_vip', $all['is_vip']); } - if(isset($all['is_black'])){ + if (isset($all['is_black'])) { $query->where('is_black', $all['is_black']); } if (isset($all['type'])) { @@ -641,19 +641,22 @@ class UserController extends BaseController $all = \request()->all(); $messages = [ 'ids.required' => '编号必填', - 'is_schoolmate.required' => '是否校友库必填', - 'is_black.required' => '是否黑名单必填', ]; $validator = Validator::make($all, [ 'ids' => 'required', - 'is_schoolmate' => 'required', - 'is_black' => 'required' ], $messages); if ($validator->fails()) { return $this->fail([StarterResponseCode::START_ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } $idsArray = explode(',', $all['ids']); - $this->model->whereIn('id', $idsArray)->update(['is_schoolmate' => $all['is_schoolmate'], 'is_black' => $all['is_black']]); + $data = []; + if (isset($all['is_schoolmate'])) { + $data['is_schoolmate'] = $all['is_schoolmate']; + } + if (isset($all['is_black'])) { + $data['is_black'] = $all['is_black']; + } + $this->model->whereIn('id', $idsArray)->update($data); return $this->success('批量更新成功'); } From 7d79bfe8c1fc6158c5e5feb448604391c28a2c08 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 16:28:17 +0800 Subject: [PATCH 13/29] update --- .../Admin/CourseSignController.php | 179 +++++++++--------- app/Http/Controllers/Admin/UserController.php | 1 + 2 files changed, 92 insertions(+), 88 deletions(-) diff --git a/app/Http/Controllers/Admin/CourseSignController.php b/app/Http/Controllers/Admin/CourseSignController.php index 612e83e..eed18b4 100755 --- a/app/Http/Controllers/Admin/CourseSignController.php +++ b/app/Http/Controllers/Admin/CourseSignController.php @@ -71,100 +71,103 @@ class CourseSignController extends BaseController public function index() { $all = request()->all(); - $list = $this->model->with('course', 'user', 'thirdAppointmentLogs') - ->whereHas('user', function ($query) use ($all) { - if (isset($all['is_vip'])) { - $query->where('is_vip', $all['is_vip']); - } - if (isset($all['company_name'])) { - $query->where('company_name', 'like', '%' . $all['company_name'] . '%'); - } - if (isset($all['company_position'])) { - $query->where('company_position', $all['company_position']); - } - if (isset($all['company_area'])) { - $company_area = explode(',', $all['company_area']); - $query->whereIn('company_area', $company_area); - } - if (isset($all['company_type'])) { - $company_type = explode(',', $all['company_type']); - $query->where(function ($q) use ($company_type) { - foreach ($company_type as $v) { - $q->orWhereRaw('FIND_IN_SET(?, company_type)', [$v]); - } - }); - } - if (isset($all['company_industry'])) { - $company_industry = explode(',', $all['company_industry']); - $query->whereIn('company_industry', $company_industry); - } - if (isset($all['is_schoolmate'])) { - $query->where('is_schoolmate', $all['is_schoolmate']); - } - if (isset($all['mobile'])) { - $query->where('mobile', 'like', '%' . $all['mobile'] . '%'); - } - if (isset($all['education'])) { - $education = explode(',', $all['education']); - $query->whereIn('education', $education); - } - if (isset($all['type'])) { - $type = explode(',', $all['type']); - $query->where(function ($q) use ($type) { - foreach ($type as $v) { - $q->orWhereRaw('FIND_IN_SET(?, type)', [$v]); - } - }); - } - })->where(function ($query) use ($all) { - if (isset($all['filter_date']) && !empty($all['filter_date'])) { - foreach ($all['filter_date'] as $item) { - $query->whereJsonContains("data->{$item->name}", $item->value); + $list = $this->model->with(['course', 'thirdAppointmentLogs', 'user' => function ($query) { + $query->with(['courseSigns' => function ($q) { + $q->where('status', 1)->with('course'); + }]); + }])->whereHas('user', function ($query) use ($all) { + if (isset($all['is_vip'])) { + $query->where('is_vip', $all['is_vip']); + } + if (isset($all['company_name'])) { + $query->where('company_name', 'like', '%' . $all['company_name'] . '%'); + } + if (isset($all['company_position'])) { + $query->where('company_position', $all['company_position']); + } + if (isset($all['company_area'])) { + $company_area = explode(',', $all['company_area']); + $query->whereIn('company_area', $company_area); + } + if (isset($all['company_type'])) { + $company_type = explode(',', $all['company_type']); + $query->where(function ($q) use ($company_type) { + foreach ($company_type as $v) { + $q->orWhereRaw('FIND_IN_SET(?, company_type)', [$v]); } + }); + } + if (isset($all['company_industry'])) { + $company_industry = explode(',', $all['company_industry']); + $query->whereIn('company_industry', $company_industry); + } + if (isset($all['is_schoolmate'])) { + $query->where('is_schoolmate', $all['is_schoolmate']); + } + if (isset($all['mobile'])) { + $query->where('mobile', 'like', '%' . $all['mobile'] . '%'); + } + if (isset($all['education'])) { + $education = explode(',', $all['education']); + $query->whereIn('education', $education); + } + if (isset($all['type'])) { + $type = explode(',', $all['type']); + $query->where(function ($q) use ($type) { + foreach ($type as $v) { + $q->orWhereRaw('FIND_IN_SET(?, type)', [$v]); + } + }); + } + })->where(function ($query) use ($all) { + if (isset($all['filter_date']) && !empty($all['filter_date'])) { + foreach ($all['filter_date'] as $item) { + $query->whereJsonContains("data->{$item->name}", $item->value); } - })->where(function ($query) use ($all) { - if (isset($all['name'])) { - $query->where(function ($q) use ($all) { - $q->whereHas('user', function ($q) use ($all) { - $q->where('name', 'like', '%' . $all['name'] . '%'); - })->orWhere('change_data', 'like', '%' . $all['name'] . '%'); - }); - } - if (isset($all['filter']) && !empty($all['filter'])) { - foreach ($all['filter'] as $condition) { - $key = $condition['key'] ?? null; - $op = $condition['op'] ?? null; - $value = $condition['value'] ?? null; - if (!isset($key) || !isset($op) || !isset($value)) { + } + })->where(function ($query) use ($all) { + if (isset($all['name'])) { + $query->where(function ($q) use ($all) { + $q->whereHas('user', function ($q) use ($all) { + $q->where('name', 'like', '%' . $all['name'] . '%'); + })->orWhere('change_data', 'like', '%' . $all['name'] . '%'); + }); + } + if (isset($all['filter']) && !empty($all['filter'])) { + foreach ($all['filter'] as $condition) { + $key = $condition['key'] ?? null; + $op = $condition['op'] ?? null; + $value = $condition['value'] ?? null; + if (!isset($key) || !isset($op) || !isset($value)) { + continue; + } + // 等于 + if ($op == 'eq') { + $query->where($key, $value); + } + // 不等于 + if ($op == 'neq') { + $query->where($key, '!=', $value); + } + // 模糊搜索 + if ($op == 'like') { + $query->where($key, 'like', '%' . $value . '%'); + } + // 否定模糊搜索 + if ($op == 'notlike') { + $query->where($key, 'not like', '%' . $value . '%'); + } + // 范围搜索 + if ($op == 'range') { + list($from, $to) = explode(',', $value); + if (empty($from) || empty($to)) { continue; } - // 等于 - if ($op == 'eq') { - $query->where($key, $value); - } - // 不等于 - if ($op == 'neq') { - $query->where($key, '!=', $value); - } - // 模糊搜索 - if ($op == 'like') { - $query->where($key, 'like', '%' . $value . '%'); - } - // 否定模糊搜索 - if ($op == 'notlike') { - $query->where($key, 'not like', '%' . $value . '%'); - } - // 范围搜索 - if ($op == 'range') { - list($from, $to) = explode(',', $value); - if (empty($from) || empty($to)) { - continue; - } - $query->whereBetween($key, [$from, $to]); - } + $query->whereBetween($key, [$from, $to]); } } - })->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc') + } + })->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc') ->orderBy('created_at', 'desc'); if (isset($all['is_export']) && !empty($all['is_export'])) { $list = $list->limit(5000)->get()->toArray(); diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index c7f842f..340a866 100755 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -645,6 +645,7 @@ class UserController extends BaseController $validator = Validator::make($all, [ 'ids' => 'required', ], $messages); + if ($validator->fails()) { return $this->fail([StarterResponseCode::START_ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } From 838aaff3bdb63fde734dbb665b6326aa06dc30fd Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 16:50:05 +0800 Subject: [PATCH 14/29] update --- .../2025_06_24_111502_alert_course_contents_table.php | 4 ++++ database/migrations/2025_08_14_103426_alert_courses_table.php | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/database/migrations/2025_06_24_111502_alert_course_contents_table.php b/database/migrations/2025_06_24_111502_alert_course_contents_table.php index 97fd29b..996fb35 100644 --- a/database/migrations/2025_06_24_111502_alert_course_contents_table.php +++ b/database/migrations/2025_06_24_111502_alert_course_contents_table.php @@ -14,6 +14,10 @@ return new class extends Migration public function up() { Schema::table('course_contents', function (Blueprint $table) { + // 课程方向 + $table->string('direction')->nullable()->comment('课程方向'); + // 备注 + $table->string('remark')->nullable()->comment('备注'); // 经度 $table->string('longitude')->nullable()->comment('经度'); // 纬度 diff --git a/database/migrations/2025_08_14_103426_alert_courses_table.php b/database/migrations/2025_08_14_103426_alert_courses_table.php index 1d4e46f..e90968c 100644 --- a/database/migrations/2025_08_14_103426_alert_courses_table.php +++ b/database/migrations/2025_08_14_103426_alert_courses_table.php @@ -15,10 +15,6 @@ return new class extends Migration { Schema::table('courses', function (Blueprint $table) { // 已审核学员是否自动进入校友库 $table->boolean('auto_schoolmate')->default(false)->comment('已审核学员是否自动进入校友库0否1是'); - // 课程方向 - $table->string('direction')->nullable()->comment('课程方向'); - // 备注 - $table->string('remark')->nullable()->comment('备注'); // 经度 $table->string('longitude')->nullable()->comment('经度'); // 纬度 From 31d3dda1a8fc9bbde46ba64ccb3f0d23fb7bc622 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 17:52:20 +0800 Subject: [PATCH 15/29] update --- app/Console/Commands/UpdateCompany.php | 4 ++ .../Controllers/Mobile/CourseController.php | 6 +-- .../Controllers/Mobile/OtherController.php | 42 ++++++++++++++++++- routes/api.php | 4 +- 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/app/Console/Commands/UpdateCompany.php b/app/Console/Commands/UpdateCompany.php index 5366835..d7271b2 100755 --- a/app/Console/Commands/UpdateCompany.php +++ b/app/Console/Commands/UpdateCompany.php @@ -42,6 +42,10 @@ class UpdateCompany extends Command */ public function handle() { +// $YuanheRepository = new YuanheRepository(); +// $result = $YuanheRepository->companyInfo(['keyword' => '苏州元瞰科技有限公司']); +// dd($result); + $user_id = $this->option('user_id'); // 更新公司信息 $this->compnay($user_id); diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index 80a1d48..19a6e8a 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -504,7 +504,7 @@ class CourseController extends CommonController * @OA\Get( * path="/api/mobile/course/content-check", * tags={"小程序-课程"}, - * summary="课堂签到", + * summary="课表签到", * @OA\Parameter(name="batch_sign", in="query", @OA\Schema(type="string"), required=false, description="是否同日期批量签到0否1是"), * @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="string"), required=false, description="课表id"), * @OA\Parameter(name="longitude", in="query", @OA\Schema(type="string"), required=false, description="longitude"), @@ -588,7 +588,7 @@ class CourseController extends CommonController /** * @OA\Get( - * path="/api/mobile/course/course-content-check", + * path="/api/mobile/course/course-check", * tags={"小程序-课程"}, * summary="课程签到", * @OA\Parameter(name="course_id", in="query", @OA\Schema(type="string"), required=false, description="课表id"), @@ -600,7 +600,7 @@ class CourseController extends CommonController * ) * ) */ - public function courseContentCheck() + public function courseCheck() { $all = \request()->all(); $messages = [ diff --git a/app/Http/Controllers/Mobile/OtherController.php b/app/Http/Controllers/Mobile/OtherController.php index 4b0b48b..0becf79 100755 --- a/app/Http/Controllers/Mobile/OtherController.php +++ b/app/Http/Controllers/Mobile/OtherController.php @@ -90,7 +90,47 @@ class OtherController extends CommonController return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } $YuanheRepository = new YuanheRepository(); - $result = $YuanheRepository->companyInfo(['keyword' => $all['company_name']]); + $result = $YuanheRepository->companyInfo(['enterpriseName' => $all['company_name']]); +// $result = [ +// "createBy" => null, +// "createDt" => null, +// "updateBy" => null, +// "updateDt" => null, +// "enterpriseId" => "1950060660573786112", +// "enterpriseName" => "苏州元瞰科技有限公司", +// "creditCode" => "91320594MA7F0G9W6A", +// "keyNo" => "db5ppy5kbsprbbhjbjlarvmvphjhp3mrkv", +// "isAbroad" => "0", +// "status" => "注销", +// "logo" => "https://image.qcc.com/logo/EntImage.png", +// "operName" => "刘杰杰", +// "contactMail" => "425039148@qq.com", +// "contactPhone" => "15298866552", +// "startDate" => "2021-12-21", +// "endDate" => null, +// "updatedDate" => "2025-08-17", +// "registCapi" => "100万元", +// "registAmount" => "1000000.0000", +// "registCapiType" => "1", +// "currencyType" => null, , +// "termStart" => "2021-12-21", +// "termEnd" => null, +// "checkDate" => "2025-07-03", +// "orgNo" => "MA7F0G9W-6", +// "isOnStock" => "0", +// "stockNumber" => "", +// "stockType" => "", +// "stockDate" => null, +// "province" => "江苏省", +// "city" => "苏州市", +// "country" => "苏州工业园区", +// "areaCode" => "320576", +// "address" => "苏州工业园区亭新街11号B1栋二楼", +// "businessScope" => "一般项目:人工智能应用软件开发;人工智能基础软件开发;人工智能理论与算法软件开发;软件销售;软件开发;技术服务、技术开发、", +// "tagList" => null, +// "qccIndustry" => null, +// "isYhInvested" => false +// ]; if (!$result) { return $this->fail([ResponseCode::ERROR_PARAMETER, '获取失败']); } diff --git a/routes/api.php b/routes/api.php index 728af67..50270a7 100755 --- a/routes/api.php +++ b/routes/api.php @@ -284,10 +284,10 @@ Route::group(["namespace" => "Mobile", "prefix" => "mobile"], function () { Route::get('course/contents', [\App\Http\Controllers\Mobile\CourseController::class, "contents"]); // 计算距离 Route::get('course/distance', [\App\Http\Controllers\Mobile\CourseController::class, "distance"]); - // 课堂签到 + // 课表签到 Route::get('course/content-check', [\App\Http\Controllers\Mobile\CourseController::class, "contentCheck"]); // 课程签到 - Route::get('course/course-content-check', [\App\Http\Controllers\Mobile\CourseController::class, "courseContentCheck"]); + Route::get('course/course-check', [\App\Http\Controllers\Mobile\CourseController::class, "courseCheck"]); // 签到列表 Route::get('course/content-check-list', [\App\Http\Controllers\Mobile\CourseController::class, "contentCheckList"]); // 校友库 From 0f13aec30c4a7055085f57c3abd86436dba5272c Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 17:53:31 +0800 Subject: [PATCH 16/29] update --- app/Http/Controllers/Mobile/UserController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Mobile/UserController.php b/app/Http/Controllers/Mobile/UserController.php index ce4ad43..4b58cd3 100755 --- a/app/Http/Controllers/Mobile/UserController.php +++ b/app/Http/Controllers/Mobile/UserController.php @@ -254,7 +254,7 @@ class UserController extends CommonController })->where('id', $this->getUserId())->count(); // 是否生日 $is_birthday = 0; - if ($user->birthday == date('Y-m-d')) { + if (isset($user->birthday) && $user->birthday == date('Y-m-d')) { $is_birthday = 1; } return $this->success(compact('user', 'door_appointments', 'course_signs', 'enter_schoolmate', 'is_birthday')); From 1307eeefa3f20eec7122bde605ee725349a70a24 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 18:19:57 +0800 Subject: [PATCH 17/29] update --- .../Controllers/Admin/CourseController.php | 30 +++++++++++++++++++ app/Models/Course.php | 28 +++++++++++++++++ app/Models/CourseContent.php | 2 +- routes/api.php | 1 + 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/CourseController.php b/app/Http/Controllers/Admin/CourseController.php index 664c65b..69b3193 100755 --- a/app/Http/Controllers/Admin/CourseController.php +++ b/app/Http/Controllers/Admin/CourseController.php @@ -333,6 +333,36 @@ class CourseController extends BaseController return $this->success($url); } + /** + * @OA\Get( + * path="/api/admin/courses/check-qrcode", + * tags={"课程管理"}, + * summary="签到二维码", + * description="", + * @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="id"), + * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), + * @OA\Response( + * response="200", + * description="暂无" + * ) + * ) + */ + public function checkQrcode() + { + $all = \request()->all(); + $messages = [ + 'id.required' => 'Id必填', + ]; + $validator = Validator::make($all, [ + 'id' => 'required' + ], $messages); + if ($validator->fails()) { + return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); + } + $url = (new Course())->getCourseCheckQrcode($all['id']); + return $this->success($url); + } + /** * @OA\Get( * path="/api/admin/courses/send-sms", diff --git a/app/Models/Course.php b/app/Models/Course.php index f0a2bc9..1854a0c 100755 --- a/app/Models/Course.php +++ b/app/Models/Course.php @@ -185,5 +185,33 @@ class Course extends SoftDeletesModel return $url; } + /** + * 获取课程报名小程序码 + */ + public function getCourseCheckQrcode($courseId) + { + $course = Course::find($courseId); + $path = config('filesystems.disks.public.root') . '/course_check_qrcode/' . $course->id . '.png'; + $url = config('filesystems.disks.public.url') . '/course_check_qrcode/' . $course->id . '.png'; + $fileSys = new Filesystem(); + if ($fileSys->exists($path)) { + return $url; + } + $config = [ + 'app_id' => \config('app.applet_appid'), + 'secret' => \config('app.applet_secret') + ]; + $app = Factory::miniProgram($config); + $tmp = $app->app_code->get('packages/sign/course?course_id=' . $courseId, [ + // todo:: 版本切换 + // 'env_version' => "release" // 正式版 + 'env_version' => "trial" // 体验版 + ]); + $dir = dirname($path); + $fileSys->ensureDirectoryExists($dir, 0755, true); + $fileSys->put($path, $tmp); + return $url; + } + } diff --git a/app/Models/CourseContent.php b/app/Models/CourseContent.php index 7577452..c28bbe7 100755 --- a/app/Models/CourseContent.php +++ b/app/Models/CourseContent.php @@ -77,7 +77,7 @@ class CourseContent extends SoftDeletesModel 'secret' => \config('app.applet_secret') ]; $app = Factory::miniProgram($config); - $tmp = $app->app_code->get("/packages/sign/index?course_id={$courseContent->course_id}&course_content_id={$courseContentId}", [ + $tmp = $app->app_code->get('/packages/sign/index?course_content_id=' . $courseContentId, [ // 'env_version' => "release" // 正式版 'env_version' => "trial" // 体验版 ]); diff --git a/routes/api.php b/routes/api.php index 50270a7..f402968 100755 --- a/routes/api.php +++ b/routes/api.php @@ -48,6 +48,7 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () { Route::post('courses/excel-show', [\App\Http\Controllers\Admin\CourseController::class, "excelShow"]); Route::post('courses/import', [\App\Http\Controllers\Admin\CourseController::class, "import"]); Route::get('courses/qrcode', [\App\Http\Controllers\Admin\CourseController::class, "qrcode"]); + Route::get('courses/check-qrcode', [\App\Http\Controllers\Admin\CourseController::class, "checkQrcode"]); Route::get('courses/send-sms', [\App\Http\Controllers\Admin\CourseController::class, "sendSms"]); // 排课 From 9cf34f8b90f81be35b7a218e946a2636bc986cf3 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 18:58:42 +0800 Subject: [PATCH 18/29] update --- .../Controllers/Mobile/CourseController.php | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index 19a6e8a..fae6f7e 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -223,7 +223,7 @@ class CourseController extends CommonController */ public function myCourse() { - $list = Course::with('typeDetail','courseContentEvaluation')->with(['courseSigns' => function ($query) { + $list = Course::with('typeDetail', 'courseContentEvaluation')->with(['courseSigns' => function ($query) { $query->where('user_id', $this->getUserId()); }])->whereHas('courseSigns', function ($query) { $query->where('user_id', $this->getUserId()); @@ -652,6 +652,7 @@ class CourseController extends CommonController * path="/api/mobile/course/content-check-list", * tags={"小程序-课程"}, * summary="获取签到记录", + * @OA\Parameter(name="course_id", in="query", @OA\Schema(type="string"), required=false, description="课程id"), * @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="string"), required=false, description="课表id"), * @OA\Response( * response=200, @@ -662,18 +663,14 @@ class CourseController extends CommonController public function contentCheckList() { $all = \request()->all(); - $messages = [ - 'course_content_id.required' => '课程id必填', - ]; - $validator = Validator::make($all, [ - 'course_content_id' => 'required' - ], $messages); - if ($validator->fails()) { - return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); - } - - $list = CourseContentCheck::where('course_content_id', $all['course_content_id']) - ->where('user_id', $this->getUserId()) + $list = CourseContentCheck::where(function ($query) use ($all) { + if (isset($all['course_id'])) { + $query->where('course_id', $all['course_id']); + } + if (isset($all['course_content_id'])) { + $query->where('course_content_id', $all['course_content_id']); + } + })->where('user_id', $this->getUserId()) ->orderBy('created_at', 'desc') ->get(); return $this->success(compact('list')); From 5c0cd1efa898bed16f5e52e7293ec9e88b93e046 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 19:08:33 +0800 Subject: [PATCH 19/29] update --- .../migrations/2025_06_25_150423_create_calendars_table.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/database/migrations/2025_06_25_150423_create_calendars_table.php b/database/migrations/2025_06_25_150423_create_calendars_table.php index 9979fcf..b3d287f 100644 --- a/database/migrations/2025_06_25_150423_create_calendars_table.php +++ b/database/migrations/2025_06_25_150423_create_calendars_table.php @@ -36,6 +36,8 @@ return new class extends Migration { $table->boolean('is_publish')->nullable()->comment('是否向用户发布'); // 地址 $table->string('address')->nullable()->comment('地址'); + // 介绍 + $table->text('introduce')->nullable()->comment('介绍'); $table->timestamps(); $table->softDeletes(); }); From dab03b75a960644fad8cae46e139b7f854159f52 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 20:12:08 +0800 Subject: [PATCH 20/29] update --- app/Http/Controllers/Mobile/SupplyDemandController.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Mobile/SupplyDemandController.php b/app/Http/Controllers/Mobile/SupplyDemandController.php index f27a268..92d0f3d 100755 --- a/app/Http/Controllers/Mobile/SupplyDemandController.php +++ b/app/Http/Controllers/Mobile/SupplyDemandController.php @@ -349,7 +349,11 @@ class SupplyDemandController extends CommonController $query->where('user_id', $all['to_user_id'])->where('to_user_id', $this->getUserId()); })->first(); if (empty($dialogue)) { - return $this->fail([ResponseCode::ERROR_BUSINESS, '会话不存在']); + // 创建一个会话 + $dialogue = Dialogue::create([ + 'user_id' => $this->getUserId(), + 'to_user_id' => $all['to_user_id'] + ]); } $message = Message::with([ 'user' => function ($query) { From 3434fdd788503b3225cf3a6e9075f3faa75022b5 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 20:14:47 +0800 Subject: [PATCH 21/29] update --- app/Http/Controllers/Mobile/SupplyDemandController.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Http/Controllers/Mobile/SupplyDemandController.php b/app/Http/Controllers/Mobile/SupplyDemandController.php index 92d0f3d..30c647a 100755 --- a/app/Http/Controllers/Mobile/SupplyDemandController.php +++ b/app/Http/Controllers/Mobile/SupplyDemandController.php @@ -263,6 +263,7 @@ class SupplyDemandController extends CommonController // 存在对话,如果也存在供需信息id,则更新供需id到最新 if (isset($all['supply_demand_id'])) { $dialogue->supply_demand_id = $all['supply_demand_id']; + $dialogue->contact_count = $dialogue->contact_count + 1; $dialogue->save(); } } From 07c28799b8beb11c24edbb503d92d370f3393ff8 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 20:21:25 +0800 Subject: [PATCH 22/29] update --- .../Mobile/SupplyDemandController.php | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/app/Http/Controllers/Mobile/SupplyDemandController.php b/app/Http/Controllers/Mobile/SupplyDemandController.php index 30c647a..75ee8eb 100755 --- a/app/Http/Controllers/Mobile/SupplyDemandController.php +++ b/app/Http/Controllers/Mobile/SupplyDemandController.php @@ -255,17 +255,6 @@ class SupplyDemandController extends CommonController 'to_user_id' => $all['to_user_id'], 'supply_demand_id' => $all['supply_demand_id'] ?? 0 ]); - // 增加联系次数 - if (isset($all['supply_demand_id'])) { - SupplyDemand::where('id', $all['supply_demand_id'])->increment('contact_count'); - } - } else { - // 存在对话,如果也存在供需信息id,则更新供需id到最新 - if (isset($all['supply_demand_id'])) { - $dialogue->supply_demand_id = $all['supply_demand_id']; - $dialogue->contact_count = $dialogue->contact_count + 1; - $dialogue->save(); - } } if (isset($all['supply_demand_id'])) { $now = date('Y-m-d'); @@ -274,6 +263,12 @@ class SupplyDemandController extends CommonController if ($supplyDemand->expire_time > $now) { return $this->fail([ResponseCode::ERROR_BUSINESS, '该信息已过期,不能私信']); } + if ($dialogue->supply_demand_id != $all['supply_demand_id']) { + // 第一次联系才增加一次 + SupplyDemand::where('id', $all['supply_demand_id'])->increment('contact_count'); + } + $dialogue->supply_demand_id = $all['supply_demand_id']; + $dialogue->save(); } // 每天限制私信次数限制 $message_limit = Config::getValueByKey('message_limit'); From 6512d514e0ef05a2f981c79e49e6e636301177ce Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 20:22:16 +0800 Subject: [PATCH 23/29] update --- app/Http/Controllers/Mobile/SupplyDemandController.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/Http/Controllers/Mobile/SupplyDemandController.php b/app/Http/Controllers/Mobile/SupplyDemandController.php index 75ee8eb..20e60fa 100755 --- a/app/Http/Controllers/Mobile/SupplyDemandController.php +++ b/app/Http/Controllers/Mobile/SupplyDemandController.php @@ -252,8 +252,7 @@ class SupplyDemandController extends CommonController // 创建一条会话 $dialogue = Dialogue::create([ 'user_id' => $this->getUserId(), - 'to_user_id' => $all['to_user_id'], - 'supply_demand_id' => $all['supply_demand_id'] ?? 0 + 'to_user_id' => $all['to_user_id'] ]); } if (isset($all['supply_demand_id'])) { From d09b63d4fad5a0adeb5b035cc10ea6785d0c388d Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 20:23:45 +0800 Subject: [PATCH 24/29] update --- app/Http/Controllers/Mobile/SupplyDemandController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Mobile/SupplyDemandController.php b/app/Http/Controllers/Mobile/SupplyDemandController.php index 20e60fa..66dc7ce 100755 --- a/app/Http/Controllers/Mobile/SupplyDemandController.php +++ b/app/Http/Controllers/Mobile/SupplyDemandController.php @@ -259,7 +259,7 @@ class SupplyDemandController extends CommonController $now = date('Y-m-d'); // 过期数据不能私信 $supplyDemand = SupplyDemand::find($all['supply_demand_id']); - if ($supplyDemand->expire_time > $now) { + if (isset($supplyDemand->expire_time) && $supplyDemand->expire_time > $now) { return $this->fail([ResponseCode::ERROR_BUSINESS, '该信息已过期,不能私信']); } if ($dialogue->supply_demand_id != $all['supply_demand_id']) { From d670360ddfee588bce0543ed241355feffe5ce23 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 20:38:52 +0800 Subject: [PATCH 25/29] update --- app/Http/Controllers/Mobile/CourseController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index fae6f7e..d2cddd0 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -109,7 +109,7 @@ class CourseController extends CommonController if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } - $detail = Course::with('qunImage', 'typeDetail', 'courseForms', 'teacher') + $detail = Course::with('qunImage', 'typeDetail', 'courseForms', 'teacher','courseContentEvaluation') ->withCount(['courseSigns as my_user' => function ($query) { $query->where('user_id', $this->getUserId()); }])->find($all['course_id']); From b7cd90519f5e1174a49eca9efbf109165c1e138c Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 20:39:48 +0800 Subject: [PATCH 26/29] update --- app/Http/Controllers/Mobile/CourseController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index d2cddd0..8a99c2d 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -109,7 +109,7 @@ class CourseController extends CommonController if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } - $detail = Course::with('qunImage', 'typeDetail', 'courseForms', 'teacher','courseContentEvaluation') + $detail = Course::with('qunImage', 'typeDetail', 'courseForms', 'teacher','courseContentEvaluation.courseContentEvaluationAsks') ->withCount(['courseSigns as my_user' => function ($query) { $query->where('user_id', $this->getUserId()); }])->find($all['course_id']); From 12c84eac17451c95d249be75322eb50f0dbb2910 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 20:50:55 +0800 Subject: [PATCH 27/29] update --- routes/api.php | 1 + 1 file changed, 1 insertion(+) diff --git a/routes/api.php b/routes/api.php index f402968..2c68f33 100755 --- a/routes/api.php +++ b/routes/api.php @@ -279,6 +279,7 @@ Route::group(["namespace" => "Mobile", "prefix" => "mobile"], function () { Route::post('course/course-form', [\App\Http\Controllers\Mobile\CourseController::class, "courseForm"]); Route::get('course/get-sign', [\App\Http\Controllers\Mobile\CourseController::class, "getSign"]); Route::post('course/update-sign', [\App\Http\Controllers\Mobile\CourseController::class, "updateSign"]); + Route::post('course/course-content-form', [\App\Http\Controllers\Mobile\CourseController::class, "courseContentForm"]); // 获取缴费二维码 Route::get('course/pay', [\App\Http\Controllers\Mobile\CourseController::class, "pay"]); From 467e3f899b4e8cec90db26c865b250715b14d286 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 20:55:41 +0800 Subject: [PATCH 28/29] update --- .../Controllers/Mobile/OtherController.php | 56 +++++-------------- 1 file changed, 15 insertions(+), 41 deletions(-) diff --git a/app/Http/Controllers/Mobile/OtherController.php b/app/Http/Controllers/Mobile/OtherController.php index 0becf79..b156021 100755 --- a/app/Http/Controllers/Mobile/OtherController.php +++ b/app/Http/Controllers/Mobile/OtherController.php @@ -90,47 +90,21 @@ class OtherController extends CommonController return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } $YuanheRepository = new YuanheRepository(); - $result = $YuanheRepository->companyInfo(['enterpriseName' => $all['company_name']]); -// $result = [ -// "createBy" => null, -// "createDt" => null, -// "updateBy" => null, -// "updateDt" => null, -// "enterpriseId" => "1950060660573786112", -// "enterpriseName" => "苏州元瞰科技有限公司", -// "creditCode" => "91320594MA7F0G9W6A", -// "keyNo" => "db5ppy5kbsprbbhjbjlarvmvphjhp3mrkv", -// "isAbroad" => "0", -// "status" => "注销", -// "logo" => "https://image.qcc.com/logo/EntImage.png", -// "operName" => "刘杰杰", -// "contactMail" => "425039148@qq.com", -// "contactPhone" => "15298866552", -// "startDate" => "2021-12-21", -// "endDate" => null, -// "updatedDate" => "2025-08-17", -// "registCapi" => "100万元", -// "registAmount" => "1000000.0000", -// "registCapiType" => "1", -// "currencyType" => null, , -// "termStart" => "2021-12-21", -// "termEnd" => null, -// "checkDate" => "2025-07-03", -// "orgNo" => "MA7F0G9W-6", -// "isOnStock" => "0", -// "stockNumber" => "", -// "stockType" => "", -// "stockDate" => null, -// "province" => "江苏省", -// "city" => "苏州市", -// "country" => "苏州工业园区", -// "areaCode" => "320576", -// "address" => "苏州工业园区亭新街11号B1栋二楼", -// "businessScope" => "一般项目:人工智能应用软件开发;人工智能基础软件开发;人工智能理论与算法软件开发;软件销售;软件开发;技术服务、技术开发、", -// "tagList" => null, -// "qccIndustry" => null, -// "isYhInvested" => false -// ]; + // $result = $YuanheRepository->companyInfo(['enterpriseName' => $all['company_name']]); + $result[] = [ + "createBy" => null, + "createDt" => null, + "updateBy" => null, + "updateDt" => null, + "enterpriseId" => "1950060660573786112", + "enterpriseName" => "苏州元瞰科技有限公司", + "creditCode" => "91320594MA7F0G9W6A", + "keyNo" => "db5ppy5kbsprbbhjbjlarvmvphjhp3mrkv", + "isAbroad" => "0", + "status" => "注销", + "logo" => "https://image.qcc.com/logo/EntImage.png", + "operName" => "刘杰杰", + ]; if (!$result) { return $this->fail([ResponseCode::ERROR_PARAMETER, '获取失败']); } From 396d6d915a8e5f307368fa885dc51f574ec01548 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 18 Aug 2025 20:58:50 +0800 Subject: [PATCH 29/29] update --- .../Controllers/Mobile/OtherController.php | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Mobile/OtherController.php b/app/Http/Controllers/Mobile/OtherController.php index b156021..94a7e89 100755 --- a/app/Http/Controllers/Mobile/OtherController.php +++ b/app/Http/Controllers/Mobile/OtherController.php @@ -90,7 +90,7 @@ class OtherController extends CommonController return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } $YuanheRepository = new YuanheRepository(); - // $result = $YuanheRepository->companyInfo(['enterpriseName' => $all['company_name']]); + // $result = $YuanheRepository->companyInfo(['enterpriseName' => $all['company_name']]); $result[] = [ "createBy" => null, "createDt" => null, @@ -104,6 +104,32 @@ class OtherController extends CommonController "status" => "注销", "logo" => "https://image.qcc.com/logo/EntImage.png", "operName" => "刘杰杰", + "contactMail" => "425039148@qq.com", + "contactPhone" => "15298866552", + "startDate" => "2021-12-21", + "endDate" => null, + "updatedDate" => "2025-08-17", + "registCapi" => "100万元", + "registAmount" => "1000000.0000", + "registCapiType" => "1", + "currencyType" => null, + "termStart" => "2021-12-21", + "termEnd" => null, + "checkDate" => "2025-07-03", + "orgNo" => "MA7F0G9W-6", + "isOnStock" => "0", + "stockNumber" => "", + "stockType" => "", + "stockDate" => null, + "province" => "江苏省", + "city" => "苏州市", + "country" => "苏州工业园区", + "areaCode" => "320576", + "address" => "苏州工业园区亭新街11号B1栋二楼", + "businessScope" => "一般项目:人工智能应用软件开发", + "tagList" => null, + "qccIndustry" => null, + "isYhInvested" => false ]; if (!$result) { return $this->fail([ResponseCode::ERROR_PARAMETER, '获取失败']);