From fb202ee3aaa977ca511f72f7a7bbfa55fd470a8b Mon Sep 17 00:00:00 2001 From: xuanchen <122383162@qq.com> Date: Sun, 27 Sep 2020 16:53:07 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/admin.php | 10 +- config/excel.php | 305 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 310 insertions(+), 5 deletions(-) create mode 100644 config/excel.php diff --git a/config/admin.php b/config/admin.php index e930396..1ac6c6a 100644 --- a/config/admin.php +++ b/config/admin.php @@ -58,9 +58,9 @@ return [ */ 'route' => [ - 'prefix' => env('ADMIN_ROUTE_PREFIX', 'admin'), + 'prefix' => env('ADMIN_ROUTE_PREFIX', 'admin'), - 'namespace' => 'App\\Admin\\Controllers', + 'namespace' => 'App\\Admin\\Controllers', 'middleware' => ['web', 'admin'], ], @@ -110,11 +110,11 @@ return [ */ 'auth' => [ - 'controller' => App\Admin\Controllers\AuthController::class, + 'controller' => App\Admin\Controllers\AuthController::class, - 'guard' => 'admin', + 'guard' => 'admin', - 'guards' => [ + 'guards' => [ 'admin' => [ 'driver' => 'session', 'provider' => 'admin', diff --git a/config/excel.php b/config/excel.php new file mode 100644 index 0000000..db3fec7 --- /dev/null +++ b/config/excel.php @@ -0,0 +1,305 @@ + [ + + /* + |-------------------------------------------------------------------------- + | Chunk size + |-------------------------------------------------------------------------- + | + | When using FromQuery, the query is automatically chunked. + | Here you can specify how big the chunk should be. + | + */ + 'chunk_size' => 1000, + + /* + |-------------------------------------------------------------------------- + | Pre-calculate formulas during export + |-------------------------------------------------------------------------- + */ + 'pre_calculate_formulas' => false, + + /* + |-------------------------------------------------------------------------- + | CSV Settings + |-------------------------------------------------------------------------- + | + | Configure e.g. delimiter, enclosure and line ending for CSV exports. + | + */ + 'csv' => [ + 'delimiter' => ',', + 'enclosure' => '"', + 'line_ending' => PHP_EOL, + 'use_bom' => false, + 'include_separator_line' => false, + 'excel_compatibility' => false, + ], + + /* + |-------------------------------------------------------------------------- + | Worksheet properties + |-------------------------------------------------------------------------- + | + | Configure e.g. default title, creator, subject,... + | + */ + 'properties' => [ + 'creator' => '', + 'lastModifiedBy' => '', + 'title' => '', + 'description' => '', + 'subject' => '', + 'keywords' => '', + 'category' => '', + 'manager' => '', + 'company' => '', + ], + ], + + 'imports' => [ + + /* + |-------------------------------------------------------------------------- + | Read Only + |-------------------------------------------------------------------------- + | + | When dealing with imports, you might only be interested in the + | data that the sheet exists. By default we ignore all styles, + | however if you want to do some logic based on style data + | you can enable it by setting read_only to false. + | + */ + 'read_only' => true, + + /* + |-------------------------------------------------------------------------- + | Heading Row Formatter + |-------------------------------------------------------------------------- + | + | Configure the heading row formatter. + | Available options: none|slug|custom + | + */ + 'heading_row' => [ + 'formatter' => 'slug', + ], + + /* + |-------------------------------------------------------------------------- + | CSV Settings + |-------------------------------------------------------------------------- + | + | Configure e.g. delimiter, enclosure and line ending for CSV imports. + | + */ + 'csv' => [ + 'delimiter' => ',', + 'enclosure' => '"', + 'escape_character' => '\\', + 'contiguous' => false, + 'input_encoding' => 'UTF-8', + ], + + /* + |-------------------------------------------------------------------------- + | Worksheet properties + |-------------------------------------------------------------------------- + | + | Configure e.g. default title, creator, subject,... + | + */ + 'properties' => [ + 'creator' => '', + 'lastModifiedBy' => '', + 'title' => '', + 'description' => '', + 'subject' => '', + 'keywords' => '', + 'category' => '', + 'manager' => '', + 'company' => '', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Extension detector + |-------------------------------------------------------------------------- + | + | Configure here which writer/reader type should be used when the package + | needs to guess the correct type based on the extension alone. + | + */ + 'extension_detector' => [ + 'xlsx' => Excel::XLSX, + 'xlsm' => Excel::XLSX, + 'xltx' => Excel::XLSX, + 'xltm' => Excel::XLSX, + 'xls' => Excel::XLS, + 'xlt' => Excel::XLS, + 'ods' => Excel::ODS, + 'ots' => Excel::ODS, + 'slk' => Excel::SLK, + 'xml' => Excel::XML, + 'gnumeric' => Excel::GNUMERIC, + 'htm' => Excel::HTML, + 'html' => Excel::HTML, + 'csv' => Excel::CSV, + 'tsv' => Excel::TSV, + + /* + |-------------------------------------------------------------------------- + | PDF Extension + |-------------------------------------------------------------------------- + | + | Configure here which Pdf driver should be used by default. + | Available options: Excel::MPDF | Excel::TCPDF | Excel::DOMPDF + | + */ + 'pdf' => Excel::DOMPDF, + ], + + /* + |-------------------------------------------------------------------------- + | Value Binder + |-------------------------------------------------------------------------- + | + | PhpSpreadsheet offers a way to hook into the process of a value being + | written to a cell. In there some assumptions are made on how the + | value should be formatted. If you want to change those defaults, + | you can implement your own default value binder. + | + | Possible value binders: + | + | [x] Maatwebsite\Excel\DefaultValueBinder::class + | [x] PhpOffice\PhpSpreadsheet\Cell\StringValueBinder::class + | [x] PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder::class + | + */ + 'value_binder' => [ + 'default' => Maatwebsite\Excel\DefaultValueBinder::class, + ], + + 'cache' => [ + /* + |-------------------------------------------------------------------------- + | Default cell caching driver + |-------------------------------------------------------------------------- + | + | By default PhpSpreadsheet keeps all cell values in memory, however when + | dealing with large files, this might result into memory issues. If you + | want to mitigate that, you can configure a cell caching driver here. + | When using the illuminate driver, it will store each value in a the + | cache store. This can slow down the process, because it needs to + | store each value. You can use the "batch" store if you want to + | only persist to the store when the memory limit is reached. + | + | Drivers: memory|illuminate|batch + | + */ + 'driver' => 'memory', + + /* + |-------------------------------------------------------------------------- + | Batch memory caching + |-------------------------------------------------------------------------- + | + | When dealing with the "batch" caching driver, it will only + | persist to the store when the memory limit is reached. + | Here you can tweak the memory limit to your liking. + | + */ + 'batch' => [ + 'memory_limit' => 60000, + ], + + /* + |-------------------------------------------------------------------------- + | Illuminate cache + |-------------------------------------------------------------------------- + | + | When using the "illuminate" caching driver, it will automatically use + | your default cache store. However if you prefer to have the cell + | cache on a separate store, you can configure the store name here. + | You can use any store defined in your cache config. When leaving + | at "null" it will use the default store. + | + */ + 'illuminate' => [ + 'store' => null, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Transaction Handler + |-------------------------------------------------------------------------- + | + | By default the import is wrapped in a transaction. This is useful + | for when an import may fail and you want to retry it. With the + | transactions, the previous import gets rolled-back. + | + | You can disable the transaction handler by setting this to null. + | Or you can choose a custom made transaction handler here. + | + | Supported handlers: null|db + | + */ + 'transactions' => [ + 'handler' => 'db', + ], + + 'temporary_files' => [ + + /* + |-------------------------------------------------------------------------- + | Local Temporary Path + |-------------------------------------------------------------------------- + | + | When exporting and importing files, we use a temporary file, before + | storing reading or downloading. Here you can customize that path. + | + */ + 'local_path' => storage_path('framework/laravel-excel'), + + /* + |-------------------------------------------------------------------------- + | Remote Temporary Disk + |-------------------------------------------------------------------------- + | + | When dealing with a multi server setup with queues in which you + | cannot rely on having a shared local temporary path, you might + | want to store the temporary file on a shared disk. During the + | queue executing, we'll retrieve the temporary file from that + | location instead. When left to null, it will always use + | the local path. This setting only has effect when using + | in conjunction with queued imports and exports. + | + */ + 'remote_disk' => null, + 'remote_prefix' => null, + + /* + |-------------------------------------------------------------------------- + | Force Resync + |-------------------------------------------------------------------------- + | + | When dealing with a multi server setup as above, it's possible + | for the clean up that occurs after entire queue has been run to only + | cleanup the server that the last AfterImportJob runs on. The rest of the server + | would still have the local temporary file stored on it. In this case your + | local storage limits can be exceeded and future imports won't be processed. + | To mitigate this you can set this config value to be true, so that after every + | queued chunk is processed the local temporary file is deleted on the server that + | processed it. + | + */ + 'force_resync_remote' => null, + ], +]; From 3ddfaa9502d601ea9b02e72a62fdb45c59bb5ef8 Mon Sep 17 00:00:00 2001 From: xuanchen <122383162@qq.com> Date: Tue, 29 Sep 2020 15:25:36 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=94=BE=E5=BC=80=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=A7=84=E5=88=99=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/User/IndexController.php | 600 +++++++++--------- 1 file changed, 299 insertions(+), 301 deletions(-) diff --git a/app/Admin/Controllers/User/IndexController.php b/app/Admin/Controllers/User/IndexController.php index 4b5b260..e717aac 100644 --- a/app/Admin/Controllers/User/IndexController.php +++ b/app/Admin/Controllers/User/IndexController.php @@ -1,301 +1,299 @@ - - * @Date : 2019/9/18 14:50 - * @return Grid - */ - protected function grid() - { - $user = Auth::guard('admin')->user(); - $grid = new Grid(new User); - - $grid->actions(function ($actions) use ($user) { - $actions->disableDelete(); - $actions->disableView(); - - if ($actions->row->identity_id == 1) { - $actions->add(new RefD3Key); - $actions->add(new ReCode); - $actions->add(new Callback); - } - - if ($actions->row->identity_id == 1 && $user->id == 1) { - $actions->add(new Profit); - } - }); - - $grid->tools(function (Grid\Tools $tools) { - // $tools->append(new UserImport); - }); - - $grid->model()->orderBy('id', 'desc'); - - $grid->quickSearch('username')->placeholder('登录账户'); - - $grid->filter(function ($filter) { - $filter->column(1 / 2, function ($filter) { - $filter->like('username', '登录账户'); - $filter->like('server_id', '渠道编号'); - $filter->like('outlet_id', '网点编号'); - $filter->like('PaOutletId', '平安网点id'); - $filter->between('created_at', '注册时间')->datetime(); - }); - $filter->column(1 / 2, function ($filter) { - $filter->like('info.nickname', '渠道/网点'); - $filter->like('server_key', '服务秘钥'); - $filter->equal('identity.identity_id', '用户身份')->select([ - ' ' => '全部', - '1' => '渠道商', - '2' => '网点', - ]); - $filter->equal('type', '所属项目')->select([ - ' ' => '全部', - 'pingan' => '平安券', - 'wo' => '沃支付', - ]); - }); - }); - - $grid->column('id', '#ID#'); - $grid->column('username', '登录账户'); - $grid->column('渠道编号')->display(function () { - return $this->server_id; - }); - $grid->column('网点编号')->display(function () { - return $this->outlet_id ?? '---'; - }); - - $grid->column('平安网点id')->display(function () { - return $this->PaOutletId ?? '---'; - }); - - $grid->column('所属项目')->display(function () { - return $this->type_text; - }); - - $grid->column('回调地址')->display(function ($title, $column) { - return '点击查看'; - })->modal(function ($model) { - $data = [ - [ - $this->callback, - ], - ]; - - return new Table(['url'], $data); - - }); - - $grid->column('密钥')->display(function ($title, $column) { - return '点击查看'; - })->modal(function ($model) { - $data = [ - [ - '服务秘钥', $model->server_key ?? '---', - ], - [ - 'DES3秘钥', $model->des3key ?? '---', - ], - ]; - - return new Table(['名称', '参数'], $data); - - }); - - $grid->column('nickname', '渠道/网点'); - $grid->column('用户身份')->display(function () { - if ($this->identity_id == 1) { - return "

" . $this->identity_text . "

"; - } else { - return $this->identity_text; - } - - }); - - $grid->column('隶属渠道')->display(function () { - return $this->parent ? $this->parent->nickname : '---'; - }); - - if ($user->id == 1) { - $grid->column('分润规则')->display(function ($title, $column) { - return '点击展开'; - })->modal(function ($model) { - if ($model->code) { - $codes = $model->code->map(function ($code) { - return $code->only(['name', 'code', 'profit']); - }); - - return new Table(['名称', '规则项', '分润金额(元)'], $codes->toArray()); - } - - }); - } - - $grid->column('created_at', '注册时间'); - $grid->disableExport(false); - - $grid->export(function ($export) { - $export->except(['密钥', '分润规则']); - $export->column('用户身份', function ($value, $original) { - return strip_tags($value); - }); - $export->column('渠道编号', function ($value, $original) { - return $value . "\t"; - }); - $export->column('网点编号', function ($value, $original) { - return $value . "\t"; - }); - $export->filename('用户管理' . date("YmdHis")); - }); - - return $grid; - } - - /** - * Notes: - * @Author: - * @Date : 2019/9/18 14:50 - * @return Form - */ - protected function form() - { - $province = Area::where('parent_id', 1)->pluck('name', 'code'); - - $form = new Form(new User); - $identity = Identity::find(1); - - $form->text('username', '登录账户') - ->creationRules(['required', "unique:users", 'max:11'], ['max' => '小于11个字符']) - ->updateRules(['required', "unique:users,username,{{id}}"])->required(); - - $form->password('password', '登录密码') - ->creationRules('required|min:6', [ - 'required' => '必填', - 'min' => '密码不能少于6个字符', - ]); - - $form->text('PaOutletId', '平安网点id'); - - $form->select('type', '项目') - ->options(['pingan' => '平安券和自有券', 'wo' => '沃支付']) - ->load('parent_id', '/admin/user/parent') - ->required(); - - $form->select('parent_id', '隶属渠道') - ->options(function ($option, $info) { - $user = $this; - if (!$option || ($user && $user->identity_id == 2)) { - return User::with('info')->whereHas('identity', function ($q) { - $q->where('identity_id', 1); - })->when(isset($user->id), function ($q) use ($user) { - $q->where('type', $user->type); - })->orderBy('id', 'desc')->get()->pluck('nickname', 'id'); - } else { - return [0 => '没有隶属渠道']; - } - }) - ->default(function ($info) { - if ($info->model() && $info->model()->parent) { - return $info->model()->parent_id; - } else { - return 0; - } - }) - ->help('未选择隶属渠道创建渠道账号,选择隶属渠道创建网点账号'); - - $form->select('province_id', '行政省份') - ->options($province) - ->load('city_id', '/admin/ajax/areas/children') - ->required(); - - $form->select('city_id', '行政城市')->options(function ($option, $info) { - if ($option) { - return Area::whereHas('parent', function ($q) use ($info) { - $q->where('code', $this->province_id); - })->pluck('name', 'code'); - } - })->load('district_id', '/admin/ajax/areas/children')->required(); - - $form->select('district_id', '行政区域')->options(function ($option, $info) { - if ($option) { - return Area::whereHas('parent', function ($q) use ($info) { - $q->where('code', $this->city_id); - })->pluck('name', 'code'); - } - })->required(); - - $form->divider('用户资料'); - $form->text('info.nickname', '渠道/网点')->placeholder('请输入渠道/网点名称')->required(); - - $form->saved(function (Form $form) { - $user_id = $form->model()->id; - $user = User::find($user_id); - if ($user->identity_id == 1 && $user->code()->count() === 0) { - $userCodes = Identity::find(1)->codes->map(function ($code) { - return $code->only(['name', 'code', 'profit']); - }); - $user->code()->createMany($userCodes); - } - - if ($user->parent_id) { - if ($user->server_id != $user->parent->server_id) { - $user->server_id = $user->parent->server_id; - $user->save(); - } - } - - }); - - return $form; - } - - /** - * 获取隶属 - * @author 玄尘 2020-03-12 - * @param Request $request [description] - * @return [type] [description] - */ - public function getParent(Request $request) - { - $type = $request->get('q'); - - $users = User::whereHas('identity', function ($query) { - $query->where('identity_id', 1); - })->get(); - - $userRet = $users->map(function ($code) { - return [ - 'id' => $code->id, - 'text' => $code->info->nickname, - ]; - }); - $userRet->prepend(['id' => '', 'text' => '']); - - return $userRet; - } - -} + + * @Date : 2019/9/18 14:50 + * @return Grid + */ + protected function grid() + { + $user = Auth::guard('admin')->user(); + $grid = new Grid(new User); + + $grid->actions(function ($actions) use ($user) { + $actions->disableDelete(); + $actions->disableView(); + + if ($actions->row->identity_id == 1) { + $actions->add(new RefD3Key); + $actions->add(new ReCode); + $actions->add(new Callback); + } + + if ($actions->row->identity_id == 1 && $user->id == 1) { + $actions->add(new Profit); + } + }); + + $grid->tools(function (Grid\Tools $tools) { + // $tools->append(new UserImport); + }); + + $grid->model()->orderBy('id', 'desc'); + + $grid->quickSearch('username')->placeholder('登录账户'); + + $grid->filter(function ($filter) { + $filter->column(1 / 2, function ($filter) { + $filter->like('username', '登录账户'); + $filter->like('server_id', '渠道编号'); + $filter->like('outlet_id', '网点编号'); + $filter->like('PaOutletId', '平安网点id'); + $filter->between('created_at', '注册时间')->datetime(); + }); + $filter->column(1 / 2, function ($filter) { + $filter->like('info.nickname', '渠道/网点'); + $filter->like('server_key', '服务秘钥'); + $filter->equal('identity.identity_id', '用户身份')->select([ + ' ' => '全部', + '1' => '渠道商', + '2' => '网点', + ]); + $filter->equal('type', '所属项目')->select([ + ' ' => '全部', + 'pingan' => '平安券', + 'wo' => '沃支付', + ]); + }); + }); + + $grid->column('id', '#ID#'); + $grid->column('username', '登录账户'); + $grid->column('渠道编号')->display(function () { + return $this->server_id; + }); + $grid->column('网点编号')->display(function () { + return $this->outlet_id ?? '---'; + }); + + $grid->column('平安网点id')->display(function () { + return $this->PaOutletId ?? '---'; + }); + + $grid->column('所属项目')->display(function () { + return $this->type_text; + }); + + $grid->column('回调地址')->display(function ($title, $column) { + return '点击查看'; + })->modal(function ($model) { + $data = [ + [ + $this->callback, + ], + ]; + + return new Table(['url'], $data); + + }); + + $grid->column('密钥')->display(function ($title, $column) { + return '点击查看'; + })->modal(function ($model) { + $data = [ + [ + '服务秘钥', $model->server_key ?? '---', + ], + [ + 'DES3秘钥', $model->des3key ?? '---', + ], + ]; + + return new Table(['名称', '参数'], $data); + + }); + + $grid->column('nickname', '渠道/网点'); + $grid->column('用户身份')->display(function () { + if ($this->identity_id == 1) { + return "

" . $this->identity_text . "

"; + } else { + return $this->identity_text; + } + + }); + + $grid->column('隶属渠道')->display(function () { + return $this->parent ? $this->parent->nickname : '---'; + }); + + $grid->column('分润规则')->display(function ($title, $column) { + return '点击展开'; + })->modal(function ($model) { + if ($model->code) { + $codes = $model->code->map(function ($code) { + return $code->only(['name', 'code', 'profit']); + }); + + return new Table(['名称', '规则项', '分润金额(元)'], $codes->toArray()); + } + + }); + + $grid->column('created_at', '注册时间'); + $grid->disableExport(false); + + $grid->export(function ($export) { + $export->except(['密钥', '分润规则']); + $export->column('用户身份', function ($value, $original) { + return strip_tags($value); + }); + $export->column('渠道编号', function ($value, $original) { + return $value . "\t"; + }); + $export->column('网点编号', function ($value, $original) { + return $value . "\t"; + }); + $export->filename('用户管理' . date("YmdHis")); + }); + + return $grid; + } + + /** + * Notes: + * @Author: + * @Date : 2019/9/18 14:50 + * @return Form + */ + protected function form() + { + $province = Area::where('parent_id', 1)->pluck('name', 'code'); + + $form = new Form(new User); + $identity = Identity::find(1); + + $form->text('username', '登录账户') + ->creationRules(['required', "unique:users", 'max:11'], ['max' => '小于11个字符']) + ->updateRules(['required', "unique:users,username,{{id}}"])->required(); + + $form->password('password', '登录密码') + ->creationRules('required|min:6', [ + 'required' => '必填', + 'min' => '密码不能少于6个字符', + ]); + + $form->text('PaOutletId', '平安网点id'); + + $form->select('type', '项目') + ->options(['pingan' => '平安券和自有券', 'wo' => '沃支付']) + ->load('parent_id', '/admin/user/parent') + ->required(); + + $form->select('parent_id', '隶属渠道') + ->options(function ($option, $info) { + $user = $this; + if (!$option || ($user && $user->identity_id == 2)) { + return User::with('info')->whereHas('identity', function ($q) { + $q->where('identity_id', 1); + })->when(isset($user->id), function ($q) use ($user) { + $q->where('type', $user->type); + })->orderBy('id', 'desc')->get()->pluck('nickname', 'id'); + } else { + return [0 => '没有隶属渠道']; + } + }) + ->default(function ($info) { + if ($info->model() && $info->model()->parent) { + return $info->model()->parent_id; + } else { + return 0; + } + }) + ->help('未选择隶属渠道创建渠道账号,选择隶属渠道创建网点账号'); + + $form->select('province_id', '行政省份') + ->options($province) + ->load('city_id', '/admin/ajax/areas/children') + ->required(); + + $form->select('city_id', '行政城市')->options(function ($option, $info) { + if ($option) { + return Area::whereHas('parent', function ($q) use ($info) { + $q->where('code', $this->province_id); + })->pluck('name', 'code'); + } + })->load('district_id', '/admin/ajax/areas/children')->required(); + + $form->select('district_id', '行政区域')->options(function ($option, $info) { + if ($option) { + return Area::whereHas('parent', function ($q) use ($info) { + $q->where('code', $this->city_id); + })->pluck('name', 'code'); + } + })->required(); + + $form->divider('用户资料'); + $form->text('info.nickname', '渠道/网点')->placeholder('请输入渠道/网点名称')->required(); + + $form->saved(function (Form $form) { + $user_id = $form->model()->id; + $user = User::find($user_id); + if ($user->identity_id == 1 && $user->code()->count() === 0) { + $userCodes = Identity::find(1)->codes->map(function ($code) { + return $code->only(['name', 'code', 'profit']); + }); + $user->code()->createMany($userCodes); + } + + if ($user->parent_id) { + if ($user->server_id != $user->parent->server_id) { + $user->server_id = $user->parent->server_id; + $user->save(); + } + } + + }); + + return $form; + } + + /** + * 获取隶属 + * @author 玄尘 2020-03-12 + * @param Request $request [description] + * @return [type] [description] + */ + public function getParent(Request $request) + { + $type = $request->get('q'); + + $users = User::whereHas('identity', function ($query) { + $query->where('identity_id', 1); + })->get(); + + $userRet = $users->map(function ($code) { + return [ + 'id' => $code->id, + 'text' => $code->info->nickname, + ]; + }); + $userRet->prepend(['id' => '', 'text' => '']); + + return $userRet; + } + +}