diff --git a/app/Admin/Controllers/ManageController.php b/app/Admin/Controllers/ManageController.php index dbe8256..754345d 100644 --- a/app/Admin/Controllers/ManageController.php +++ b/app/Admin/Controllers/ManageController.php @@ -6,6 +6,7 @@ use Slowlyo\OwlAdmin\Renderers\Page; use Slowlyo\OwlAdmin\Renderers\Form; use Slowlyo\OwlAdmin\Controllers\AdminController; use App\Services\Admin\ManageService; +use App\Admin\Components; /** * 专家管理 @@ -18,8 +19,11 @@ class ManageController extends AdminController public function list(): Page { - $crud = $this->baseCRUD() - ->filterTogglable(false) + $crud = $this->baseCRUD()->tableLayout('fixed') + ->headerToolbar([ + amis()->LinkAction()->link(admin_url('/manages/create'))->label('新增')->icon('fa fa-add')->level('primary'), + ...$this->baseHeaderToolBar(), + ]) ->columns([ amis()->TableColumn('id', 'ID')->sortable(), amis()->TableColumn('name', '姓名'), @@ -48,27 +52,275 @@ class ManageController extends AdminController return $this->baseList($crud); } + public function createManage() + { + $wizard = amis() + ->Card() + ->header(['title' => __('admin.create')]) + ->toolbar([$this->backButton()]) + ->body( + amis()->Wizard()->className('min-h-screen') + ->api($this->getStorePath()) + ->steps([ + amis()->WizardStep()->title('基本信息')->body([ + amis()->FieldSetControl()->title('基础资料')->body([ + amis()->GroupControl()->mode('horizontal')->body([ + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('name', '姓名')->required(true), + Components::make()->cropImageControl('avatar', '寸照')->required(true), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('nation', '民族')->required(true), + amis()->RadiosControl('gender', '性别')->options([ + '1'=>'男', '2'=>'女' + ])->required(), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->DateControl('birthday', '出生年月')->valueFormat('YYYY-MM-DD')->required(true), + amis()->TextControl('political_face', '政治面貌')->required(true), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('educational_level', '学历学位')->required(true), + amis()->TextControl('company', '工作单位')->required(true), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('strative_position', '行政职务')->required(true), + amis()->TextControl('technical_position', '专业技术职务')->required(true), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('subject', '学科门类')->required(true), + amis()->TextControl('research_direction', '研究方向')->required(true), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('address', '通讯地址(邮编)')->required(true), + amis()->TextControl('email', '个人邮箱')->required(true), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('work_phone', '办公电话')->required(true), + amis()->TextControl('mobile_phone', '移动电话')->required(true), + ]), + ]), + amis()->FieldSetControl()->title('个人简历')->className('mt-10')->body([ + amis()->TableControl('jobs', '')->columnsTogglable(false)->columns([ + amis()->DateControl('start_at', '开始时间')->valueFormat('YYYY-MM-DD')->required(true), + amis()->DateControl('end_at', '截止时间')->valueFormat('YYYY-MM-DD')->required(true), + amis()->TextControl('company', '工作单位以及所在部门')->required(true), + amis()->TextControl('job_name', '职务、职称')->required(true), + ])->needConfirm(false)->addable()->removable()->minLength(1) + ]), + amis()->FieldSetControl()->title('获奖情况')->className('mt-10')->body([ + amis()->TableControl('ranks', '')->columnsTogglable(false)->columns([ + amis()->TextControl('rank_name', '获奖名称')->required(true), + amis()->TextControl('rank_cate', '获奖类别(等级)')->required(true), + amis()->TextControl('rank_company', '授予单位')->required(true), + amis()->DateControl('rank_at', '获奖时间')->valueFormat('YYYY-MM-DD')->required(true), + amis()->TextControl('rank_lv', '本人排名')->required(true), + ])->needConfirm(false)->addable()->removable()->minLength(1) + ]) + ]), + amis()->WizardStep()->title('科研项目情况')->body([ + amis()->TableControl('projects', '')->columnsTogglable(false)->columns([ + amis()->TextControl('project_name', '项目名称')->required(true), + amis()->TextControl('project_source', '项目来源')->required(true), + amis()->SelectControl('join_type', '主持或者参加')->options([ + '1'=>'主持', '2'=>'参加' + ])->required(true), + amis()->DateControl('start_at', '开始时间')->valueFormat('YYYY-MM-DD')->required(true), + amis()->DateControl('end_at', '截止时间')->valueFormat('YYYY-MM-DD')->required(true), + amis()->TextControl('result_name', '成果名称')->required(true), + amis()->TextControl('result_use', '成果转化')->required(true), + ])->needConfirm(false)->addable()->removable()->minLength(1) + ]), + amis()->WizardStep()->title('论著发表出版情况')->body([ + amis()->TableControl('articles', '')->columnsTogglable(false)->columns([ + amis()->TextControl('artcile_name', '论文或著作名称')->required(true), + amis()->TextControl('press_name', '出版社/期刊/报纸')->required(true), + amis()->YearControl('year', '年份')->valueFormat('YYYY')->required(true), + amis()->TextControl('source_page', '期/卷/版/页')->required(true), + amis()->TextControl('author_rank', '作者名次')->required(true), + ])->needConfirm(false)->addable()->removable()->minLength(1) + ]), + amis()->WizardStep()->title('决策咨询情况')->body([ + amis()->TableControl('consults', '')->columnsTogglable(false)->columns([ + amis()->TextControl('consult_title', '决策咨询报告题目')->required(true), + amis()->TextControl('consult_channel', '报送渠道')->required(true), + amis()->SelectControl('join_type', '主持或者参加')->options([ + '1'=>'主持', '2'=>'参加' + ])->required(true), + amis()->TextControl('leader_instruction', '领导批示')->required(true), + amis()->DateControl('consult_at', '日期')->valueFormat('YYYY-MM-DD')->required(true), + amis()->TextControl('result_use', '成果转化')->required(true), + ])->needConfirm(false)->addable()->removable()->minLength(1) + ]), + amis()->WizardStep()->title('学术交流情况')->body([ + amis()->TableControl('meetings', '')->columnsTogglable(false)->columns([ + amis()->TextControl('meeting_name', '学术活动名称')->required(true), + amis()->TextControl('meeting_company', '主办单位')->required(true), + amis()->TextControl('meeting_cate', '类型')->required(true), + amis()->DateControl('meeting_at', '日期')->valueFormat('YYYY-MM-DD')->required(true), + amis()->TextControl('result_name', '成果名称')->required(true), + amis()->TextControl('result_use', '成果转化')->required(true), + ])->needConfirm(false)->addable()->removable()->minLength(1) + ]), + amis()->WizardStep()->title('社科普及项目情况')->body([ + amis()->TableControl('socials', '')->columnsTogglable(false)->columns([ + amis()->TextControl('social_name', '社科普及项目名称')->required(true), + amis()->TextControl('social_company', '主办单位')->required(true), + amis()->TextControl('social_cate', '类型')->required(true), + amis()->DateControl('social_at', '日期')->valueFormat('YYYY-MM-DD')->required(true), + amis()->TextControl('result_name', '成果名称')->required(true), + amis()->TextControl('result_use', '成果转化')->required(true), + ])->needConfirm(false)->addable()->removable()->minLength(1) + ]), + amis()->WizardStep()->title('其他注意事项')->body([ + amis()->TextareaControl('others', '')->minRows(10)->placeholder('请填写其他注意事项,若无则无需填写'), + ]), + ]) + ->redirect($this->getListPath()) + ); + + $page = $this->basePage()->body($wizard); + + return $this->response()->success($page); + } + + public function editManage() + { + $wizard = amis() + ->Card() + ->header(['title' => __('admin.create')]) + ->toolbar([$this->backButton()]) + ->body( + amis()->Wizard()->className('min-h-screen') + ->api($this->getUpdatePath())->initApi($this->getEditGetDataPath()) + ->steps([ + amis()->WizardStep()->title('基本信息')->body([ + amis()->FieldSetControl()->title('基础资料')->body([ + amis()->GroupControl()->mode('horizontal')->body([ + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('name', '姓名')->required(true), + Components::make()->cropImageControl('avatar', '寸照')->required(true), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('nation', '民族')->required(true), + amis()->RadiosControl('gender', '性别')->options([ + '1'=>'男', '2'=>'女' + ])->required(), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->DateControl('birthday', '出生年月')->valueFormat('YYYY-MM-DD')->required(true), + amis()->TextControl('political_face', '政治面貌')->required(true), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('educational_level', '学历学位')->required(true), + amis()->TextControl('company', '工作单位')->required(true), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('strative_position', '行政职务')->required(true), + amis()->TextControl('technical_position', '专业技术职务')->required(true), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('subject', '学科门类')->required(true), + amis()->TextControl('research_direction', '研究方向')->required(true), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('address', '通讯地址(邮编)')->required(true), + amis()->TextControl('email', '个人邮箱')->required(true), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('work_phone', '办公电话')->required(true), + amis()->TextControl('mobile_phone', '移动电话')->required(true), + ]), + ]), + amis()->FieldSetControl()->title('个人简历')->className('mt-10')->body([ + amis()->TableControl('jobs', '')->columnsTogglable(false)->columns([ + amis()->DateControl('start_at', '开始时间')->valueFormat('YYYY-MM-DD')->required(true), + amis()->DateControl('end_at', '截止时间')->valueFormat('YYYY-MM-DD')->required(true), + amis()->TextControl('company', '工作单位以及所在部门')->required(true), + amis()->TextControl('job_name', '职务、职称')->required(true), + ])->needConfirm(false)->addable()->removable()->minLength(1) + ]), + amis()->FieldSetControl()->title('获奖情况')->className('mt-10')->body([ + amis()->TableControl('ranks', '')->columnsTogglable(false)->columns([ + amis()->TextControl('rank_name', '获奖名称')->required(true), + amis()->TextControl('rank_cate', '获奖类别(等级)')->required(true), + amis()->TextControl('rank_company', '授予单位')->required(true), + amis()->DateControl('rank_at', '获奖时间')->valueFormat('YYYY-MM-DD')->required(true), + amis()->TextControl('rank_lv', '本人排名')->required(true), + ])->needConfirm(false)->addable()->removable()->minLength(1) + ]) + ]), + amis()->WizardStep()->title('科研项目情况')->body([ + amis()->TableControl('projects', '')->columnsTogglable(false)->columns([ + amis()->TextControl('project_name', '项目名称')->required(true), + amis()->TextControl('project_source', '项目来源')->required(true), + amis()->SelectControl('join_type', '主持或者参加')->options([ + '1'=>'主持', '2'=>'参加' + ])->required(true), + amis()->DateControl('start_at', '开始时间')->valueFormat('YYYY-MM-DD')->required(true), + amis()->DateControl('end_at', '截止时间')->valueFormat('YYYY-MM-DD')->required(true), + amis()->TextControl('result_name', '成果名称')->required(true), + amis()->TextControl('result_use', '成果转化')->required(true), + ])->needConfirm(false)->addable()->removable()->minLength(1) + ]), + amis()->WizardStep()->title('论著发表出版情况')->body([ + amis()->TableControl('articles', '')->columnsTogglable(false)->columns([ + amis()->TextControl('artcile_name', '论文或著作名称')->required(true), + amis()->TextControl('press_name', '出版社/期刊/报纸')->required(true), + amis()->YearControl('year', '年份')->valueFormat('YYYY')->required(true), + amis()->TextControl('source_page', '期/卷/版/页')->required(true), + amis()->TextControl('author_rank', '作者名次')->required(true), + ])->needConfirm(false)->addable()->removable()->minLength(1) + ]), + amis()->WizardStep()->title('决策咨询情况')->body([ + amis()->TableControl('consults', '')->columnsTogglable(false)->columns([ + amis()->TextControl('consult_title', '决策咨询报告题目')->required(true), + amis()->TextControl('consult_channel', '报送渠道')->required(true), + amis()->SelectControl('join_type', '主持或者参加')->options([ + '1'=>'主持', '2'=>'参加' + ])->required(true), + amis()->TextControl('leader_instruction', '领导批示')->required(true), + amis()->DateControl('consult_at', '日期')->valueFormat('YYYY-MM-DD')->required(true), + amis()->TextControl('result_use', '成果转化')->required(true), + ])->needConfirm(false)->addable()->removable()->minLength(1) + ]), + amis()->WizardStep()->title('学术交流情况')->body([ + amis()->TableControl('meetings', '')->columnsTogglable(false)->columns([ + amis()->TextControl('meeting_name', '学术活动名称')->required(true), + amis()->TextControl('meeting_company', '主办单位')->required(true), + amis()->TextControl('meeting_cate', '类型')->required(true), + amis()->DateControl('meeting_at', '日期')->valueFormat('YYYY-MM-DD')->required(true), + amis()->TextControl('result_name', '成果名称')->required(true), + amis()->TextControl('result_use', '成果转化')->required(true), + ])->needConfirm(false)->addable()->removable()->minLength(1) + ]), + amis()->WizardStep()->title('社科普及项目情况')->body([ + amis()->TableControl('socials', '')->columnsTogglable(false)->columns([ + amis()->TextControl('social_name', '社科普及项目名称')->required(true), + amis()->TextControl('social_company', '主办单位')->required(true), + amis()->TextControl('social_cate', '类型')->required(true), + amis()->DateControl('social_at', '日期')->valueFormat('YYYY-MM-DD')->required(true), + amis()->TextControl('result_name', '成果名称')->required(true), + amis()->TextControl('result_use', '成果转化')->required(true), + ])->needConfirm(false)->addable()->removable()->minLength(1) + ]), + amis()->WizardStep()->title('其他注意事项')->body([ + amis()->TextareaControl('others', '')->minRows(10)->placeholder('请填写其他注意事项,若无则无需填写'), + ]), + ])->redirect($this->getListPath()) + ); + + $page = $this->basePage()->body($wizard); + + return $this->response()->success($page); + } + public function form($isEdit = false): Form { return $this->baseForm()->body([ - amis()->TextControl('name', '姓名'), - amis()->ImageControl('avatar', '头像'), - amis()->TextControl('gender', '性别:0未知,1男,2女'), - amis()->TextControl('birthday', '生日'), - amis()->TextControl('nation', '民族'), - amis()->TextControl('political_face', '政治面貌'), - amis()->TextControl('educational_level', '学历学位'), - amis()->TextControl('company', '工作单位'), - amis()->TextControl('strative_position', '行政职务'), - amis()->TextControl('technical_position', '专业技术职务'), - amis()->TextControl('subject', '学科门类'), - amis()->TextControl('research_direction', '研究方向'), - amis()->TextControl('address', '通讯地址(邮编)'), - amis()->TextControl('email', '个人邮箱'), - amis()->TextControl('work_phone', '办公电话'), - amis()->TextControl('mobile_phone', '移动电话'), - amis()->TextControl('remarks', '备注'), - amis()->TextControl('others', '补充说明'), + ]); } diff --git a/app/Admin/routes.php b/app/Admin/routes.php index 1280fa9..30d5f5f 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -32,7 +32,9 @@ Route::group([ $router->resource('ads', \App\Admin\Controllers\AdController::class); - $router->resource('manages', \App\Admin\Controllers\ManageController::class); + $router->get('manages/create', [\App\Admin\Controllers\ManageController::class, 'createManage']); + $router->get('manages/{manage}/edit', [\App\Admin\Controllers\ManageController::class, 'editManage']); + $router->resource('manages', \App\Admin\Controllers\ManageController::class)->only(['index', 'store', 'update', 'show', 'destroy']); //修改上传 $router->post('upload_file', [\App\Admin\Controllers\IndexController::class, 'uploadFile']); diff --git a/app/Models/Manage.php b/app/Models/Manage.php index 59d0363..02ab7d8 100644 --- a/app/Models/Manage.php +++ b/app/Models/Manage.php @@ -17,37 +17,37 @@ class Manage extends Model } - public function article() + public function articles() { return $this->hasMany(ManageArticle::class, 'manage_id'); } - public function consult() + public function consults() { return $this->hasMany(ManageConsult::class, 'manage_id'); } - public function job() + public function jobs() { return $this->hasMany(ManageJob::class, 'manage_id'); } - public function meeting() + public function meetings() { return $this->hasMany(ManageMeeting::class, 'manage_id'); } - public function project() + public function projects() { return $this->hasMany(ManageProject::class, 'manage_id'); } - public function rank() + public function ranks() { return $this->hasMany(ManageRank::class, 'manage_id'); } - public function social() + public function socials() { return $this->hasMany(ManageSocial::class, 'manage_id'); } diff --git a/app/Models/ManageArticle.php b/app/Models/ManageArticle.php index f9c24b4..b879a8a 100644 --- a/app/Models/ManageArticle.php +++ b/app/Models/ManageArticle.php @@ -8,4 +8,8 @@ use Illuminate\Database\Eloquent\Model; class ManageArticle extends Model { use HasFactory; + + protected $fillable = [ + 'manage_id', 'artcile_name', 'press_name', 'year', 'source_page', 'author_rank' + ]; } diff --git a/app/Models/ManageConsult.php b/app/Models/ManageConsult.php index add76bf..db67b4d 100644 --- a/app/Models/ManageConsult.php +++ b/app/Models/ManageConsult.php @@ -8,4 +8,8 @@ use Illuminate\Database\Eloquent\Model; class ManageConsult extends Model { use HasFactory; + + protected $fillable = [ + 'manage_id', 'consult_title', 'consult_channel', 'join_type', 'leader_instruction', 'consult_at', 'result_use' + ]; } diff --git a/app/Models/ManageJob.php b/app/Models/ManageJob.php index 54d09f9..4685e6f 100644 --- a/app/Models/ManageJob.php +++ b/app/Models/ManageJob.php @@ -8,4 +8,8 @@ use Illuminate\Database\Eloquent\Model; class ManageJob extends Model { use HasFactory; + + protected $fillable = [ + 'manage_id', 'start_at', 'end_at', 'company', 'job_name' + ]; } diff --git a/app/Models/ManageMeeting.php b/app/Models/ManageMeeting.php index fae1fee..3975632 100644 --- a/app/Models/ManageMeeting.php +++ b/app/Models/ManageMeeting.php @@ -8,4 +8,9 @@ use Illuminate\Database\Eloquent\Model; class ManageMeeting extends Model { use HasFactory; + + + protected $fillable = [ + 'manage_id', 'meeting_name', 'meeting_company', 'meeting_cate', 'meeting_at', 'result_name', 'result_use' + ]; } diff --git a/app/Models/ManageProject.php b/app/Models/ManageProject.php index 648cffa..7ffe012 100644 --- a/app/Models/ManageProject.php +++ b/app/Models/ManageProject.php @@ -8,4 +8,8 @@ use Illuminate\Database\Eloquent\Model; class ManageProject extends Model { use HasFactory; + + protected $fillable = [ + 'manage_id', 'project_name', 'project_source', 'join_type', 'start_at', 'end_at', 'result_name', 'result_use' + ]; } diff --git a/app/Models/ManageRank.php b/app/Models/ManageRank.php index b165f9a..c7adaac 100644 --- a/app/Models/ManageRank.php +++ b/app/Models/ManageRank.php @@ -8,4 +8,8 @@ use Illuminate\Database\Eloquent\Model; class ManageRank extends Model { use HasFactory; + + protected $fillable = [ + 'manage_id', 'rank_name', 'rank_cate', 'rank_company', 'rank_at', 'rank_lv' + ]; } diff --git a/app/Models/ManageSocial.php b/app/Models/ManageSocial.php index dce51c0..c513d10 100644 --- a/app/Models/ManageSocial.php +++ b/app/Models/ManageSocial.php @@ -8,4 +8,8 @@ use Illuminate\Database\Eloquent\Model; class ManageSocial extends Model { use HasFactory; + + protected $fillable = [ + 'manage_id', 'social_name', 'social_company', 'social_cate', 'social_at', 'result_name', 'result_use' + ]; } diff --git a/app/Services/Admin/ManageService.php b/app/Services/Admin/ManageService.php index 6bb55f1..78454bc 100644 --- a/app/Services/Admin/ManageService.php +++ b/app/Services/Admin/ManageService.php @@ -6,6 +6,7 @@ use App\Models\Manage; use App\Models\Filters\ManageFilter; use App\Traits\UploadTrait; use Illuminate\Support\Arr; +use DB; /** * @method Manage getModel() @@ -19,4 +20,86 @@ class ManageService extends BaseService protected string $modelFilterName = ManageFilter::class; + protected array $withRelationships = ['articles', 'consults', 'jobs', 'meetings', 'projects', 'ranks', 'socials']; + + public function store($data): bool + { + $columns = $this->getTableColumns(); + $model = $this->getModel(); + + $data['avatar'] = $this->saveImage('avatar', 'manages/avatar')[0] ?? ''; + + foreach ($data as $k => $v) { + if (!in_array($k, $columns)) { + continue; + } + + $model->setAttribute($k, $v); + } + try{ + DB::beginTransaction(); + + $model->save(); + $model->jobs()->createMany($data['jobs']); + $model->ranks()->createMany($data['ranks']); + $model->projects()->createMany($data['projects']); + $model->articles()->createMany($data['articles']); + $model->consults()->createMany($data['consults']); + $model->meetings()->createMany($data['meetings']); + $model->socials()->createMany($data['socials']); + + DB::commit(); + }catch(\Throwable $th){ + DB::rollBack(); + report($th); + return false; + } + return true; + } + + public function update($primaryKey, $data): bool + { + $columns = $this->getTableColumns(); + $model = $this->query()->whereKey($primaryKey)->first(); + + if(isset($data['avatar'])){ + $data['avatar'] = $this->saveImage('avatar', 'manages/cover')[0] ?? ''; + } + + foreach ($data as $k => $v) { + if (!in_array($k, $columns)) { + continue; + } + + $model->setAttribute($k, $v); + } + + try{ + DB::beginTransaction(); + + $model->save(); + $model->jobs()->delete(); + $model->jobs()->createMany($data['jobs']); + $model->ranks()->delete(); + $model->ranks()->createMany($data['ranks']); + $model->projects()->delete(); + $model->projects()->createMany($data['projects']); + $model->articles()->delete(); + $model->articles()->createMany($data['articles']); + $model->consults()->delete(); + $model->consults()->createMany($data['consults']); + $model->meetings()->delete(); + $model->meetings()->createMany($data['meetings']); + $model->socials()->delete(); + $model->socials()->createMany($data['socials']); + + DB::commit(); + }catch(\Throwable $th){ + dd($th); + DB::rollBack(); + report($th); + return $this->setError('系统错误,请刷新后重试'); + } + return true; + } } \ No newline at end of file