From b97808f282c449facb7ac25168929cee06145725 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 4 Jul 2025 10:44:04 +0800 Subject: [PATCH 01/68] update --- .../Admin/EmailRecordController.php | 220 ++++++++++++++++++ .../Admin/EmailTemplateController.php | 36 ++- .../Controllers/Mobile/UserController.php | 3 +- app/Models/EmailRecord.php | 4 + app/Models/EmailRecordUser.php | 4 + routes/api.php | 14 +- 6 files changed, 257 insertions(+), 24 deletions(-) create mode 100644 app/Http/Controllers/Admin/EmailRecordController.php diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php new file mode 100644 index 0000000..77ebb88 --- /dev/null +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -0,0 +1,220 @@ +all(); + $list = $this->model->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 . '%'); + } + // 范围搜索 + 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); + } + + /** + * @OA\Get( + * path="/api/admin/email-record/show", + * tags={"邮件发送配置"}, + * summary="详情", + * description="", + * @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="id"), + * @OA\Parameter(name="show_relation", 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 show() + { + $all = \request()->all(); + $messages = [ + 'title.required' => '标题必填', + ]; + $validator = Validator::make($all, [ + 'title' => 'required' + ], $messages); + if ($validator->fails()) { + return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); + } + $detail = $this->model->with('emailRecordUsers.user')->find($all['id']); + return $this->success($detail); + } + + /** + * @OA\Post( + * path="/api/admin/email-record/save", + * tags={"邮件发送配置"}, + * summary="保存", + * description="", + * @OA\Parameter(name="id", in="query", @OA\Schema(type="integer", format="int64"), required=true, description="ID(存在则更新,不存在则新增)"), + * @OA\Parameter(name="time", in="query", @OA\Schema(type="string", format="date"), required=false, description="发送时间"), + * @OA\Parameter(name="subject", in="query", @OA\Schema(type="string", maxLength=255), required=false, description="主题"), + * @OA\Parameter(name="email_template_id", in="query", @OA\Schema(type="string", format="mediumtext"), required=false, description="邮件模版id"), + * @OA\Parameter(name="email_record_users", in="query", @OA\Schema(type="string", format="mediumtext"), required=false, description="二维数组,包括建明:user_id"), + * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"), + * @OA\Response( + * response="200", + * description="操作成功" + * ) + * ) + */ + public function save() + { + $all = \request()->all(); + DB::beginTransaction(); + try { + if (isset($all['id'])) { + $model = $this->model->find($all['id']); + if (empty($model)) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '数据不存在']); + } + } else { + $model = $this->model; + $all['admin_id'] = $this->getUserId(); + $all['department_id'] = $this->getUser()->department_id; + } + $original = $model->getOriginal(); + $model->fill($all); + $model->save(); + DB::commit(); + // 记录日志 + $this->saveLogs($original, $model); + return $this->success($model); + } catch (\Exception $exception) { + DB::rollBack(); + return $this->fail([$exception->getCode(), $exception->getMessage()]); + } + } + + /** + * @OA\Get( + * path="/api/admin/email-record/destroy", + * 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 destroy() + { + return parent::destroy(); + } + +} diff --git a/app/Http/Controllers/Admin/EmailTemplateController.php b/app/Http/Controllers/Admin/EmailTemplateController.php index 3686f6f..b3717bd 100644 --- a/app/Http/Controllers/Admin/EmailTemplateController.php +++ b/app/Http/Controllers/Admin/EmailTemplateController.php @@ -11,6 +11,7 @@ use App\Models\CourseContentEvaluationAsk; use App\Models\CourseContentEvaluationForm; use App\Models\CustomForm; use App\Models\CustomFormField; +use App\Models\EmailTemplate; use App\Models\SupplyDemand; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; @@ -25,14 +26,14 @@ class EmailTemplateController extends BaseController */ public function __construct() { - parent::__construct(new Calendar()); + parent::__construct(new EmailTemplate()); } /** * @OA\Get( - * path="/api/admin/calendars/index", - * tags={"日历管理"}, + * path="/api/admin/email-template/index", + * tags={"邮件模版管理"}, * summary="列表", * description="", * @OA\Parameter(name="is_export", in="query", @OA\Schema(type="string"), required=false, description="是否导出0否1是"), @@ -44,7 +45,6 @@ class EmailTemplateController extends BaseController * @OA\Parameter(name="sort_name", in="query", @OA\Schema(type="string"), required=false, description="排序字段名字"), * @OA\Parameter(name="sort_type", in="query", @OA\Schema(type="string"), required=false, description="排序类型"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), - * @OA\Parameter(name="keyword", in="query", @OA\Schema(type="string"), required=true, description="关键词"), * @OA\Response( * response="200", * description="暂无" @@ -122,8 +122,8 @@ class EmailTemplateController extends BaseController /** * @OA\Get( - * path="/api/admin/calendars/show", - * tags={"日历管理"}, + * path="/api/admin/email-template/show", + * tags={"邮件模版管理"}, * summary="详情", * description="", * @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="id"), @@ -139,31 +139,29 @@ class EmailTemplateController extends BaseController { $all = \request()->all(); $messages = [ - 'id.required' => 'Id必填', + 'title.required' => '标题必填', ]; $validator = Validator::make($all, [ - 'id' => 'required' + 'title' => 'required' ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } - $detail = $this->model->with('courseContent')->find($all['id']); + $detail = $this->model->find($all['id']); return $this->success($detail); } /** * @OA\Post( - * path="/api/admin/calendars/save", - * tags={"日历管理"}, + * path="/api/admin/email-template/save", + * tags={"邮件模版管理"}, * summary="保存", * description="", * @OA\Parameter(name="id", in="query", @OA\Schema(type="integer", format="int64"), required=true, description="ID(存在则更新,不存在则新增)"), - * @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="integer"), required=false, description="课程课堂ID"), - * @OA\Parameter(name="date", in="query", @OA\Schema(type="string", format="date"), required=false, description="日期(YYYY-MM-DD)"), - * @OA\Parameter(name="title", in="query", @OA\Schema(type="string", maxLength=255), required=false, description="标题"), - * @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="title", in="query", @OA\Schema(type="integer"), required=false, description="标题"), + * @OA\Parameter(name="description", in="query", @OA\Schema(type="string", format="date"), required=false, description="描述"), + * @OA\Parameter(name="content", in="query", @OA\Schema(type="string", maxLength=255), required=false, description="邮件内容"), + * @OA\Parameter(name="var", in="query", @OA\Schema(type="string", format="mediumtext"), required=false, description="变量描述"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"), * @OA\Response( * response="200", @@ -178,8 +176,8 @@ class EmailTemplateController extends BaseController /** * @OA\Get( - * path="/api/admin/calendars/destroy", - * tags={"日历管理"}, + * path="/api/admin/email-template/destroy", + * tags={"邮件模版管理"}, * summary="删除", * description="", * @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="id"), diff --git a/app/Http/Controllers/Mobile/UserController.php b/app/Http/Controllers/Mobile/UserController.php index 0efb971..76ab4ab 100755 --- a/app/Http/Controllers/Mobile/UserController.php +++ b/app/Http/Controllers/Mobile/UserController.php @@ -240,7 +240,8 @@ class UserController extends CommonController $query->where('start_date', '<=', $nowDate)->where('end_date', '>=', $nowDate); })->first(); if ($course_signs) { - $course_signs->qrcode = $doorRepository->getEmpQrCodeByCourse($course_signs, $out); + //$course_signs->qrcode = $doorRepository->getEmpQrCodeByCourse($course_signs, $out); + $course_signs->qrcode = ''; } // 是否有资格进入校友库 $enter_schoolmate = User::whereHas('courseSigns', function ($query) { diff --git a/app/Models/EmailRecord.php b/app/Models/EmailRecord.php index 089aedc..448d1d5 100755 --- a/app/Models/EmailRecord.php +++ b/app/Models/EmailRecord.php @@ -8,6 +8,10 @@ use Illuminate\Support\Facades\Cache; class EmailRecord extends SoftDeletesModel { + public function emailRecordUsers() + { + return $this->hasMany(EmailRecordUser::class, 'email_record_id', 'id'); + } } diff --git a/app/Models/EmailRecordUser.php b/app/Models/EmailRecordUser.php index 2e00a71..3df9e13 100755 --- a/app/Models/EmailRecordUser.php +++ b/app/Models/EmailRecordUser.php @@ -8,6 +8,10 @@ use Illuminate\Support\Facades\Cache; class EmailRecordUser extends SoftDeletesModel { + public function user() + { + return $this->hasOne(User::class, 'id', 'user_id'); + } } diff --git a/routes/api.php b/routes/api.php index af9ee1f..66d95b2 100755 --- a/routes/api.php +++ b/routes/api.php @@ -205,10 +205,16 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () { Route::get('calendars/destroy', [\App\Http\Controllers\Admin\CalendarsController::class, "destroy"]); // 邮件模版 - Route::get('email-template/index', [\App\Http\Controllers\Admin\EmailTemplatesController::class, "index"]); - Route::get('email-template/show', [\App\Http\Controllers\Admin\EmailTemplatesController::class, "show"]); - Route::post('email-template/save', [\App\Http\Controllers\Admin\EmailTemplatesController::class, "save"]); - Route::get('email-template/destroy', [\App\Http\Controllers\Admin\EmailTemplatesController::class, "destroy"]); + Route::get('email-template/index', [\App\Http\Controllers\Admin\EmailTemplateController::class, "index"]); + Route::get('email-template/show', [\App\Http\Controllers\Admin\EmailTemplateController::class, "show"]); + Route::post('email-template/save', [\App\Http\Controllers\Admin\EmailTemplateController::class, "save"]); + Route::get('email-template/destroy', [\App\Http\Controllers\Admin\EmailTemplateController::class, "destroy"]); + + // 邮件发送配置 + Route::get('email-record/index', [\App\Http\Controllers\Admin\EmailRecordController::class, "index"]); + Route::get('email-record/show', [\App\Http\Controllers\Admin\EmailRecordController::class, "show"]); + Route::post('email-record/save', [\App\Http\Controllers\Admin\EmailRecordController::class, "save"]); + Route::get('email-record/destroy', [\App\Http\Controllers\Admin\EmailRecordController::class, "destroy"]); }); From 59acfcd1af4ab8c78454ca97b188f606150eedfd Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 4 Jul 2025 13:19:26 +0800 Subject: [PATCH 02/68] update --- app/Console/Commands/SendEmail.php | 70 +++++++++++++++++++ app/Console/Kernel.php | 2 + .../Admin/EmailRecordController.php | 52 +++++++++++++- app/Models/EmailRecord.php | 6 ++ app/Models/EmailRecordUser.php | 29 +++++++- ...7_04_092917_create_email_records_table.php | 2 + ...092918_create_email_record_users_table.php | 5 +- resources/views/email.blade.php | 7 ++ routes/api.php | 2 +- 9 files changed, 169 insertions(+), 6 deletions(-) create mode 100755 app/Console/Commands/SendEmail.php create mode 100644 resources/views/email.blade.php diff --git a/app/Console/Commands/SendEmail.php b/app/Console/Commands/SendEmail.php new file mode 100755 index 0000000..6e0361a --- /dev/null +++ b/app/Console/Commands/SendEmail.php @@ -0,0 +1,70 @@ +where('status', 0); + })->where(function ($query) { + $query->whereNull('time')->orWhere('time', '<', date('Y-m-d H:i:s')); + })->get(); + foreach ($emailRecords as $records) { + // 获取模版配置 + $emailTemplate = $records->emailTemplate; + // 获取未发送人员 + $emailRecordUsers = $records->emailRecordUsers->where('status', 0); + foreach ($emailRecordUsers as $recordUser) { + // 替换后的标题 + $title = EmailRecordUser::template($records->subject, $recordUser); + // 替换后的内容 + $template = EmailRecordUser::template($emailTemplate->content, $recordUser); + // 发送邮件 + EmailRecordUser::email($title, $template, $recordUser); + $recordUser->status = 1; + $recordUser->save(); + } + } + return $this->info('更新完成'); + } + +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 8c11076..c669aed 100755 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -22,6 +22,8 @@ class Kernel extends ConsoleKernel $schedule->command('update_appointment_total')->dailyAt('1:00'); // 生日检测 $schedule->command('check_birthday')->dailyAt('09:00'); + // 邮件群发 + $schedule->command('send_email')->everyMinute(); } /** diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php index 77ebb88..315c0f5 100644 --- a/app/Http/Controllers/Admin/EmailRecordController.php +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -162,7 +162,7 @@ class EmailRecordController extends BaseController * @OA\Parameter(name="time", in="query", @OA\Schema(type="string", format="date"), required=false, description="发送时间"), * @OA\Parameter(name="subject", in="query", @OA\Schema(type="string", maxLength=255), required=false, description="主题"), * @OA\Parameter(name="email_template_id", in="query", @OA\Schema(type="string", format="mediumtext"), required=false, description="邮件模版id"), - * @OA\Parameter(name="email_record_users", in="query", @OA\Schema(type="string", format="mediumtext"), required=false, description="二维数组,包括建明:user_id"), + * @OA\Parameter(name="email_record_users", in="query", @OA\Schema(type="string", format="mediumtext"), required=false, description="二维数组,包括建明:email,var_data自定义数据"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"), * @OA\Response( * response="200", @@ -188,6 +188,10 @@ class EmailRecordController extends BaseController $original = $model->getOriginal(); $model->fill($all); $model->save(); + if (isset($all['email_record_users'])) { + $model->emailRecordUsers()->delete(); + $model->emailRecordUsers()->createMany($all['email_record_users']); + } DB::commit(); // 记录日志 $this->saveLogs($original, $model); @@ -217,4 +221,50 @@ class EmailRecordController extends BaseController return parent::destroy(); } + /** + * @OA\Post( + * path="/api/admin/email-record/excel-show", + * tags={"邮件发送配置"}, + * summary="导入预览", + * description="", + * @OA\Parameter(name="file", 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", + * description="暂无" + * ) + * ) + */ + public function excelShow() + { + $file = \request()->file('file'); + //判断文件是否有效 + if (!(\request()->hasFile('file') && $file->isValid())) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '文件不存在或无效']); + } + //获取文件大小 + $img_size = floor($file->getSize() / 1024); + if ($img_size >= 50 * 1024) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '文件必须小于50M']); + } + //过滤文件后缀 + $ext = $file->getClientOriginalExtension(); + if (!in_array($ext, ['xls', 'xlsx', 'csv'])) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '仅支持xls/xlsx/csv格式']); + } + $tempFile = $file->getRealPath(); + $dataArray = (new FastExcel)->import($tempFile)->toArray(); + $list = []; + foreach ($dataArray as $key => $value) { + if (!isset($value['邮箱']) || empty($value['邮箱'])) { + continue; + } + $list[] = [ + 'email' => $value['邮箱'], + 'var_data' => $value + ]; + } + return $this->success($list); + } + } diff --git a/app/Models/EmailRecord.php b/app/Models/EmailRecord.php index 448d1d5..be0f8dd 100755 --- a/app/Models/EmailRecord.php +++ b/app/Models/EmailRecord.php @@ -8,6 +8,12 @@ use Illuminate\Support\Facades\Cache; class EmailRecord extends SoftDeletesModel { + + public function emailTemplate() + { + return $this->hasOne(EmailTemplate::class, 'id', 'email_template_id'); + } + public function emailRecordUsers() { return $this->hasMany(EmailRecordUser::class, 'email_record_id', 'id'); diff --git a/app/Models/EmailRecordUser.php b/app/Models/EmailRecordUser.php index 3df9e13..dd49489 100755 --- a/app/Models/EmailRecordUser.php +++ b/app/Models/EmailRecordUser.php @@ -5,12 +5,37 @@ namespace App\Models; use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\Mail; class EmailRecordUser extends SoftDeletesModel { - public function user() + protected $casts = ['var_data' => 'json']; + + /** + * 邮件模版内容替换 + * @param $template + * @param $email_record_users + */ + public static function template($template, $record_user) + { + $var_data = $record_user->var_data; + foreach ($var_data as $key => $var) { + $template = str_replace('{' . $key . '}', $var, $template); + } + return $var_data; + } + + + /** + * 发送邮件 + */ + public static function email($title, $template, $record_user) { - return $this->hasOne(User::class, 'id', 'user_id'); + Mail::send('email', compact('template'), function ($message) use ($record_user, $title) { + $message->from(env('MAIL_USERNAME'), '苏州科技商学院'); + $message->to($record_user->email)->subject($title); + }); + return true; } } diff --git a/database/migrations/2025_07_04_092917_create_email_records_table.php b/database/migrations/2025_07_04_092917_create_email_records_table.php index d1e1bac..c3bb6a2 100644 --- a/database/migrations/2025_07_04_092917_create_email_records_table.php +++ b/database/migrations/2025_07_04_092917_create_email_records_table.php @@ -20,6 +20,8 @@ return new class extends Migration { $table->string('subject')->nullable()->comment('邮件主题'); // 邮件模版id $table->integer('email_template_id')->nullable()->comment('邮件模版id'); + // 状态 + $table->tinyInteger('status')->nullable()->default(0)->comment('状态0:待处理1:已处理'); $table->timestamps(); $table->softDeletes(); }); diff --git a/database/migrations/2025_07_04_092918_create_email_record_users_table.php b/database/migrations/2025_07_04_092918_create_email_record_users_table.php index 47fb7d5..67da0fe 100644 --- a/database/migrations/2025_07_04_092918_create_email_record_users_table.php +++ b/database/migrations/2025_07_04_092918_create_email_record_users_table.php @@ -16,8 +16,9 @@ return new class extends Migration { $table->id(); // 发送配置id $table->integer('email_record_id')->nullable()->comment('发送记录id'); - // 接收用户id - $table->integer('user_id')->nullable()->comment('接收用户id'); + $table->json('var_data')->nullable()->comment('自定义的数据'); + // 邮箱 + $table->string('email')->nullable()->comment('邮箱'); // 状态 $table->tinyInteger('status')->nullable()->comment('状态0:待发送1:成功 2:失败'); // 发送时间 diff --git a/resources/views/email.blade.php b/resources/views/email.blade.php new file mode 100644 index 0000000..619dc08 --- /dev/null +++ b/resources/views/email.blade.php @@ -0,0 +1,7 @@ + + + + +{!! $template !!} + + diff --git a/routes/api.php b/routes/api.php index 66d95b2..99726be 100755 --- a/routes/api.php +++ b/routes/api.php @@ -215,7 +215,7 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () { Route::get('email-record/show', [\App\Http\Controllers\Admin\EmailRecordController::class, "show"]); Route::post('email-record/save', [\App\Http\Controllers\Admin\EmailRecordController::class, "save"]); Route::get('email-record/destroy', [\App\Http\Controllers\Admin\EmailRecordController::class, "destroy"]); - + Route::post('email-record/excel-show', [\App\Http\Controllers\Admin\EmailRecordController::class, "excelShow"]); }); }); From 41c9b5111f64a09d3763cbbb9f86d51998fab877 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 4 Jul 2025 13:44:10 +0800 Subject: [PATCH 03/68] update --- app/Http/Controllers/Admin/CalendarsController.php | 4 +++- app/Http/Controllers/Mobile/CourseController.php | 10 +++++----- app/Models/Calendar.php | 5 +++++ .../2025_06_25_150423_create_calendars_table.php | 4 ++++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/Admin/CalendarsController.php b/app/Http/Controllers/Admin/CalendarsController.php index 34032e3..d090c6b 100644 --- a/app/Http/Controllers/Admin/CalendarsController.php +++ b/app/Http/Controllers/Admin/CalendarsController.php @@ -54,7 +54,7 @@ class CalendarsController extends BaseController public function index() { $all = request()->all(); - $list = $this->model->with('courseContent')->where(function ($query) use ($all) { + $list = $this->model->with('course','courseContent')->where(function ($query) use ($all) { if (isset($all['filter']) && !empty($all['filter'])) { foreach ($all['filter'] as $condition) { $key = $condition['key'] ?? null; @@ -158,6 +158,8 @@ class CalendarsController extends BaseController * summary="保存", * description="", * @OA\Parameter(name="id", in="query", @OA\Schema(type="integer", format="int64"), required=true, description="ID(存在则更新,不存在则新增)"), + * @OA\Parameter(name="type", in="query", @OA\Schema(type="integer"), required=false, description="类型1课程2课堂3事件"), + * @OA\Parameter(name="course_id", in="query", @OA\Schema(type="integer"), required=false, description="课程ID"), * @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="integer"), required=false, description="课程课堂ID"), * @OA\Parameter(name="date", in="query", @OA\Schema(type="string", format="date"), required=false, description="日期(YYYY-MM-DD)"), * @OA\Parameter(name="title", in="query", @OA\Schema(type="string", maxLength=255), required=false, description="标题"), diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index 7e55b8d..5cfe01b 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -243,7 +243,7 @@ class CourseController extends CommonController */ public function myCourseContent() { - $list = CourseContent::with('course.typeDetail', 'teacher','courseContentEvaluation')->whereHas('course', function ($query) { + $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) { @@ -310,12 +310,12 @@ class CourseController extends CommonController $messages = [ 'course_content_evaluation_id.required' => '问卷id必填', 'data.required' => '表单数据必填', - // 'time_total.required' => '用时必填' + // 'time_total.required' => '用时必填' ]; $validator = Validator::make($all, [ 'course_content_evaluation_id' => 'required', 'data' => 'required', - // 'time_total' => 'required' + // 'time_total' => 'required' ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); @@ -339,7 +339,7 @@ class CourseController extends CommonController $model = CourseContentEvaluationForm::create([ 'course_content_evaluation_id' => $all['course_content_evaluation_id'], 'user_id' => $this->getUserId(), - 'time_total' => $all['time_total']??0, + 'time_total' => $all['time_total'] ?? 0, 'data' => $all['data'] ]); return $this->success($model); @@ -814,7 +814,7 @@ class CourseController extends CommonController if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } - $list = Calendar::with('courseContent')->where('date', 'like', $all['month'] . '%')->orderBy('date')->get(); + $list = Calendar::with('course', 'courseContent')->where('date', 'like', $all['month'] . '%')->orderBy('date')->get(); return $this->success($list); } diff --git a/app/Models/Calendar.php b/app/Models/Calendar.php index 7c14afc..6abc56e 100755 --- a/app/Models/Calendar.php +++ b/app/Models/Calendar.php @@ -9,6 +9,11 @@ use Illuminate\Support\Facades\Cache; class Calendar extends SoftDeletesModel { + public function course() + { + return $this->hasOne(Course::class, 'id', 'course_id'); + } + public function courseContent() { return $this->hasMany(CourseContent::class, 'id', 'course_content_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 fa41db9..6f8d18c 100644 --- a/database/migrations/2025_06_25_150423_create_calendars_table.php +++ b/database/migrations/2025_06_25_150423_create_calendars_table.php @@ -14,6 +14,10 @@ return new class extends Migration { { Schema::create('calendars', function (Blueprint $table) { $table->id(); + // 类型 + $table->tinyInteger('type')->nullable()->comment('类型1课程2课堂3事件'); + //课程id + $table->integer('course_id')->nullable()->comment('课程id'); // 课程课堂id $table->integer('course_content_id')->nullable()->comment('课程课堂id'); // 日期 From 7bf6cde856b37e8709a16b76ed1035ec32e9b881 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 4 Jul 2025 13:56:45 +0800 Subject: [PATCH 04/68] update --- app/Http/Controllers/Admin/CalendarsController.php | 1 + .../migrations/2025_06_25_150423_create_calendars_table.php | 2 ++ 2 files changed, 3 insertions(+) diff --git a/app/Http/Controllers/Admin/CalendarsController.php b/app/Http/Controllers/Admin/CalendarsController.php index d090c6b..1cf3a38 100644 --- a/app/Http/Controllers/Admin/CalendarsController.php +++ b/app/Http/Controllers/Admin/CalendarsController.php @@ -163,6 +163,7 @@ class CalendarsController extends BaseController * @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="integer"), required=false, description="课程课堂ID"), * @OA\Parameter(name="date", in="query", @OA\Schema(type="string", format="date"), required=false, description="日期(YYYY-MM-DD)"), * @OA\Parameter(name="title", in="query", @OA\Schema(type="string", maxLength=255), required=false, description="标题"), + * @OA\Parameter(name="url", in="query", @OA\Schema(type="string", maxLength=255), required=false, description="url"), * @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)"), 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 6f8d18c..5526c83 100644 --- a/database/migrations/2025_06_25_150423_create_calendars_table.php +++ b/database/migrations/2025_06_25_150423_create_calendars_table.php @@ -30,6 +30,8 @@ return new class extends Migration { $table->dateTime('start_time')->nullable()->comment('开始时间'); // 结束时间 $table->dateTime('end_time')->nullable()->comment('结束时间'); + // 链接 + $table->string('url')->nullable()->comment('链接'); $table->timestamps(); $table->softDeletes(); }); From f0f007a7521448c34e1580560760951a99bff622 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 4 Jul 2025 14:42:24 +0800 Subject: [PATCH 05/68] update --- .../Admin/CourseSignController.php | 2 +- app/Models/User.php | 59 ++++++++++++++++++- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Admin/CourseSignController.php b/app/Http/Controllers/Admin/CourseSignController.php index 43de2e1..f9a966c 100755 --- a/app/Http/Controllers/Admin/CourseSignController.php +++ b/app/Http/Controllers/Admin/CourseSignController.php @@ -526,7 +526,7 @@ class CourseSignController extends BaseController return $this->success(['total' => count($records)]); } catch (\Exception $exception) { DB::rollBack(); - return $this->fail([$exception->getCode(), $exception->getMessage()]); + return $this->fail([$exception->getTrace(), $exception->getMessage()]); } } diff --git a/app/Models/User.php b/app/Models/User.php index 4478058..c94c0a5 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -18,9 +18,62 @@ class User extends Authenticatable implements Auditable use \OwenIt\Auditing\Auditable; use SoftDeletes; - - protected $guarded = ['id']; - + protected $fillable = [ + 'remember_token', + 'created_at', + 'updated_at', + 'nickname', + 'openid', + 'country', + 'province', + 'city', + 'headimgurl', + 'username', + 'password', + 'name', + 'sex', + 'birthday', + 'mobile', + 'idcard', + 'education', + 'company_name', + 'company_position', + 'company_has_share', + 'type', + 'company_type', + 'company_fund', + 'company_area', + 'company_address', + 'company_industry', + 'company_product', + 'school', + 'speciality', + 'overseas_experience', + 'sign_from', + 'email', + 'sales_volume', + 'valuation', + 'market_value', + 'is_yuanhe', + 'plate', + 'introduce', + 'honour', + 'company_need_fund', + 'company_other', + 'remark', + 'is_import', + 'is_vip', + 'is_schoolmate', + 'appointment_total', + 'letter', + 'code', + 'score', + 'pid', + 'company_introduce', + 'company_date', + 'deleted_at', + 'no', + ]; protected $appends = ['is_vip_text', 'is_schoolmate_text', 'appointment_total', 'name']; // 更新时候覆盖更新的字段 From 838864aa7395087fa1fe7c95cf2c0da887f3b42a Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 4 Jul 2025 14:57:49 +0800 Subject: [PATCH 06/68] update --- .../Controllers/Admin/CalendarsController.php | 84 +++---------------- 1 file changed, 11 insertions(+), 73 deletions(-) diff --git a/app/Http/Controllers/Admin/CalendarsController.php b/app/Http/Controllers/Admin/CalendarsController.php index 1cf3a38..ac063bb 100644 --- a/app/Http/Controllers/Admin/CalendarsController.php +++ b/app/Http/Controllers/Admin/CalendarsController.php @@ -35,16 +35,7 @@ class CalendarsController extends BaseController * tags={"日历管理"}, * summary="列表", * description="", - * @OA\Parameter(name="is_export", in="query", @OA\Schema(type="string"), required=false, description="是否导出0否1是"), - * @OA\Parameter(name="export_fields", in="query", @OA\Schema(type="string"), required=false, description="需要导出的字段数组"), - * @OA\Parameter(name="filter", in="query", @OA\Schema(type="string"), required=false, description="查询条件。数组"), - * @OA\Parameter(name="show_relation", in="query", @OA\Schema(type="string"), required=false, description="需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods"), - * @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="sort_name", in="query", @OA\Schema(type="string"), required=false, description="排序字段名字"), - * @OA\Parameter(name="sort_type", in="query", @OA\Schema(type="string"), required=false, description="排序类型"), - * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), - * @OA\Parameter(name="keyword", in="query", @OA\Schema(type="string"), required=true, description="关键词"), + * @OA\Parameter(name="month", in="query", @OA\Schema(type="string"), required=true, description="月份"), * @OA\Response( * response="200", * description="暂无" @@ -53,70 +44,17 @@ class CalendarsController extends BaseController */ public function index() { - $all = request()->all(); - $list = $this->model->with('course','courseContent')->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 . '%'); - } - // 范围搜索 - 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); + $all = \request()->all(); + $messages = [ + 'month.required' => '月份必填', + ]; + $validator = Validator::make($all, [ + 'month' => 'required', + ], $messages); + if ($validator->fails()) { + return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } + $list = Calendar::with('course', 'courseContent')->where('date', 'like', $all['month'] . '%')->orderBy('date')->get(); return $this->success($list); } From 0b5af7935c836c8aebef000628210c59c5f0fe3f Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 4 Jul 2025 15:27:57 +0800 Subject: [PATCH 07/68] update --- app/Http/Controllers/Admin/CourseContentController.php | 4 ++++ app/Models/CourseContent.php | 10 ++++++++-- .../2025_06_24_111502_alert_course_contents_table.php | 3 +++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Admin/CourseContentController.php b/app/Http/Controllers/Admin/CourseContentController.php index d422e8a..e7acdf4 100755 --- a/app/Http/Controllers/Admin/CourseContentController.php +++ b/app/Http/Controllers/Admin/CourseContentController.php @@ -147,6 +147,10 @@ class CourseContentController extends BaseController * @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="操作成功" diff --git a/app/Models/CourseContent.php b/app/Models/CourseContent.php index 70754c9..622d194 100755 --- a/app/Models/CourseContent.php +++ b/app/Models/CourseContent.php @@ -6,9 +6,15 @@ namespace App\Models; class CourseContent extends SoftDeletesModel { - protected $casts = ['publicize_ids' => 'json']; + protected $casts = ['publicize_ids' => 'json', 'file_ids' => 'json']; - protected $appends = ['publicize']; + protected $appends = ['publicize', 'files']; + + public function getFilesAttribute($value) + { + if (empty($this->file_ids)) return []; + return Upload::whereIn('id', $this->file_ids)->get(); + } public function getPublicizeAttribute($value) { 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 2f938cd..7bf19fa 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 @@ -22,6 +22,9 @@ return new class extends Migration $table->dateTime('start_time')->nullable()->comment('开始时间'); // 结束时间 $table->dateTime('end_time')->nullable()->comment('结束时间'); + $table->json('file_ids')->nullable()->comment('文件id数组'); + // 详细地址 + $table->string('address_detail')->nullable()->comment('详细地址'); }); } From 64ed0b4f402aab639315240cb491815421cdb5cb Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 4 Jul 2025 15:36:30 +0800 Subject: [PATCH 08/68] update --- .../Admin/CourseContentController.php | 30 +++++++++++++++++++ app/Models/CourseContent.php | 30 +++++++++++++++++++ routes/api.php | 1 + 3 files changed, 61 insertions(+) diff --git a/app/Http/Controllers/Admin/CourseContentController.php b/app/Http/Controllers/Admin/CourseContentController.php index e7acdf4..0076e52 100755 --- a/app/Http/Controllers/Admin/CourseContentController.php +++ b/app/Http/Controllers/Admin/CourseContentController.php @@ -308,4 +308,34 @@ class CourseContentController extends BaseController } } + /** + * @OA\Get( + * path="/api/admin/course-contents/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 qrcode() + { + $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 CourseContent())->getCourseContentCheckQrcode($all['id']); + return $this->success($url); + } + } diff --git a/app/Models/CourseContent.php b/app/Models/CourseContent.php index 622d194..100fe11 100755 --- a/app/Models/CourseContent.php +++ b/app/Models/CourseContent.php @@ -4,6 +4,9 @@ namespace App\Models; +use EasyWeChat\Factory; +use Illuminate\Filesystem\Filesystem; + class CourseContent extends SoftDeletesModel { protected $casts = ['publicize_ids' => 'json', 'file_ids' => 'json']; @@ -57,5 +60,32 @@ class CourseContent extends SoftDeletesModel return $this->hasOne(CourseContentEvaluation::class, 'course_content_id', 'id'); } + /** + * 获取课程详情小程序码 + */ + public function getCourseContentCheckQrcode($courseContentId) + { + $courseContent = self::find($courseContentId); + $path = config('filesystems.disks.public.root') . '/course_content_qrcode/' . $courseContent->id . '.png'; + $url = config('filesystems.disks.public.url') . '/course_content_qrcode/' . $courseContent->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/surveyFill/index?course_content_id' . $courseContentId, [ + 'env_version' => "release" // 正式版 + // 'env_version' => "trial" // 体验版 + ]); + $dir = dirname($path); + $fileSys->ensureDirectoryExists($dir, 0755, true); + $fileSys->put($path, $tmp); + return $url; + } + } diff --git a/routes/api.php b/routes/api.php index 99726be..695a8d6 100755 --- a/routes/api.php +++ b/routes/api.php @@ -55,6 +55,7 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () { 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"]); + Route::get('course-contents/qrcode', [\App\Http\Controllers\Admin\CourseContentController::class, "qrcode"]); // 课程类别 Route::get('course-types/index', [\App\Http\Controllers\Admin\CourseTypeController::class, "index"]); From 70d60920ee1b13a95aeabe795da890eccef2ace9 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 4 Jul 2025 17:48:08 +0800 Subject: [PATCH 09/68] update --- app/Http/Controllers/Admin/EmailTemplateController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/EmailTemplateController.php b/app/Http/Controllers/Admin/EmailTemplateController.php index b3717bd..353c23c 100644 --- a/app/Http/Controllers/Admin/EmailTemplateController.php +++ b/app/Http/Controllers/Admin/EmailTemplateController.php @@ -54,7 +54,7 @@ class EmailTemplateController extends BaseController public function index() { $all = request()->all(); - $list = $this->model->with('courseContent')->where(function ($query) use ($all) { + $list = $this->model->where(function ($query) use ($all) { if (isset($all['filter']) && !empty($all['filter'])) { foreach ($all['filter'] as $condition) { $key = $condition['key'] ?? null; From 779342c430fd4cb62874ddfbe6c81dc02aa61c65 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 14:13:05 +0800 Subject: [PATCH 10/68] update --- .../Admin/EmailTemplateController.php | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/EmailTemplateController.php b/app/Http/Controllers/Admin/EmailTemplateController.php index 353c23c..9c12cd9 100644 --- a/app/Http/Controllers/Admin/EmailTemplateController.php +++ b/app/Http/Controllers/Admin/EmailTemplateController.php @@ -171,7 +171,31 @@ class EmailTemplateController extends BaseController */ public function save() { - return parent::save(); + $all = \request()->all(); + DB::beginTransaction(); + try { + if (isset($all['id'])) { + $model = $this->model->find($all['id']); + if (empty($model)) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '数据不存在']); + } + } else { + $model = $this->model; + $all['admin_id'] = $this->getUserId(); + $all['department_id'] = $this->getUser()->department_id; + } + $original = $model->getOriginal(); + dd($all); + $model->fill($all); + $model->save(); + DB::commit(); + // 记录日志 + $this->saveLogs($original, $model); + return $this->success($model); + } catch (\Exception $exception) { + DB::rollBack(); + return $this->fail([$exception->getCode(), $exception->getMessage()]); + } } /** From 3a7140812e2031e097a565b324fd6028f15d3df8 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 14:17:34 +0800 Subject: [PATCH 11/68] update --- .../Admin/EmailTemplateController.php | 2 +- app/Http/functions.php | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Admin/EmailTemplateController.php b/app/Http/Controllers/Admin/EmailTemplateController.php index 9c12cd9..e48dbc8 100644 --- a/app/Http/Controllers/Admin/EmailTemplateController.php +++ b/app/Http/Controllers/Admin/EmailTemplateController.php @@ -185,7 +185,7 @@ class EmailTemplateController extends BaseController $all['department_id'] = $this->getUser()->department_id; } $original = $model->getOriginal(); - dd($all); + dd(getVar($all['content'])); $model->fill($all); $model->save(); DB::commit(); diff --git a/app/Http/functions.php b/app/Http/functions.php index 1bdc307..9d6fdec 100755 --- a/app/Http/functions.php +++ b/app/Http/functions.php @@ -676,7 +676,8 @@ function isMultiDimensionalArray($array) * @param lng1,lng2 经度 * @return float 距离,单位为km **/ -function getDistance($lat1,$lng1,$lat2,$lng2){ +function getDistance($lat1, $lng1, $lat2, $lng2) +{ //将角度转为狐度 $radLat1 = deg2rad($lat1);//deg2rad()函数将角度转换为弧度 $radLat2 = deg2rad($lat2); @@ -684,6 +685,16 @@ function getDistance($lat1,$lng1,$lat2,$lng2){ $radLng2 = deg2rad($lng2); $a = $radLat1 - $radLat2; $b = $radLng1 - $radLng2; - $s =2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*6371; - return round($s,1); + $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6371; + return round($s, 1); +} + +/** + * 提取中括号里的数据 + */ +function getVar($text) +{ + $pattern = '/\{.*?\}/'; + preg_match_all($pattern, $text, $matches); + return $matches[0] ?? ''; } From 46c928f99680c6a81ea3f6fa4c0cf086f4ecef62 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 14:20:34 +0800 Subject: [PATCH 12/68] update --- app/Http/functions.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/Http/functions.php b/app/Http/functions.php index 9d6fdec..8712db0 100755 --- a/app/Http/functions.php +++ b/app/Http/functions.php @@ -696,5 +696,9 @@ function getVar($text) { $pattern = '/\{.*?\}/'; preg_match_all($pattern, $text, $matches); - return $matches[0] ?? ''; + if (count($matches[0]) > 0) { + // 数组转英文逗号分割的字符串 + return implode(',', $matches[0]); + } + return ''; } From 6f7f178a7eb9348f38288f0bcd6b761d8183f6de Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 14:24:29 +0800 Subject: [PATCH 13/68] update --- app/Http/Controllers/Admin/EmailTemplateController.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/Http/Controllers/Admin/EmailTemplateController.php b/app/Http/Controllers/Admin/EmailTemplateController.php index e48dbc8..4dbaec8 100644 --- a/app/Http/Controllers/Admin/EmailTemplateController.php +++ b/app/Http/Controllers/Admin/EmailTemplateController.php @@ -161,7 +161,6 @@ class EmailTemplateController extends BaseController * @OA\Parameter(name="title", in="query", @OA\Schema(type="integer"), required=false, description="标题"), * @OA\Parameter(name="description", in="query", @OA\Schema(type="string", format="date"), required=false, description="描述"), * @OA\Parameter(name="content", in="query", @OA\Schema(type="string", maxLength=255), required=false, description="邮件内容"), - * @OA\Parameter(name="var", in="query", @OA\Schema(type="string", format="mediumtext"), required=false, description="变量描述"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"), * @OA\Response( * response="200", @@ -185,7 +184,7 @@ class EmailTemplateController extends BaseController $all['department_id'] = $this->getUser()->department_id; } $original = $model->getOriginal(); - dd(getVar($all['content'])); + $all['var'] = getVar($all['content']); $model->fill($all); $model->save(); DB::commit(); From 17824c19bdee02dcf5efeef8ee82dcb1f7b3662e Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 14:40:58 +0800 Subject: [PATCH 14/68] update --- app/Models/EmailRecordUser.php | 2 +- .../2025_07_04_092918_create_email_record_users_table.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Models/EmailRecordUser.php b/app/Models/EmailRecordUser.php index dd49489..5e9ca64 100755 --- a/app/Models/EmailRecordUser.php +++ b/app/Models/EmailRecordUser.php @@ -22,7 +22,7 @@ class EmailRecordUser extends SoftDeletesModel foreach ($var_data as $key => $var) { $template = str_replace('{' . $key . '}', $var, $template); } - return $var_data; + return $template; } diff --git a/database/migrations/2025_07_04_092918_create_email_record_users_table.php b/database/migrations/2025_07_04_092918_create_email_record_users_table.php index 67da0fe..2ab565f 100644 --- a/database/migrations/2025_07_04_092918_create_email_record_users_table.php +++ b/database/migrations/2025_07_04_092918_create_email_record_users_table.php @@ -20,7 +20,7 @@ return new class extends Migration { // 邮箱 $table->string('email')->nullable()->comment('邮箱'); // 状态 - $table->tinyInteger('status')->nullable()->comment('状态0:待发送1:成功 2:失败'); + $table->tinyInteger('status')->nullable()->default(0)->comment('状态0:待发送1:成功 2:失败'); // 发送时间 $table->dateTime('send_time')->nullable()->comment('发送时间'); $table->timestamps(); From 90018efe00d068622b1681b4d253c5928ecbbf2f Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 14:48:29 +0800 Subject: [PATCH 15/68] update --- app/Console/Commands/SendEmail.php | 12 +++++++++--- ..._07_04_092918_create_email_record_users_table.php | 2 ++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/Console/Commands/SendEmail.php b/app/Console/Commands/SendEmail.php index 6e0361a..80739c8 100755 --- a/app/Console/Commands/SendEmail.php +++ b/app/Console/Commands/SendEmail.php @@ -58,9 +58,15 @@ class SendEmail extends Command $title = EmailRecordUser::template($records->subject, $recordUser); // 替换后的内容 $template = EmailRecordUser::template($emailTemplate->content, $recordUser); - // 发送邮件 - EmailRecordUser::email($title, $template, $recordUser); - $recordUser->status = 1; + try { + // 发送邮件 + EmailRecordUser::email($title, $template, $recordUser); + $recordUser->status = 1; + } catch (\Exception $e) { + $recordUser->status = 2; + $recordUser->reason = $e->getMessage(); + } + $recordUser->send_time = date('Y-m-d H:i:s'); $recordUser->save(); } } diff --git a/database/migrations/2025_07_04_092918_create_email_record_users_table.php b/database/migrations/2025_07_04_092918_create_email_record_users_table.php index 2ab565f..a02ea65 100644 --- a/database/migrations/2025_07_04_092918_create_email_record_users_table.php +++ b/database/migrations/2025_07_04_092918_create_email_record_users_table.php @@ -23,6 +23,8 @@ return new class extends Migration { $table->tinyInteger('status')->nullable()->default(0)->comment('状态0:待发送1:成功 2:失败'); // 发送时间 $table->dateTime('send_time')->nullable()->comment('发送时间'); + // 原因 + $table->string('reason')->nullable()->comment('原因'); $table->timestamps(); $table->softDeletes(); }); From c5bd437214fc1d08496c390a995d7ccbaaed0f50 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 14:52:36 +0800 Subject: [PATCH 16/68] update --- app/Http/Controllers/Admin/EmailTemplateController.php | 2 +- app/Models/EmailTemplate.php | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/EmailTemplateController.php b/app/Http/Controllers/Admin/EmailTemplateController.php index 4dbaec8..72048d1 100644 --- a/app/Http/Controllers/Admin/EmailTemplateController.php +++ b/app/Http/Controllers/Admin/EmailTemplateController.php @@ -147,7 +147,7 @@ class EmailTemplateController extends BaseController if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } - $detail = $this->model->find($all['id']); + $detail = $this->model->withCount('emailRecords')->find($all['id']); return $this->success($detail); } diff --git a/app/Models/EmailTemplate.php b/app/Models/EmailTemplate.php index 56c6a01..accd159 100755 --- a/app/Models/EmailTemplate.php +++ b/app/Models/EmailTemplate.php @@ -9,5 +9,10 @@ use Illuminate\Support\Facades\Cache; class EmailTemplate extends SoftDeletesModel { + public function emailRecords() + { + return $this->hasMany(EmailRecord::class, 'email_template_id', 'id'); + } + } From 8bdaee161a3f6e28ebac3409f714d9c54ebc5207 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 14:55:10 +0800 Subject: [PATCH 17/68] update --- app/Http/Controllers/Admin/BaseController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/BaseController.php b/app/Http/Controllers/Admin/BaseController.php index 0ca5e2a..b2b2918 100755 --- a/app/Http/Controllers/Admin/BaseController.php +++ b/app/Http/Controllers/Admin/BaseController.php @@ -50,7 +50,7 @@ class BaseController extends CommonController public function index() { $all = request()->all(); - $list = $this->model->with(underlineToHump($all['show_relation'] ?? []))->where(function ($query) use ($all) { + $list = $this->model->withCount('emailRecords')->with(underlineToHump($all['show_relation'] ?? []))->where(function ($query) use ($all) { if (isset($all['filter']) && !empty($all['filter'])) { foreach ($all['filter'] as $condition) { $key = $condition['key'] ?? null; From a6dc7589bfd09becca241e467b57000d9906c5e1 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 15:01:06 +0800 Subject: [PATCH 18/68] update --- app/Http/Controllers/Admin/BaseController.php | 2 +- app/Http/Controllers/Admin/EmailTemplateController.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Admin/BaseController.php b/app/Http/Controllers/Admin/BaseController.php index b2b2918..0ca5e2a 100755 --- a/app/Http/Controllers/Admin/BaseController.php +++ b/app/Http/Controllers/Admin/BaseController.php @@ -50,7 +50,7 @@ class BaseController extends CommonController public function index() { $all = request()->all(); - $list = $this->model->withCount('emailRecords')->with(underlineToHump($all['show_relation'] ?? []))->where(function ($query) use ($all) { + $list = $this->model->with(underlineToHump($all['show_relation'] ?? []))->where(function ($query) use ($all) { if (isset($all['filter']) && !empty($all['filter'])) { foreach ($all['filter'] as $condition) { $key = $condition['key'] ?? null; diff --git a/app/Http/Controllers/Admin/EmailTemplateController.php b/app/Http/Controllers/Admin/EmailTemplateController.php index 72048d1..62b689d 100644 --- a/app/Http/Controllers/Admin/EmailTemplateController.php +++ b/app/Http/Controllers/Admin/EmailTemplateController.php @@ -54,7 +54,7 @@ class EmailTemplateController extends BaseController public function index() { $all = request()->all(); - $list = $this->model->where(function ($query) use ($all) { + $list = $this->model->withCount('emailRecords')->where(function ($query) use ($all) { if (isset($all['filter']) && !empty($all['filter'])) { foreach ($all['filter'] as $condition) { $key = $condition['key'] ?? null; From f0f321d4ec38108f45814262563a248a70fb74bb Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 16:13:09 +0800 Subject: [PATCH 19/68] update --- app/Http/Controllers/Admin/EmailRecordController.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php index 315c0f5..98a03f5 100644 --- a/app/Http/Controllers/Admin/EmailRecordController.php +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -14,6 +14,7 @@ use App\Models\CustomFormField; use App\Models\EmailRecord; use App\Models\EmailTemplate; use App\Models\SupplyDemand; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; use Maatwebsite\Excel\Facades\Excel; @@ -259,6 +260,13 @@ class EmailRecordController extends BaseController if (!isset($value['邮箱']) || empty($value['邮箱'])) { continue; } + // 时间标准格式化 + foreach ($value as $k => &$v) { + if ($v instanceof \DateTimeImmutable) { + $v = Carbon::parse($value[$v])->toDateString(); + } + } + $list[] = [ 'email' => $value['邮箱'], 'var_data' => $value From 291e3d0f51bef1a4b5b799770c953484e2be1a9f Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 16:17:16 +0800 Subject: [PATCH 20/68] update --- app/Http/Controllers/Admin/EmailRecordController.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php index 98a03f5..9f8c42d 100644 --- a/app/Http/Controllers/Admin/EmailRecordController.php +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -262,6 +262,7 @@ class EmailRecordController extends BaseController } // 时间标准格式化 foreach ($value as $k => &$v) { + dd($v); if ($v instanceof \DateTimeImmutable) { $v = Carbon::parse($value[$v])->toDateString(); } From 7a4ecccb31459ebc1a2774d1414f3e000d612c4a Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 16:17:44 +0800 Subject: [PATCH 21/68] update --- app/Http/Controllers/Admin/EmailRecordController.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php index 9f8c42d..7c16d18 100644 --- a/app/Http/Controllers/Admin/EmailRecordController.php +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -262,9 +262,8 @@ class EmailRecordController extends BaseController } // 时间标准格式化 foreach ($value as $k => &$v) { - dd($v); if ($v instanceof \DateTimeImmutable) { - $v = Carbon::parse($value[$v])->toDateString(); + $v = Carbon::parse($v)->toDateString(); } } From 767164f1b6ed5c7ad50a74520ec8fe871cfc5127 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 16:21:29 +0800 Subject: [PATCH 22/68] update --- app/Http/Controllers/Admin/EmailRecordController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php index 7c16d18..57e083f 100644 --- a/app/Http/Controllers/Admin/EmailRecordController.php +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -263,7 +263,7 @@ class EmailRecordController extends BaseController // 时间标准格式化 foreach ($value as $k => &$v) { if ($v instanceof \DateTimeImmutable) { - $v = Carbon::parse($v)->toDateString(); + $v = Carbon::parse($v)->toAtomString(); } } From e06b21fd11d48cae7f58dc4a57e5977919307276 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 16:22:54 +0800 Subject: [PATCH 23/68] update --- app/Http/Controllers/Admin/EmailRecordController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php index 57e083f..256d589 100644 --- a/app/Http/Controllers/Admin/EmailRecordController.php +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -263,7 +263,7 @@ class EmailRecordController extends BaseController // 时间标准格式化 foreach ($value as $k => &$v) { if ($v instanceof \DateTimeImmutable) { - $v = Carbon::parse($v)->toAtomString(); + $v = Carbon::parse($v)->rawFormat('Y-m-d H:i'); } } From 69ddba627827c7db98e4178d81d896b4b198fab6 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 18:11:31 +0800 Subject: [PATCH 24/68] update --- app/Http/Controllers/Admin/EmailRecordController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php index 256d589..4048b94 100644 --- a/app/Http/Controllers/Admin/EmailRecordController.php +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -56,7 +56,7 @@ class EmailRecordController extends BaseController public function index() { $all = request()->all(); - $list = $this->model->where(function ($query) use ($all) { + $list = $this->model->with('emailRecordUsers.user')->where(function ($query) use ($all) { if (isset($all['filter']) && !empty($all['filter'])) { foreach ($all['filter'] as $condition) { $key = $condition['key'] ?? null; From 63fef77b9afabb8a46c586eb8f32a34568f83d34 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 7 Jul 2025 18:14:47 +0800 Subject: [PATCH 25/68] update --- app/Http/Controllers/Admin/EmailRecordController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php index 4048b94..1522f20 100644 --- a/app/Http/Controllers/Admin/EmailRecordController.php +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -56,7 +56,7 @@ class EmailRecordController extends BaseController public function index() { $all = request()->all(); - $list = $this->model->with('emailRecordUsers.user')->where(function ($query) use ($all) { + $list = $this->model->with('emailRecordUsers')->where(function ($query) use ($all) { if (isset($all['filter']) && !empty($all['filter'])) { foreach ($all['filter'] as $condition) { $key = $condition['key'] ?? null; @@ -149,7 +149,7 @@ class EmailRecordController extends BaseController if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } - $detail = $this->model->with('emailRecordUsers.user')->find($all['id']); + $detail = $this->model->with('emailRecordUsers')->find($all['id']); return $this->success($detail); } From 606bcc8844a9760c8c6bfa95498ac7b09581e8f6 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Tue, 8 Jul 2025 13:50:06 +0800 Subject: [PATCH 26/68] update --- app/Http/Controllers/Admin/EmailRecordController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php index 1522f20..eb87560 100644 --- a/app/Http/Controllers/Admin/EmailRecordController.php +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -56,7 +56,7 @@ class EmailRecordController extends BaseController public function index() { $all = request()->all(); - $list = $this->model->with('emailRecordUsers')->where(function ($query) use ($all) { + $list = $this->model->where(function ($query) use ($all) { if (isset($all['filter']) && !empty($all['filter'])) { foreach ($all['filter'] as $condition) { $key = $condition['key'] ?? null; From f5f710798dcea9ed3ccf1d2004903cf343dfb2d9 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Tue, 8 Jul 2025 14:04:37 +0800 Subject: [PATCH 27/68] update --- app/Http/Controllers/Admin/EmailRecordController.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php index eb87560..9b81c49 100644 --- a/app/Http/Controllers/Admin/EmailRecordController.php +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -149,7 +149,11 @@ class EmailRecordController extends BaseController if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } - $detail = $this->model->with('emailRecordUsers')->find($all['id']); + $detail = $this->model->with('emailTemplate', 'emailRecordUsers')->find($all['id']); + // 成功数量 + $detail->success_count = $detail->emailRecordUsers->where('status', 1)->count(); + // 失败数量 + $detail->fail_count = $detail->emailRecordUsers->where('status', 2)->count(); return $this->success($detail); } From 5cedc00ea9a2319de8287c722ff038844bce1b5b Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Tue, 8 Jul 2025 14:05:33 +0800 Subject: [PATCH 28/68] update --- app/Http/Controllers/Admin/EmailRecordController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php index 9b81c49..e3b58b9 100644 --- a/app/Http/Controllers/Admin/EmailRecordController.php +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -149,7 +149,7 @@ class EmailRecordController extends BaseController if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } - $detail = $this->model->with('emailTemplate', 'emailRecordUsers')->find($all['id']); + $detail = $this->model->with('emailTemplate', 'emailRecordUsers')->withCount('emailRecordUsers')->find($all['id']); // 成功数量 $detail->success_count = $detail->emailRecordUsers->where('status', 1)->count(); // 失败数量 From 7fa2c2b76d5957fed1ed64ed1a4cd2258ba0ee17 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Tue, 8 Jul 2025 14:29:38 +0800 Subject: [PATCH 29/68] update --- .../Admin/EmailRecordController.php | 110 ++++++++++++++++++ app/Models/EmailRecordUser.php | 5 + routes/api.php | 1 + 3 files changed, 116 insertions(+) diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php index e3b58b9..dadb1a9 100644 --- a/app/Http/Controllers/Admin/EmailRecordController.php +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -12,6 +12,7 @@ use App\Models\CourseContentEvaluationForm; use App\Models\CustomForm; use App\Models\CustomFormField; use App\Models\EmailRecord; +use App\Models\EmailRecordUser; use App\Models\EmailTemplate; use App\Models\SupplyDemand; use Illuminate\Support\Carbon; @@ -122,6 +123,115 @@ class EmailRecordController extends BaseController return $this->success($list); } + /** + * @OA\Get( + * path="/api/admin/email-record/user-index", + * tags={"发送记录"}, + * summary="列表", + * description="", + * @OA\Parameter(name="email_template_id", in="query", @OA\Schema(type="string"), required=false, description="模版id"), + * @OA\Parameter(name="is_export", in="query", @OA\Schema(type="string"), required=false, description="是否导出0否1是"), + * @OA\Parameter(name="export_fields", in="query", @OA\Schema(type="string"), required=false, description="需要导出的字段数组"), + * @OA\Parameter(name="filter", in="query", @OA\Schema(type="string"), required=false, description="查询条件。数组"), + * @OA\Parameter(name="show_relation", in="query", @OA\Schema(type="string"), required=false, description="需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods"), + * @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="sort_name", in="query", @OA\Schema(type="string"), required=false, description="排序字段名字"), + * @OA\Parameter(name="sort_type", 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 userIndex() + { + $all = request()->all(); + $list = EmailRecordUser::with('emailRecord.emailTemplate')->where(function ($query) use ($all) { + if (isset($all['email_template_id'])) { + $query->whereHas('emailRecord', function ($q) use ($all) { + $q->whereHas('emailTemplate', function ($qry) use ($all) { + $qry->where('id', $all['email_template_id']); + }); + }); + } + 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 . '%'); + } + // 范围搜索 + 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); + } + $email_records = EmailRecord::where(function ($query) use ($all) { + if (isset($all['email_template_id'])) { + $query->where('email_template_id', $all['email_template_id']); + } + })->get(); + // 发送总数 + $total_count = EmailRecordUser::whereIn('email_record_id', $email_records->pluck('id'))->count(); + // 成功数量 + $success_count = EmailRecordUser::whereIn('email_record_id', $email_records->pluck('id'))->where('status', 1)->count(); + // 失败数量 + $fail_count = EmailRecordUser::whereIn('email_record_id', $email_records->pluck('id'))->where('status', 2)->count(); + return $this->success(compact('list', 'total_count', 'success_count', 'fail_count')); + } + /** * @OA\Get( * path="/api/admin/email-record/show", diff --git a/app/Models/EmailRecordUser.php b/app/Models/EmailRecordUser.php index 5e9ca64..71b4e00 100755 --- a/app/Models/EmailRecordUser.php +++ b/app/Models/EmailRecordUser.php @@ -11,6 +11,11 @@ class EmailRecordUser extends SoftDeletesModel { protected $casts = ['var_data' => 'json']; + public function emailRecord() + { + return $this->hasOne(EmailRecord::class, 'id', 'email_record_id'); + } + /** * 邮件模版内容替换 * @param $template diff --git a/routes/api.php b/routes/api.php index 695a8d6..3f606dc 100755 --- a/routes/api.php +++ b/routes/api.php @@ -213,6 +213,7 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () { // 邮件发送配置 Route::get('email-record/index', [\App\Http\Controllers\Admin\EmailRecordController::class, "index"]); + Route::get('email-record/user-index', [\App\Http\Controllers\Admin\EmailRecordController::class, "userIndex"]); Route::get('email-record/show', [\App\Http\Controllers\Admin\EmailRecordController::class, "show"]); Route::post('email-record/save', [\App\Http\Controllers\Admin\EmailRecordController::class, "save"]); Route::get('email-record/destroy', [\App\Http\Controllers\Admin\EmailRecordController::class, "destroy"]); From 3b9f56ab363b918146d2b43521e2ca024fcf4316 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Tue, 8 Jul 2025 14:36:53 +0800 Subject: [PATCH 30/68] update --- .../Admin/EmailRecordController.php | 213 +++++------------- routes/api.php | 1 - 2 files changed, 56 insertions(+), 158 deletions(-) diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php index dadb1a9..10391f1 100644 --- a/app/Http/Controllers/Admin/EmailRecordController.php +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -57,156 +57,60 @@ class EmailRecordController extends BaseController public function index() { $all = request()->all(); - $list = $this->model->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 . '%'); - } - // 范围搜索 - if ($op == 'range') { - list($from, $to) = explode(',', $value); - if (empty($from) || empty($to)) { + $list = $this->model->with('emailTemplate') + ->withCount('emailRecordUsers') + ->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; } - $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); - } - - /** - * @OA\Get( - * path="/api/admin/email-record/user-index", - * tags={"发送记录"}, - * summary="列表", - * description="", - * @OA\Parameter(name="email_template_id", in="query", @OA\Schema(type="string"), required=false, description="模版id"), - * @OA\Parameter(name="is_export", in="query", @OA\Schema(type="string"), required=false, description="是否导出0否1是"), - * @OA\Parameter(name="export_fields", in="query", @OA\Schema(type="string"), required=false, description="需要导出的字段数组"), - * @OA\Parameter(name="filter", in="query", @OA\Schema(type="string"), required=false, description="查询条件。数组"), - * @OA\Parameter(name="show_relation", in="query", @OA\Schema(type="string"), required=false, description="需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods"), - * @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="sort_name", in="query", @OA\Schema(type="string"), required=false, description="排序字段名字"), - * @OA\Parameter(name="sort_type", 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 userIndex() - { - $all = request()->all(); - $list = EmailRecordUser::with('emailRecord.emailTemplate')->where(function ($query) use ($all) { - if (isset($all['email_template_id'])) { - $query->whereHas('emailRecord', function ($q) use ($all) { - $q->whereHas('emailTemplate', function ($qry) use ($all) { - $qry->where('id', $all['email_template_id']); - }); - }); - } - 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 . '%'); - } - // 范围搜索 - 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 == '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 . '%'); + } + // 范围搜索 + 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'); if (isset($all['is_export']) && !empty($all['is_export'])) { $list = $list->get()->toArray(); $export_fields = $all['export_fields'] ?? []; @@ -217,19 +121,14 @@ class EmailRecordController extends BaseController } else { // 输出 $list = $list->paginate($all['page_size'] ?? 20); - } - $email_records = EmailRecord::where(function ($query) use ($all) { - if (isset($all['email_template_id'])) { - $query->where('email_template_id', $all['email_template_id']); + foreach ($list as $detail) { + // 成功数量 + $detail->success_count = $detail->emailRecordUsers->where('status', 1)->count(); + // 失败数量 + $detail->fail_count = $detail->emailRecordUsers->where('status', 2)->count(); } - })->get(); - // 发送总数 - $total_count = EmailRecordUser::whereIn('email_record_id', $email_records->pluck('id'))->count(); - // 成功数量 - $success_count = EmailRecordUser::whereIn('email_record_id', $email_records->pluck('id'))->where('status', 1)->count(); - // 失败数量 - $fail_count = EmailRecordUser::whereIn('email_record_id', $email_records->pluck('id'))->where('status', 2)->count(); - return $this->success(compact('list', 'total_count', 'success_count', 'fail_count')); + } + return $this->success($list); } /** diff --git a/routes/api.php b/routes/api.php index 3f606dc..695a8d6 100755 --- a/routes/api.php +++ b/routes/api.php @@ -213,7 +213,6 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () { // 邮件发送配置 Route::get('email-record/index', [\App\Http\Controllers\Admin\EmailRecordController::class, "index"]); - Route::get('email-record/user-index', [\App\Http\Controllers\Admin\EmailRecordController::class, "userIndex"]); Route::get('email-record/show', [\App\Http\Controllers\Admin\EmailRecordController::class, "show"]); Route::post('email-record/save', [\App\Http\Controllers\Admin\EmailRecordController::class, "save"]); Route::get('email-record/destroy', [\App\Http\Controllers\Admin\EmailRecordController::class, "destroy"]); From f0cbfcf66a874a1d168e9797bcb7608cfbd74ab8 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Tue, 8 Jul 2025 14:38:59 +0800 Subject: [PATCH 31/68] update --- app/Console/Commands/SendEmail.php | 2 ++ .../migrations/2025_07_04_092917_create_email_records_table.php | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/Console/Commands/SendEmail.php b/app/Console/Commands/SendEmail.php index 80739c8..2d3d198 100755 --- a/app/Console/Commands/SendEmail.php +++ b/app/Console/Commands/SendEmail.php @@ -69,6 +69,8 @@ class SendEmail extends Command $recordUser->send_time = date('Y-m-d H:i:s'); $recordUser->save(); } + $records->send_time = date('Y-m-d H:i:s'); + $records->save(); } return $this->info('更新完成'); } diff --git a/database/migrations/2025_07_04_092917_create_email_records_table.php b/database/migrations/2025_07_04_092917_create_email_records_table.php index c3bb6a2..6820764 100644 --- a/database/migrations/2025_07_04_092917_create_email_records_table.php +++ b/database/migrations/2025_07_04_092917_create_email_records_table.php @@ -22,6 +22,8 @@ return new class extends Migration { $table->integer('email_template_id')->nullable()->comment('邮件模版id'); // 状态 $table->tinyInteger('status')->nullable()->default(0)->comment('状态0:待处理1:已处理'); + // 发送时间 + $table->dateTime('send_time')->nullable()->comment('发送时间'); $table->timestamps(); $table->softDeletes(); }); From e8d7ce11732c6a94a6bbe5aa5eecaf4ea9eaf02e Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Tue, 8 Jul 2025 14:46:22 +0800 Subject: [PATCH 32/68] update --- app/Console/Commands/SendEmail.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Console/Commands/SendEmail.php b/app/Console/Commands/SendEmail.php index 2d3d198..9df5677 100755 --- a/app/Console/Commands/SendEmail.php +++ b/app/Console/Commands/SendEmail.php @@ -69,6 +69,7 @@ class SendEmail extends Command $recordUser->send_time = date('Y-m-d H:i:s'); $recordUser->save(); } + $records->status = 1; $records->send_time = date('Y-m-d H:i:s'); $records->save(); } From 1a8b2a9af713e430d343ac6bf43b0b38dfcfc3fc Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Tue, 8 Jul 2025 15:26:47 +0800 Subject: [PATCH 33/68] update --- app/Console/Commands/SendEmail.php | 6 +-- .../Admin/EmailRecordController.php | 47 +++++++++++++++++++ app/Models/EmailRecordUser.php | 9 ++-- routes/api.php | 1 + 4 files changed, 55 insertions(+), 8 deletions(-) diff --git a/app/Console/Commands/SendEmail.php b/app/Console/Commands/SendEmail.php index 9df5677..02e5cb1 100755 --- a/app/Console/Commands/SendEmail.php +++ b/app/Console/Commands/SendEmail.php @@ -55,12 +55,12 @@ class SendEmail extends Command $emailRecordUsers = $records->emailRecordUsers->where('status', 0); foreach ($emailRecordUsers as $recordUser) { // 替换后的标题 - $title = EmailRecordUser::template($records->subject, $recordUser); + $title = EmailRecordUser::template($records->subject, $recordUser->var_data); // 替换后的内容 - $template = EmailRecordUser::template($emailTemplate->content, $recordUser); + $template = EmailRecordUser::template($emailTemplate->content, $recordUser->var_data); try { // 发送邮件 - EmailRecordUser::email($title, $template, $recordUser); + EmailRecordUser::email($title, $template, $recordUser->email); $recordUser->status = 1; } catch (\Exception $e) { $recordUser->status = 2; diff --git a/app/Http/Controllers/Admin/EmailRecordController.php b/app/Http/Controllers/Admin/EmailRecordController.php index 10391f1..9d79a3c 100644 --- a/app/Http/Controllers/Admin/EmailRecordController.php +++ b/app/Http/Controllers/Admin/EmailRecordController.php @@ -216,6 +216,53 @@ class EmailRecordController extends BaseController } } + /** + * @OA\Post( + * path="/api/admin/email-record/send-example", + * tags={"邮件发送配置"}, + * summary="发送测试邮件", + * description="", + * @OA\Parameter(name="email_template_id", in="query", @OA\Schema(type="integer", format="int64"), required=true, description="模版id"), + * @OA\Parameter(name="subject", in="query", @OA\Schema(type="string", format="date"), required=false, description="标题"), + * @OA\Parameter(name="email", in="query", @OA\Schema(type="string", format="date"), required=false, description="邮箱地址"), + * @OA\Parameter(name="var_data", in="query", @OA\Schema(type="string", format="mediumtext"), required=false, description="数组,var_data自定义数据"), + * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"), + * @OA\Response( + * response="200", + * description="操作成功" + * ) + * ) + */ + public function sendExample() + { + $all = \request()->all(); + $validator = Validator::make($all, [ + 'email_template_id' => 'required', + 'subject' => 'required', + 'email' => 'required', + 'var_data' => 'required', + ]); + if ($validator->fails()) { + return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); + } + try { + $emailTemplate = EmailTemplate::find($all['email_template_id']); + // 替换后的标题 + $title = EmailRecordUser::template($all['subject'], $all['var_data']); + // 替换后的内容 + $template = EmailRecordUser::template($emailTemplate->content, $all['var_data']); + try { + // 发送邮件 + EmailRecordUser::email($title, $template, $all['email']); + return $this->success("发送成功"); + } catch (\Exception $e) { + return $this->fail([ResponseCode::ERROR_BUSINESS, $e->getMessage()]); + } + } catch (\Exception $exception) { + return $this->fail([$exception->getCode(), $exception->getMessage()]); + } + } + /** * @OA\Get( * path="/api/admin/email-record/destroy", diff --git a/app/Models/EmailRecordUser.php b/app/Models/EmailRecordUser.php index 71b4e00..1aba2c0 100755 --- a/app/Models/EmailRecordUser.php +++ b/app/Models/EmailRecordUser.php @@ -21,9 +21,8 @@ class EmailRecordUser extends SoftDeletesModel * @param $template * @param $email_record_users */ - public static function template($template, $record_user) + public static function template($template, $var_data) { - $var_data = $record_user->var_data; foreach ($var_data as $key => $var) { $template = str_replace('{' . $key . '}', $var, $template); } @@ -34,11 +33,11 @@ class EmailRecordUser extends SoftDeletesModel /** * 发送邮件 */ - public static function email($title, $template, $record_user) + public static function email($title, $template, $email) { - Mail::send('email', compact('template'), function ($message) use ($record_user, $title) { + Mail::send('email', compact('template'), function ($message) use ($email, $title) { $message->from(env('MAIL_USERNAME'), '苏州科技商学院'); - $message->to($record_user->email)->subject($title); + $message->to($email)->subject($title); }); return true; } diff --git a/routes/api.php b/routes/api.php index 695a8d6..8f4d64f 100755 --- a/routes/api.php +++ b/routes/api.php @@ -215,6 +215,7 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () { Route::get('email-record/index', [\App\Http\Controllers\Admin\EmailRecordController::class, "index"]); Route::get('email-record/show', [\App\Http\Controllers\Admin\EmailRecordController::class, "show"]); Route::post('email-record/save', [\App\Http\Controllers\Admin\EmailRecordController::class, "save"]); + Route::post('email-record/send-example', [\App\Http\Controllers\Admin\EmailRecordController::class, "sendExample"]); Route::get('email-record/destroy', [\App\Http\Controllers\Admin\EmailRecordController::class, "destroy"]); Route::post('email-record/excel-show', [\App\Http\Controllers\Admin\EmailRecordController::class, "excelShow"]); }); From 352c172df9991d964dfda81f4bb6e58903566488 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 14 Jul 2025 16:12:37 +0800 Subject: [PATCH 34/68] update --- .../Admin/CourseContentController.php | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/Admin/CourseContentController.php b/app/Http/Controllers/Admin/CourseContentController.php index 0076e52..f24a2d3 100755 --- a/app/Http/Controllers/Admin/CourseContentController.php +++ b/app/Http/Controllers/Admin/CourseContentController.php @@ -239,17 +239,28 @@ class CourseContentController extends BaseController if (!in_array('上课地点', $keyList)) { return $this->fail([ResponseCode::ERROR_BUSINESS, '上课地点字段不存在']); } + if (!in_array('联系方式', $keyList)) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '联系方式字段不存在']); + } + if (!in_array('性别', $keyList)) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '性别字段不存在']); + } $list = []; foreach ($dataArray as $value) { + if (empty($value['联系方式'])) { + continue; + } $list[] = [ 'course_id' => $course_id, 'date' => Carbon::parse($value['日期'])->toDateString(), - 'period' => $value['时间'], + 'period' => $value['时间'] ?? '', 'teacher_name' => $value['授课老师'], - 'teacher_introduce' => $value['老师简介'], - 'teacher_id' => Teacher::where('name', $value['授课老师'])->value('id'), - 'address' => $value['上课地点'], - 'theme' => $value['课程主题'] + 'teacher_introduce' => $value['老师简介'] ?? '', + 'teacher_id' => Teacher::where('mobile', $value['联系方式'])->value('id'), + 'address' => $value['上课地点'] ?? '', + 'theme' => $value['课程主题'] ?? '', + 'sex' => $value['性别'] ?? '', + 'mobile' => $value['联系方式'] ?? '' ]; } return $this->success($list); @@ -293,8 +304,13 @@ class CourseContentController extends BaseController foreach ($records as $item) { if (!isset($item['teacher_id']) || empty($item['teacher_id'])) { // 写入老师表 - $where = ['name' => $item['teacher_name']]; - $data = ['name' => $item['teacher_name'], 'introduce' => $item['teacher_introduce']]; + $where = ['mobile' => $item['mobile']]; + $data = [ + 'mobile' => $item['mobile'], + 'name' => $item['teacher_name'], + 'introduce' => $item['teacher_introduce'], + 'sex'=>$item['sex'], + ]; $teacher = Teacher::updateOrCreate($where, $data); $item['teacher_id'] = $teacher->id; } From d88291d0e95cd55c13928f6553c7e1856a154af8 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 14 Jul 2025 16:16:18 +0800 Subject: [PATCH 35/68] update --- .../2025_06_24_111502_alert_course_contents_table.php | 2 ++ 1 file changed, 2 insertions(+) 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 7bf19fa..13ad53d 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 @@ -25,6 +25,8 @@ return new class extends Migration $table->json('file_ids')->nullable()->comment('文件id数组'); // 详细地址 $table->string('address_detail')->nullable()->comment('详细地址'); + $table->string('sex')->nullable()->comment('性别'); + $table->string('mobile')->nullable()->comment('联系方式'); }); } From ca28948ac5f40efcdcbd0351f6f5e8588e71653c Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 14 Jul 2025 16:26:13 +0800 Subject: [PATCH 36/68] update --- .../Admin/CourseContentController.php | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Admin/CourseContentController.php b/app/Http/Controllers/Admin/CourseContentController.php index f24a2d3..f38857d 100755 --- a/app/Http/Controllers/Admin/CourseContentController.php +++ b/app/Http/Controllers/Admin/CourseContentController.php @@ -247,16 +247,22 @@ class CourseContentController extends BaseController } $list = []; foreach ($dataArray as $value) { - if (empty($value['联系方式'])) { + if (empty($value['授课老师']) && empty($value['联系方式'])) { continue; } + if ($value['授课老师']) { + $teacher_id = Teacher::where('name', $value['授课老师'])->value('id'); + } + if ($value['联系方式']) { + $teacher_id = Teacher::where('mobile', $value['联系方式'])->value('id'); + } $list[] = [ 'course_id' => $course_id, 'date' => Carbon::parse($value['日期'])->toDateString(), 'period' => $value['时间'] ?? '', - 'teacher_name' => $value['授课老师'], + 'teacher_name' => $value['授课老师'] ?? '', 'teacher_introduce' => $value['老师简介'] ?? '', - 'teacher_id' => Teacher::where('mobile', $value['联系方式'])->value('id'), + 'teacher_id' => $teacher_id ?? null, 'address' => $value['上课地点'] ?? '', 'theme' => $value['课程主题'] ?? '', 'sex' => $value['性别'] ?? '', @@ -304,12 +310,17 @@ class CourseContentController extends BaseController foreach ($records as $item) { if (!isset($item['teacher_id']) || empty($item['teacher_id'])) { // 写入老师表 - $where = ['mobile' => $item['mobile']]; + if ($item['mobile']) { + $where = ['mobile' => $item['mobile']]; + } + if ($item['teacher_name']) { + $where = ['name' => $item['teacher_name']]; + } $data = [ 'mobile' => $item['mobile'], 'name' => $item['teacher_name'], 'introduce' => $item['teacher_introduce'], - 'sex'=>$item['sex'], + 'sex' => $item['sex'], ]; $teacher = Teacher::updateOrCreate($where, $data); $item['teacher_id'] = $teacher->id; From eb362e7734520695372ab73fdd2a3f10a5f6e740 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 14 Jul 2025 17:05:45 +0800 Subject: [PATCH 37/68] update --- app/Http/Controllers/Admin/CourseContentController.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/Http/Controllers/Admin/CourseContentController.php b/app/Http/Controllers/Admin/CourseContentController.php index f38857d..68a0839 100755 --- a/app/Http/Controllers/Admin/CourseContentController.php +++ b/app/Http/Controllers/Admin/CourseContentController.php @@ -324,6 +324,13 @@ class CourseContentController extends BaseController ]; $teacher = Teacher::updateOrCreate($where, $data); $item['teacher_id'] = $teacher->id; + } else { + $teacher = Teacher::find($item['teacher_id']); + $teacher->name = $item['teacher_name']; + $teacher->mobile = $item['mobile']; + $teacher->introduce = $item['teacher_introduce']; + $teacher->sex = $item['sex']; + $teacher->save(); } CourseContent::create($item); } From 2594cabc4da045c42cc1f839c6908b7b447bc12e Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 16 Jul 2025 14:20:06 +0800 Subject: [PATCH 38/68] update --- .../Admin/SupplyDemandController.php | 2 +- .../Mobile/SupplyDemandController.php | 20 +++++++++-- app/Models/SupplyDemand.php | 7 ++++ ..._20_100410_create_supply_demands_table.php | 2 +- ...7_16_133839_alert_supply_demands_table.php | 35 +++++++++++++++++++ 5 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 database/migrations/2025_07_16_133839_alert_supply_demands_table.php diff --git a/app/Http/Controllers/Admin/SupplyDemandController.php b/app/Http/Controllers/Admin/SupplyDemandController.php index 8ecfc6b..29bac40 100755 --- a/app/Http/Controllers/Admin/SupplyDemandController.php +++ b/app/Http/Controllers/Admin/SupplyDemandController.php @@ -156,7 +156,7 @@ class SupplyDemandController extends BaseController * @OA\Parameter(name="wechat", in="query", @OA\Schema(type="string"), required=false, description="微信号"), * @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=false, description="电话"), * @OA\Parameter(name="email", in="query", @OA\Schema(type="string"), required=false, description="邮箱"), - * @OA\Parameter(name="status", in="query", @OA\Schema(type="integer"), required=false, description="审核状态(0:待审核;1:通过;2:拒绝)"), + * @OA\Parameter(name="status", in="query", @OA\Schema(type="integer"), required=false, description="状态0待审核1通过2拒绝3退回修改4永久隐藏"), * @OA\Response( * response=200, * description="操作成功" diff --git a/app/Http/Controllers/Mobile/SupplyDemandController.php b/app/Http/Controllers/Mobile/SupplyDemandController.php index aa4242d..f53a407 100755 --- a/app/Http/Controllers/Mobile/SupplyDemandController.php +++ b/app/Http/Controllers/Mobile/SupplyDemandController.php @@ -16,6 +16,7 @@ use App\Models\SupplyDemand; use App\Models\SupplyDemandKeep; use App\Notifications\BirthdayNotify; use App\Notifications\SupplyDemandNotify; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Validator; @@ -32,11 +33,12 @@ class SupplyDemandController extends CommonController * @OA\Parameter(name="myself", in="query", @OA\Schema(type="integer"), required=true, description="是否只看自己的0否1是"), * @OA\Parameter(name="type", in="query", @OA\Schema(type="integer"), required=true, description="类型"), * @OA\Parameter(name="keyword", in="query", @OA\Schema(type="integer"), required=true, description="关键词"), - * @OA\Parameter(name="status", in="query", @OA\Schema(type="integer"), required=true, description="状态0待审核1通过2拒绝"), + * @OA\Parameter(name="status", in="query", @OA\Schema(type="integer"), required=true, description="状态0待审核1通过2拒绝3退回修改4永久隐藏"), * @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="sort_name", in="query", @OA\Schema(type="string"), required=false, description="排序字段名字"), * @OA\Parameter(name="sort_type", in="query", @OA\Schema(type="string"), required=false, description="排序类型"), + * @OA\Parameter(name="expire_type", in="query", @OA\Schema(type="string"), required=false, description="有效期类型1有效期内2失效的"), * @OA\Response( * response="200", * description="暂无" @@ -63,6 +65,15 @@ class SupplyDemandController extends CommonController if (isset($all['myself']) && $all['myself'] == 1) { $query->where('user_id', $this->getUserId()); } + if (isset($all['expire_type'])) { + if ($all['expire_type'] == 1) { + $query->where(function ($q) { + $q->whereNull('expire_time')->orWhere('expire_time', '>', Carbon::now()); + }); + } else { + $query->where('expire_time', '<', Carbon::now()); + } + } })->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc') ->paginate($all['page_size'] ?? 20); return $this->success(compact('supplyDemands')); @@ -100,6 +111,8 @@ class SupplyDemandController extends CommonController // 增加view_count $detail->increment('view_count'); $detail->save(); + // 判断是否发送过私信 + $detail->messages_count = Message::where('supply_demand_id', $detail->id)->where('user_id', $this->getUserId())->count(); return $this->success($detail); } @@ -118,7 +131,10 @@ class SupplyDemandController extends CommonController * @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=false, description="电话"), * @OA\Parameter(name="email", in="query", @OA\Schema(type="string"), required=false, description="邮箱"), * @OA\Parameter(name="expire_time", in="query", @OA\Schema(type="string"), required=false, description="过期时间"), - * @OA\Parameter(name="status", in="query", @OA\Schema(type="integer"), required=false, description="审核状态(0:待审核;1:通过;2:拒绝)"), + * @OA\Parameter(name="public_way", in="query", @OA\Schema(type="string"), required=false, description="公开模式1直接公开2私信后自动公开3不公开"), + * @OA\Parameter(name="file_ids", in="query", @OA\Schema(type="string"), required=false, description="文件id数组"), + * @OA\Parameter(name="contact_name", in="query", @OA\Schema(type="string"), required=false, description="联系人名字"), + * @OA\Parameter(name="status", in="query", @OA\Schema(type="integer"), required=false, description="状态0待审核1通过2拒绝3退回修改4永久隐藏"), * @OA\Response( * response="200", * description="暂无" diff --git a/app/Models/SupplyDemand.php b/app/Models/SupplyDemand.php index af24f16..8dab203 100755 --- a/app/Models/SupplyDemand.php +++ b/app/Models/SupplyDemand.php @@ -9,6 +9,13 @@ use Illuminate\Support\Facades\Cache; class SupplyDemand extends SoftDeletesModel { + protected $casts = ['file_ids' => 'json']; + + public function getFilesAttribute($value) + { + if (empty($this->file_ids)) return []; + return Upload::whereIn('id', $this->file_ids)->get(); + } public function user() { return $this->hasOne(User::class, 'id', 'user_id'); diff --git a/database/migrations/2025_06_20_100410_create_supply_demands_table.php b/database/migrations/2025_06_20_100410_create_supply_demands_table.php index 6b73473..bfb251e 100644 --- a/database/migrations/2025_06_20_100410_create_supply_demands_table.php +++ b/database/migrations/2025_06_20_100410_create_supply_demands_table.php @@ -31,7 +31,7 @@ return new class extends Migration { // 邮箱 $table->string('email')->nullable()->comment('邮箱'); // 审核状态 - $table->tinyInteger('status')->default(0)->comment('状态0待审核1通过2拒绝'); + $table->tinyInteger('status')->default(0)->comment('状态0待审核1通过2拒绝3退回修改4永久隐藏'); // 浏览次数 $table->integer('view_count')->default(0)->comment('浏览次数'); // 联系次数 diff --git a/database/migrations/2025_07_16_133839_alert_supply_demands_table.php b/database/migrations/2025_07_16_133839_alert_supply_demands_table.php new file mode 100644 index 0000000..cc52619 --- /dev/null +++ b/database/migrations/2025_07_16_133839_alert_supply_demands_table.php @@ -0,0 +1,35 @@ +boolean('public_way')->default(false)->comment('公开模式1直接公开2私信后自动公开3不公开'); + $table->json('file_ids')->nullable()->comment('文件'); + // 联系人名字 + $table->string('contact_name')->nullable()->comment('联系人名字'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('supply_demands', function (Blueprint $table) { + // + }); + } +}; From ae7bd47b7fc6916681cc8139b47febb85fb2d508 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 16 Jul 2025 14:50:34 +0800 Subject: [PATCH 39/68] update --- app/Http/Controllers/Mobile/CourseController.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index 5cfe01b..521c0f6 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -21,6 +21,7 @@ use App\Models\Notice; use App\Models\Order; use App\Models\User; use EasyWeChat\Factory; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Validator; @@ -814,6 +815,11 @@ class CourseController extends CommonController if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } + $startDate = Carbon::parse($all['month'])->startOfMonth(); + $endDate = Carbon::parse($all['month'])->endOfMonth(); + dd($startDate,$endDate); + + $list = Calendar::with('course', 'courseContent')->where('date', 'like', $all['month'] . '%')->orderBy('date')->get(); return $this->success($list); } From 82ba994ad0f9b78b8a01273703dec1f58d05ee8a Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 16 Jul 2025 14:52:20 +0800 Subject: [PATCH 40/68] update --- app/Http/Controllers/Mobile/CourseController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index 521c0f6..6b0b34a 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -815,8 +815,8 @@ class CourseController extends CommonController if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } - $startDate = Carbon::parse($all['month'])->startOfMonth(); - $endDate = Carbon::parse($all['month'])->endOfMonth(); + $startDate = $all['month'] . '-01'; + $endDate = date('Y-m-t', strtotime($startDate)); dd($startDate,$endDate); From 74249ba7f9058f3755472194236fe7b6379afba8 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 16 Jul 2025 15:04:25 +0800 Subject: [PATCH 41/68] update --- app/Http/Controllers/Mobile/CourseController.php | 15 +++++++++++---- app/Http/functions.php | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index 6b0b34a..7b594c3 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -817,10 +817,17 @@ class CourseController extends CommonController } $startDate = $all['month'] . '-01'; $endDate = date('Y-m-t', strtotime($startDate)); - dd($startDate,$endDate); - - - $list = Calendar::with('course', 'courseContent')->where('date', 'like', $all['month'] . '%')->orderBy('date')->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/Http/functions.php b/app/Http/functions.php index 8712db0..c57acd3 100755 --- a/app/Http/functions.php +++ b/app/Http/functions.php @@ -702,3 +702,19 @@ function getVar($text) } return ''; } + +/** + * 获取两个日期之间的所有日期 + */ +function getDates($start, $end) +{ + $dt_start = strtotime($start); + $dt_end = strtotime($end); + $temp = []; + while ($dt_start <= $dt_end) { + $re = date('Y-m-d', $dt_start); + $temp[] = $re; + $dt_start = strtotime('+1 day', $dt_start); + } + return $temp; // 返回data型数据 +} From ce9dd1b20b5c75fc2a8fd4c265bc86eb27b74c7b Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 16 Jul 2025 15:12:27 +0800 Subject: [PATCH 42/68] update --- app/Http/Controllers/Mobile/CourseController.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index 7b594c3..90bcc9a 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -823,9 +823,10 @@ class CourseController extends CommonController // 查询Calendar模型里start_time和end_time在日期内的数据,其中date是年月日,start_time和end_time是时分秒 $list[] = [ 'date' => $date, - 'details' => Calendar::with('course', 'courseContent')->whereDate('start_time', '>=', $date) + 'details' => Calendar::with('course', 'courseContent') + ->whereDate('start_time', '>=', $date) ->whereDate('end_time', '<=', $date) - ->get() + ->dd() ]; } return $this->success($list); From 99de692cbbed882b03a49ca7ba1151f17fd5b928 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 16 Jul 2025 15:16:21 +0800 Subject: [PATCH 43/68] update --- app/Http/Controllers/Mobile/CourseController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index 90bcc9a..b49e1d2 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -824,9 +824,9 @@ class CourseController extends CommonController $list[] = [ 'date' => $date, 'details' => Calendar::with('course', 'courseContent') - ->whereDate('start_time', '>=', $date) - ->whereDate('end_time', '<=', $date) - ->dd() + ->whereDate('start_time', '<=', $date) + ->whereDate('end_time', '>=', $date) + ->get() ]; } return $this->success($list); From 40957dc15f42d33d0a712dd4b5d16951b374faa3 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 17 Jul 2025 14:15:39 +0800 Subject: [PATCH 44/68] update --- app/Models/User.php | 35 ++++++++++++++++++- .../2025_06_19_105447_alert_users_table.php | 5 +-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/app/Models/User.php b/app/Models/User.php index c94c0a5..1c0f62c 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -183,7 +183,40 @@ class User extends Authenticatable implements Auditable public static function updateNo($userId) { $user = self::find($userId); - $no = date('Ymd', strtotime($user->created_at)) . str_pad($userId, 6, '0', STR_PAD_LEFT); + if (!empty($user->no)) { + return false; + } + // 获取最早一条审核通过的报名数据 + $courseSigns = CourseSign::with('course') + ->where('user_id', $userId) + ->where('status', 1) + ->orderBy('created_at', 'asc') + ->first(); + if (empty($courseSigns)) { + return false; + } + if (empty($courseSigns->course->start_time)) { + return false; + } + // 编号前缀 + $prifix = date('Ymd', strtotime($courseSigns->course->start_time)); + // 获取同一天开始的所有课程 + $course = Course::where('start_time', $courseSigns->course->start_time)->orderBy('created_at', 'asc')->get(); + // 获取同一天开始所有课程的报名信息 + $courseSigns = CourseSign::whereIn('id', function ($query) use ($course) { + $query->from('course_signs') + ->where('status', 1) + ->whereIn('course_id', $course->pluck('id')) + ->selectRaw('MIN(id)') + ->groupBy('user_id'); + })->whereHas('user', function ($query) { + $query->whereNull('no'); + })->orderBy('created_at', 'asc')->get(); + // 获取当前用户id在$courseSigns中第几位 + $index = $courseSigns->search(function ($item) use ($user) { + return $item->user_id == $user->id; + }); + $no = $prifix . str_pad($index, 3, '0', STR_PAD_LEFT); $user->no = $no; $user->save(); return $user->no; diff --git a/database/migrations/2025_06_19_105447_alert_users_table.php b/database/migrations/2025_06_19_105447_alert_users_table.php index 4f92a64..6ce4142 100644 --- a/database/migrations/2025_06_19_105447_alert_users_table.php +++ b/database/migrations/2025_06_19_105447_alert_users_table.php @@ -4,8 +4,7 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { /** * Run the migrations. * @@ -16,6 +15,8 @@ return new class extends Migration Schema::table('users', function (Blueprint $table) { $table->string('no')->nullable()->comment('学号'); $table->date('birthday')->nullable()->comment('生日')->change(); + // no字段唯一索引 + $table->unique('no'); }); } From 891c15ab8bdc25d12b13534fe3eda6702edc48c2 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 17 Jul 2025 14:23:36 +0800 Subject: [PATCH 45/68] update --- app/Models/User.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Models/User.php b/app/Models/User.php index 1c0f62c..85c0ed7 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -195,13 +195,13 @@ class User extends Authenticatable implements Auditable if (empty($courseSigns)) { return false; } - if (empty($courseSigns->course->start_time)) { + if (empty($courseSigns->course->start_date)) { return false; } // 编号前缀 - $prifix = date('Ymd', strtotime($courseSigns->course->start_time)); + $prefix = date('Ymd', strtotime($courseSigns->course->start_date)); // 获取同一天开始的所有课程 - $course = Course::where('start_time', $courseSigns->course->start_time)->orderBy('created_at', 'asc')->get(); + $course = Course::where('start_date', $courseSigns->course->start_date)->orderBy('created_at', 'asc')->get(); // 获取同一天开始所有课程的报名信息 $courseSigns = CourseSign::whereIn('id', function ($query) use ($course) { $query->from('course_signs') @@ -216,7 +216,7 @@ class User extends Authenticatable implements Auditable $index = $courseSigns->search(function ($item) use ($user) { return $item->user_id == $user->id; }); - $no = $prifix . str_pad($index, 3, '0', STR_PAD_LEFT); + $no = $prefix . str_pad($index, 3, '0', STR_PAD_LEFT); $user->no = $no; $user->save(); return $user->no; From cc12c0bc64c37eea517cfd9aa6584e5a6bc5cae5 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 17 Jul 2025 16:04:33 +0800 Subject: [PATCH 46/68] update --- app/Models/User.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/Models/User.php b/app/Models/User.php index 85c0ed7..af15105 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -209,14 +209,13 @@ class User extends Authenticatable implements Auditable ->whereIn('course_id', $course->pluck('id')) ->selectRaw('MIN(id)') ->groupBy('user_id'); - })->whereHas('user', function ($query) { - $query->whereNull('no'); })->orderBy('created_at', 'asc')->get(); + // 获取当前用户id在$courseSigns中第几位 $index = $courseSigns->search(function ($item) use ($user) { return $item->user_id == $user->id; }); - $no = $prefix . str_pad($index, 3, '0', STR_PAD_LEFT); + $no = $prefix . str_pad($index + 1, 3, '0', STR_PAD_LEFT); $user->no = $no; $user->save(); return $user->no; From 3d81c43669061ef0527e75933d944ee602d74575 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 17 Jul 2025 16:11:48 +0800 Subject: [PATCH 47/68] update --- app/Models/User.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Models/User.php b/app/Models/User.php index af15105..fbeb1a6 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -203,7 +203,7 @@ class User extends Authenticatable implements Auditable // 获取同一天开始的所有课程 $course = Course::where('start_date', $courseSigns->course->start_date)->orderBy('created_at', 'asc')->get(); // 获取同一天开始所有课程的报名信息 - $courseSigns = CourseSign::whereIn('id', function ($query) use ($course) { + $courseSignsList = CourseSign::whereIn('id', function ($query) use ($course) { $query->from('course_signs') ->where('status', 1) ->whereIn('course_id', $course->pluck('id')) @@ -212,7 +212,7 @@ class User extends Authenticatable implements Auditable })->orderBy('created_at', 'asc')->get(); // 获取当前用户id在$courseSigns中第几位 - $index = $courseSigns->search(function ($item) use ($user) { + $index = $courseSignsList->search(function ($item) use ($user) { return $item->user_id == $user->id; }); $no = $prefix . str_pad($index + 1, 3, '0', STR_PAD_LEFT); From 2ec8ed1f5070c5829698081ae594b9448a789994 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 17 Jul 2025 16:16:01 +0800 Subject: [PATCH 48/68] update --- app/Console/Commands/UpdateUserNo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Console/Commands/UpdateUserNo.php b/app/Console/Commands/UpdateUserNo.php index 6b3c7eb..b3ed7d5 100755 --- a/app/Console/Commands/UpdateUserNo.php +++ b/app/Console/Commands/UpdateUserNo.php @@ -40,7 +40,7 @@ class UpdateUserNo extends Command */ public function handle() { - $users = User::get(); + $users = User::whereNull('no')->get(); foreach ($users as $user) { $no = User::updateNo($user->id); $this->info($no . '更新成功'); From 3eee5e1ef468766d939ef6edc976421ca9b25a1b Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 17 Jul 2025 16:41:22 +0800 Subject: [PATCH 49/68] update --- .../Controllers/Admin/CompanyController.php | 224 ++++++++++++++++++ app/Models/Company.php | 8 + app/Models/User.php | 1 + ...25_07_17_162734_create_companies_table.php | 49 ++++ routes/api.php | 6 + 5 files changed, 288 insertions(+) create mode 100644 app/Http/Controllers/Admin/CompanyController.php create mode 100644 app/Models/Company.php create mode 100644 database/migrations/2025_07_17_162734_create_companies_table.php diff --git a/app/Http/Controllers/Admin/CompanyController.php b/app/Http/Controllers/Admin/CompanyController.php new file mode 100644 index 0000000..cc8f248 --- /dev/null +++ b/app/Http/Controllers/Admin/CompanyController.php @@ -0,0 +1,224 @@ +all(); + $list = $this->model->withCount('emailRecords')->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 . '%'); + } + // 范围搜索 + 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); + } + + /** + * @OA\Get( + * path="/api/admin/company/show", + * tags={"公司管理"}, + * summary="详情", + * description="", + * @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="id"), + * @OA\Parameter(name="show_relation", 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 show() + { + $all = \request()->all(); + $messages = [ + 'title.required' => '标题必填', + ]; + $validator = Validator::make($all, [ + 'title' => 'required' + ], $messages); + if ($validator->fails()) { + return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); + } + $detail = $this->model->withCount('emailRecords')->find($all['id']); + return $this->success($detail); + } + + /** + * @OA\Post( + * path="/api/admin/company/save", + * tags={"公司管理"}, + * summary="保存", + * description="", + * @OA\Parameter(name="id", in="query", @OA\Schema(type="int"), required=true, description="Id(存在更新,不存在新增)"), + * @OA\Parameter(name="company_name", in="query", @OA\Schema(type="string"), description="企业名字"), + * @OA\Parameter(name="company_type", in="query", @OA\Schema(type="string"), description="行业类型"), + * @OA\Parameter(name="company_tag", in="query", @OA\Schema(type="string"), description="标签"), + * @OA\Parameter(name="company_scale", in="query", @OA\Schema(type="string"), description="企业规模"), + * @OA\Parameter(name="company_date", in="query", @OA\Schema(type="string", format="date"), description="成立时间"), + * @OA\Parameter(name="company_legal_representative", in="query", @OA\Schema(type="string"), description="法人代表"), + * @OA\Parameter(name="management_platform", in="query", @OA\Schema(type="string"), description="管理平台"), + * @OA\Parameter(name="project_manager", in="query", @OA\Schema(type="string"), description="项目经理"), + * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"), + * @OA\Response( + * response="200", + * description="操作成功" + * ) + * ) + */ + public function save() + { + $all = \request()->all(); + DB::beginTransaction(); + try { + if (isset($all['id'])) { + $model = $this->model->find($all['id']); + if (empty($model)) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '数据不存在']); + } + } else { + $model = $this->model; + $all['admin_id'] = $this->getUserId(); + $all['department_id'] = $this->getUser()->department_id; + } + $original = $model->getOriginal(); + $model->fill($all); + $model->save(); + DB::commit(); + // 记录日志 + $this->saveLogs($original, $model); + return $this->success($model); + } catch (\Exception $exception) { + DB::rollBack(); + return $this->fail([$exception->getCode(), $exception->getMessage()]); + } + } + + /** + * @OA\Get( + * path="/api/admin/company/destroy", + * 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 destroy() + { + return parent::destroy(); + } + +} diff --git a/app/Models/Company.php b/app/Models/Company.php new file mode 100644 index 0000000..843d6c0 --- /dev/null +++ b/app/Models/Company.php @@ -0,0 +1,8 @@ +no)) { return false; diff --git a/database/migrations/2025_07_17_162734_create_companies_table.php b/database/migrations/2025_07_17_162734_create_companies_table.php new file mode 100644 index 0000000..d962fc2 --- /dev/null +++ b/database/migrations/2025_07_17_162734_create_companies_table.php @@ -0,0 +1,49 @@ +id(); + $table->integer('admin_id')->nullable(); + $table->integer('department_id')->nullable(); + // 企业名字 + $table->string('company_name')->nullable()->comment('企业名字'); + // 行业类型 + $table->string('company_type')->nullable()->comment('行业类型'); + // 标签 + $table->string('company_tag')->nullable()->comment('标签'); + // 企业规模 + $table->string('company_scale')->nullable()->comment('企业规模'); + // 成立时间 + $table->date('company_date')->nullable()->comment('成立时间'); + // 法人代表 + $table->string('company_legal_representative')->nullable()->comment('法人代表'); + // 管理平台 + $table->string('management_platform')->nullable()->comment('管理平台'); + // 项目经理 + $table->string('project_manager')->nullable()->comment('项目经理'); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('companies'); + } +}; diff --git a/routes/api.php b/routes/api.php index 8f4d64f..54a91d4 100755 --- a/routes/api.php +++ b/routes/api.php @@ -218,6 +218,12 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () { Route::post('email-record/send-example', [\App\Http\Controllers\Admin\EmailRecordController::class, "sendExample"]); Route::get('email-record/destroy', [\App\Http\Controllers\Admin\EmailRecordController::class, "destroy"]); Route::post('email-record/excel-show', [\App\Http\Controllers\Admin\EmailRecordController::class, "excelShow"]); + + // 企业管理 + Route::get('company/index', [\App\Http\Controllers\Admin\CompanyController::class, "index"]); + Route::get('company/show', [\App\Http\Controllers\Admin\CompanyController::class, "show"]); + Route::post('company/save', [\App\Http\Controllers\Admin\CompanyController::class, "save"]); + Route::get('company/destroy', [\App\Http\Controllers\Admin\CompanyController::class, "destroy"]); }); }); From 02709f7d06d0a6eb9e6dc33aa531061f63a6eac9 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 17 Jul 2025 16:43:14 +0800 Subject: [PATCH 50/68] update --- database/migrations/2025_06_19_105447_alert_users_table.php | 1 + 1 file changed, 1 insertion(+) diff --git a/database/migrations/2025_06_19_105447_alert_users_table.php b/database/migrations/2025_06_19_105447_alert_users_table.php index 6ce4142..87851b4 100644 --- a/database/migrations/2025_06_19_105447_alert_users_table.php +++ b/database/migrations/2025_06_19_105447_alert_users_table.php @@ -14,6 +14,7 @@ return new class extends Migration { { Schema::table('users', function (Blueprint $table) { $table->string('no')->nullable()->comment('学号'); + $table->integer('company_id')->nullable()->comment('企业id'); $table->date('birthday')->nullable()->comment('生日')->change(); // no字段唯一索引 $table->unique('no'); From dc02e19a8598844dbe44f3b939d3c8e92cd3ef28 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 18 Jul 2025 10:50:10 +0800 Subject: [PATCH 51/68] update --- .../Controllers/Admin/OtherController.php | 31 +++++++++++++++++ ...25_07_17_162734_create_companies_table.php | 17 +++++++++- ..._07_18_102212_alert_course_types_table.php | 33 +++++++++++++++++++ routes/api.php | 2 ++ 4 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 database/migrations/2025_07_18_102212_alert_course_types_table.php diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index 79c40e2..6651166 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -7,6 +7,8 @@ use App\Models\Admin; use App\Models\Appointment; use App\Models\AppointmentConfig; use App\Models\CarparkLog; +use App\Models\CourseSign; +use App\Models\CourseType; use App\Models\CustomFormField; use App\Models\Department; use App\Models\User; @@ -20,6 +22,35 @@ use Illuminate\Filesystem\Filesystem; class OtherController extends CommonController { + /** + * @OA\Get( + * path="/api/admin/other/home", + * tags={"其他"}, + * summary="驾驶舱", + * description="", + * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), + * @OA\Response( + * response="200", + * description="暂无" + * ) + * ) + */ + public function home() + { + // 校友总数 + $schoolmateTotal = User::where('is_schoolmate', 1)->count(); + // 2025年校友数 + $schoolmateTotalYear = User::where('is_schoolmate', 1)->where('created_at', 'like', '%' . date('Y') . '%')->count(); + // 课程统计 + $courseTypes = CourseType::with('courses')->where('is_chart')->get(); + foreach ($courseTypes as $courseType) { + $courseType->course_signs_total = CourseSign::where('course_id', $courseType->courses->pluck('id')) + ->where('status', 1) + ->count(); + } + return $this->success(compact('courseTypes', 'schoolmateTotal', 'schoolmateTotalYear')); + } + /** * @OA\Post( * path="/api/admin/other/admin-user-list", diff --git a/database/migrations/2025_07_17_162734_create_companies_table.php b/database/migrations/2025_07_17_162734_create_companies_table.php index d962fc2..347f54f 100644 --- a/database/migrations/2025_07_17_162734_create_companies_table.php +++ b/database/migrations/2025_07_17_162734_create_companies_table.php @@ -19,7 +19,7 @@ return new class extends Migration { // 企业名字 $table->string('company_name')->nullable()->comment('企业名字'); // 行业类型 - $table->string('company_type')->nullable()->comment('行业类型'); + $table->string('company_attribute')->nullable()->comment('行业类型'); // 标签 $table->string('company_tag')->nullable()->comment('标签'); // 企业规模 @@ -32,6 +32,21 @@ return new class extends Migration { $table->string('management_platform')->nullable()->comment('管理平台'); // 项目经理 $table->string('project_manager')->nullable()->comment('项目经理'); + + $table->bigInteger('market_value')->nullable()->comment('市值'); + $table->bigInteger('company_fund')->nullable()->comment('公司融资情况'); + $table->bigInteger('valuation')->nullable()->comment('估值'); + $table->string('company_address')->nullable()->comment('公司地址'); + $table->string('company_area')->nullable()->comment('公司区域'); + + $table->string('company_type')->nullable()->comment('公司性质-上市,拟上市'); + $table->string('company_industry')->nullable()->comment('公司所属行业'); + $table->string('company_need_fund')->nullable()->comment('公司是否需要融资-0否1是'); + $table->text('company_introduce')->nullable()->comment('公司简介'); + $table->string('company_other')->nullable()->comment('其他'); + $table->text('company_product')->nullable()->comment('产品'); + $table->string('overseas_experience')->nullable()->comment('海外经验'); + $table->string('sales_volume')->nullable()->comment('销售额'); $table->timestamps(); $table->softDeletes(); }); diff --git a/database/migrations/2025_07_18_102212_alert_course_types_table.php b/database/migrations/2025_07_18_102212_alert_course_types_table.php new file mode 100644 index 0000000..0b2c1ff --- /dev/null +++ b/database/migrations/2025_07_18_102212_alert_course_types_table.php @@ -0,0 +1,33 @@ +boolean('is_chart')->default(true)->comment('是否参与统计0否1是'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('course_types', function (Blueprint $table) { + // + }); + } +}; diff --git a/routes/api.php b/routes/api.php index 54a91d4..09f7642 100755 --- a/routes/api.php +++ b/routes/api.php @@ -34,6 +34,8 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () { Route::get('users/index', [\App\Http\Controllers\Admin\UserController::class, "index"]); Route::get('other/table-fileds', [\App\Http\Controllers\Admin\OtherController::class, "tableFileds"]); + Route::get('other/home', [\App\Http\Controllers\Admin\OtherController::class, "home"]); + // 验证码登陆 Route::get('auth/sms-login', [\App\Http\Controllers\Admin\AuthController::class, "smsLogin"]); Route::get('auth/send-sms', [\App\Http\Controllers\Admin\AuthController::class, "sendSms"]); From 37f36f45a11b94b4757607b603bfd8f02577a004 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 18 Jul 2025 10:53:57 +0800 Subject: [PATCH 52/68] update --- .../Controllers/Admin/CompanyController.php | 29 ++++++++++++++----- ...25_07_17_162734_create_companies_table.php | 2 +- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/app/Http/Controllers/Admin/CompanyController.php b/app/Http/Controllers/Admin/CompanyController.php index cc8f248..0fb85e6 100644 --- a/app/Http/Controllers/Admin/CompanyController.php +++ b/app/Http/Controllers/Admin/CompanyController.php @@ -159,14 +159,27 @@ class CompanyController extends BaseController * summary="保存", * description="", * @OA\Parameter(name="id", in="query", @OA\Schema(type="int"), required=true, description="Id(存在更新,不存在新增)"), - * @OA\Parameter(name="company_name", in="query", @OA\Schema(type="string"), description="企业名字"), - * @OA\Parameter(name="company_type", in="query", @OA\Schema(type="string"), description="行业类型"), - * @OA\Parameter(name="company_tag", in="query", @OA\Schema(type="string"), description="标签"), - * @OA\Parameter(name="company_scale", in="query", @OA\Schema(type="string"), description="企业规模"), - * @OA\Parameter(name="company_date", in="query", @OA\Schema(type="string", format="date"), description="成立时间"), - * @OA\Parameter(name="company_legal_representative", in="query", @OA\Schema(type="string"), description="法人代表"), - * @OA\Parameter(name="management_platform", in="query", @OA\Schema(type="string"), description="管理平台"), - * @OA\Parameter(name="project_manager", in="query", @OA\Schema(type="string"), description="项目经理"), + * @OA\Parameter(name="company_name", in="query", @OA\Schema(type="string", nullable=true), description="企业名字"), + * @OA\Parameter(name="company_attribute", in="query", @OA\Schema(type="string", nullable=true), description="行业类型"), + * @OA\Parameter(name="company_tag", in="query", @OA\Schema(type="string", nullable=true), description="标签"), + * @OA\Parameter(name="company_scale", in="query", @OA\Schema(type="string", nullable=true), description="企业规模"), + * @OA\Parameter(name="company_date", in="query", @OA\Schema(type="string", format="date", nullable=true), description="成立时间"), + * @OA\Parameter(name="company_legal_representative", in="query", @OA\Schema(type="string", nullable=true), description="法人代表"), + * @OA\Parameter(name="management_platform", in="query", @OA\Schema(type="string", nullable=true), description="管理平台"), + * @OA\Parameter(name="project_manager", in="query", @OA\Schema(type="string", nullable=true), description="项目经理"), + * @OA\Parameter(name="market_value", in="query", @OA\Schema(type="integer", format="int64", nullable=true), description="市值"), + * @OA\Parameter(name="company_fund", in="query", @OA\Schema(type="integer", format="int64", nullable=true), description="公司融资情况"), + * @OA\Parameter(name="valuation", in="query", @OA\Schema(type="integer", format="int64", nullable=true), description="估值"), + * @OA\Parameter(name="company_address", in="query", @OA\Schema(type="string", nullable=true), description="公司地址"), + * @OA\Parameter(name="company_area", in="query", @OA\Schema(type="string", nullable=true), description="公司区域"), + * @OA\Parameter(name="company_type", in="query", @OA\Schema(type="string", nullable=true), description="公司性质-上市,拟上市"), + * @OA\Parameter(name="company_industry", in="query", @OA\Schema(type="string", nullable=true), description="公司所属行业"), + * @OA\Parameter(name="company_need_fund", in="query", @OA\Schema(type="string", nullable=true), description="公司是否需要融资-0否1是"), + * @OA\Parameter(name="company_introduce", in="query", @OA\Schema(type="string", format="textarea", nullable=true), description="公司简介"), + * @OA\Parameter(name="company_other", in="query", @OA\Schema(type="string", nullable=true), description="其他"), + * @OA\Parameter(name="company_product", in="query", @OA\Schema(type="string", format="textarea", nullable=true), description="产品"), + * @OA\Parameter(name="overseas_experience", in="query", @OA\Schema(type="string", nullable=true), description="海外经验"), + * @OA\Parameter(name="sales_volume", in="query", @OA\Schema(type="string", nullable=true), description="销售额"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"), * @OA\Response( * response="200", diff --git a/database/migrations/2025_07_17_162734_create_companies_table.php b/database/migrations/2025_07_17_162734_create_companies_table.php index 347f54f..2f7da3b 100644 --- a/database/migrations/2025_07_17_162734_create_companies_table.php +++ b/database/migrations/2025_07_17_162734_create_companies_table.php @@ -32,7 +32,7 @@ return new class extends Migration { $table->string('management_platform')->nullable()->comment('管理平台'); // 项目经理 $table->string('project_manager')->nullable()->comment('项目经理'); - + $table->bigInteger('market_value')->nullable()->comment('市值'); $table->bigInteger('company_fund')->nullable()->comment('公司融资情况'); $table->bigInteger('valuation')->nullable()->comment('估值'); From 4231f8918d4eb4711678db81809ecbfab689c5e0 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 18 Jul 2025 10:56:29 +0800 Subject: [PATCH 53/68] update --- app/Console/Commands/UpdateCompany.php | 49 ++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100755 app/Console/Commands/UpdateCompany.php diff --git a/app/Console/Commands/UpdateCompany.php b/app/Console/Commands/UpdateCompany.php new file mode 100755 index 0000000..4d8bbe9 --- /dev/null +++ b/app/Console/Commands/UpdateCompany.php @@ -0,0 +1,49 @@ +info('更新完成'); + } + + +} From 416b1e47cdef25dc97e3d87bc30011179e61bc03 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 18 Jul 2025 13:54:30 +0800 Subject: [PATCH 54/68] update --- .../Controllers/Admin/CompanyController.php | 4 +- .../Controllers/Admin/OtherController.php | 40 +++++++++++++++++-- ...25_07_17_162734_create_companies_table.php | 9 +++-- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/Admin/CompanyController.php b/app/Http/Controllers/Admin/CompanyController.php index 0fb85e6..9464157 100644 --- a/app/Http/Controllers/Admin/CompanyController.php +++ b/app/Http/Controllers/Admin/CompanyController.php @@ -172,8 +172,10 @@ class CompanyController extends BaseController * @OA\Parameter(name="valuation", in="query", @OA\Schema(type="integer", format="int64", nullable=true), description="估值"), * @OA\Parameter(name="company_address", in="query", @OA\Schema(type="string", nullable=true), description="公司地址"), * @OA\Parameter(name="company_area", in="query", @OA\Schema(type="string", nullable=true), description="公司区域"), - * @OA\Parameter(name="company_type", in="query", @OA\Schema(type="string", nullable=true), description="公司性质-上市,拟上市"), + * @OA\Parameter(name="company_city", in="query", @OA\Schema(type="string", nullable=true), description="公司城市"), + * @OA\Parameter(name="company_market", in="query", @OA\Schema(type="string", nullable=true), description="是否上市0否1是"), * @OA\Parameter(name="company_industry", in="query", @OA\Schema(type="string", nullable=true), description="公司所属行业"), + * @OA\Parameter(name="is_schoolmate", in="query", @OA\Schema(type="string", nullable=true), description="是否校友企业-0非校友1校友"), * @OA\Parameter(name="company_need_fund", in="query", @OA\Schema(type="string", nullable=true), description="公司是否需要融资-0否1是"), * @OA\Parameter(name="company_introduce", in="query", @OA\Schema(type="string", format="textarea", nullable=true), description="公司简介"), * @OA\Parameter(name="company_other", in="query", @OA\Schema(type="string", nullable=true), description="其他"), diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index 6651166..63b0b28 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -7,13 +7,16 @@ use App\Models\Admin; use App\Models\Appointment; use App\Models\AppointmentConfig; use App\Models\CarparkLog; +use App\Models\Company; use App\Models\CourseSign; use App\Models\CourseType; use App\Models\CustomFormField; use App\Models\Department; +use App\Models\ParameterDetail; use App\Models\User; use App\Repositories\DoorRepository; use App\Repositories\EntranceRepository; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; use App\Models\Course; use EasyWeChat\Factory; @@ -38,9 +41,30 @@ class OtherController extends CommonController public function home() { // 校友总数 - $schoolmateTotal = User::where('is_schoolmate', 1)->count(); + $schoolmate['schoolmate_total'] = User::where('is_schoolmate', 1)->count(); // 2025年校友数 - $schoolmateTotalYear = User::where('is_schoolmate', 1)->where('created_at', 'like', '%' . date('Y') . '%')->count(); + $schoolmate['schoolmate_year'] = User::where('is_schoolmate', 1)->where('created_at', 'like', '%' . date('Y') . '%')->count(); + // 上市企业总市值 + $company['company_market'] = Company::where('company_market', 1)->sum('market_value'); + // 校友企业总融资额 + $company['company_fund'] = Company::where('is_schoolmate', 1)->sum('company_fund'); + // 校友企业总估值 + $company['valuation'] = Company::where('is_schoolmate', 1)->sum('valuation'); + // 校友企业所属领域 + $industryTotal = []; + $industries = ParameterDetail::where('parameter_id', 4)->get(); + foreach ($industries as $item) { + $level2Names = ParameterDetail::where('parameter_id', 10)->where('remark', $item->value)->pluck('value'); + $industryTotal[] = [ + 'industry' => $item->value, + 'total' => User::whereIn('company_industry', $level2Names)->count() + ]; + } + // 追加其他领域 + $industryTotal[] = [ + 'industry' => '其他', + 'total' => User::count() - collect($industryTotal)->sum('total') + ]; // 课程统计 $courseTypes = CourseType::with('courses')->where('is_chart')->get(); foreach ($courseTypes as $courseType) { @@ -48,7 +72,17 @@ class OtherController extends CommonController ->where('status', 1) ->count(); } - return $this->success(compact('courseTypes', 'schoolmateTotal', 'schoolmateTotalYear')); + // 苏州区域数据 + $suzhou = Company::where('company_city', '苏州市') + // 根据company_area分组查询公司数量 + ->select('company_area', DB::raw('count(*) as company_total')) + ->groupBy('company_area') + ->get(); + // 全国数据 + $country = Company::select('company_city', DB::raw('count(*) as company_total')) + ->groupBy('company_city') + ->get(); + return $this->success(compact('courseTypes', 'schoolmate', 'company', 'industryTotal', 'suzhou', 'country')); } /** diff --git a/database/migrations/2025_07_17_162734_create_companies_table.php b/database/migrations/2025_07_17_162734_create_companies_table.php index 2f7da3b..3597c0f 100644 --- a/database/migrations/2025_07_17_162734_create_companies_table.php +++ b/database/migrations/2025_07_17_162734_create_companies_table.php @@ -32,16 +32,19 @@ return new class extends Migration { $table->string('management_platform')->nullable()->comment('管理平台'); // 项目经理 $table->string('project_manager')->nullable()->comment('项目经理'); - $table->bigInteger('market_value')->nullable()->comment('市值'); $table->bigInteger('company_fund')->nullable()->comment('公司融资情况'); $table->bigInteger('valuation')->nullable()->comment('估值'); $table->string('company_address')->nullable()->comment('公司地址'); $table->string('company_area')->nullable()->comment('公司区域'); + $table->string('company_city')->nullable()->comment('公司城市'); + // 是否上市 + $table->boolean('company_market')->nullable()->comment('公司性质-0未上市1已上市'); + // 是否校友企业 + $table->boolean('is_schoolmate')->nullable()->comment('是否校友企业-0非校友1校友'); + $table->boolean('company_need_fund')->nullable()->comment('公司是否需要融资-0否1是'); - $table->string('company_type')->nullable()->comment('公司性质-上市,拟上市'); $table->string('company_industry')->nullable()->comment('公司所属行业'); - $table->string('company_need_fund')->nullable()->comment('公司是否需要融资-0否1是'); $table->text('company_introduce')->nullable()->comment('公司简介'); $table->string('company_other')->nullable()->comment('其他'); $table->text('company_product')->nullable()->comment('产品'); From 0c7939b8e8137adb52049b8b412b2a6a1673badf Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 18 Jul 2025 14:14:22 +0800 Subject: [PATCH 55/68] update --- app/Http/Controllers/Admin/OtherController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index 63b0b28..e1624aa 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -66,7 +66,7 @@ class OtherController extends CommonController 'total' => User::count() - collect($industryTotal)->sum('total') ]; // 课程统计 - $courseTypes = CourseType::with('courses')->where('is_chart')->get(); + $courseTypes = CourseType::with('courses')->where('is_chart',1)->get(); foreach ($courseTypes as $courseType) { $courseType->course_signs_total = CourseSign::where('course_id', $courseType->courses->pluck('id')) ->where('status', 1) From 95caeea7540af9f41532d542ac44c8e2aaf8e5cd Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 18 Jul 2025 14:15:07 +0800 Subject: [PATCH 56/68] update --- app/Http/Controllers/Admin/OtherController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index e1624aa..dfb4794 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -68,7 +68,7 @@ class OtherController extends CommonController // 课程统计 $courseTypes = CourseType::with('courses')->where('is_chart',1)->get(); foreach ($courseTypes as $courseType) { - $courseType->course_signs_total = CourseSign::where('course_id', $courseType->courses->pluck('id')) + $courseType->course_signs_total = CourseSign::whereIn('course_id', $courseType->courses->pluck('id')) ->where('status', 1) ->count(); } From d05197516af5d4e848471e8248a3fe7c00b3039d Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 18 Jul 2025 14:15:52 +0800 Subject: [PATCH 57/68] update --- app/Http/Controllers/Admin/OtherController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index dfb4794..166e156 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -66,7 +66,7 @@ class OtherController extends CommonController 'total' => User::count() - collect($industryTotal)->sum('total') ]; // 课程统计 - $courseTypes = CourseType::with('courses')->where('is_chart',1)->get(); + $courseTypes = CourseType::where('is_chart',1)->get(); foreach ($courseTypes as $courseType) { $courseType->course_signs_total = CourseSign::whereIn('course_id', $courseType->courses->pluck('id')) ->where('status', 1) From d7391e3c2431485325b70250c78c29c95fd392ae Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 18 Jul 2025 14:17:27 +0800 Subject: [PATCH 58/68] update --- app/Http/Controllers/Admin/OtherController.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index 166e156..dd3736a 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -66,9 +66,10 @@ class OtherController extends CommonController 'total' => User::count() - collect($industryTotal)->sum('total') ]; // 课程统计 - $courseTypes = CourseType::where('is_chart',1)->get(); + $courseTypes = CourseType::where('is_chart', 1)->get(); foreach ($courseTypes as $courseType) { - $courseType->course_signs_total = CourseSign::whereIn('course_id', $courseType->courses->pluck('id')) + $courseIds = Course::where('type', $courseType->id)->pluck('id'); + $courseType->course_signs_total = CourseSign::whereIn('course_id', $courseIds) ->where('status', 1) ->count(); } From eca2f892ef4e2755d07f18fe073a6ec8834028e9 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 23 Jul 2025 13:17:10 +0800 Subject: [PATCH 59/68] update --- app/Http/Controllers/Admin/BaseController.php | 10 +++++++++- app/Http/Controllers/Admin/CourseContentController.php | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/BaseController.php b/app/Http/Controllers/Admin/BaseController.php index 0ca5e2a..500d009 100755 --- a/app/Http/Controllers/Admin/BaseController.php +++ b/app/Http/Controllers/Admin/BaseController.php @@ -91,6 +91,14 @@ class BaseController extends CommonController 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); @@ -243,7 +251,7 @@ class BaseController extends CommonController public function excelShow() { $file = \request()->file('file'); - $data = \request('data',[]); + $data = \request('data', []); //判断文件是否有效 if (!(\request()->hasFile('file') && $file->isValid())) { return $this->fail([ResponseCode::ERROR_BUSINESS, '文件不存在或无效']); diff --git a/app/Http/Controllers/Admin/CourseContentController.php b/app/Http/Controllers/Admin/CourseContentController.php index 68a0839..9a649b2 100755 --- a/app/Http/Controllers/Admin/CourseContentController.php +++ b/app/Http/Controllers/Admin/CourseContentController.php @@ -80,6 +80,14 @@ class CourseContentController extends BaseController 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); From 105e5eed7644630b9817e2ab89bc61f5101174eb Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 23 Jul 2025 13:28:19 +0800 Subject: [PATCH 60/68] update --- app/Http/Controllers/Admin/CompanyController.php | 5 +++-- app/Models/Company.php | 4 ++++ .../migrations/2025_07_17_162734_create_companies_table.php | 2 ++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Admin/CompanyController.php b/app/Http/Controllers/Admin/CompanyController.php index 9464157..a30f203 100644 --- a/app/Http/Controllers/Admin/CompanyController.php +++ b/app/Http/Controllers/Admin/CompanyController.php @@ -55,7 +55,7 @@ class CompanyController extends BaseController public function index() { $all = request()->all(); - $list = $this->model->withCount('emailRecords')->where(function ($query) use ($all) { + $list = $this->model->with('users')->where(function ($query) use ($all) { if (isset($all['filter']) && !empty($all['filter'])) { foreach ($all['filter'] as $condition) { $key = $condition['key'] ?? null; @@ -148,7 +148,7 @@ class CompanyController extends BaseController if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } - $detail = $this->model->withCount('emailRecords')->find($all['id']); + $detail = $this->model->with('users')->find($all['id']); return $this->success($detail); } @@ -165,6 +165,7 @@ class CompanyController extends BaseController * @OA\Parameter(name="company_scale", in="query", @OA\Schema(type="string", nullable=true), description="企业规模"), * @OA\Parameter(name="company_date", in="query", @OA\Schema(type="string", format="date", nullable=true), description="成立时间"), * @OA\Parameter(name="company_legal_representative", in="query", @OA\Schema(type="string", nullable=true), description="法人代表"), + * @OA\Parameter(name="company_shareholder", in="query", @OA\Schema(type="string", nullable=true), description="股东信息"), * @OA\Parameter(name="management_platform", in="query", @OA\Schema(type="string", nullable=true), description="管理平台"), * @OA\Parameter(name="project_manager", in="query", @OA\Schema(type="string", nullable=true), description="项目经理"), * @OA\Parameter(name="market_value", in="query", @OA\Schema(type="integer", format="int64", nullable=true), description="市值"), diff --git a/app/Models/Company.php b/app/Models/Company.php index 843d6c0..61828b1 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -4,5 +4,9 @@ namespace App\Models; class Company extends SoftDeletesModel { + public function users() + { + return $this->hasMany(User::class, 'company_id', 'id'); + } } diff --git a/database/migrations/2025_07_17_162734_create_companies_table.php b/database/migrations/2025_07_17_162734_create_companies_table.php index 3597c0f..7bab308 100644 --- a/database/migrations/2025_07_17_162734_create_companies_table.php +++ b/database/migrations/2025_07_17_162734_create_companies_table.php @@ -43,6 +43,8 @@ return new class extends Migration { // 是否校友企业 $table->boolean('is_schoolmate')->nullable()->comment('是否校友企业-0非校友1校友'); $table->boolean('company_need_fund')->nullable()->comment('公司是否需要融资-0否1是'); + // 股东信息 + $table->string('company_shareholder')->nullable()->comment('股东信息'); $table->string('company_industry')->nullable()->comment('公司所属行业'); $table->text('company_introduce')->nullable()->comment('公司简介'); From 39f3f9c559c038c46f75d1b100e278f0498fdd4a Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 23 Jul 2025 13:32:56 +0800 Subject: [PATCH 61/68] update --- app/Http/Controllers/Admin/CompanyController.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Admin/CompanyController.php b/app/Http/Controllers/Admin/CompanyController.php index a30f203..43d16b9 100644 --- a/app/Http/Controllers/Admin/CompanyController.php +++ b/app/Http/Controllers/Admin/CompanyController.php @@ -55,7 +55,11 @@ class CompanyController extends BaseController public function index() { $all = request()->all(); - $list = $this->model->with('users')->where(function ($query) use ($all) { + $list = $this->model->with(['users' => function ($query) { + $query->whereHas('courseSigns', function ($q) { + $q->where('status', 1); + })->with('courseSigns.course'); + }])->where(function ($query) use ($all) { if (isset($all['filter']) && !empty($all['filter'])) { foreach ($all['filter'] as $condition) { $key = $condition['key'] ?? null; @@ -148,7 +152,11 @@ class CompanyController extends BaseController if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } - $detail = $this->model->with('users')->find($all['id']); + $detail = $this->model->with(['users' => function ($query) { + $query->whereHas('courseSigns', function ($q) { + $q->where('status', 1); + })->with('courseSigns.course'); + }])->find($all['id']); return $this->success($detail); } From 4ed7e2c1483765f69ba07b11a8090dc19cfcc404 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 23 Jul 2025 13:39:46 +0800 Subject: [PATCH 62/68] update --- database/migrations/2025_07_17_162734_create_companies_table.php | 1 + 1 file changed, 1 insertion(+) diff --git a/database/migrations/2025_07_17_162734_create_companies_table.php b/database/migrations/2025_07_17_162734_create_companies_table.php index 7bab308..7f483f4 100644 --- a/database/migrations/2025_07_17_162734_create_companies_table.php +++ b/database/migrations/2025_07_17_162734_create_companies_table.php @@ -38,6 +38,7 @@ return new class extends Migration { $table->string('company_address')->nullable()->comment('公司地址'); $table->string('company_area')->nullable()->comment('公司区域'); $table->string('company_city')->nullable()->comment('公司城市'); + $table->string('company_province')->nullable()->comment('公司省份'); // 是否上市 $table->boolean('company_market')->nullable()->comment('公司性质-0未上市1已上市'); // 是否校友企业 From 4d2d5a8241e5af144a1dde0a829053ce329836c2 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 23 Jul 2025 13:43:40 +0800 Subject: [PATCH 63/68] update --- app/Http/Controllers/Admin/CourseTypeController.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Http/Controllers/Admin/CourseTypeController.php b/app/Http/Controllers/Admin/CourseTypeController.php index 90cdcf6..5124cf3 100755 --- a/app/Http/Controllers/Admin/CourseTypeController.php +++ b/app/Http/Controllers/Admin/CourseTypeController.php @@ -75,6 +75,7 @@ class CourseTypeController extends BaseController * @OA\Parameter(name="fault_tip", in="query", @OA\Schema(type="string", format="date"), description="不通过提示"), * @OA\Parameter(name="back_tip", in="query", @OA\Schema(type="string", format="date"), description="备选提示"), * @OA\Parameter(name="year_total", in="query", @OA\Schema(type="string", format="date"), description="年预约次数"), + * @OA\Parameter(name="is_chart", in="query", @OA\Schema(type="string", format="date"), description="是否参与首页统计0否1是"), * @OA\Response( * response=200, * description="操作成功" From 10cb98b01559c0449275de32307e7cf41c1ca413 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 23 Jul 2025 14:19:38 +0800 Subject: [PATCH 64/68] update --- app/Http/Controllers/Admin/CompanyController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Admin/CompanyController.php b/app/Http/Controllers/Admin/CompanyController.php index 43d16b9..5f4aac1 100644 --- a/app/Http/Controllers/Admin/CompanyController.php +++ b/app/Http/Controllers/Admin/CompanyController.php @@ -144,10 +144,10 @@ class CompanyController extends BaseController { $all = \request()->all(); $messages = [ - 'title.required' => '标题必填', + 'id.required' => 'Id必填', ]; $validator = Validator::make($all, [ - 'title' => 'required' + 'id' => 'required' ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); From 9df18688c0772d701c9e71735799f2244f0927c7 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 23 Jul 2025 15:07:10 +0800 Subject: [PATCH 65/68] update --- app/Http/Controllers/Admin/CourseContentController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/CourseContentController.php b/app/Http/Controllers/Admin/CourseContentController.php index 9a649b2..ebec3ef 100755 --- a/app/Http/Controllers/Admin/CourseContentController.php +++ b/app/Http/Controllers/Admin/CourseContentController.php @@ -86,7 +86,8 @@ class CourseContentController extends BaseController } // notnull搜索 if ($op == 'notnull') { - $query->whereNotNull($key); + // 不是null并且不是空数组 + $query->whereNotNull($key)->where($key, '!=', []); } // 范围搜索 if ($op == 'range') { From ac6a600062f7ae0b081b0e729046bddce380a4aa Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 23 Jul 2025 15:52:49 +0800 Subject: [PATCH 66/68] update --- app/Http/Controllers/Admin/CourseContentController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Admin/CourseContentController.php b/app/Http/Controllers/Admin/CourseContentController.php index ebec3ef..171be6e 100755 --- a/app/Http/Controllers/Admin/CourseContentController.php +++ b/app/Http/Controllers/Admin/CourseContentController.php @@ -86,8 +86,8 @@ class CourseContentController extends BaseController } // notnull搜索 if ($op == 'notnull') { - // 不是null并且不是空数组 - $query->whereNotNull($key)->where($key, '!=', []); + // 不是null并且不是空json,这个是一个json字段 + $query->whereNotNull($key)->where('json_length(' . $key . ') >', 0); } // 范围搜索 if ($op == 'range') { From 685efec78f0eeb998f90f0c4fde7e7f6e38ebf4e Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 23 Jul 2025 15:53:30 +0800 Subject: [PATCH 67/68] update --- app/Http/Controllers/Admin/CourseContentController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/CourseContentController.php b/app/Http/Controllers/Admin/CourseContentController.php index 171be6e..f520d9f 100755 --- a/app/Http/Controllers/Admin/CourseContentController.php +++ b/app/Http/Controllers/Admin/CourseContentController.php @@ -82,7 +82,7 @@ class CourseContentController extends BaseController } // null搜索 if ($op == 'null') { - $query->whereNull($key); + $query->whereNull($key)->where('json_length(' . $key . ') =', 0); } // notnull搜索 if ($op == 'notnull') { From 559aa47916e0d49a69b1e91809d98a586dcd0b60 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 23 Jul 2025 15:53:46 +0800 Subject: [PATCH 68/68] update --- app/Http/Controllers/Admin/CourseContentController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/CourseContentController.php b/app/Http/Controllers/Admin/CourseContentController.php index f520d9f..cdbeb3e 100755 --- a/app/Http/Controllers/Admin/CourseContentController.php +++ b/app/Http/Controllers/Admin/CourseContentController.php @@ -82,7 +82,7 @@ class CourseContentController extends BaseController } // null搜索 if ($op == 'null') { - $query->whereNull($key)->where('json_length(' . $key . ') =', 0); + $query->whereNull($key)->orWhere('json_length(' . $key . ') =', 0); } // notnull搜索 if ($op == 'notnull') {