• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
Prev

SIYUCMS 系统的一些技巧

Data: 2021-06-23 17:25:34Form: JournalClick: 28

1、数据库信息要写到.env文件里头才有效果,config/database.php文件里头不会生效

 

2、URL地址默认是/index/Article/index.html?cate=5这样格式,有个index不好看。去掉的方法是
①\config\app.php。增加'app_express' => true,//运用不存在时,访问默认路由(去掉URL/index/的方法,这样就可以访问无index地址不会报错了,这步骤无需伪静态搭配),但是这个方法不能让内页url去掉index,所以选方法②
②、修改\public\index.php。$http->name('index')->run();这样直接访问没index的时候,直接定义到index的控制去。
但是这样就有后台无法访问的问题,把网站主目录下index.php复制一个变成admin.php。然后里头的index改成 ->name('admin')
然后在nginx伪静态那里设置以下
location / {
      if (!-e $request_filename){
          rewrite ^/admin(.*)$ /admin.php?s=$1 last;
          rewrite ^/index(.*)$ /index.php?s=$1 last;
          rewrite ^(.*)$ /index.php?s=$1 last; break;
      }
}

 

栏目未设置目录的情况下
url会变成/index/Article/index.html?cate=5,设置以后就会去掉index地址变成/information.html,标黄的index访问因为之前已经强制路由调整解析的原因会报错,修复的方法是
\vendor\topthink\think-multi-app\src\Url.php,
protected function getAppName()
    {
        $app = $this->app->http->getName();
        //URL去掉index后,链接包含index的修复方法
        if($app=='index'){
            $app='';
        }
        $map = $this->app->config->get('app.app_map', []);
 
        if ($key = array_search($app, $map)) {
            $app = $key;
        }

 

3、\index\controller为控制器目录。Error.php为内容控制器。\route目录或者route.php为路由定义器
4、内置标签都在 \app\common\taglib\Tp.php 中修改。
5、成功或者失败标签使用 $this->error(‘提示信息’,‘跳转的URL地址’,‘返回的数据’,‘跳转等待时间’,‘发送的Header信息’)。异步方法使用 result,传值都一样只是URL项变成返回code值。只跳转的方法是$this->jump('url')。
6、 页面传值的方法 View::assign(['iframe' => false])。
7、模型字段增加数据以后再调整字段可能模型列表不会显示数据,就要去模型列表那边生成代码才能解决该问题。
8、其他模块字段增加调用栏目数据时,不可使用cate_id名称。使用cate_id会筛选模型分类,导致无法全选所有分类。不可使用cate,会导致列表出不来。
9、控制器模块可以引用系统组件来完成功能,例如:
use think\facade\Request;[数据接收模块,不仅仅支持post与get方法支持,具体看文件说明]
use think\facade\View;[页面数据传达支持]
use think\facade\Session;[session支持]
use app\common\model\Module;[引入该数据表,用于数据库操作]
10、
Request::get('取值名称', '无数据时输出', '过滤方法')

 

11、公共方法写在 \app\common.php 文件中
12、大量数据索引还是不快的情况下,考虑order根据索引排序会快一些。
13、有些字段结果会被系统优化一定要检查字段类型还有是否绑定了字典
14、后台栏目需要增加顶部的方法是
①、public\static\plugins\siyu-ui.js 里增加执行方法
②、如果是需要弹出新窗口内容方法,就要去app\admin\controller\Base.php里头增加对应方法。
③、需要选中变化效果就在按钮class增加.multiple【默认置灰,选中数据可用】或者.single【默认与多数据置灰,选中单数据可用】名称
④、传输多id参考系统自带批量操作方法,使用rows.join()传值即可。
⑤、base里头的方法可以直接接收get值、json值等
public function del(string $id)
⑥、方法里头构建页面使用
// 构建页面
$builder = FormBuilder::getInstance();
$builder->setExtraCss($css)//$css添加css字符数据
->setExtraJs($js)//$js添加js字符数据
->addHtml($html);//$html添加html字符数据
return $builder->fetch();
⑦、模型里增加按钮方法是
// 构建页面
        return TableBuilder::getInstance()
            ->setUniqueId($pk)                                         // 设置主键
            ->addColumns($columns)                                     // 添加列表字段数据
            ->setSearch($search)                                       // 添加头部搜索
            ->addColumn('right_button', '操作', 'btn')                 // 启用右侧操作列
            ->addRightButtons(['edit', 'delete','preview' => ['title' => '查看']])                      // 设置右侧操作列
            ->addTopButtons(['add', 'edit', 'del', 'export', 'build']) // 设置顶部按钮组
            ->addTopButton(
                'default', [
                    'title'   => '生成菜单规则',
                    'icon'    => 'fa fa-bars',
                    'class'   => 'btn btn-danger single disabled',
                    'href'    => '',
                    'onclick' => '$.operate.makeRule(\'' . url('makeRule') . '\')'
                ]
            )                                                          // 自定义按钮
            ->fetch();
其中addRightButtons 支持type、title、icon、class 等自定义自带参数,参数文件 TableBuilder.php 的 addRightButton 方法
执行事件需要去layout.html 去重新定义事件,并且 TableBuilder.php 的 addRightButton 里也需要增加对应case赋予样式,URL分类地址在 TableBuilder.php 的 initialize 添加以后要去\view\admin\table_builder\layout.html 修改js执行事件
  
右侧按钮需要原理同上
默认没有onclick参数,可在layout.html增加新赋值传递()与''需要转义,不然会报错。id值没有办法直接参数传递,可在layout.html增加js判断
  15、Linux下文件名大小写非常敏感,上传后出错一定要优先排查大小写问题。
16、宝塔添加站点后会对目标文件夹添加775所有者权限,如果文件很多的话,需要等待很久
17、tp自带标签在这边编辑添加
\vendor\topthink\think-template\src\template\taglib\Cx.php
\app\common\taglib\Tp.php

 

18、一个类里头要调用另外一个类的方法可以使用静态调用。
public static function add_user_list($url_list=array()){ 要调用的方法,加上标黄静态标签
\app\index\controller\Index::add_user_list($content,$this->collection_key); 直接加上路径调用即可
19、模型不填写栏目的方法。去修改后台模型类型从CMS改成后台,然后生成代码来生效!
20、模型如果使用数据源分类的是模型数据 导致数据不显示的话,可以重新生成模型代码试试,还不行就改成字段本身,不影响添加下拉数据,区别是列表页展示时不显示来源数据的最终字段名称
21、表单的提交、删除、状态等命令集合在 siyu-ui.js,框架采用 bootstrapTable,参考命令可以查阅 http://doc.ruoyi.vip/ruoyi/document/qdsc.html
22、内容表单的格式可以去 \view\admin\form_builder\items 寻找对应表单格式来修改。
23、高级下拉表格,去\admin\controller\Index.php 修改输出参数,可以根据id来赋予参数值
24、模型名称不能带_字符会报错,直接使用驼峰命名法即可。
25、后台表单数据处理方式
①、去生成的模型文件修改,例如ProgressInfo模型就去\app\admin\controller\ProgressInfo.php 添加内容,默认事件在Base.php里头复制过来修改即可
②、表单处理 \app\common\builder\MakeBuilder.php 与 \app\common\builder\FormBuilder.php 
数组偏移参数每个表单不一样,以实际输出为准。
官方文档 https://www.kancloud.cn/a173512/thinkphp6/2507366#getgetAddGroupsstring_modelName_string_tableName_array_columns_FormBuilder_287
26、下拉表单默认显示的参数可以在字段设置这边来调整,如"请选择"改成其他

 

27、thinkphp 上传代码
$files = request()->file('file');
        try{
            // 验证
            validate(['file'=>[
                'fileSize' => 410241024,
                'fileExt' => 'jpg,jpeg,png,bmp,gif,xlsx,xls,XLSX,XLS,xlsx,xls,XLSX,XLS,doc',
                'fileMime' => 'image/jpeg,image/png,image/gif', //这个一定要加上,很重要我认为!
            ]])->check(['file' => $files]);
            // 上传图片到本地服务器
            $saveName = \think\facade\Filesystem::disk('public')->putFile( 'project', $files, 'data');
            $this->returnok('图片上传成功!', $saveName);
        } catch (\Exception $e) {
            // 验证失败 输出错误信息
            $this->returnerror('图片上传失败!');
        }
        exit();

 

28、表单$.modal.xx 与 $.operate.xx 方法都在siyu-ui.js定义好,非 bootstrap 组件命令
29、列表的异步搜索数据,就是模型文件里头的
if (Request::param('getList') == 1) {
里头内容,可以根据特别标记来修改返回数据,格式为
"total"=>返回总数,
"per_page"=>分页数,
"current_page"=>当前页数,
"last_page"=>最后页数,
"data"=>数据组,必须是[]索引方式,array{}方式不好使,
然后将结果json_encode返回即可
30、
 // 查找当前控制器和方法,控制器首字母大写,方法名首字母小写 如:Index/index
        $route = Request::controller() . '/' . lcfirst(Request::action());
31、支付或者接口输出不想要调试工具干扰,可以用exit(内容),来代替echo输出,就没有调试器了。
32、用户权限问题:设置好用户权限以后,需要清理缓存重新登录后生效。设置新的页面功能时,需要去后台新建菜单并隐藏且菜单不能带参数,这样才不会出现 没有权限的问题。公共方法无需权限验证可加入白名单 \app\admin\middleware\Admin.php  里的 handle 方法
33、表单默认修改显示筛选状态可以去修改
\app\common\builder\MakeBuilder.php 里的 getListSearch 函数
这个函数是控制 获取列表需要的搜索字段
 if (Request::param($field['field']) || Request::param($field['field']) === "0") {
                $field['default_value'] = Request::param($field['field']);
            }
            //status 默认值是显示状态(之前是显示所有)
            if ($field['field'] == 'status') {
                $field['default_value']=1;
            }
            // 添加到返回数组中(注意顺序不可变)
            $items[] = [
34、列表想变成树形态展示
在构建页面时增加该参数即可
->setPagination('false')                  // 关闭分页显示
        ->setParentIdField('parentid')                 // 设置列表树父字段id
其余方法参照 原有系统的 AuthRule 方法即可(开启该功能后,需要在对应 \app\common\model\模型名.php,加入以下代码来统一getList 方法返回数据,不然调用base的方法会报错。原生的tree方法需要数据包含pid字段,如无会报错
// 获取列表
    public static function getList(array $where = [], int $pageSize = 0, array $order = ['sort', 'id' => 'desc'])
    {
        $list = self::where($where)
            ->order($order)
            ->select()
            ->toArray();
       
        //处理缺少的pid字段
        foreach ($list as $k => $v) {
            $list[$k]['pid']  = $v['parentid'];
        }
        $list = tree($list);
        // 渲染输出
        $result = [
            'total'        => count($list),
            'per_page'     => 10000,
            'current_page' => 1,
            'last_page'    => 1,
            'data'         => $list,
        ];
        return MakeBuilder::changeTableData($result, 'UserOrganization');
    }

  

35、在thinkphp里搜索 “字段值增长” ,就可以看到所有的thinkphp数据处理函数
36、layer 提交事件 在cnhuiyou.js 里的 function formSubmit($this) { 函数,事件需要增加执行遮罩层,避免重复操作
37、自带 redirect 有重定向方法,可隐射新的url地址
38、自定义列表 TableBuilder 方法里getList的where传值方法是[array('line_id','=',$id),array('status','=','1')]
        默认id无法代入,就设置默认数据源URL(需要TableBuilder .php里增加方法,具体参考setAddUrl)
            ->addTopButtons(['add','edit','del'])            // 设置顶部按钮组
            ->setSortUrl('/admin/Line/scenic_sort.html')                            // 设置排序地址
            ->setData_url('/admin/Line/scenic.html?getList=1&id='.$id)
            ->fetch();

 

 39、数据字典映射及个别字段排除的方法
// 处理数据(把列表中需要处理的字段转换成数组和对应的值)

        $list['list'] = changeFields($list['list'], 28,"score,visit");


 image.png

image.png

40、前台分页{$page}文件地址在 \vendor\topthink\think-orm\src\paginator\driver\Bootstrap.php




Name:
<提交>