Procházet zdrojové kódy

建立点赞表并迁移旧数据

visuddhinanda@gmail.com před 3 roky
rodič
revize
48b4fc521a

+ 126 - 0
app/Http/Controllers/LikeController.php

@@ -0,0 +1,126 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\Like;
+use Illuminate\Http\Request;
+
+class LikeController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index(Request $request)
+    {
+        //
+        switch ($request->get("view")) {
+            case 'count':
+                # code...
+                $resulte = Like::where("target_id",$request->get("target_id"))
+                                ->groupBy("type")
+                                ->select("type")
+                                ->selectRaw("count(*)")
+                                ->get();
+                if(isset($_COOKIE["user_uid"])){
+                    foreach ($resulte as $key => $value) {
+                        # code...
+                        if(Like::where(["target_id"=>$request->get("target_id"),
+                                        'type'=>$value->type,
+                                        'user_id'=>$_COOKIE["user_uid"]])->exists()){
+                            $resulte[$key]->selected = true;
+                        }
+                    }
+                }
+                break;
+            default:
+                # code...
+                break;
+        }
+
+        return $this->ok($resulte);
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        //
+        if(!isset($_COOKIE["user_uid"])){
+            return $this->error("no login");
+        }
+        $param = $request->all();
+        $param['user_id'] = $_COOKIE["user_uid"];
+        $like = Like::firstOrCreate($param);
+
+        return $this->ok($like);
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  \App\Models\Like  $like
+     * @return \Illuminate\Http\Response
+     */
+    public function show(Like $like)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\Models\Like  $like
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, Like $like)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\Models\Like  $like
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(Like $like)
+    {
+        //
+        if(!isset($_COOKIE["user_uid"])){
+            return $this->error("no login");
+        }
+        if($like->user_id==$_COOKIE["user_uid"]){
+            return $this->ok($like->delete());
+        }
+        
+        $param = $request->all();
+        $param['user_id'] = $_COOKIE["user_uid"];
+        $like = Like::where($param)->delete();
+        return $this->ok($like);
+        
+    }
+    public function delete(Request $request){
+        if(!isset($_COOKIE["user_uid"])){
+            return $this->error("no login");
+        }
+        $param = [
+            "id"=>$request->get('id'),
+            'user_id'=>$_COOKIE["user_uid"]
+        ];
+        $del = Like::where($param)->delete();
+        $count = Like::where('target_id',$request->get('target_id'))
+                    ->where('type',$request->get('type'))
+                    ->count();
+        return $this->ok([
+            'deleted'=>$del,
+            'count'=>$count
+            ]);
+    }
+}

+ 15 - 0
app/Models/Like.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Like extends Model
+{
+    use HasFactory;
+    protected $fillable = ['type' , 'target_id', 'target_type','user_id','context'];
+    protected $casts = [
+            'id' => 'string'
+        ];
+}

+ 46 - 0
database/migrations/2022_05_29_103822_create_likes_table.php

@@ -0,0 +1,46 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateLikesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+     /*
+
+    点赞 like
+    关注 watch
+    收藏 favorite
+    书签 bookmark
+     */
+    public function up()
+    {
+        Schema::create('likes', function (Blueprint $table) {
+            $table->uuid('id')->primary()->default(DB::raw('uuid_generate_v1mc()'));
+            $table->string('type',32)->index();
+            $table->uuid('target_id')->index();
+            $table->string('target_type',32)->index();
+            $table->string('context',128)->nullable();
+            $table->uuid('user_id')->index();
+            $table->timestamps();
+
+            $table->unique(['type','target_id','user_id']);
+
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('likes');
+    }
+}

+ 152 - 0
v1/scripts/migrations/20220529172100_like_copy.php

@@ -0,0 +1,152 @@
+<?php
+/*
+迁移  article 库
+从旧数据表中提取数据插入到新的表
+插入时用uuid判断是否曾经插入
+曾经插入就不插入了
+*/
+require_once __DIR__."/../../../public/app/config.php";
+
+set_exception_handler(function($e){
+	fwrite(STDERR,"error-msg:".$e->getMessage().PHP_EOL);
+	fwrite(STDERR,"error-file:".$e->getFile().PHP_EOL);
+	fwrite(STDERR,"error-line:".$e->getLine().PHP_EOL);
+	exit;
+});
+$start = time();
+
+$fpError = fopen(__DIR__.'/log/'.basename($_SERVER['PHP_SELF'],'.php').".err.data.csv",'w');
+
+#user info
+$user_db=_FILE_DB_USERINFO_;#user数据库
+$user_table=_TABLE_USER_INFO_;#user表名
+
+# 
+$src_db = _SQLITE_DB_LIKE_;#源数据库
+$src_table = _SQLITE_TABLE_LIKE_;#源表名
+
+$dest_db = _PG_DB_LIKE_;#目标数据库
+$dest_table = _PG_TABLE_LIKE_;#目标表名
+
+fwrite(STDOUT,"migarate like".PHP_EOL);
+#打开user数据库
+$PDO_USER = new PDO($user_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
+$PDO_USER->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+fwrite(STDOUT,"open user table".PHP_EOL);
+
+#打开源数据库
+$PDO_SRC = new PDO($src_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
+$PDO_SRC->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+fwrite(STDOUT,"open src table".PHP_EOL);
+
+#打开目标数据库
+$PDO_DEST = new PDO($dest_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
+$PDO_DEST->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+fwrite(STDOUT,"open dest table".PHP_EOL);
+
+$queryInsert = "INSERT INTO ".$dest_table." 
+								(
+                                    type,
+                                    target_id,
+                                    target_type,
+                                    user_id,
+									updated_at,
+									created_at)
+									VALUES (? , ? , ? , ? , ?, ? )";
+$stmtDEST = $PDO_DEST->prepare($queryInsert);
+
+$commitData = [];
+$allInsertCount = 0;
+$allSrcCount = 0;
+$count = 0;
+
+#从user数据表中读取
+$query = "SELECT id,userid  FROM ".$user_table." WHERE userid = ? ";
+$stmtUser = $PDO_USER->prepare($query);
+
+#从源数据表中读取
+$query = "SELECT *  FROM ".$src_table;
+$stmtSrc = $PDO_SRC->prepare($query);
+$stmtSrc->execute();
+while($srcData = $stmtSrc->fetch(PDO::FETCH_ASSOC)){
+	$allSrcCount++;
+
+    if($srcData["user_id"]=='visuddhinanda'){
+		$srcData["user_id"] = 'ba5463f3-72d1-4410-858e-eadd10884713';
+	}
+    if($srcData["user_id"]=='test7'){
+		$srcData["user_id"] = '6bd2f4d7-d970-419c-8ee5-f4bac42f4bc1';
+	}
+    if($srcData["user_id"]=='Dhammadassi'){
+		$srcData["user_id"] = 'd8538ebd-d369-4777-b99a-3ccb1aff8bfc';
+	}
+    if($srcData["user_id"]=='pannava'){
+		$srcData["user_id"] = '4db550c4-bc1b-43f2-a518-2740cb478f37';
+	}
+    if($srcData["user_id"]=='NST'){
+		$srcData["user_id"] = '5c23e629-56a3-48e9-97c7-2af73b59c3b9';
+	}
+    if($srcData["user_id"]=='viranyani'){
+		$srcData["user_id"] = 'C1AB2ABF-EAA8-4EEF-B4D9-3854321852B4';
+	}
+    if($srcData["user_id"]=='test6'){
+		$srcData["user_id"] = 'f81c7140-64b4-4025-b58c-45a3b386324a';
+	}
+	if($srcData["user_id"]=='test28'){
+		$srcData["user_id"] = 'df0ad9bc-c0cd-4cd9-af05-e43d23ed57f0';
+	}
+	if($srcData["user_id"]=='290fd808-2f46-4b8c-b300-0367badd67ed'){
+		$srcData["user_id"] = 'f81c7140-64b4-4025-b58c-45a3b386324a';
+	}
+	if($srcData["user_id"]=='BA837178-9ABD-4DD4-96A0-D2C21B756DC4'){
+		$srcData["user_id"] = 'ba5463f3-72d1-4410-858e-eadd10884713';
+	}
+	$stmtUser->execute(array($srcData["user_id"]));
+	$userId = $stmtUser->fetch(PDO::FETCH_ASSOC);
+	if(!$userId){
+		fwrite(STDERR,time()."error,no user id {$srcData["owner"]}".PHP_EOL);
+		continue;
+	}
+	if(strlen($srcData["user_id"])>36){
+		fwrite(STDERR,time().",error,user id too long {$srcData["user_id"]}".PHP_EOL);
+		continue;	
+	}
+
+	//查询是否已经插入
+	$queryExsit = "SELECT id  FROM ".$dest_table." WHERE type = ? and target_id = ? and user_id = ? ";
+	$getExist = $PDO_DEST->prepare($queryExsit);
+	$getExist->execute(array($srcData["like_type"],$srcData["resource_id"],$srcData["user_id"]));
+	$exist = $getExist->fetch(PDO::FETCH_ASSOC);
+	if($exist){
+		continue;
+	}
+	#插入目标表
+	$commitData = array(
+			$srcData["like_type"],
+			$srcData["resource_id"],
+			$srcData["resource_type"],
+			$srcData["user_id"],
+			$srcData["created_at"],
+			$srcData["created_at"]
+		);
+	$stmtDEST->execute($commitData);
+
+	$count++;	
+	$allInsertCount++;
+
+
+	if($count ==10000){
+		#10000行输出log 一次
+		echo "finished $count".PHP_EOL;
+		$count=0;
+	}	
+}
+
+fwrite(STDOUT,"insert done $allInsertCount in $allSrcCount ".PHP_EOL) ;
+fwrite(STDOUT, "all done in ".(time()-$start)."s".PHP_EOL);
+
+fclose($fpError);
+
+
+
+