常见问题

未匹配的标注

常见问题汇总

前端控制台JS报错?

如果发现这个问题,绝大部分都是因为静态资源文件有问题引起的(比如升级步骤不正确),请先重新发布资源并清理浏览器缓存

php artisan admin:publish --assets --force

如果还是报错,请到此处进行反馈 github.com/jqhph/dcat-admin/issues

如何设置语言为简体中文?

打开配置文件config/app.php,设置locale参数的值为zh_CN

Laravel7时间显示为UTC格式

这个是Laravel7升级后带来的坑,原因请参考日期序列化

在本项目中解决这个问题很简单,只需在Model中引入Dcat\Admin\Traits\HasDateTimeFormatter这个trait即可。

<?php

namespace App\Models;

use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Model;

class MyModel extends Model
{
     use HasDateTimeFormatter;
}

表单保存时报错Array to string conversion

出现这个问题是因为表单提交的值最后转换成了array类型,而MySQL是不支持直接存储array类型数据的,在dcat-admin中可以用以下方式对数据格式进行转换

$form->multipleSelect('user_id')->saving(function ($v) {
 // 转为 , 隔开的字符串
 return implode(',', $v);});

当然,也可以通过model修改器去转化字段的值,这方面内容可以参考laravel文档,这里就不再赘述。

更优雅的转化值方法,可参考 Dcat Admin 教程 - 如何优雅地更改表单值的数据类型?

如何从laravel-admin迁移到dcat-admin?

Dcat Admin 教程 - 如何从 Laravel admin 迁移到 dcat admin?

重写登陆页面和登陆逻辑

方式一,重写登陆控制器方法:

默认的登陆控制器用的是App\Admin\AuthController这个类,可以通过配置参数admin.auth.controller进行修改

<?php

namespace App\Admin\Controllers;

use Dcat\Admin\Controllers\AuthController as BaseAuthController;

class AuthController extends BaseAuthController
{
    // 自定义登陆view模板
    protected $view = 'admin.login';

    // 重写登陆页面逻辑
    public function getLogin(Content $content)
    {
        ...
    }

    ...
}

方式二,覆写路由:

在路由文件app/Admin/routes.php中,覆盖掉登陆页面和登陆逻辑的路由,即可实现自定义的功能

Route::group([
    'prefix'        => config('admin.prefix'),
    'namespace'     => Admin::controllerNamespace(),
    'middleware'    => ['web', 'admin'],
], function (Router $router) {

    $router->get('auth/login', 'AuthController@getLogin');
    $router->post('auth/login', 'AuthController@postLogin');

});

在自定义的路由器AuthController中的getLoginpostLogin方法里分别实现自己的登陆页面和登陆逻辑。

更新新版本后出现异常

如果遇到更新之后,部分组件不能正常使用,那有可能是dcat-admin自带的静态资源有更新了,需要运行命令php artisan admin:publish --force来重新发布前端资源,发布之后不要忘记清理浏览器缓存.

文件上传失败或无法访问?

如果你发现无法上传文件,那么通常有几下几点原因:

  1. Laravel文件上传配置不正确,请参考文档图片/文件上传。如果你不了解laravel文件上传功能,请阅读文档Laravel - 文件存储
  2. 文件过大,需要调整php.iniupload_max_filesize参数
  3. 文件上传目录没有写权限
  4. php没有安装或没有开启fileinfo扩展
  5. 检查php.iniupload_tim_dir参数设置是否正常
  6. 检查是否升级新版本没有重新发布资源或没有清理浏览器缓存

如果文件上传成功了,却无法正常访问,那么可能是.env配置文件中的APP_URL参数没有设置正确。

关于前端资源加载问题

Dcat Admin是支持前端资源按需加载的,在需要用到某个组件的时候再引入前端资源即可,开发者无需担心安装组件过多影响页面加载速度。

只有那种需要在全局页面引入的资源,才需要在app/Admin/bootstrap.phpServiceProvider::boot方法中引入:

Admin::css('path/to/your/css');
Admin::js('path/to/your/js');

谷歌字体加载过慢?

如果出现谷歌字体加载过慢的情况下,可以把谷歌字体下载到你自己的服务器,然后在app/Admin/bootstrap.php中加入以下代码,让系统从你自己的服务器中加载字体

Admin::asset()->alias(
    '@nunito', 
     ['css' => asset('你的服务器字体路径/nunito.css?family=Nunito:200,200i,300,300i,400,400i,600,600i,800,800i,900,900i')]
);

如果你完全不想使用这两种字体,可以加入以下代码

Admin::asset()->alias('@nunito', []);

为何配置了角色和权限,依然提示无权访问?

这个原因可能是由于权限的URL路径配置错误导致的,正确的包含增删改查功能的URL配置应该是auth/users*这样的,如果配置成了auth/users/*,那么就会提示无权访问。

{tip} 另外标签表单填写自定义URL有两种方法:一种是选中后按删除键进行更改;另一种是填写后按空格键 + 回车键

为何没有权限的菜单不会自动隐藏?

权限与菜单是相互独立的,并且默认是可见的。当设置了权限之后,系统并没有办法可以判断用户是否可以访问某个菜单,所以需要给菜单绑定对应的权限或者角色,绑定之后系统就可以识别用户是否可访问这个菜单。

项目使用HTTPS之后无法登陆

需要把配置文件的admin.https参数的值设置为true

$.get(xxx) 没有反应

Dcat Admin使用的是jQuery3.x$.get方法在jQuery3.x中已经被废弃,请使用$.ajax代替

前后台session发生冲突

2.0的版本之后 admin.session 中间件不再默认启用,如果您的应用同时有前台和后台,则需要开启 admin.session 中间件,否则会造成前后台 session 冲突问题。

把配置参数 admin.route.enable_session_middleware 的值设置为 true 即可开启

    'route' => [
        'domain' => env('ADMIN_ROUTE_DOMAIN'),

        'prefix' => env('ADMIN_ROUTE_PREFIX', 'admin'),

        'namespace' => 'App\\Admin\\Controllers',

        'middleware' => ['web', 'admin'],

        // 开启 admin.session 中间件
        'enable_session_middleware' => true,
    ],

数据表字段设置 Not null 后保存表单时报错

如果数据表字段设置为not null,当表单提交的数据是空时,会保存字段值为null到数据库,这时就会报错。我们可以通过以下方法解决这个问题

$form->text(...)->saving(function ($v) {
    // 把字段值类型强转为 string,如果是数值强转为int
    return (string) $v;
});

图片防盗链

图片请求默认会去掉 referer 字段,如果有防盗链要求,可以在配置文件(config/admin.php)中设置:

 "disable_no_referrer_meta" => true

适配 Laravel-S

自从 Laravel-S 3.7.18 发行版开始,支持使用 DcatAdmin 。

1,composer require hhxsv5/laravel-s

2,执行 php artisan laravels publish 发布资源。

3,修改 config/laravels.php ,添加以下服务注册和清理器:

'register_providers' => [
 \Dcat\Admin\AdminServiceProvider::class,
],

'cleaners' => [
  ...
  Hhxsv5\LaravelS\Illuminate\Cleaners\DcatAdminCleaner::class,

],

4,执行 php bin/laravels start 即可使用 swoole 。

为何不开发成前后端分离项目?

最近有很多同学问我为什么不采用前后端分离技术方案,我在这个帖子里回答的非常详细,有相关疑问的同学请点击此处查看帖子,这里不再赘述。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
贡献者:4
讨论数量: 4
发起讨论 只看当前版本


lbb_1022
切换模式按钮变成了四个 不知道是自己改动哪里影响的
0 个点赞 | 7 个回复 | 问答 | 课程版本 2.x
sinmu
为什么Dcat-admin在本地加载会这么慢?
0 个点赞 | 5 个回复 | 问答 | 课程版本 2.x
xiangjb
新增权限时菜单出不来数据
0 个点赞 | 1 个回复 | 问答 | 课程版本 2.x