这里写目录标题
问题一 : 请求超时
问题描述
请求超时:Please do not request frequently. Try again in
解决方案
根目录下的config
文件中,修改throttle.php
文件中的visit_rate
属性 ,根据合适的限制可设置 10/m
、10/60
、100/h
、100/d
、null
,需注意,此处设置需为字符串。且一般不设置为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 文件内容:
<?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项目一般会访问项目所在路径文件,路径中不能有中文,如果有中文会导致报错。