作者 赵彬吉

update

@@ -8,6 +8,10 @@ use App\Http\Controllers\Bside\BaseController; @@ -8,6 +8,10 @@ use App\Http\Controllers\Bside\BaseController;
8 use App\Http\Logic\Aside\ServerConfigLogic; 8 use App\Http\Logic\Aside\ServerConfigLogic;
9 use App\Http\Requests\Aside\ServerConfigRequest; 9 use App\Http\Requests\Aside\ServerConfigRequest;
10 use App\Models\Project as ProjectModel; 10 use App\Models\Project as ProjectModel;
  11 +use Illuminate\Http\Request;
  12 +use Illuminate\Support\Str;
  13 +use Illuminate\Validation\Rule;
  14 +use Illuminate\Validation\ValidationException;
11 15
12 /** 16 /**
13 * @name:项目信息 17 * @name:项目信息
@@ -47,4 +51,39 @@ class ProjectController extends BaseController @@ -47,4 +51,39 @@ class ProjectController extends BaseController
47 $data = $logic->save($this->param); 51 $data = $logic->save($this->param);
48 return $this->success($data); 52 return $this->success($data);
49 } 53 }
  54 +
  55 + /**
  56 + * 更新表结构
  57 + * @param ServerConfigLogic $logic
  58 + * @author zbj
  59 + * @date 2023/4/24
  60 + */
  61 + public function updateDatabase(Request $request, ServerConfigLogic $logic){
  62 + $request->validate([
  63 + 'type' => 'in:1,2,3',
  64 + 'id'=> Rule::requiredIf($request->type == 1),
  65 + 'sql' => ['required', function ($attribute, $value, $fail) {
  66 + if(Str::contains(Str::lower($value), ['drop', 'delete', 'truncate'])){
  67 + $fail('危险操作');
  68 + }
  69 + }]
  70 + ],[
  71 + 'id.required' => 'ID不能为空',
  72 + 'sql.required' => '请输入Sql语句',
  73 + ]);
  74 +
  75 + switch ($this->param['type']){
  76 + case "1":
  77 + $data = $logic->updateTable($this->param);
  78 + break;
  79 + case "2":
  80 + $data = $logic->updateLocalTable($this->param);
  81 + break;
  82 + case "3":
  83 + $data = $logic->updateAllTable($this->param);
  84 + break;
  85 + }
  86 +
  87 + return $this->success($data);
  88 + }
50 } 89 }
@@ -4,6 +4,7 @@ namespace App\Http\Logic\Aside; @@ -4,6 +4,7 @@ namespace App\Http\Logic\Aside;
4 4
5 5
6 6
  7 +use App\Models\Project;
7 use App\Models\ServerConfig; 8 use App\Models\ServerConfig;
8 use App\Services\ProjectServer; 9 use App\Services\ProjectServer;
9 use Illuminate\Support\Facades\DB; 10 use Illuminate\Support\Facades\DB;
@@ -26,6 +27,10 @@ class ServerConfigLogic extends BaseLogic @@ -26,6 +27,10 @@ class ServerConfigLogic extends BaseLogic
26 27
27 public function save($param) 28 public function save($param)
28 { 29 {
  30 + $project = ProjectServer::useProject($param['project_id']);
  31 + if(!$project){
  32 + $this->fail('项目不存在或者已经删');
  33 + }
29 DB::beginTransaction(); 34 DB::beginTransaction();
30 try { 35 try {
31 $res = parent::save($param); 36 $res = parent::save($param);
@@ -39,12 +44,13 @@ class ServerConfigLogic extends BaseLogic @@ -39,12 +44,13 @@ class ServerConfigLogic extends BaseLogic
39 44
40 (new ProjectLogic())->save($data); 45 (new ProjectLogic())->save($data);
41 46
42 - //数据库配置  
43 - $project = ProjectServer::useProject($param['project_id']);  
44 - //创建数据库  
45 - ProjectServer::createDatabase($project);  
46 - //创建表  
47 - ProjectServer::initTable($project); 47 + //初始化数据库
  48 + if ($param['type'] == ServerConfig::TYPE_MYSQL) {
  49 + //创建数据库
  50 + ProjectServer::createDatabase($project);
  51 + //创建表
  52 + ProjectServer::initTable($project);
  53 + }
48 54
49 DB::commit(); 55 DB::commit();
50 } catch (\Exception $e) { 56 } catch (\Exception $e) {
@@ -53,4 +59,58 @@ class ServerConfigLogic extends BaseLogic @@ -53,4 +59,58 @@ class ServerConfigLogic extends BaseLogic
53 } 59 }
54 return $this->success(); 60 return $this->success();
55 } 61 }
  62 +
  63 +
  64 + /**
  65 + * 更新指定项目 数据库
  66 + * @param $param
  67 + * @return array
  68 + * @author zbj
  69 + * @date 2023/4/24
  70 + */
  71 + public function updateTable($param){
  72 + $project = ProjectServer::useProject($param['project_id']);
  73 + if(!$project){
  74 + $this->fail('项目不存在或者已经删');
  75 + }
  76 + ProjectServer::useProject($param['project_id']);
  77 + DB::connection('custom_mysql')->statement($param['sql']);
  78 + return $this->success();
  79 + }
  80 +
  81 + /**
  82 + * 更新本地 数据库
  83 + * @param $param
  84 + * @return array
  85 + * @author zbj
  86 + * @date 2023/4/24
  87 + */
  88 + public function updateLocalTable($param){
  89 + DB::statement($param['sql']);
  90 + return $this->success();
  91 + }
  92 +
  93 + /**
  94 + * 更新所有项目 数据库
  95 + * @param $param
  96 + * @return array
  97 + * @author zbj
  98 + * @date 2023/4/24
  99 + */
  100 + public function updateAllTable($param){
  101 + $projects = Project::all();
  102 + foreach ($projects as $project){
  103 + //DB类是单例模式,不能用哈 切换配置不会生效
  104 + $conn = new \mysqli(
  105 + $project->mysqlConfig->host,
  106 + $project->mysqlConfig->user,
  107 + $project->mysqlConfig->password,
  108 + $project->databaseName(),
  109 + $project->mysqlConfig->port,
  110 + );
  111 +
  112 + $conn->query($param['sql']);
  113 + }
  114 + return $this->success();
  115 + }
56 } 116 }
@@ -47,7 +47,13 @@ class ProjectServer extends BaseService @@ -47,7 +47,13 @@ class ProjectServer extends BaseService
47 */ 47 */
48 public static function createDatabase($project) 48 public static function createDatabase($project)
49 { 49 {
50 - $conn = new \mysqli($project->mysqlConfig->host, $project->mysqlConfig->user, $project->mysqlConfig->password); 50 + $conn = new \mysqli(
  51 + $project->mysqlConfig->host,
  52 + $project->mysqlConfig->user,
  53 + $project->mysqlConfig->password,
  54 + '',
  55 + $project->mysqlConfig->port,
  56 + );
51 $conn->query("CREATE DATABASE IF NOT EXISTS {$project->databaseName()}"); 57 $conn->query("CREATE DATABASE IF NOT EXISTS {$project->databaseName()}");
52 return true; 58 return true;
53 } 59 }
@@ -45,6 +45,7 @@ Route::middleware(['web'])->group(function (){ //admin用渲染默认要加上w @@ -45,6 +45,7 @@ Route::middleware(['web'])->group(function (){ //admin用渲染默认要加上w
45 //项目管理 45 //项目管理
46 Route::prefix('project')->group(function () { 46 Route::prefix('project')->group(function () {
47 Route::post('/save_server_config', [Aside\ProjectController::class, 'saveServerConfig'])->name('admin.project.save_server_config'); 47 Route::post('/save_server_config', [Aside\ProjectController::class, 'saveServerConfig'])->name('admin.project.save_server_config');
  48 + Route::post('/update_database', [Aside\ProjectController::class, 'updateDatabase'])->name('admin.project.update_database');
48 }); 49 });
49 50
50 }); 51 });