liutk 2026-02-21 20:24:39 +08:00
parent 1b926b7b9e
commit c77fed7b65
10 changed files with 278 additions and 1 deletions

View File

@ -0,0 +1,72 @@
<?php
namespace App\Admin\Controllers;
use Slowlyo\OwlAdmin\Renderers\Page;
use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Controllers\AdminController;
use App\Services\Admin\FriendLinkService;
use App\Traits\CustomActionTrait;
use App\Admin\Components;
/**
* 合作伙伴
*
* @property FriendLinkService $service
*/
class FriendLinkController extends AdminController
{
use CustomActionTrait;
protected string $serviceName = FriendLinkService::class;
public function list(): Page
{
$crud = $this->baseCRUD()->tableLayout('fixed')
->headerToolbar([
$this->createTypeButton('drawer', 'md'),
...$this->baseHeaderToolBar(),
])
->filter($this->baseFilter()->body([
amis()->GroupControl()->mode('horizontal')->body([
// amis()->TextControl('id', __('admin.friend_links.id'))->columnRatio(3)
// ->placeholder(__('admin.id')),
amis()->TextControl('title', __('admin.friend_links.title'))->columnRatio(3)
->placeholder(__('admin.friend_links.title')),
]),
]))
->columns([
amis()->TableColumn('id', 'ID')->sortable()->width('50px'),
amis()->TableColumn('title', __('admin.friend_links.title')),
amis()->TableColumn('link', __('admin.friend_links.link')),
amis()->TableColumn('cover_url', __('admin.friend_links.cover'))->type('image')->height('50px')->width('250px')->enlargeAble(true),
// amis()->TableColumn('description', __('admin.project_cates.description')),
amis()->TableColumn('created_at', __('admin.created_at'))->set('type', 'datetime')->sortable()->width('150px'),
amis()->Operation()->label(__('admin.actions'))->buttons([
$this->rowEditTypeButton('drawer', 'md'),
$this->rowDeleteButton(),
])
]);
return $this->baseList($crud);
}
public function form($isEdit = false): Form
{
return $this->baseForm()->panelClassName('px-0')->body([
amis()->Grid()->columns([
amis()->Wrapper()->body([
amis()->TextControl('title', __('admin.friend_links.title'))->required(true),
amis()->TextControl('link', __('admin.friend_links.link'))->required(true),
Components::make()->cropImageControl('cover', __('admin.friend_links.cover'))->required(true),
amis()->TextareaControl('description', __('admin.friend_links.description')),
Components::make()->sortControl('sort', __('admin.friend_links.sort')),
])
]),
]);
}
public function detail(): Form
{
return $this->baseDetail()->body([]);
}
}

View File

@ -39,6 +39,7 @@ Route::group([
$router->resource('project_photos', \App\Admin\Controllers\ProjectPhotoController::class);
$router->resource('project_advances', \App\Admin\Controllers\ProjectAdvanceController::class);
$router->resource('case_studies', \App\Admin\Controllers\CaseStudyController::class);
$router->resource('friend_links', \App\Admin\Controllers\FriendLinkController::class);
//修改上传
$router->post('upload_file', [\App\Admin\Controllers\IndexController::class, 'uploadFile']);

View File

@ -0,0 +1,11 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Contact extends Model
{
use HasFactory;
}

View File

@ -0,0 +1,24 @@
<?php
namespace App\Models\Filters;
use EloquentFilter\ModelFilter;
use Illuminate\Support\Arr;
class FriendLinkFilter extends ModelFilter
{
/**
* 主键
*/
public function id($id)
{
return $this->where('id', $id);
}
/**
* 标题
*/
public function title($title)
{
return $this->where('title','like', '%'.$title.'%');
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
use EloquentFilter\Filterable;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage;
class FriendLink extends Model
{
use HasFactory;
use Filterable;
protected $appends = ['cover_url'];
protected function serializeDate(\DateTimeInterface $date)
{
return $date->format('Y-m-d H:i:s');
}
protected $casts = [
'created_at' => 'datetime:Y-m-d H:i:s',
'updated_at' => 'datetime:Y-m-d H:i:s',
];
protected function coverUrl():Attribute {
return Attribute::make(
get: fn($value) => $this->cover ? (Str::startsWith($this->cover, ['http://', 'https://']) ? $this->cover : Storage::url($this->cover)) : null,
);
}
}

View File

@ -0,0 +1,60 @@
<?php
namespace App\Services\Admin;
use App\Models\FriendLink;
use App\Models\Filters\FriendLinkFilter;
use App\Traits\UploadTrait;
use Illuminate\Support\Arr;
/**
* @method FriendLink getModel()
* @method FriendLink|\Illuminate\Database\Query\Builder query()
*/
class FriendLinkService extends BaseService
{
use UploadTrait;
protected string $modelName = FriendLink::class;
protected string $modelFilterName = FriendLinkFilter::class;
public function store($data): bool
{
$columns = $this->getTableColumns();
$model = $this->getModel();
$data['cover'] = $this->saveImage('cover', 'friend_links/cover')[0] ?? '';
foreach ($data as $k => $v) {
if (!in_array($k, $columns)) {
continue;
}
$model->setAttribute($k, $v);
}
return $model->save();
}
public function update($primaryKey, $data): bool
{
$columns = $this->getTableColumns();
$model = $this->query()->whereKey($primaryKey)->first();
if(isset($data['cover'])){
$data['cover'] = $this->saveImage('cover', 'friend_links/cover')[0] ?? '';
}
foreach ($data as $k => $v) {
if (!in_array($k, $columns)) {
continue;
}
$model->setAttribute($k, $v);
}
return $model->save();
}
}

View File

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('contacts', function (Blueprint $table) {
$table->id();
$table->string('name')->nullable()->comment('姓名');
$table->string('phone')->nullable()->comment('电话');
$table->string('company')->nullable()->comment('公司名称');
$table->unsignedTinyInteger('type')->nullable()->comment('业务需求');
$table->string('content')->nullable()->comment('项目概况与备注');
$table->unsignedTinyInteger('status')->default(0)->comment('状态0未处理1已处理');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('contacts');
}
};

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('friend_links', function (Blueprint $table) {
$table->id();
$table->string('title')->comment('标题');
$table->text('description')->nullable()->comment('简介');
$table->string('cover')->nullable()->comment('封面');
$table->unsignedInteger('sort')->default(0)->comment('排序');
$table->string('link')->nullable()->comment('链接地址');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('friend_links');
}
};

View File

@ -37,7 +37,7 @@ class AdminMenuSeeder extends Seeder
]
],
['title'=> 'contacts', 'icon'=>'fluent-mdl2:chat-invite-friend','url'=>'/contacts', 'order'=>5],
['title'=> 'friend_links' , 'icon'=>'carbon:ibm-cloud-direct-link-2-connect','url'=>'/contacts', 'order'=>6],
['title'=> 'friend_links' , 'icon'=>'carbon:ibm-cloud-direct-link-2-connect','url'=>'/friend_links', 'order'=>6],
['title' => 'admin_system', 'icon' => 'material-symbols:settings-outline', 'url' => '/system', 'order'=>7,
'children' => [
['title' => 'admin_users', 'icon' => '', 'url' => '/system/admin_users', 'order'=>1],

View File

@ -343,4 +343,13 @@ return [
'appendixes' => '附件',
'published_at_remark' => '*若未设置发布时间且操作设置为显示,则默认生成发布时间',
],
'friend_links' => [
'id' => '主键ID',
'title' => '标题',
'description'=> '简介',
'content' => '内容',
'cover' =>'封面',
'sort' => '排序',
'link'=>'链接地址'
]
];