Browse Source

导入 导出

Silent 6 years ago
parent
commit
f6ef677297

+ 66 - 0
app/Exports/StudentsExport.php

xqd
@@ -0,0 +1,66 @@
+<?php
+namespace App\Exports;
+
+use App\Models\Student;
+use Illuminate\Support\Facades\Log;
+use Maatwebsite\Excel\Concerns\FromCollection;
+use Maatwebsite\Excel\Concerns\WithHeadings;
+use Maatwebsite\Excel\Concerns\WithEvents;
+use Maatwebsite\Excel\Events\AfterSheet;
+
+class StudentsExport implements FromCollection, WithHeadings, WithEvents
+{
+
+    public $columns = 7;
+
+    public function collection()
+    {
+        $students = Student::orderBy('created_at', 'desc')->get();
+
+        $items = collect();
+        foreach($students as $item) {
+            $tmp = $item->getCourseInfo();
+
+            $item = collect([
+                'name' => $item->name,
+                'phone' => $item->phone,
+                'course_name' => $tmp['course_name'],
+                'apply_date' => $tmp['apply_date'],
+                'end_date' => $tmp['end_date'],
+                'teacher_names' => $tmp['teacher_names'],
+                'remark' => $item->remark,
+            ]);
+
+            $items->push($item);
+        }
+
+        return $items;
+    }
+
+    public function headings(): array
+    {
+        return [
+            '姓名',
+            '手机号',
+            '课程名称',
+            '报名日期',
+            '截止日期',
+            '任课老师',
+            '备注',
+        ];
+    }
+
+    public function registerEvents(): array
+    {
+        return [
+            AfterSheet::class => function(AfterSheet $event) {
+                $sheet = $event->sheet->getDelegate();
+                for($i = 0; $i <= $this->columns; ++$i) {
+                    $sheet->getColumnDimensionByColumn($i)->setWidth(14);
+                }
+                $items = $sheet->getHighestRowAndColumn();
+                $sheet->getStyle('A1:' . $items['column'] . $items['row'])->getAlignment()->setHorizontal('center');
+            },
+        ];
+    }
+}

+ 19 - 0
app/Http/Controllers/Admin/StudentController.php

xqd xqd xqd
@@ -2,6 +2,8 @@
 
 namespace App\Http\Controllers\Admin;
 
+use App\Exports\StudentsExport;
+use App\Imports\StudentsImport;
 use App\Models\Course;
 use App\Models\Student;
 use App\Models\StudentCourse;
@@ -9,7 +11,9 @@ use App\Models\StudentCourseTeacher;
 use App\Models\Teacher;
 use App\Models\TeacherStudent;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\Validator;
+use Maatwebsite\Excel\Facades\Excel;
 
 class StudentController extends Controller
 {
@@ -172,4 +176,19 @@ class StudentController extends Controller
         }
         return $this->showMessage('操作成功');
     }
+    
+    public function export(Request $request)
+    {
+        return Excel::download(new StudentsExport(), '学员.xlsx');
+    }
+
+    public function import(Request $request)
+    {
+        if(!$request->has('file') || !$request->file('file')) {
+            return $this->showWarning('请选择导入的文件');
+        }
+
+        Excel::import(new StudentsImport(), $request->file('file'));
+        return $this->showMessage('操作成功');
+    }
 }

+ 1 - 2
app/Http/Controllers/TestController.php

xqd
@@ -10,12 +10,11 @@ use Carbon\Carbon;
 use GuzzleHttp\Client;
 use Illuminate\Http\Request;
 use Intervention\Image\Facades\Image;
+use Maatwebsite\Excel\Sheet;
 
 class TestController extends Controller
 {
     public function index(Request $request)
     {
-        $student = Student::find(7);
-        dd($student->save());
     }
 }

+ 63 - 0
app/Imports/StudentsImport.php

xqd
@@ -0,0 +1,63 @@
+<?php
+
+namespace App\Imports;
+
+use App\Models\Course;
+use App\Models\Student;
+use App\Models\StudentCourse;
+use App\Models\StudentCourseTeacher;
+use App\Models\Teacher;
+use Carbon\Carbon;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Collection;
+use Maatwebsite\Excel\Concerns\ToArray;
+use Maatwebsite\Excel\Concerns\ToCollection;
+
+class StudentsImport implements ToArray
+{
+    public function array(array $rows)
+    {
+        foreach($rows as $key => $row)
+        {
+            if($key == 0) continue;
+            $student = Student::create([
+                'name' => $row[0],
+                'phone' => $row[1],
+                'remark' => $row[6],
+            ]);
+
+            $course = Course::firstOrCreate([
+                'name' => $row[2]
+            ]);
+
+            $assign_teacher = $row[5] == '全部' ? 1 : 2;
+
+            $duration = null;
+            if(!empty($row[3]) && !empty($row[4]) && $row[4] > $row[3]) {
+                $duration = Carbon::createFromTimestamp(strtotime($row[3]))->diffInDays(Carbon::createFromTimestamp(strtotime($row[4])));
+            }
+            $student_course = StudentCourse::create([
+                'student_id' => $student->id,
+                'course_id' => $course->id,
+                'apply_date' => $row[3],
+                'duration' => $duration,
+                'assign_teacher' => $assign_teacher
+            ]);
+
+            if($assign_teacher == 2) {
+                $teacher_names = explode(',', $row[5]);
+                foreach($teacher_names as $teacher_name) {
+                    $teacher = Teacher::firstOrCreate([
+                        'name' => $teacher_name
+                    ]);
+
+                    StudentCourseTeacher::create([
+                        'student_course_id' => $student_course->id,
+                        'teacher_id' => $teacher->id,
+                        'student_id' => $student->id,
+                    ]);
+                }
+            }
+        }
+    }
+}

+ 1 - 0
composer.json

xqd
@@ -13,6 +13,7 @@
         "laravel/framework": "5.5.*",
         "laravel/passport": "^2.0",
         "laravel/tinker": "~1.0",
+        "maatwebsite/excel": "^3.1",
         "overtrue/laravel-wechat": "~4.0"
     },
     "require-dev": {

+ 3 - 0
config/app.php

xqd xqd
@@ -182,6 +182,8 @@ return [
         Intervention\Image\ImageServiceProvider::class,
         Germey\Geetest\GeetestServiceProvider::class,
         Overtrue\LaravelWeChat\ServiceProvider::class,
+
+        Maatwebsite\Excel\ExcelServiceProvider::class,
     ],
 
     /*
@@ -233,6 +235,7 @@ return [
         'Image' => Intervention\Image\Facades\Image::class,
         'Geetest' => Germey\Geetest\Geetest::class,
         'EasyWeChat' => Overtrue\LaravelWeChat\Facade::class,
+        'Excel' => Maatwebsite\Excel\Facades\Excel::class,
     ],
 
 ];

+ 39 - 2
resources/views/admin/students/index.blade.php

xqd xqd xqd xqd
@@ -1,6 +1,8 @@
 @extends('admin.layout')
 <style type="text/css">
-
+    #sg-import-modal .form-control {
+        height: auto;
+    }
 </style>
 @section('header')
 
@@ -32,7 +34,11 @@
                                 </form>
                             </div>
                             <div class="col-sm-8 pull-right">
-                                <a href="{{ $pre_uri . 'create' }}" class="btn btn-sm btn-primary pull-right">添加{{ $model_name }}</a>
+                                <div class="btn-group pull-right" id="sg-top-actions">
+                                    <a href="{{ $pre_uri . 'export' }}" class="btn btn-sm btn-info">导出</a>
+                                    <button class="btn btn-sm btn-warning btn-import">导入</button>
+                                    <a href="{{ $pre_uri . 'create' }}" class="btn btn-sm btn-primary">添加{{ $model_name }}</a>
+                                </div>
                             </div>
                         </div>
                         <table class="table table-striped table-bordered table-hover dataTables-example dataTable" id="sg-main-table">
@@ -104,6 +110,33 @@
         </form>
     </div>
 </div>
+<div class="modal fade" id="sg-import-modal" tabindex="-1" role="dialog" aria-labelledby="import-label" aria-hidden="true">
+    <div class="modal-dialog">
+        <form id="sg-import-form" class="form-horizontal" method="POST" action="{{ $pre_uri . 'import' }}" enctype="multipart/form-data">
+            {{ csrf_field() }}
+
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+                    <h4 class="modal-title" id="delete-label">选择要导入的文件</h4>
+                </div>
+                <div class="modal-body">
+                    <div class="form-group">
+                        <label for="lastname" class="col-sm-2 control-label">选择文件</label>
+                        <div class="col-sm-10">
+                            <input type="file" class="form-control" name="file" required>
+                            <span class="help-block">导入的文件只支持xlsx和xls</span>
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
+                    <button type="submit" class="btn btn-success">导入</button>
+                </div>
+            </div>
+        </form>
+    </div>
+</div>
 @endsection
 
 @section('footer')
@@ -113,6 +146,10 @@ $(function () {
         $('#delete-input-id').val($(this).attr('data-id'));
         $('#delete-modal').modal('show');
     });
+
+    $('#sg-top-actions').on('click', '.btn-import', function() {
+        $('#sg-import-modal').modal('show');
+    });
 })
 </script>
 @endsection