Browse Source

Merge pull request #2036 from visuddhinanda/laravel

课程人员管理留记录
visuddhinanda 2 years ago
parent
commit
6f1267e9b7

+ 58 - 0
app/Console/Commands/UpdateSentenceVer.php

@@ -0,0 +1,58 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+use App\Models\Sentence;
+use Illuminate\Support\Str;
+
+class UpdateSentenceVer extends Command
+{
+    /**
+     * 将无channel_uid的旧版句子数据的ver修改为1.
+     * php artisan update:sentence.ver
+     * @var string
+     */
+    protected $signature = 'update:sentence.ver';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '将无channel_uid的旧版句子数据的ver修改为1';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        $count = 0;
+        $total = Sentence::whereNull('channel_uid')->orWhere('channel_uid','')->count();
+        foreach (Sentence::whereNull('channel_uid')->orWhere('channel_uid','')->cursor() as $key => $value) {
+            # code...
+            $value->ver = 1;
+            $value->channel_uid = Str::uuid();
+            $value->save();
+            $count++;
+            if($count % 1000 === 0){
+                $per = (int)($count*100 / $total);
+                $this->info("[{$per}%]-{$count}");
+            }
+        }
+        $this->info("all done [{$count}]");
+        return 0;
+    }
+}

+ 35 - 11
app/Http/Controllers/CourseController.php

@@ -9,6 +9,7 @@ use App\Http\Api\AuthApi;
 use App\Http\Api\StudioApi;
 use App\Http\Api\StudioApi;
 use App\Http\Resources\CourseResource;
 use App\Http\Resources\CourseResource;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Str;
 
 
 class CourseController extends Controller
 class CourseController extends Controller
 {
 {
@@ -71,6 +72,7 @@ class CourseController extends Controller
                 //我学习的课程
                 //我学习的课程
                 $course = CourseMember::where('user_id',$user["user_uid"])
                 $course = CourseMember::where('user_id',$user["user_uid"])
                                       ->where('role','student')
                                       ->where('role','student')
+                                      ->where('is_current',true)
                                       ->select('course_id')
                                       ->select('course_id')
                                       ->get();
                                       ->get();
                 $courseId = [];
                 $courseId = [];
@@ -87,9 +89,10 @@ class CourseController extends Controller
                     return $this->error(__('auth.failed'));
                     return $this->error(__('auth.failed'));
                 }
                 }
                 $course = CourseMember::where('user_id',$user["user_uid"])
                 $course = CourseMember::where('user_id',$user["user_uid"])
-                ->where('role','assistant')
-                ->select('course_id')
-                ->get();
+                                    ->whereIn('role',['assistant','manager','teacher'])
+                                      ->where('is_current',true)
+                                      ->select('course_id')
+                                    ->get();
                 $courseId = [];
                 $courseId = [];
                 foreach ($course as $key => $value) {
                 foreach ($course as $key => $value) {
                     # code...
                     # code...
@@ -130,12 +133,14 @@ class CourseController extends Controller
         $create = Course::where('studio_id', $user["user_uid"])->count();
         $create = Course::where('studio_id', $user["user_uid"])->count();
         //我学习的课程
         //我学习的课程
         $study = CourseMember::where('user_id',$user["user_uid"])
         $study = CourseMember::where('user_id',$user["user_uid"])
-        ->where('role','student')
-        ->count();
+                            ->where('role','student')
+                            ->where('is_current',true)
+                            ->count();
         //我任教的课程
         //我任教的课程
         $teach = CourseMember::where('user_id',$user["user_uid"])
         $teach = CourseMember::where('user_id',$user["user_uid"])
-        ->where('role','assistant')
-        ->count();
+                            ->where('is_current',true)
+                            ->whereIn('role',['assistant','manager','teacher'])
+                            ->count();
         return $this->ok(['create'=>$create,'teach'=>$teach,'study'=>$study]);
         return $this->ok(['create'=>$create,'teach'=>$teach,'study'=>$study]);
     }
     }
     /**
     /**
@@ -161,10 +166,29 @@ class CourseController extends Controller
             return $this->error(__('validation.exists',['name']));
             return $this->error(__('validation.exists',['name']));
         }
         }
 
 
-        $course = new Course;
-        $course->title = $request->get('title');
-        $course->studio_id = $studio_id;
-        $course->save();
+        try {
+            $course = new Course;
+            DB::transaction(function () use($course,$request,$studio_id,$user) {
+                $saveCourse = false;
+                $saveCourseMember = false;
+
+                $course->id = Str::uuid();
+                $course->title = $request->get('title');
+                $course->studio_id = $studio_id;
+                $saveCourse = $course->save();
+
+                //添加owner
+                $newMember = new CourseMember();
+                $newMember->user_id = $user['user_uid'];
+                $newMember->course_id = $course->id;
+                $newMember->role = 'owner';
+                $saveCourseMember = $newMember->save();
+            });
+
+        } catch(\Exception $e) {
+            return $this->error('course create fail',500,500);
+        }
+
         return $this->ok(new CourseResource($course));
         return $this->ok(new CourseResource($course));
     }
     }
 
 

+ 106 - 90
app/Http/Controllers/CourseMemberController.php

@@ -19,73 +19,61 @@ class CourseMemberController extends Controller
     public function index(Request $request)
     public function index(Request $request)
     {
     {
         //
         //
+        $user = AuthApi::current($request);
+        if(!$user){
+            return $this->error(__('auth.failed',[403],403));
+        }
+        //判断当前用户是否有指定的 course 的权限
+        $role = CourseMember::where('course_id', $request->get('id',$request->get('course')))
+                            ->where('user_id',$user['user_uid'])
+                            ->value('role');
+        if(empty($role)){
+            return $this->error(__('auth.failed',[403],403));
+        }
+
         $result=false;
         $result=false;
-		$indexCol = ['id','user_id','course_id','channel_id','role','updated_at','created_at'];
+		$indexCol = ['id','user_id','course_id',
+                    'channel_id','role','editor_uid',
+                    'updated_at','created_at'];
 		switch ($request->get('view')) {
 		switch ($request->get('view')) {
             case 'course':
             case 'course':
 	            # 获取 course 内所有 成员
 	            # 获取 course 内所有 成员
-                $user = AuthApi::current($request);
-                if(!$user){
-                    return $this->error(__('auth.failed'));
-                }
-                //TODO 判断当前用户是否有指定的 course 的权限
-                $table = CourseMember::where('course_id', $request->get('id'));
+                $table = CourseMember::where('course_id', $request->get('id'))
+                                    ->where('is_current',true);
 				break;
 				break;
-            case 'user':
-                //获取某个用户的角色
-                $user = AuthApi::current($request);
-                if(!$user){
-                    return $this->error(__('auth.failed'));
-                }
-                //TODO 判断当前用户是否有指定的 course 的权限
+            case 'timeline':
+                /**
+                 * 编辑时间线
+                 */
                 $table = CourseMember::where('course_id', $request->get('course'))
                 $table = CourseMember::where('course_id', $request->get('course'))
-                                    ->where('user_id', $user['user_uid']);
+                                    ->where('user_id',$request->get('userId'));
                 break;
                 break;
+            default:
+                return $this->error('无法识别的参数view',400,400);
+            break;
         }
         }
-        if(isset($_GET["search"])){
-            $table = $table->where('title', 'like', $_GET["search"]."%");
+        if(!empty($request->get("search"))){
+            $table = $table->where('name', 'like', $request->get("search")."%");
         }
         }
 
 
         $count = $table->count();
         $count = $table->count();
 
 
-        if(isset($_GET["order"]) && isset($_GET["dir"])){
-            $table = $table->orderBy($_GET["order"],$_GET["dir"]);
-        }else{
-            $table = $table->orderBy('updated_at','desc');
-        }
+        $table = $table->orderBy($request->get('order','created_at'),
+                                $request->get('dir','asc'));
 
 
-        $table->skip($request->get('offset',0))
+        $table = $table->skip($request->get('offset',0))
               ->take($request->get('limit',1000));
               ->take($request->get('limit',1000));
 
 
         $result = $table->get();
         $result = $table->get();
 
 
         //获取当前用户角色
         //获取当前用户角色
-        $isOwner = Course::where('id',$request->get('id'))->where('studio_id',$user["user_uid"])->exists();
-        $role = 'unknown';
-        if($isOwner){
-            $role = 'owner';
-        }else{
-            foreach ($result as $key => $value) {
-            # 找到当前用户
-            if($user["user_uid"]===$value->user_id){
-                switch ($value->role) {
-                    case 'assistant':
-                        $role = 'manager';
-                        break;
-                    default:
-                        # code...
-                        break;
-                }
-                break;
-            }
-        }
-        }
+        $role = CourseMember::where('course_id', $request->get('id'))
+                            ->where('user_id', $user['user_uid'])
+                            ->where('is_current',true)
+                            ->value('role');
+
+		return $this->ok(["rows"=>CourseMemberResource::collection($result),'role'=>$role,"count"=>$count]);
 
 
-		if($result){
-			return $this->ok(["rows"=>CourseMemberResource::collection($result),'role'=>$role,"count"=>$count]);
-		}else{
-			return $this->error("没有查询到数据");
-		}
     }
     }
 
 
     /**
     /**
@@ -97,62 +85,60 @@ class CourseMemberController extends Controller
     public function store(Request $request)
     public function store(Request $request)
     {
     {
         //
         //
+        $user = AuthApi::current($request);
+        if(!$user){
+            return $this->error(__('auth.failed',[403],403));
+        }
         $validated = $request->validate([
         $validated = $request->validate([
             'user_id' => 'required',
             'user_id' => 'required',
             'course_id' => 'required',
             'course_id' => 'required',
             'role' => 'required',
             'role' => 'required',
-            'operating' => 'required',
+            'status' => 'required',
         ]);
         ]);
-        //查找重复的项目
+        //查找重复的
         if(CourseMember::where('course_id', $validated['course_id'])
         if(CourseMember::where('course_id', $validated['course_id'])
                       ->where('user_id',$validated['user_id'])
                       ->where('user_id',$validated['user_id'])
                       ->exists()){
                       ->exists()){
-            return $this->error('member exists');
+            return $this->error('member exists',[200],200);
         }
         }
         $newMember = new CourseMember();
         $newMember = new CourseMember();
-        $newMember->user_id = $validated['user_id'];
         $newMember->course_id = $validated['course_id'];
         $newMember->course_id = $validated['course_id'];
         $newMember->role = $validated['role'];
         $newMember->role = $validated['role'];
+        $newMember->editor_uid = $user['user_uid'];
+        $newMember->status = $validated['status'];
+        if($validated['status'] === 'invited'){
+            $newMember->user_id = $validated['user_id'];
+        }else{
+            $newMember->user_id = $user['user_uid'];
+        }
+
         /**
         /**
          * 查找course 信息,根据加入方式设置状态
          * 查找course 信息,根据加入方式设置状态
          * open : accepted
          * open : accepted
          * manual: progressing
          * manual: progressing
          */
          */
         $course  = Course::find($validated['course_id']);
         $course  = Course::find($validated['course_id']);
-        if($course){
-            switch ($course->join) {
-                case 'open': //开放学习课程
-                    switch ($validated['operating']) {
-                        case 'invite':
-                            $newMember->status = 'invited';
-                            break;
-                        case 'sign_up':
-                            $newMember->status = 'normal';
-                            break;
+        if(!$course){
+            return $this->error('invalid course');
+        }
+        switch ($course->join) {
+            case 'open': //开放学习课程
+                if($validated['status']!=='joined' &&
+                    $validated['status']!=='invited'
+                    ){
+                    return $this->error('invalid course',[200],200);
                     }
                     }
-                    break;
-                case 'manual': //人工审核课程
-                    switch ($validated['operating']) {
-                        case 'invite':
-                            $newMember->status = 'invited';
-                            break;
-                        case 'sign_up':
-                            $newMember->status = 'sign_up';
-                            break;
+                break;
+            case 'manual': //人工审核课程
+                if($validated['status']!=='applied' &&
+                    $validated['status']!=='invited'
+                    ){
+                    return $this->error('invalid course',[200],200);
                     }
                     }
-                    break;
-                case 'invite': //仅限邀请
-                    $newMember->status = 'invited';
-                    break;
-
-                default:
-                    # code...
-                    break;
-            }
-        }else{
-            return $this->error('invalid course');
+                break;
         }
         }
         $newMember->save();
         $newMember->save();
+
         return $this->ok(new CourseMemberResource($newMember));
         return $this->ok(new CourseMemberResource($newMember));
 
 
     }
     }
@@ -160,12 +146,27 @@ class CourseMemberController extends Controller
     /**
     /**
      * Display the specified resource.
      * Display the specified resource.
      *
      *
-     * @param  \App\Models\CourseMember  $courseMember
+     * @param  \Illuminate\Http\Request  $request
+     * @param  string  $courseId
      * @return \Illuminate\Http\Response
      * @return \Illuminate\Http\Response
      */
      */
-    public function show(CourseMember $courseMember)
+    public function show(Request $request,string $courseId)
     {
     {
         //
         //
+        $user = AuthApi::current($request);
+        if(!$user){
+            return $this->error(__('auth.failed'));
+        }
+        $member = CourseMember::where('course_id',$courseId)
+                                ->where('user_id',$user['user_uid'])
+                                ->where('is_current',true)
+                                ->first();
+        if($member){
+            return $this->ok(new CourseMemberResource($member));
+        }else{
+            return $this->error('no result');
+        }
+
     }
     }
 
 
     /**
     /**
@@ -177,23 +178,38 @@ class CourseMemberController extends Controller
      */
      */
     public function update(Request $request, CourseMember $courseMember)
     public function update(Request $request, CourseMember $courseMember)
     {
     {
-        //
+        /**
+         * 保留原有记录
+         * 增加一条新纪录
+         * 原有记录变为历史记录
+         */
         $user = AuthApi::current($request);
         $user = AuthApi::current($request);
         if(!$user){
         if(!$user){
             return $this->error(__('auth.failed'));
             return $this->error(__('auth.failed'));
         }
         }
 
 
+        $newMember = new CourseMember();
+        $newMember->user_id = $courseMember->user_id;
+        $newMember->course_id = $courseMember->course_id;
+        $newMember->role = $courseMember->role;
+        $newMember->status = $courseMember->status;
+        $newMember->channel_id = $courseMember->channel_id;
+        $newMember->editor_uid = $user['user_uid'];
+
+        $courseMember->is_current = false;
+        $courseMember->save();
+
         if($request->has('channel_id')) {
         if($request->has('channel_id')) {
-            if($courseMember->user_id !== $user['user_uid']){
+            if($newMember->user_id !== $user['user_uid']){
                 return $this->error(__('auth.failed'));
                 return $this->error(__('auth.failed'));
             }
             }
-            $courseMember->channel_id = $request->get('channel_id');
+            $newMember->channel_id = $request->get('channel_id');
         }
         }
         if($request->has('status')) {
         if($request->has('status')) {
-            $courseMember->status = $request->get('status');
+            $newMember->status = $request->get('status');
         }
         }
-        $courseMember->save();
-        return $this->ok(new CourseMemberResource($courseMember));
+        $newMember->save();
+        return $this->ok(new CourseMemberResource($newMember));
 
 
     }
     }
     public function set_channel(Request $request)
     public function set_channel(Request $request)

+ 2 - 1
app/Http/Resources/CourseMemberResource.php

@@ -19,8 +19,9 @@ class CourseMemberResource extends JsonResource
             "id"=>$this->id,
             "id"=>$this->id,
             "user_id"=> $this->user_id,
             "user_id"=> $this->user_id,
             "course_id"=> $this->course_id,
             "course_id"=> $this->course_id,
-            "role"=> $this->role,
+            "role"=> $this->role ,
             "user"=> UserApi::getByUuid($this->user_id),
             "user"=> UserApi::getByUuid($this->user_id),
+            "editor"=> UserApi::getByUuid($this->editor_uid),
             "status"=> $this->status,
             "status"=> $this->status,
             'channel_id'=> $this->channel_id,
             'channel_id'=> $this->channel_id,
             "created_at"=> $this->created_at,
             "created_at"=> $this->created_at,

+ 6 - 5
app/Http/Resources/CourseResource.php

@@ -81,17 +81,18 @@ class CourseResource extends JsonResource
             }
             }
         }
         }
 
 
-        if($request->get('view')==="study"){
+        if($request->get('view') !== "create"){
             $user = AuthApi::current($request);
             $user = AuthApi::current($request);
-                if(!$user){
-                    return $this->error(__('auth.failed'));
-                }
+            if(!$user){
+                return $this->error(__('auth.failed'));
+            }
             $course_member = CourseMember::where('user_id',$user["user_uid"])
             $course_member = CourseMember::where('user_id',$user["user_uid"])
                                   ->where('course_id',$this->id)
                                   ->where('course_id',$this->id)
-                                  ->select('status')
+                                  ->where('is_current',true)
                                   ->first();
                                   ->first();
             if($course_member){
             if($course_member){
                 $data['my_status'] = $course_member->status;
                 $data['my_status'] = $course_member->status;
+                $data['my_status_id'] = $course_member->id;
             }
             }
         }else{
         }else{
             //计算待审核
             //计算待审核

+ 7 - 0
app/Models/Course.php

@@ -14,4 +14,11 @@ class Course extends Model
     ];
     ];
     public  $incrementing = false;
     public  $incrementing = false;
 
 
+    protected $dates = [
+        'created_at',
+        'updated_at',
+        'start_at',
+        'end_at'
+    ];
+
 }
 }

+ 35 - 0
database/migrations/2024_03_29_114758_add_current_in_course_members.php

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddCurrentInCourseMembers extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('course_members', function (Blueprint $table) {
+            //
+			$table->boolean('is_current')->index()->default(true);
+
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('course_members', function (Blueprint $table) {
+            //
+            $table->dropColumn('is_current');
+        });
+    }
+}

+ 34 - 0
database/migrations/2024_03_30_024059_add_editor_in_course_members.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddEditorInCourseMembers extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('course_members', function (Blueprint $table) {
+            //
+            $table->uuid('editor_uid')->index()->default(DB::raw('uuid_generate_v1mc()'));
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('course_members', function (Blueprint $table) {
+            //
+            $table->dropColumn('editor_uid');
+        });
+    }
+}