开发业务(7)——fastadmin内部代码改动

 极速开发项目模式下下,需要对框架非常熟悉。

1.后端登录的改动  例如要更换后台登录的背景和相关样式
 找到index/login登录方法     admin/controller/Index.php
 return $this->view->fetch();
定位到样式页面:
admin/view/index/login.html
最简单的比如更换背景图           这个是最简单的改动  但是很实用,一般需要更换后台背景图
切换到CSS代码

```
 body{
                background-image: url('{$background}');
            }
```

从控制器里面拿到数据:

```php
        $background = Config::get('fastadmin.login_background');
        $background = $background ? (stripos($background, 'http') === 0 ? $background : config('site.cdnurl') . $background) : '';
```

最简单的实现办法:
直接去config.php文件里面进行配置(这是官方默认的方法)
如果是静态资源 使用后台设置的cdnurl 相关链接。
或者我们直接在index/login 里面写死$background的参数。而如果更复杂,我们要开发一个可以更换背景图的插件开发方法,当前功公共插件里面的插件。

2.首先我们创建一个插件 (可以使用插件命令) 
然后加入我们的配置:

```
[
'name' => 'mode',
'title' => '模式',   //选项的题目
'type' => 'radio',  //选项按钮
'content' => [      //选项里面的内容
'fixed' => '固定', 
'random' => '每次随机',
'daily' => '每日切换',
],
'value' => 'fixed',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
],
[
'name' => 'image',
'title' => '固定背景图',
'type' => 'image',    //显示的插件类型数据
'content' => [],
'value' => '/uploads/20240809/df28d93e11c0a76dbd005f81214c12c6.jpg',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
],

```

在我们的插件方法里面新增一个 adminLoginInit 方法。该方法就是设置view里面的pic参数
\think\View::*instance*()->assign('background', $background);
掌握一个技巧: 系统初始化登录的时候,是可以获取到插件里面最开始的执行方法的。该技巧不是官方demo,很难被用到,如果我们自己开发一个这样的插件,要不就是暴力修改config.php(这是不被允许的) 要么更改官方login登录方法,backgroud的参数获取方式,或者干脆直接加这段逻辑进去。

2.关联模型的理解(理解该模型能简化编程)
  这个是开发里面比较复杂的概念。在thinkphp里面 每个数据表都被设置为一个模型,主要有hasone(一对一是关联数据信息的)belongsto (多对1)
比如我设计了一张用户表 同时新项目新增了一张用户信息拓展表(也就是每个用户都能对应拓展表里面的数据信息)这个时候,可以使用到关联模型 hasone (新增关联模型) 
有关联模型在user模型里面: 

```php
   public function profile()
    {
        return $this->hasOne('Profile')->field('id,father,monther');
    }
```

我们在user表里面关联了用户的Profile数据表,然后读取profile表里的信息

```
$user = User::get(1);
echo $user->profile->father;
```

如果没有关联,额外需要根据uid 查询profile数据表再获取对应字段,现在因为有了关联,直接查询的时候就自动关联到了表里面的数据信息。主要是节约了构造join数据表查询数据的代码工作量。

3.模型的生成额外说明 
   关联模型(查表的时候使用到,默认系统查询的时候,会自动调用关联查询,方便度增加,但是性能损耗应该降低,一般很少场景会用到关联查询,本来拆表的目的就是为了简化查询)
  全局模型类型(建议勾选上,这样前端只要直接use 就可以使用静态方法,而不是自己去手动建)
 删除模式(删除模式的命令无法通过命令行执行,必须通过CLI去执行,因为有个确认操作)
强制覆盖模式(频繁的改数据表 需要强制覆盖删除数据)
组件使用官方默认定义的即可(要不然每次自己都会忘记自己的命名规范)

4.列表选择的时候,拉取name的名字,但是实际在列表里面显示的办法
  一个是使用关联  关联最大的问题在于性能可能存在问题
 更常用的一个解决方法是字段的冗余,设计数据表的时候,额外储存改id对应的name名字,同时在add的时候,将该值直接加进去。
场景还是挺多的,基本每个项目都需要关联数据表的查询,但是实际列表里面又不显示。所以勾选显示字段的时候,需要注意,不能勾选。

主要改动: 移除列表里面关联id的显示,显示数据表里面对应的name字段(确保操作人员看到的不仅仅是id)
后台新增或者编辑的时候,去拉取下对应数据表,获取name字段的值,写入系统里面。需要复制add/edit方法到模板里面,同时将视图里的name数据也一并移除,因为后端会自动关联ID到数据表里面。

5.前端数据拉取的相关结构:
   拉取关联用户数据列表的办法(这是生成后,需要进行微调的地方)

```
   <div class="form-group">
        <label class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>
        <div class="col-xs-12 col-sm-8">
            <input id="c-user_id" data-rule="required" data-source="user/user/index" data-field="nickname" class="form-control selectpage" name="row[user_id]" type="text" value="{$row.user_id|htmlentities}">
        </div>
    </div>
```

7.表单功能禁止删除  只要在初始化的时候,禁止即可
Table.api.init({
    extend: {
        index_url: 'banji/index' + **location**.search,
      //  add_url: 'banji/add',
     //   edit_url: 'banji/edit',
      //  del_url: 'banji/del',
        multi_url: 'banji/multi',
        import_url: 'banji/import',
        table: 'banji',
    }
});

再删除视图里面的增加修改删除。即可限制新增  删除

8.thinkphp的语法扩充: 语法糖(API常用分页列表操作)
$newslist = self::*where*('status', 'normal')
    ->field('descontent', true)
    ->where('ztype',$ztype)
    ->paginate($limit);
典型的分页  可以获取查询  字段排除  条件

9.自动生成API文档
 采用的是反射查询API的模式   例如以以下为demo 
 有API路由  有方法  有参数和响应
不过生成的API最大的问题
  一个是开发的时候不方便测试或者组合逻辑的时候(特别涉及到token相关参数)
第二个是无法共享给公共库(很多公共API其实是共享的,但是生成的只是单独项目)
第三个最大的问题在于频繁逻辑的改动,改文档非常麻烦,但是只改一次接口就简单很多。

```
    /**
     * 
     * @ApiTitle    (微信小程序登录)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/xcx/login/index)
     * @ApiParams   (name="openid", type="string", required=false, description="唯一标识")
     * @ApiParams   (name="sessionKey", type="string", required=false, description="秘钥")
     * @ApiParams   (name="iv", type="string", required=false, description="偏移量")
     * @ApiParams   (name="cate", type="string", required=false, description="顾客:user,员工:staff,默认staff")
     * @ApiParams   (name="encryptedData", type="string", required=false, description="加密串")
     * @ApiParams   (name="inviter_code", type="string", required=false, description="邀请人code")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="data", type="object")
     * @ApiReturn   ({
    "code": 1,
    "msg": "登录成功",
    "time": "1713971279",
    "data": {
    "token": "08667f4a-854d-439e-8c7f-c4e887b1d062",
    "group_id": 1
    }
    })
     */
```

10.框架的优缺点
 优点:如果你项目比较常规,基本都是关联+增删改查  会完成的非常快,而且易用性也还不错。但是如果碰上定制化的后台页面,改动逻辑就非常大了。
比如完成课程表的定制,发现非常复杂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大梁来了

千山万水总是情,打赏一块行不行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值