# Dcat Admin 整合插件快速开发版本_dcat_faster **Repository Path**: techutter/dcat-faster ## Basic Information - **Project Name**: Dcat Admin 整合插件快速开发版本_dcat_faster - **Description**: 旨在能更快更方便的开始和完成中小型项目,基于Dcat admin框架,整合了支付(yansongda-pay),短信(easy-sms),微信(easywechat),以及很多常用方法封装,对dcat的一些改进 - **Primary Language**: PHP - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 8 - **Created**: 2024-12-20 - **Last Updated**: 2024-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dcat-faster 基于 Dcat Admin 整合各种常用插件 #### 集成插件 - **[Dcat Admin文档](https://learnku.com/docs/dcat-admin/2.x)** - **[Laravel9 文档](https://learnku.com/docs/laravel/9.x)** - **[Yansongda 微信支付和公众号支付(v3)](https://pay.yansongda.cn/docs/v3/)** - **[qiniu-laravel-storage 七牛云](https://github.com/zgldh/qiniu-laravel-storage/)** - **[overtrue/easy-sms 短信插件](https://github.com/overtrue/easy-sms)** - **[overtrue/pinyin 汉字转拼音](https://github.com/overtrue/pinyin)** - **[overtrue/wechat 微信相关接口(v5)](https://easywechat.com/docs/5.x/overview)** - **[easy-excel excel导入导出](https://github.com/jqhph/easy-excel)** - **[intervention/image 图片处理](https://github.com/Intervention/image)** - **[php-snowflake 雪花算法唯一ID](https://github.com/godruoyi/php-snowflake)** #### 安装步骤 - 配置nginx指向/public下,配置laravel伪静态 ~~~ location / { try_files $uri $uri/ /index.php?$query_string; } ~~~ - 为了减小git包和源码包的体积,已经忽略vendor目录,先切换到项目目录,再依次运行: ~~~ composer install php artisan key:generate ~~~ - 导入数据库/database/init.sql,配置.env文件 - 需要确保/storage目录和/public目录可写权限,如果要是使用代码生成工具需要/app/目录写入权限 #### 后台账号:admin,密码:admin - **[演示站点:http://124.71.77.94:8080/admin](http://124.71.77.94:8080/admin)** - **[Dcat官方演示站点: http://103.39.211.179:8080/admin/](http://103.39.211.179:8080/admin/auth/login)** #### 安运行环境 - PHP8+ - Nginx 1.15 + - MySQL5.7-8.0 (建议8.0) - Redis (可选) ~~~ OpenSSL fileinfo bcmath mb_string php_zip php_xmlreader ~~~ ## 图片/文件上传 ~~~ /api/attachment/upload //api上传,如小程序端 /admin/upload //后端上传 后台示例: //单图表单上传 $form->image('avatar',"商品缩略图") ->accept('jpg,png,gif,jpeg,bmp,jpg', 'image/*') ->url("upload"); //指定上传链接 //多图表单上传 $form->multipleImage('images', '商品轮播图') ->sortable() ->saveAsJson(); $form->multipleImage('images', '商品轮播图')->limit(5) ->accept('jpg,png,gif,jpeg,bmp,jpg', 'image/*') ->url("upload") ->saving(function ($paths) { return implode(',', $paths);//指定用逗号拼接保存 }); //列表预览,单图多图通用 $grid->column('images')->display(function ($pictures) { return explode(",", $pictures);//指定用逗号分割 // return json_decode($pictures, true); })->image(null, 50, 50); ~~~ ## Excel导入、导出 - 工具类封装:\App\Admin\Grid\ImportTool 和 \resources\views\admin\tools\import.blade.php - Excel导入 ~~~ use App\Admin\Grid\ImportTool; use Dcat\Admin\Traits\HasUploadedFile; use Dcat\EasyExcel\Excel; class UserController extends AdminController { use HasUploadedFile; protected function import(Request $request) { //先保存到本地 $disk = $this->disk("local"); if (!$request->hasFile('file')) { return show(500, "未检测到文件"); } $file = $request->file("file"); $newName = date("Ym") . "/" . md5(uniqid() . mt_rand(1000, 9999)) . "." . $file->getClientOriginalExtension(); $result = $disk->putFileAs("uploads/files", $file, $newName); $path = "/uploads/files/" . $newName; $sheet = Excel::import(public_path($path))->sheet(0)->toArray(); var_dump($sheet); } } ~~~ - Excel导出,自定义导出用easy-excel, grid列表快速导出: ~~~ $grid->export()->rows(function (array $rows) { return $rows; }); ~~~ ## 支付调用 ~~~ use Pay; /** * 微信小程序支付 * @return {json} [返回微信小程序支付签名包] */ function miniapp_pay(Request $requset){ $wechat = Pay::wechat(config("pay.wechat")); $order = [ 'out_trade_no' => (new Snowflake())->id(), 'body' => "小程序支付测试", 'openid' => "xxxxxx", 'total_fee' => 1, ]; return Pay::wechat(config("pay.wechat"))->miniapp($order); } /** * 微信支付回调 */ function wxpay_back(Request $requset) { $wechat = Pay::wechat(config("pay.wechat")); $result = $wechat->verify(); if (isset($result->out_trade_no)) { //根据单号查询并更新数据库 } return $wechat->success()->send(); } ~~~ ### 支付回调 ~~~ /** * 微信支付回调 */ function wxpay_back(Request $requset) { $wechat = Pay::wechat(config("pay.wechat")); $result = $wechat->verify(); if ($result&&isset($result->out_trade_no)) { //根据单号查询并更新数据库 } return $wechat->success()->send(); } /** * 支付宝支付回调 */ function alipay_back(Request $request) { $alipay = Pay::alipay(config("pay.alipay")); $result = $alipay->verify(); if (isset($result->out_trade_no)) { //根据单号查询并更新数据库 } return $alipay->success(); } ~~~ ## 小程序、公众号接口 #### 微信小程序获取openid ~~~ use EasyWeChat\Factory; function miniapp_oauth(Request $request) { $config = config("wechat.mini_program.default"); $app = Factory::miniProgram($config); try { $res = $app->auth->session($request->input("code", '')); if (isset($res['openid'])) { //session_key建议不要返回给前端 session("session_key", $res['session_key']); return json_msg(0, "微信登录", $res['openid']); } else { return json_msg(0, "授权登录失败", $res); } } catch (\Exception $e) { //配置错误时排除异常 return json_msg(500, $e->getMessage()); } } ~~~ #### 公众号授权 ~~~ /** use EasyWeChat\Factory; function official_oauth(Request $request) { $config = config("wechat.official_account.default"); $app = Factory::officialAccount($config); //静默授权 /*$response = $app->oauth->scopes(['snsapi_base']) ->setRequest($request) ->redirect(request_domain() . "/api/demo/oauth_back");*/ //用户信息授权 $response = $app->oauth->scopes(['snsapi_userinfo']) ->setRequest($request) ->redirect(request_domain() . "/api/demo/oauth_back"); return $response; } /** * 公众号授权回调 * @param Request $request [description] */ function oauth_back(Request $request) { $config = config("wechat.official_account.default"); $app = Factory::officialAccount($config); $user = $app->oauth->user(); $user->getId(); // 对应微信的 OPENID $user->getNickname(); // 对应微信的 nickname $user->getAvatar(); // 头像网址 $user->getOriginal(); // 原始API返回的结果 $user->getToken(); // access_token, 比如用于地址共享时使用 } ~~~ #### 公众号模板消息推送 ~~~ /** use EasyWeChat\Factory; function official_push(Request $request) { $config = config("wechat.official_account.default"); $app = Factory::officialAccount($config); $res = $app->template_message->send([ 'touser' => 'oUN1NxLNoCzq-B09a0FVYZ1iqLcM',//公众号推送 'template_id' => 'yz673S53td8r86tVqxsd-LPRzpxbo_lnRCAxM4qIPvs', 'url' => 'https://easywechat.org', 'data' => [ 'first' => "恭喜您下单成功!", 'keyword1' => $this->uuid(), 'keyword2' => date("Y-m-d H:i"), 'keyword3' => "100元", 'remark' => "我们会尽快发货", ], ]); var_dump($res); } ~~~ #### 公众号模板消息推送 ~~~ /** use EasyWeChat\Factory; function official_push(Request $request) { $config = config("wechat.official_account.default"); $app = Factory::officialAccount($config); $res = $app->template_message->send([ 'touser' => 'oUN1NxLNoCzq-B09a0FVYZ1iqLcM',//公众号推送 'template_id' => 'yz673S53td8r86tVqxsd-LPRzpxbo_lnRCAxM4qIPvs', 'url' => 'https://easywechat.org', 'data' => [ 'first' => "恭喜您下单成功!", 'keyword1' => $this->uuid(), 'keyword2' => date("Y-m-d H:i"), 'keyword3' => "100元", 'remark' => "我们会尽快发货", ], ]); var_dump($res); } ~~~ ## 工具类:列表快速弹框(跳过RawAction) dcat admin 的列表在新增一个弹框页面必须先追加一个RawAction操作,每一个弹框都去创建一个action有点麻烦,故写了两个通用的action,再多的弹框用着两个action就够了。 - LazyFormAction 列表操作栏快速追加懒加载表单(app/Admin/Actions) - ModalAction 列表操作栏快速追加自定义URL的弹框(app/Admin/Actions) - 更多工具类:昵称,支付,微信补充接口,腾讯地图接口在app/Http/Utils Controller代码示例: ~~~ $grid->actions(function(Grid\Displayers\Actions $actions){ $actions->append(new LazyFormAction(LazyFormDemo::class,$actions->row->toArray(),"审核")); $actions->append(new ModalAction(admin_url('order/cancel'),["id"=>1],'自定义URL','feather icon-link')); }); ~~~ ## 框架视图修改以及其他修改 - 框架视图已通过/admin/bootstarp.php将视图目录重新指向/resourses/views/dcat/目录下面,修改框架UI不再需要修改/vendor目录 - 对框架登录页和菜单颜色进行了修改 - 对editor组件进行了修改,editor的上传改为走接口/admin/upload - 将laravel9的vite打包工具修改回webpack - 将/routes/api.php和/routes/web.php的默认名称空间指向/app/Http/Controllers ## ## app/helper.php 公共助手函数文件 - show(),show_success(),show_error() 接口统一返回 ~~~ show(403,'暂无修改权限',$data); //自定义code返回 show_success('操作成功',$data); //快速返回成功,code为200, show_error('操作失败',$data); //快速返回失败信息,code为500 ~~~ - payload_encrypt(),payload_decrypt() 根据参数生成token ~~~ $token=payload_encrypt(['user_id'=>1]); $data=payload_decrypt(); $user_id=payload_decrypt('user_id'); ~~~ - admin_config() 获取配置,获取后台的表单关联后台的分组配置表单,此方法会用缓存 ~~~ admin_config("withdraw_percent"); ~~~ - unique_no() 快速生成唯一单号 ~~~ unique_no(); //年份开头的20位单号 unique_no("TK",mt_rand(1000,9999)); //追加自定义前缀和后缀 ~~~ - 生成数字唯一ID 和 UUID ~~~ unique_bigint(); //雪花算法 16位数字,如果保存数据库建议用varchar而不是bigint (可能会造成接口返回时整数溢出) uuid(); //生成laravel提供的 uuid ~~~ - validate_form() 快速验证用户提交数据 - ~~~ validate_form([ "mobile|手机号" => "required|size:11", "name|姓名" => "required" ]); ~~~ - children_tree() 递归构造二叉树 ~~~ $list=Category::->select('id','pid','name')get()->toArray(); $list=children_tree($list); ~~~ - curl_post(),curl_get() 发送CURL请求 ~~~ curl_post($url,['name'=>'G'],['ContentType:application/json']); curl_get($url); ~~~ - rand_char() 生成随机字符串,数字 ~~~ rand_char(8,5); ~~~ - number2chinese() 数字转汉字 ~~~ number2chinese(25); // 25 > 二十五 ~~~ - distance_api(),distance_line() 获取两地点的距离 ~~~ distance_api($lat1,$long1,$lat2,$long2,'walking'); //腾讯地图接口 distance_line($lat1,$long1,$lat2,$long2); //球体计算距离 ~~~ - distance_raw(); MySQL中生成坐标距离计算的列 ~~~ distance_raw($latitude,$longitude); ~~~ - send_sms() 发送阿里云短信 ,需要在.env 和/config/easysms.php配置短信 ~~~ send_sms("notice",185xxxx2333,['order_no'=>'xxxxx','status'=>'已发货']);//发送通知类短信 send_sms("login",185xxxx2333,['code'=>mr_rand(100000,999999)],true);//发送登录验证码并缓存验证码 check_sms_code("login",185xxxx2333,$code);//校验验证码 ~~~ - 敏感数据加/解密 ~~~ aes_decrypt($decryptedString); aes_encrypt($array); ~~~ ##列表操作方法 ~~~ $grid->quickSearch('order_no')->placeholder('搜索订单号'); //快速搜索框 $grid->model()->orderBy("id",'desc');//修改排序 $grid->disableFilterButton(); //禁用筛选条件 $grid->disableRefreshButton(); //禁用刷新按钮 $grid->disableRowSelector(); //取消全选 $grid->disableDeleteButton(); //禁用删除 $grid->disableViewButton(); //禁用详情按钮 $grid->disableEditButton(); //禁用编辑按钮 $grid->disableCreateButton(); //禁用新增 $grid->fixColumns(2); //固定前两列与最后一列 ,页面过长时左右滚动 $grid->column('title') ->sortable() //字段可以排序 ->editable() //允许快速编辑,和switch()都是走的表单保存,必须在form中有这个字段 ->limit(20) //最多显示20个字符,超出省略号 $grid->column('image')->image(null,50,50); //图片,尺寸50*50 $grid->column('创建时间')->display(function()){ //自定义返回格式 return substr($this->created_at,0,10); }) $grid->column('status','订单状态') ->using([0=>'未支付',1=>'已支付']) ->badge(['default'=>'danger','1'=>'success']) //加样式,也可用 dot $grid->display(); $grid->export()->rows(function (array $rows) { foreach ($rows as $index => &$row) { $row['name'] = $row['first_name'].' '.$row['last_name']; } return $rows; }); //数据导出 $grid->export() ->titles(['title'=>'文章标题','created_at'=>'发布时间']) //自定义表头 ->filename('租赁订单') //自定义文件名 ->rows(function (array $rows) { //修改数据 foreach ($rows as $index => &$row) { $row['name'] = $row['first_name'].' '.$row['last_name']; } return $rows; }) //导入,相关文件:/app/Admin/Extensions/Excel/ImoportTool.php /resources/views/admin/tool/import.blade.php $grid->tools(new ImportTool('/user/import')); ~~~ ##表单常用操作方法 ~~~ $form->text("name") ->rules("between:0,9999") //自定义验证规格, ->required() //必填 ->help() //下方提示语 ->readonly() //只读 ->disable() //禁用 ->maxLength(100) //最大长度,仅text可用 //选择框:select , radio , checkbox $form->radio("status") ->default(1) //默认值 ->saveAsJson() //保存为json字符串 ->saving(function ($value) { // 转化逗号拼接字符串保存到数据库 return implode(',',$value); }); ->options([1=>'上架',0=>'下架‘) ->when([1],function(Form $form){ //当选中1的时候显示 }); //上传 $form->image('logo') ->disk('oss') //指定文件驱动 ->maxSize(1024) //文件大小限制(KB) ->saveFullUrl() //是否保存域名,只对默认上传接口生效,自定义url不行 ->url('/upload') //自定义上传接口 $form->file('file') ->accept('jpg,png,gif,jpeg') //限制文件类型 // 限制最大上传数量 $form->multipleImage("banners") ->sortable(); //可进行排序 ->limit(10); //限制数量 ->saving(function ($paths) { //自定义保存格式 // return implode(',', $paths); return json_encode($paths); }); //地图选点 $form->map("latitude","longitude","门店位置"); // $form->currency('price')->symbol('¥'); if($form->isCreating()){//表单是否是新增操作 } if($form->isDeleting()){//表单是否是删除操作 } $form->deleting(function(Form $form){//表单删除前 $dataArr = $form->model()->toArray(); //这里是取到的数组 foreach($dataArr as $item){ if($item['status']>0){ return $form->response()->error('订单已支付,无法删除');//中断删除 } } }); $form->saving(function(Form $form){//表单修改保存前 if($form->model()->status<1){ } }); $form->saved(function(Form $form){//表单修改保存后 if($form->model()->status==1){ } }); ~~~ ## 多后台/多应用/多API - 多后台配置 :http://www.dcatadmin.com/docs/master/multi-app.html - 多API配置 修改\app\Providers\RouteServiceProvider.php ,增加路由映射和新的路由文件 ~~~ protected function mapApiRoutes() { Route::prefix('api') ->middleware('api') ->namespace($this->namespaceapi) ->group(base_path('routes/api.php')); Route::prefix('apiv2') ->middleware('api') ->namespace("App\Http\Apiv2\Controllers") ->group(base_path('routes/apiv2.php')); } ~~~