diff --git a/beike/Admin/Http/Controllers/CustomerController.php b/beike/Admin/Http/Controllers/CustomerController.php new file mode 100644 index 00000000..ad6101ab --- /dev/null +++ b/beike/Admin/Http/Controllers/CustomerController.php @@ -0,0 +1,82 @@ + + * @created 2022-06-28 16:17:04 + * @modified 2022-06-28 16:17:04 + */ + +namespace Beike\Admin\Http\Controllers; + +use Beike\Admin\Http\Resources\CustomerResource; +use Beike\Models\Customer; +use Beike\Repositories\CustomerRepo; +use Illuminate\Http\Request; + +class CustomerController extends Controller +{ + protected string $defaultRoute = 'customers.index'; + public function index(Request $request) + { + $customers = CustomerRepo::list($request->only(['name', 'email', 'status', 'from', 'customer_group_name'])); + + $data = [ + 'customers' => CustomerResource::collection($customers), + ]; + + return view('admin::pages.customers.index', $data); + } + + public function create() + { + $data = [ + 'customer' => new Customer(), + '_redirect' => $this->getRedirect(), + ]; + return view('admin::pages.customers.form', $data); + } + + public function store(Request $request) + { + CustomerRepo::create($request->all()); + + return redirect($this->getRedirect())->with('success', 'customer created'); + } + + public function edit(Request $request, Customer $customer) + { + $data = [ + 'customer' => $customer, + '_redirect' => $this->getRedirect(), + ]; + + return view('admin::pages.customers.form', $data); + } + + public function update(Request $request) + { + $customerId = $request->id ?? 0; + CustomerRepo::update($customerId, $request->all()); + + return redirect($this->getRedirect())->with('success', 'customer created'); + } + + public function destroy(Request $request) + { + $customerId = $request->id ?? 0; + CustomerRepo::delete($customerId); + + return ['success' => true]; + } + + public function restore(Request $request) + { + $customerId = $request->id ?? 0; + Customer::withTrashed()->find($customerId)->restore(); + + return ['success' => true]; + } +} diff --git a/beike/Admin/Http/Resources/CustomerResource.php b/beike/Admin/Http/Resources/CustomerResource.php new file mode 100644 index 00000000..bb5b0920 --- /dev/null +++ b/beike/Admin/Http/Resources/CustomerResource.php @@ -0,0 +1,29 @@ + $this->id, + 'name' => $this->name, + 'email' => $this->email, + 'status' => $this->status ? '启用' : '禁用', + 'avatar' => image_resize($this->avatar), + 'from' => $this->from, + 'customer_group_name' => $this->customer_group_name, + ]; + + return $data; + } +} diff --git a/beike/Admin/Routes/admin.php b/beike/Admin/Routes/admin.php index 33a2d6c9..67b72fd8 100644 --- a/beike/Admin/Routes/admin.php +++ b/beike/Admin/Routes/admin.php @@ -17,6 +17,8 @@ Route::prefix('admin') Route::Resource('files', \Beike\Admin\Http\Controllers\FileController::class); + Route::Resource('customers', \Beike\Admin\Http\Controllers\CustomerController::class); + Route::put('products/restore', [\Beike\Admin\Http\Controllers\ProductController::class, 'restore']); Route::resource('products', \Beike\Admin\Http\Controllers\ProductController::class); diff --git a/beike/Models/Customer.php b/beike/Models/Customer.php index 3e1ac02b..ecdc718a 100644 --- a/beike/Models/Customer.php +++ b/beike/Models/Customer.php @@ -3,11 +3,13 @@ namespace Beike\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Foundation\Auth\User as Authenticatable; class Customer extends Authenticatable { use HasFactory; + use SoftDeletes; const AUTH_GUARD = 'web_shop'; diff --git a/beike/Repositories/CustomerRepo.php b/beike/Repositories/CustomerRepo.php index 4e596059..b64aacae 100644 --- a/beike/Repositories/CustomerRepo.php +++ b/beike/Repositories/CustomerRepo.php @@ -17,11 +17,74 @@ class CustomerRepo { /** * 创建一个customer记录 + * @param $customerData + * @return int */ public static function create($customerData) { return Customer::query()->insertGetId($customerData); } + /** + * @param $id + * @param $data + * @return bool|int + */ + public static function update($id, $data) + { + return Customer::query()->find($id)->update($data); + } + + /** + * @param $id + * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Model|null + */ + public static function find($id) + { + return Customer::query()->find($id); + } + + /** + * @param $id + * @return void + */ + public static function delete($id) + { + Customer::query()->find($id)->delete(); + } + + /** + * @param $data + * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator + */ + public static function list($data) + { + $builder = Customer::query()->from('customers AS c') + ->leftJoin('customer_groups AS cg', 'c.customer_group_id', 'cg.id') + ->leftJoin('customer_group_descriptions AS cgd', function ($join) { + $join->on('cgd.customer_group_id', 'cg.id') + ->where('cgd.language_id', current_language_id()); + }) + ->select(['c.id', 'c.email', 'c.name', 'c.avatar', 'c.status', 'c.from', 'cgd.name AS customer_group_name']); + + + if (isset($data['name'])) { + $builder->where('c.name', 'like', "%{$data['name']}%"); + } + if (isset($data['email'])) { + $builder->where('c.email', 'like', "%{$data['email']}%"); + } + if (isset($data['status'])) { + $builder->where('c.status', $data['status']); + } + if (isset($data['from'])) { + $builder->where('c.from', $data['from']); + } + if (isset($data['customer_group_name'])) { + $builder->where('cgd.name', 'like', "%{$data['name']}%"); + } + + return $builder->paginate(20)->withQueryString(); + } } diff --git a/resources/beike/admin/views/pages/customers/form-vue.blade.php b/resources/beike/admin/views/pages/customers/form-vue.blade.php new file mode 100644 index 00000000..9289f6a9 --- /dev/null +++ b/resources/beike/admin/views/pages/customers/form-vue.blade.php @@ -0,0 +1,97 @@ +@extends('admin::admin.layouts.master') + +@section('title', '分类管理') + +@push('header') + +@endpush + +@section('content') +