Ver código fonte

:sparkles: 导入导出

visuddhinanda 3 anos atrás
pai
commit
f6bc44e81f
1 arquivos alterados com 227 adições e 54 exclusões
  1. 227 54
      app/Http/Controllers/DhammaTermController.php

+ 227 - 54
app/Http/Controllers/DhammaTermController.php

@@ -10,6 +10,13 @@ use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Str;
 use Illuminate\Support\Str;
 use App\Http\Api\AuthApi;
 use App\Http\Api\AuthApi;
 use App\Http\Api\StudioApi;
 use App\Http\Api\StudioApi;
+use App\Http\Api\ChannelApi;
+use App\Http\Api\ShareApi;
+use App\Tools\Tools;
+use App\Http\Resources\TermResource;
+use Illuminate\Support\Facades\App;
+use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
 
 
 class DhammaTermController extends Controller
 class DhammaTermController extends Controller
 {
 {
@@ -21,7 +28,7 @@ class DhammaTermController extends Controller
     public function index(Request $request)
     public function index(Request $request)
     {
     {
         $result=false;
         $result=false;
-		$indexCol = ['id','guid','word','meaning','other_meaning','note','language','channal','created_at','updated_at'];
+		$indexCol = ['id','guid','word','meaning','other_meaning','note','language','channal','owner','editor_id','created_at','updated_at'];
 
 
 		switch ($request->get('view')) {
 		switch ($request->get('view')) {
             case 'create-by-channel':
             case 'create-by-channel':
@@ -72,21 +79,38 @@ class DhammaTermController extends Controller
                 ]);
                 ]);
                 break;
                 break;
             case 'studio':
             case 'studio':
-				# 获取studio内所有channel
+				# 获取 studio 内所有 term
                 $search = $request->get('search');
                 $search = $request->get('search');
                 $user = AuthApi::current($request);
                 $user = AuthApi::current($request);
-                if($user){
-                    //判断当前用户是否有指定的studio的权限
-                    if($user['user_uid'] === StudioApi::getIdByName($request->get('name'))){
-                        $table = DhammaTerm::select($indexCol)
-                                    ->where('owner', $user["user_uid"]);
-                    }else{
-                        return $this->error(__('auth.failed'));
-                    }
-                }else{
+                if(!$user){
+                    return $this->error(__('auth.failed'));
+                }
+                //判断当前用户是否有指定的studio的权限
+                if($user['user_uid'] !== StudioApi::getIdByName($request->get('name'))){
                     return $this->error(__('auth.failed'));
                     return $this->error(__('auth.failed'));
                 }
                 }
+                $table = DhammaTerm::select($indexCol)
+                                   ->where('owner', $user["user_uid"]);
 				break;
 				break;
+            case 'channel':
+                # 获取 studio 内所有 term
+                $search = $request->get('search');
+                $user = AuthApi::current($request);
+                if(!$user){
+                    return $this->error(__('auth.failed'));
+                }
+                //判断当前用户是否有指定的 channel 的权限
+                $channel = Channel::find($request->get('id'));
+                if($user['user_uid'] !== $channel->owner_uid ){
+                    //看是否为协作
+                    $power = ShareApi::getResPower($user['user_uid'],$request->get('id'));
+                    if($power === 0){
+                        return $this->error(__('auth.failed'));
+                    }
+                }
+                $table = DhammaTerm::select($indexCol)
+                                    ->where('channal', $request->get('id'));
+                break;
             case 'show':
             case 'show':
                 return $this->ok(DhammaTerm::find($request->get('id')));
                 return $this->ok(DhammaTerm::find($request->get('id')));
                 break;
                 break;
@@ -157,7 +181,7 @@ class DhammaTermController extends Controller
         $result = $table->get();
         $result = $table->get();
 
 
 		if($result){
 		if($result){
-			return $this->ok(["rows"=>$result,"count"=>$count]);
+			return $this->ok(["rows"=>TermResource::collection($result),"count"=>$count]);
 		}else{
 		}else{
 			return $this->error("没有查询到数据");
 			return $this->error("没有查询到数据");
 		}
 		}
@@ -171,26 +195,21 @@ class DhammaTermController extends Controller
      */
      */
     public function store(Request $request)
     public function store(Request $request)
     {
     {
-                // validate
-        // read more on validation at http://laravel.com/docs/validation
-        $rules = array(
+        $user = AuthApi::current($request);
+        if(!$user){
+            return $this->error(__('auth.failed'));
+        }
+        $validated = $request->validate([
             'word' => 'required',
             'word' => 'required',
             'meaning' => 'required',
             'meaning' => 'required',
             'language' => 'required'
             'language' => 'required'
-        );
-        $validator = Validator::make($request->all(), $rules);
-
-        // process the login
-        if ($validator->fails()) {
-            return $this->error($validator);
-        }
-
+        ]);
         #查询重复的
         #查询重复的
         /*
         /*
         重复判定:
         重复判定:
         一个channel下面word+tag+language 唯一
         一个channel下面word+tag+language 唯一
         */
         */
-        $table = DhammaTerm::where('owner', $_COOKIE["user_uid"])
+        $table = DhammaTerm::where('owner', $user["user_uid"])
                 ->where('word',$request->get("word"))
                 ->where('word',$request->get("word"))
                 ->where('tag',$request->get("tag"));
                 ->where('tag',$request->get("tag"));
         if($request->get("channel")){
         if($request->get("channel")){
@@ -204,24 +223,34 @@ class DhammaTermController extends Controller
         if($isDoesntExist){
         if($isDoesntExist){
             #不存在插入数据
             #不存在插入数据
             $term = new DhammaTerm;
             $term = new DhammaTerm;
-            $term->id=app('snowflake')->id();
-            $term->guid=Str::uuid();
-            $term->word=$request->get("word");
-            $term->meaning=$request->get("meaning");
+            $term->id = app('snowflake')->id();
+            $term->guid = Str::uuid();
+            $term->word = $request->get("word");
+            $term->word_en = Tools::getWordEn($request->get("word"));
+            $term->meaning = $request->get("meaning");
+            $term->other_meaning = $request->get("other_meaning");
+            $term->note = $request->get("note");
+            $term->tag = $request->get("tag");
+            $term->channal = $request->get("channal");
+            $term->language = $request->get("language");
+            if($request->has("channal")){
+                $channelInfo = ChannelApi::getById($request->get("channal"));
+                if(!$channelInfo){
+                    return $this->error("channel id failed");
+                }else{
+                    $term->owner = $channelInfo['studio_id'];
+                }
+            }else{
+                $term->owner = StudioApi::getIdByName($request->get("studioName"));
+            }
+            $term->editor_id = $user["user_id"];
+            $term->create_time = time()*1000;
+            $term->modify_time = time()*1000;
             $term->save();
             $term->save();
-            return $this->ok($data);
-
+            return $this->ok($term);
         }else{
         }else{
             return $this->error("word existed");
             return $this->error("word existed");
         }
         }
-        // store
-        /*
-        $data = $request->all();
-        $data['id'] = app('snowflake')->id();
-        $data['guid'] = Str::uuid();
-        DhammaTerm::create($data);
-        */
-
 
 
     }
     }
 
 
@@ -252,9 +281,38 @@ class DhammaTermController extends Controller
      * @param  \App\Models\DhammaTerm  $dhammaTerm
      * @param  \App\Models\DhammaTerm  $dhammaTerm
      * @return \Illuminate\Http\Response
      * @return \Illuminate\Http\Response
      */
      */
-    public function update(Request $request, DhammaTerm $dhammaTerm)
+    public function update(Request $request, string $id)
     {
     {
         //
         //
+        $user = AuthApi::current($request);
+        if(!$user){
+            return $this->error(__('auth.failed'));
+        }
+        $dhammaTerm = DhammaTerm::find($id);
+        $dhammaTerm->word = $request->get("word");
+        $dhammaTerm->word_en = Tools::getWordEn($request->get("word"));
+        $dhammaTerm->meaning = $request->get("meaning");
+        $dhammaTerm->other_meaning = $request->get("other_meaning");
+        $dhammaTerm->note = $request->get("note");
+        $dhammaTerm->tag = $request->get("tag");
+        $dhammaTerm->channal = $request->get("channal");
+        $dhammaTerm->language = $request->get("language");
+        if($request->has("channal")){
+            $channelInfo = ChannelApi::getById($request->get("channal"));
+            if(!$channelInfo){
+                return $this->error("channel id failed");
+            }else{
+                $dhammaTerm->owner = $channelInfo['studio_id'];
+            }
+        }else{
+            $dhammaTerm->owner = StudioApi::getIdByName($request->get("studioName"));
+        }
+        $dhammaTerm->editor_id = $user["user_id"];
+        $dhammaTerm->create_time = time()*1000;
+        $dhammaTerm->modify_time = time()*1000;
+        $dhammaTerm->save();
+		return $this->ok($dhammaTerm);
+
     }
     }
 
 
     /**
     /**
@@ -268,28 +326,34 @@ class DhammaTermController extends Controller
         /**
         /**
          * 一次删除多个单词
          * 一次删除多个单词
          */
          */
-        if(isset($_COOKIE["user_uid"])){
-            $user_uid = $_COOKIE["user_uid"];
-        }else{
-            $user = AuthApi::current($request);
-            if(!$user){
-                return $this->error(__('auth.failed'));
-            }
-            $user_uid = $user['user_uid'];
+        $user = AuthApi::current($request);
+        if(!$user){
+            return $this->error(__('auth.failed'));
         }
         }
-
+        $count = 0;
         if($request->has("uuid")){
         if($request->has("uuid")){
-            $count = DhammaTerm::whereIn('guid', $request->get("id"))
-                            ->where('owner', $user_uid)
-                            ->delete();
+            //查看是否有删除权限
+            foreach ($request->get("id") as $key => $uuid) {
+                $term = DhammaTerm::find($uuid);
+                if($term->owner !== $user['user_uid']){
+                    if(!empty($term->channal)){
+                        //看是否为协作
+                        $power = ShareApi::getResPower($user['user_uid'],$term->channal);
+                        if($power < 20){
+                            continue;
+                        }
+                    }else{
+                        continue;
+                    }
+                }
+                $count += $term->delete();
+            }
         }else{
         }else{
             $arrId = json_decode($request->get("id"),true) ;
             $arrId = json_decode($request->get("id"),true) ;
-            $count = 0;
-
             foreach ($arrId as $key => $id) {
             foreach ($arrId as $key => $id) {
                 # code...
                 # code...
                 $result = DhammaTerm::where('id', $id)
                 $result = DhammaTerm::where('id', $id)
-                                ->where('owner', $user_uid)
+                                ->where('owner', $user['user_uid'])
                                 ->delete();
                                 ->delete();
                 if($result){
                 if($result){
                     $count++;
                     $count++;
@@ -299,4 +363,113 @@ class DhammaTermController extends Controller
 
 
 		return $this->ok($count);
 		return $this->ok($count);
     }
     }
+
+    public function export(Request $request){
+        $user = AuthApi::current($request);
+        if(!$user){
+            return $this->error(__('auth.failed'));
+        }
+//TODO 判断是否有导出权限
+        switch ($request->get("view")) {
+            case 'channel':
+                # code...
+                $rows = DhammaTerm::where('channal',$request->get("id"))->cursor();
+                break;
+            case 'studio':
+                # code...
+                $rows = DhammaTerm::where('channal',$request->get("name"))->cursor();
+                break;
+            default:
+                $this->error('no view');
+                break;
+        }
+
+        $spreadsheet = new Spreadsheet();
+        $activeWorksheet = $spreadsheet->getActiveSheet();
+        $activeWorksheet->setCellValue('A1', 'id');
+        $activeWorksheet->setCellValue('B1', 'word');
+        $activeWorksheet->setCellValue('C1', 'meaning');
+        $activeWorksheet->setCellValue('D1', 'other_meaning');
+        $activeWorksheet->setCellValue('E1', 'note');
+        $activeWorksheet->setCellValue('F1', 'tag');
+        $activeWorksheet->setCellValue('G1', 'language');
+        $activeWorksheet->setCellValue('H1', 'channel_id');
+
+        $currLine = 2;
+        foreach ($rows as $key => $row) {
+            # code...
+            $activeWorksheet->setCellValue("A{$currLine}", $row->guid);
+            $activeWorksheet->setCellValue("B{$currLine}", $row->word);
+            $activeWorksheet->setCellValue("C{$currLine}", $row->meaning);
+            $activeWorksheet->setCellValue("D{$currLine}", $row->other_meaning);
+            $activeWorksheet->setCellValue("E{$currLine}", $row->note);
+            $activeWorksheet->setCellValue("F{$currLine}", $row->tag);
+            $activeWorksheet->setCellValue("G{$currLine}", $row->language);
+            $activeWorksheet->setCellValue("H{$currLine}", $row->channal);
+            $currLine++;
+        }
+        $writer = new Xlsx($spreadsheet);
+        $fId = Str::uuid();
+        $filename = storage_path("app/tmp/{$fId}");
+        $writer->save($filename);
+        Cache::put("download/tmp/{$fId}",file_get_contents($filename),300);
+        unlink($filename);
+        return $this->ok(['uuid'=>$fId,'filename'=>"term.xlsx",'type'=>"application/vnd.ms-excel"]);
+    }
+
+    public function import(Request $request){
+        $user = AuthApi::current($request);
+        if(!$user){
+            return $this->error(__('auth.failed'));
+        }
+
+        $filename = $request->get('filename');
+        $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
+        $reader->setReadDataOnly(true);
+        $spreadsheet = $reader->load($filename);
+        $activeWorksheet = $spreadsheet->getActiveSheet();
+        $currLine = 2;
+        do {
+            # code...
+            $id = $activeWorksheet->getCell("A{$currLine}")->getValue();
+            $word = $activeWorksheet->getCell("B{$currLine}")->getValue();
+            $meaning = $activeWorksheet->getCell("C{$currLine}")->getValue();
+            $other_meaning = $activeWorksheet->getCell("D{$currLine}")->getValue();
+            $note = $activeWorksheet->getCell("E{$currLine}")->getValue();
+            $tag = $activeWorksheet->getCell("F{$currLine}")->getValue();
+            $language = $activeWorksheet->getCell("G{$currLine}")->getValue();
+            $query = ['word'=>$word,'tag'=>$tag];
+            switch ($request->get('view')) {
+                case 'channel':
+                    # code...
+                    $query['channal'] = $request->get('id');
+                    $channel = ChannelApi::getById($request->get('id'));
+                    $owner_id = $channel['studio_id'];
+                    $lang = $channel['lang'];
+                    break;
+                case 'studio':
+                    # code...
+                    break;
+                default:
+                    # code...
+                    break;
+            }
+
+            if(!empty($word)){
+                $row = DhammaTerm::firstOrNew($query);
+                $row->word_en = Tools::getWordEn($word);
+                $row->meaning = $meaning;
+                $row->other_meaning = $other_meaning;
+                $row->note = $note;
+                $row->language = $lang;
+                $row->owner = $owner_id;
+                $row->editor_id = $user['user_id'];
+                $row->save();
+            }else{
+                break;
+            }
+            $currLine++;
+        } while (!empty($ending));
+        return $this->ok($currLine-2);
+    }
 }
 }