buildAdmin的开发部署时遇到的一些问题记录

问题一 : 请求超时

问题描述

请求超时:Please do not request frequently. Try again in

解决方案

根目录下的config文件中,修改throttle.php文件中的visit_rate 属性 ,根据合适的限制可设置 10/m 10/60100/h100/dnull,需注意,此处设置需为字符串。且一般不设置为null。
请求超时

问题二 :部署后admin 无法访问

问题描述

部署后修改配置文件后,/admin的管理页面依旧无法访问
在这里插入图片描述

解决方案

大概率是由于admin前端项目打包后,index.html文件或某个js文件的内部路径 没有采用相对路径 ./格式导致的。
本次处理bug解决 方案为:
在index.html 中

## src 路径和href 路径前加入 /admin
	<script type="module" crossorigin src="/admin/assets/index-Cr0saE70.js"></script>
	<link rel="modulepreload" crossorigin href="/admin/assets/vue-BF1cKiK_.js">
	<link rel="stylesheet" crossorigin href="/admin/assets/style-BTffnLSG.css">

或者有可能是请求方式问题,需要修改router/index.ts目录文件

#将hash路由改为web路由
const router = createRouter({
    history: createWebHistory(),
    routes: staticRoutes,
})

问题三:富文本输入问题

问题描述

使用富文本输入框,输入的内容无法被接口正确接收,会自动过滤掉诸如<p>等html标签。

解决方案

需在对应控制器中配置:

    public function initialize(): void
    {
        parent::initialize();
        $this->model = new \app\admin\model\customer\Message();
        ##重点是这一行,使用clean_xss方式过滤
        $this->request->filter('clean_xss');
    }

问题四:关联关系无法显示

问题描述

关联的数据无法正常对应显示,比如选择了相关关系,取另一个表中的数据作为下拉框。

解决方案

## 关系使用table 才会自动查询并返回数据
protected array $withJoinTable = ['pidTable'];

问题五:增删改查的修改

问题描述

thinkphp 框架中,增删改查如果没有复杂查询,可使用框架自带的增(add)删(delete)改(edit)查(index) ,可复制\app\admin\library\traits\Backend目录下的基础方法来修改。如果配置了访问控制器选择下拉框,则为(select)函数。 默认下拉框配置时,如果访问index ,会自动进入select ,但select默认又是index

解决方案

public function initialize(): void
    {
        parent::initialize();
        ## 重点是这行,配置这个model后,会自动匹配预定义的数据库里的结构,来增删改数据。
        $this->model = new \app\admin\model\Category();
    }

问题六:查询参数的配置

问题描述

php 基于查询的修改

解决方案

在默认的index函数中,使用$where[] = [ ‘category.id’ / ‘id’ (检索值) , ‘=’ / ‘like’ / ‘eq’ 等数据库检索匹配的参数 , 值 ‘$id’ / 7 / ‘超级’ ] 这样的格式来匹配检索数据,获取列表。where的位置在 list($where ,$alias,$limit, $order) = $this -> queryBuilder 后,在$res之前。
例如:

## 默认查询函数index
/**
     * 查看
     * @throws Throwable
     */
    public function index(): void
    {
        // 如果是 select 则转发到 select 方法,若未重写该方法,其实还是继续执行 index
        if ($this->request->param('select')) {
            $this->select();
        }

        /**
         * 1. withJoin 不可使用 alias 方法设置表别名,别名将自动使用关联模型名称(小写下划线命名规则)
         * 2. 以下的别名设置了主表别名,同时便于拼接查询参数等
         * 3. paginate 数据集可使用链式操作 each(function($item, $key) {}) 遍历处理
         */
        list($where, $alias, $limit, $order) = $this->queryBuilder();
        $where[] = ['category.pid','=',7];
        $res = $this->model
            ->withJoin($this->withJoinTable, $this->withJoinType)
            ->alias($alias)
            ->where($where)
            ->order($order)
            ->paginate($limit);
        $res->visible(['pidTable' => ['title']]);

        $this->success('', [
            'list'   => $res->items(),
            'total'  => $res->total(),
            'remark' => get_route_remark(),
        ]);
    }

添加的add 函数

/**
     * 添加
     */
    public function add(): void
    {
        if ($this->request->isPost()) {
            $data = $this->request->post();
            #手动设置添加时的参数值, 会覆盖前端页面传递来的值
            $data['pid'] = 7;
            $data['level'] = 1;
            if (!$data) {
                $this->error(__('Parameter %s can not be empty', ['']));
            }

            $data = $this->excludeFields($data);
            if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
                $data[$this->dataLimitField] = $this->auth->id;
            }

            $result = false;
            $this->model->startTrans();
            try {
                // 模型验证
                if ($this->modelValidate) {
                    $validate = str_replace("\\model\\", "\\validate\\", get_class($this->model));
                    if (class_exists($validate)) {
                        $validate = new $validate();
                        if ($this->modelSceneValidate) $validate->scene('add');
                        $validate->check($data);
                    }
                }
                $result = $this->model->save($data);
                $this->model->commit();
            } catch (Throwable $e) {
                $this->model->rollback();
                $this->error($e->getMessage());
            }
            if ($result !== false) {
                $this->success(__('Added successfully'));
            } else {
                $this->error(__('No rows were added'));
            }
        }

        $this->error(__('Parameter error'));
    }

问题七:暴露接口给前端且无需登陆验证。

问题描述

如何暴露接口给前端使其获取数据。若有登录验证,则参考admin页面,可定义其他的数据接口。
若无登录验证,需要配置route来暴露接口。

此处的配置文件格式为:
route文件路径

route 文件内容:

<?php
use think\facade\Route;

/**
 * 应用模块 相关路由
 */
Route::group(function () {
    //首页
    Route::get('web/index', 'web.Index/index');
    //分类
    Route::get('web/category/:pid', 'web.Index/category');
    //产品
    Route::get('web/product', 'web.Index/product');
    Route::get('web/productDetail', 'web.Index/productDetail');
//    //解决方案
//    Route::get('web/solute', 'web.Index/solute');
//    Route::get('web/solute/:id', 'web.Index/soluteDetail');
    //资质
    Route::get('web/qualify', 'web.Index/qualify');
    //新闻
    Route::get('web/news', 'web.Index/news');
    Route::get('web/newsDetail', 'web.Index/newsDetail');
    //关于我们
    Route::get('web/about', 'web.Index/about');
    //首页轮播
    Route::get('web/banner', 'web.Index/banner');

    Route::post('web/upload','web.Index/upload');

    Route::post('web/submitForm','customer.Message/add');

    Route::get('web/hireInformation','web.index/hire');

    Route::get('web/allCustomer','web.index/allCustomer');

})->middleware([
]);

上述代码存放在app下的api路径中,所以接口需要/api前缀

问题八:如何控制是否需要鉴权

问题描述:

定义在api下的接口不需要访问鉴权,定义了 route后就可以直接请求或提交数据。具体的实现原理是?

解决方案:

admin中定义的方法,都有initialize方法

public function initialize(): void
    {
        parent::initialize();
        $this->model = new \app\admin\model\Category();
    }

此处的parent::initialize就是跳转后会自动进行鉴权。表示这个文件中定义的所有方法都需要initialize后使用 ,即需要admin登录后才可以。

问题九:重新发布突然报错。

问题描述:

没有出错提示,仅仅只是提示执行失败
失败图片

解决方案:

是由于php默认的代码超时时间为30s,所以build还没运行完成,就超时了,此处php版本为8.2.9nts。在早先的版本中php8.0.2nts中,默认的超时时间比较长,所以不会出错,切换了版本后,就出错了。

问题十:buildAdmin部署问题

问题描述:正确的存放buildAdmin的文件包

如何正确的将项目部署到服务器中,很重要的两点,一个是admin文件中应存放什么。还有一个public目录中本来有index.php之类的文件。

解决方案:

具体的来说,应该直接将php项目的public文件直接上传到服务器,然后创建一个admin文件,并将php项目的web文件打包后的dist中Index.html 和 assets 两个文件 直接上传到admin目录中,然后将正确的前端中dist文件,存放在public目录下。替代原来的index.html 和 assets。

问题十一 :登录时,无法正常显示验证码

问题描述:无法找到imagettfbbox

项目创建后初始化完成但登录时,无法弹出验证码弹窗,并报错:imagettfbbox(): Could not find/open font

解决方案:

由于系统安装路径问题,php项目一般会访问项目所在路径文件,路径中不能有中文,如果有中文会导致报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值