bear小熊开发助手

前言

[TOC]

Bear是什么?

快速标签生成品。

使用此助手需要有一定PHP经验,小白不建议使用,可以先看下PHP手册,或者PHP相关的视频!

目前文档还不是很完整,整理中...

地址

重构中,待开放...

Bear有哪些功能?

  • HTML生成
  • 模块管理
  • 数据库模块绑定

有问题反馈

在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

感激

感谢以下的项目,排名不分先后

  • hdphp
  • layui
  • smarty()

关于作者

一个纯粹的PHPer.

相关文档

SMARTY 文档地址 https://www.smarty.net/docs/zh_CN/

layui 示例 http://www.layui.com/demo/form.html

layui 后台模板 http://www.layui.com/admin/std/dist/views/

layui 文档 https://www.layui.com/doc

bootstrap table http://bootstrap-table.wenzhixin.net.cn/

使用方法

使用

use \bear\Bear;

常见参数/名词解释

html 和 class 命名原则

如果param中没有设置CLASS和ID,默认的CLASS和ID 'bear-(表单的name)'

其它参数

第个表单,我们都会赋予其它的一些属性或者参数,共同参数
参数含义类型
classHTML CLASS样式名string
idhtml idstring
placeholder提示信息string
tip表单下面位置的提示信息string

布局

[TOC]

布局

用法

Bear::make('layout')

正确

[TOC]

正确页面

用法

return Bear::make('layout')->success($msg,$backurl)

错误页面

[TOC]

错误页面

用法

return Bear::make('layout')->error($msg)

页面继承

[TOC]

错误页面

用法

return Bear::make('layout')->extends($templatePath,$data);

页面加载

[TOC]

错误页面

用法

return Bear::make('layout')->view($templatePath,$data);

后台iframe

[TOC]

后台IFRAME页面

用法

$data['leftMenu']   ="" ;//左侧菜单
$data['defaultUri'] = '/manager/welcome';//默认加载首页
$userInfo['avatar'] = "";//管理员图像
$data['userInfo'] = $userInfo;
$data['notice']['open_notic_windows'] = true/false;//右下角弹出窗
$data['notice']['notice'] = setting('notice');//弹出窗内容
return Bear::make('layout')->iframeWindows($data);

公共布局

setTab 设置TAB切换

[TOC]

设置TAB切换

用法

默认第一个回调函数参数为this本身

DEMO图

使用FROM

 return Bear::make('form')
        ->setLeftMenu($leftMenus)
        // ->addStatic('<div class="ibox float-e-margins"> <div class="ibox-title"><h5>基本数据</h5> </div> </div>')
        ->addText('table','表名',$table,['readonly'=>'readonly'])
        ->addText('field','字段',$fieldInfo['Field'],['readonly'=>'readonly'])
        ->addText('alias_name','别名',$alias_name)
        ->addSelect('mold','类型',Bear::make('form')->getFormType(),$mold)

        ->addRadio('is_show_list','是否列表显示',['否','是'],(int)$is_show_list)
        ->addText('sort_list','列表显示排序',(int)$sort_list)

        ->addRadio('is_write','是否可编辑',['否','是'],(int)$is_write)
        ->addText('sort_edit','编辑显示排序',(int)$sort_edit)
        ->addText('role','验证规则',$role,['tips'=>'查看支持的规则列表<a target="_blank" href="http://doc.jerryblog.cn/docs/show/504">点击查看</a>多个用|分隔'])
        ->addText('insert_before','数据插入',$role,['tips'=>'数据入库前的处理,支持htmlspecilchar,encode<a target="_blank" href="http://doc.jerryblog.cn/docs/show/505">点击查看</a>多个用,号隔开'])
        ->addText('select_after','数据查找',$role,['tips'=>'数据查出后的函数处理,支持htmlspecilchar_decode,decode<a target="_blank" href="http://doc.jerryblog.cn/docs/show/506">点击查看</a>多个用,号隔开'])
        ->addTextarea('remark','备注',$remark)
        ->setNav('基本设置',['table','field','alias_name','mold',])
        ->setNav('列表设置',['is_show_list','sort_list'])
        ->setNav('编辑设置',['is_write','sort_edit','role','insert_before','select_after','remark'])
        ->fetch();
  
  
  
  

其它写法

setNav([
    '基本配置'=>['title','wx_return_type','sort'],
    '标题配置'=>['pre_title','return_title_field','nex_title'],
    '描述配置'=>['pre_des','des','nex_des'],
    ])

表单

[TOC]

表单

用法

Bear::make('form')

addAlert 提示信息

[TOC]

提示信息

用法

addAlert(field,title,kind)

demo

addAlert('这是一条Alert提示信息','danger')

参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型
title标题string
kind类型(参考前言介绍)string

kind (color)

类型名类型
defaultstring
primarystring
infostring
successstring
mintstring
warningstring
dangerstring
pinkstring
purplestring
darkstring

addText 单行文本

[TOC]
单行文本

用法

addText(field, title,default,[params])

demo

addText('text','单行文件框')

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型
field字段名string
title标题string
default默认值string

其它参数

第个表单,我们都会赋予其它的一些属性或者参数,共同参数
参数含义类型
classHTML CLASS样式名string
idhtml idstring
placeholder提示信息string
tip表单下面位置的提示信息string
verify验证规则string
autocomplete自动完成string

addPassword 密码框

[TOC]

密码框

用法

addPassword(field, title,default,[params])

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型
field字段名string
title标题string
default默认值string

其它参数

第个表单,我们都会赋予其它的一些属性或者参数,共同参数
参数含义类型
classHTML CLASS样式名string
idhtml idstring
placeholder提示信息string
tip表单下面位置的提示信息string
verify验证规则string
autocomplete自动完成string

demo

->addPassword('text','密码','',['class'=>'text','id'=>'test','alt'=>'test','tips'=>'这里填写密码'])

addRadio单选框

[TOC]

单选框

用法

addRadio(field, title,options,default)

demo

->addRadio('radio','单选按钮',['选项一','选项三'])

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型
field字段名string
title标题string
options选项array eg:见options介绍
default默认值string

addCheckbox 复选框

[TOC]

复选框

用法

addCheckbox(field, title,options,default)

demo

addCheckbox('radio','多选按钮',['选项一','选项三'])

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型
field字段名string
title标题string
options选项array eg:见options介绍
default默认值string

addSwitch 开关

[TOC]

开关

用法

addSwitch(field, title,options,default)

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型
field字段名string
title标题string
options选项array eg:见options介绍
default默认值string

demo

->addSwitch('switch','开关')

options

单选的用法和复选类似,请参照复选的用法。

addSelect 选择

[TOC]

普通下拉

addSelect('select','选择SELECT',['选项目1','选项2'])

带搜索下拉
addSelectChosen('addselectChosen','选择SELECT,带搜索',['选项目1','选项2'])

addDate日期时间

[TOC]

日期时间

文档地址

http://www.bootcss.com/p/bootstrap-datetimepicker/

用法

addDate(field, title,default,[param])

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型
field字段名string
title标题string
options选项array eg:见options介绍
default默认值string

parm->format 参数

yyyy-mm-dd
yyyy-mm-dd hh:ii
yyyy-mm-ddThh:ii
yyyy-mm-dd hh:ii:ss
yyyy-mm-ddThh:ii:ssZ

           |


addimg上传图片

[TOC]

上传图片

更多附件相关操作,请参考 扩展 附件上传

用法

addImg(field, title,default)

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型
field字段名string
title标题string
default默认值string

demo

 ->addImg('imgs','图片','')

php后台代码

 $info = File::upload();
  if(!File::getError()){
    Bear::returnJson(0,'上传成功',['path'=>$info[0]['path']]);
  }

setAction 设置表单提交地址

[TOC]

设置表单提交地址

用法

setAction($url)

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型
url提交地址string

setMethod 提交方式(POST,GET)

[TOC]

设置表单提交方式

用法

setMethod($type)

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型
type提交方式eg:post,get

setTitle 设置标题

[TOC]

设置标题

用法

setTitle($title)

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型
title标题string

setValidate 设置数据验证

[TOC]

设置数据验证

用法

setValidate($rule,$msg)
$rule =  [
        'name|姓名'  => 'require|max:25',
        'age'   => 'number|between:1,120',
        'email' => 'email',    
    ];
$msg  =   [
         'name.require' => '名称必须',
         'name.max'     => '名称最多不能超过25个字符',
         'age.number'   => '年龄必须是数字',
         'age.between'  => '年龄只能在1-120之间',
         'email'        => '邮箱格式错误',    
     ];

后台数据接收用法

setTrigger 设置触发器

[TOC]

设置触发器

支持多触发器

用法

setTrigger($field,$value,$show);

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型
field字段名string
value选中的值多个以,号隔开
show要显示的字段多个以,号隔开

demo

 ->setTrigger('mold','radio,checkbox,switch,select,select','options')##radio都需要参数,所有选中显示参数

sort 排序处理

[TOC]

排序处理

用法

sort($data);

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型
field字段名string
value选中的值多个以,号隔开
show要显示的字段多个以,号隔开

data 格式

$data = [
    ['id'=>'1','title'=>'test'],
    ['id'=>'2','title'=>'test2'],
];

addStatic

[TOC]

静态文件

用法

->addStatic($html);

基本参数

单选的用法和复选类似,请参照复选的用法。

data 格式

->addStatic("<div>这是测试static</div>");

编辑器

addMdeditor
addUeditor
addWangeditor
addIcon
addFile

[TOC]

上传文件

更多附件相关操作,请参考 扩展 附件上传

用法

addFile(field, title,default,['exts'=>'zip|txt'])

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型
field字段名string
title标题string
default默认值string
exts默认值 选择accecpt里面的附件类型见exts传参

exts传参:zip|txt

表格

表头数据处理

[TOC]

添加表头

用法

addColumn($field,$title,$param)

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型是否必须
field字段stringY
title标题stringY
param参数见表头参数表N

表头参数一览表

详细可以参照 layui 表格文档 https://www.layui.com/doc/modules/table.html#cols
参数类型说明示例值
fieldString(必填项)设定字段名。字段名的设定非常重要,且是表格数据列的唯一标识username
titleString(必填项)设定标题名称用户名
widthNumber/String设定列宽(默认自动分配)。支持填写:数字、百分比。
minWidthNumber局部定义当前常规单元格的最小宽度(默认:60),一般用于列宽自动分配的情况。其优先级高于基础参数中的 cellMinWidth100
typeString设定列类型。可选值有:<br/>normal(常规列,无需设定)、<br/>checkbox(复选框列)、<br/>space(空列)、<br/>numbers(序号列)。任意一个可选值
LAY_CHECKEDBoolean是否全选状态(默认:false)。必须复选框列开启后才有效,如果设置 true,则表示复选框默认全部选中。true
fixedString固定列。可选值有:<br/>left(固定在左)、<br/>right(固定在右)。一旦设定,对应的列将会被固定在左或右,不随滚动条而滚动。 注意:如果是固定在左,该列必须放在表头最前面;如果是固定在右,该列必须放在表头最后面。left(同 true) right
sortBoolean是否允许排序(默认:false)。如果设置 true,则在对应的表头显示排序icon,从而对列开启排序功能。true
unresizeBoolean是否禁用拖拽列宽(默认:false)。默认情况下会根据列类型(type)来决定是否禁用,如复选框列,会自动禁用。而其它普通列,默认允许拖拽列宽,当然你也可以设置 true 来禁用该功能。false
editString单元格编辑类型(默认不开启)目前只支持:text(输入框)text
eventString自定义单元格点击事件名,以便在 tool 事件中完成对该单元格的业务处理任意字符
styleString自定义单元格样式。即传入 CSS 样式background-color: #5FB878; color: #fff;
alignString单元格排列方式。可选值有:left(默认)、center(居中)、right(居右)center
--sort 设置排序

[TOC]

设置排序

用法

addColumn($field,$title,['sort'=>true])

参数获取

use bear\sys\make\Make;
$sort = Make::getSort();

返出 string
表行数据处理

[TOC]

edit 可编辑字段

[TOC]

设置可编辑字段

X-editable DEMO

http://vitalets.github.io/x-editable/demo-bs3.html

用法

addColumn($field,$title,['edit'=>text])

类型选择

| 类型 | 含义 |
| ----------- | --------- |
| text | 文本框 |
| textarea | 文本框 |
| select | 文本框 |
| date | 文本框 |
| checklist | 文本框 |

更多类型可参考 x-editbale 文档

参数获取

use bear\sys\make\Make;
$sort = Make::getSort();

返出 string
匿名函数使用

[TOC]

使用匿名函数

用法

默认,我们会传入当前数据数组入匿名函数

如果有多个参数,在匿名函数后面传入 如下demo的$sendo

demo1 设置属性

 ->addColumn('remark','备注信息',['width'=>100])


        

demo 2 设置回调

->addColumn('subscribe','是否关注微信',function($data){
            return $data['subscribe']>0?'是':'否';
        })

demo 同时设置属性和回调


$sendo = 'test';
 ->addColumn('remark','备注信息',['width'=>'150','callback'=>function($data){ return $data['title'].$sendo;}],$sendo)
setCheckbox 第一排多选框

[TOC]

添加表头多选框

默认开启

用法

setCheckbox($status)

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型是否必须
status数据bool true/falseN 默认为不显示
setData 添加表数据

[TOC]

添加表头

用法

之前的SETPAGES方法已不再使用,全集成成此方法中
setData($data)

基本参数

单选的用法和复选类似,请参照复选的用法。 参数自动分页处理

参数含义类型是否必须
data当前页数据arrayY

demo

 $dataList = Db::table($table,true)->where(getSearch())->paginate(10);
    return $html
            ->setData($dataList)
            ->addTopBtn('sort','列表排序',['url'=>$this->rote."sort?table={$table}&f=list_sort",'class'=>'bearAlert'])
            ->addRightBtn('edit','编辑',['href'=>$this->rote."dataEdit?itemid={$itemid}&id={id}"])
            ->addRightBtn('del','删除',['href'=>$this->rote."dataDel?itemid={$itemid}&id={id}"])
            ->fetch();

setTable 设置表名

[TOC]

设置表名

用法

setTable($table)

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型是否必须
table表名stringY
setPk 设置主键

[TOC]

设置主键

用法

setPk($pk)

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型是否必须默认
pk主键stringNid
addTopBtn 顶部按钮

[TOC]

设置顶部按钮

用法

addTopBtn($tag,$title,$para)

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型是否必须默认
tag标签stringN不可重复
标题显示的文字stringN不可重复

para

参数含义类型是否必须默认
confirm弹出确认框stringN-
confirm-msg确认框的信息stringN-
submitPOST提交stringN-
submit-msg弹出框的信息stringN-
addRightBtn 右侧按钮
同顶部按钮属性一至

[TOC]

设置右侧按钮

用法

addRightBtn($tag,$title,$para)

基本参数

同顶部按钮属性一至

submit

属性名描述
submit-msg提示信息
submit-method提交方式 post get
href提交URL

confirm

属性

属性名描述
confirm-msg提示信息
method提交方式 post get
href提交URL
setSearch 设置搜索条件

[TOC]

设置搜索条件

用法

setSearch(['id'=>'主键','title'=>'标题'])
export导出

[TOC]

添加表头

用法,只接受闭包写法

export(function($arg1,$arg2,$arg3){
   return DB::table($table)->get();
},$arg1,$arg2,$arg3)

demo

setFixedColumns

冻结列

用法

setFixedColumns($number)

基本参数

单选的用法和复选类似,请参照复选的用法。

参数含义类型是否必须默认
number冻结列数intN数字,默认为1
模型
快速页面构造
快速生成常用的页面
rbac权限管理

[TOC]

继承


use bear\module\layout\Rbac as rb;
class Rbac extends rb
{

   

}
权限组

[TOC]

后台用户组管理

方法

admingroup

使用说明

需要数据库

组授权
后台管理页面
快速后台

[TOC]

后台用户组管理

方法

admingroup

使用说明

需要数据库

欢迎页

[TOC]

欢迎页

用法

Bear::make('form')->welcome();
配置项(文件)页

[TOC]

场景说明

有很多时候,比如我们调试的时候,总是要层层目录找目录文件,这时候如果有个方便的后台管理,直接生成配置文件,可以帮助我们更快捷的开发

方法

config::get('配置项目名.配置名')
##
默认为
config::get('web.配置名')
提交的配置文件,默认会写入到 bear/framework/config/web.php文件中

使用说明

配置常用的站点设置,如支付宝,QQ,微信等配置文件设置

需要数据库


CREATE TABLE `setting` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `varname` varchar(255) NOT NULL COMMENT '字段名',
  `value` text COMMENT '变量值',
  PRIMARY KEY (`id`),
  UNIQUE KEY `varname` (`varname`)
) ENGINE=MyISAM AUTO_INCREMENT=193 DEFAULT CHARSET=utf8 COMMENT='系统设置';

字段说明

参数含义类型
varname配置名string
valuestring
使用DEMO

demo

在任何controller中的method类使用如下代码

use bear\module\post\Setting;

if(Setting::save($_POST,'system_setting','web')===true){
          returnJson(0,'操作成功');
 }

 return bear('form')
    ->setTitle('配置')
    ->addImg('wx_reply', '微信回复内容',getset('wx_reply'))
    ->addText('site_name', '网站名称',getset('site_name'))
    ->fetch(); 

页面预览

权限控制页
登陆/注册

demo

public function login(){
      if(Bear::isPost()){
          Post::login();
          exit();
      }
     return Bear::make('form')->copyright('<p>Designed By Jerry &amp; <a href="https://jerryblog.cn">jerryblog.cn</a> 2018</p>')->logo('http://bear.jerryblog.cn/bear/images/blank.png')->loginurl(url('ucenter/login'))->regurl('')->fetch('form/login');

 }
数据验证
crypt key:当前token
后台验证

[TOC]

bearMark使用

->setValidate($rule,$msg)

rele

  [
        'name|姓名'  => 'require|max:25',
        'age'   => 'number|between:1,120',
        'email' => 'email',    
    ]

独立验证

任何时候,都可以使用Validate类进行独立的验证操作,例如:

use bear\sys\validate\Validate;
$data = [];
      Validate::rule([
        'name|姓名'  => 'require|max:25',
        'age'   => 'number|between:1,120',
        'email' => 'email',    
    ]);
    

      $result   = Validate::check($data);
      show(Validate::getError());
前台验证
微信
配置项

[TOC]

微信常规配置

使用页面构造的微信配置

if(s::save($_POST,'system_setting','web')===true){
              returnJson(0,'操作成功');
     }
    return bear('form')
    // ->setAction(url('sys/post/setting'))
    ->setTitle('微信消息配置')
    ->addText('wx_AppId', 'AppId',getset('wx_AppId'))
    ->addText('wx_AppSecret', 'AppSecret',getset('wx_AppSecret'))
    ->addText('wx_mchid', '商户ID',getset('wx_mchid'))
    ->addText('wx_paysignkey', '支付密钥',getset('wx_paysignkey'))
    ->addTextarea('wx_apiclient_cert', '支付证书cert',getset('wx_apiclient_cert'),['tips'=>'请在微信商户后台下载支付证书,用记事本打开apiclient_cert.pem,并复制里面的内容粘贴到这里。'])
    ->addTextarea('wx_apiclient_key', '支付证书key',getset('wx_apiclient_key'),['tips'=>'请在微信商户后台下载支付证书,用记事本打开apiclient_key.pem,并复制里面的内容粘贴到这里。'])

    ->fetch(); 
关键字回复

[TOC]

方法

## 列表
use bear\module\wx\Wx;
 return Wx::replyList();
## 添加

使用说明

配置常用的站点设置,如支付宝,QQ,微信等配置文件设置

需要数据库


CREATE TABLE `wx_reply` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `type` varchar(60) NOT NULL COMMENT '回复类型:text,images,news,voice,music,video',
  `title` varchar(250) DEFAULT NULL COMMENT '标题(适用图文)',
  `content` text COMMENT '文本内容',
  `url` varchar(500) DEFAULT NULL COMMENT '资源地址',
  `link` varchar(500) DEFAULT NULL COMMENT '连接(图片连接,图文连接等)',
  `status_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1:永久0:临时',
  `media_id` varchar(120) DEFAULT NULL COMMENT '媒体ID',
  PRIMARY KEY (`reply_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='关键字回复';
数据模型管理
数据表列表

[TOC]

方法

## 列表
use bear\module\smartdb\Smartdb;
 return  Smartdb::tableList('test(库名)');
## 添加

使用说明

配置常用的站点设置,如支付宝,QQ,微信等配置文件设置

需要数据库


use bear\module\smartdb\Smartdb;
class Database 
{

  public function table(){
    return Smartdb::tableList('test(库名)');
  }
项目管理

[TOC]

方法

## 列表
use bear\Bear;

return Bear::module('smartdb')->item();

## 添加
return Bear::module('smartdb')->edit();

使用说明

配置常用的站点设置,如支付宝,QQ,微信等配置文件设置

需要数据库

扩展

相关扩展

以下为BEAR的相关扩展,可以选择不使用,不会影响BEAR生成器的使用
数据库

[TOC]

文档地址

mdeoo文档地址 https://medoo.lvtao.net/doc.where.php
数据库组件文件 http://doc.hdphp.com/215185

配置文件地址

有关上传处理的配置项位于 bear/framework/config/upload.php 配置文件中,请查看文件内容修改成满足项目需求的配置项。

数据模型

[TOC]

介绍

数据模型是指,通过bear:make封装一些常用的页面,如配置文件,分类文章管理

查询构造

[TOC]

从数据表中取得所有的数据列

Db::table('user')->get();

取得指定的字段

Db::table('user')->get(['username','age']);

从数据表中取得单一数据列

Db::table('user')->where('username','向军')->first();

//取出指定主键的值
Db::table('user')->first(2);

从数据表中取得单一数据列的单一字段

Db::table('user')->where('username', '向军')->pluck('username');

//返回第一条记录的 username 字段值

取得单一字段值的列表

Db::table('user')->lists('username');
//满足条件记录的所有username字段
[
    [0] => admin
    [1] => hdxj
]

返回一维数组,第一个字段做为键名使用,第 2 个字段做为键值

Db::table('user')->lists('id,username'); 
//id 字段做为键名使用
[
    [1] => admin
    [2] => hdxj
]

多个字段返回二维数组,第一个字段值做为键名使用,其余字段做为键值

Db::table('user')->lists('id,username,age');

//返回值如下
[
    [1] => [
            [id] => 1
            [username] => admin
            [age] => 22
           ]

    [2] => [
            [id] => 2
            [username] => hdxj
            [age] => 67
           ]
]

like模糊查询

第三个参数为null时,查询忽略

Db::table( 'rule' )->where( 'name','like', "%后盾人%" )->get()

指定查询结果字段

Db::table('user')->field('username AS name,age')->get();
或
Db::table('user')->field(['username','age'])->get();

根据某个字段查询

Db::table('user')->getByName("hdphp");
//返回一条记录

增加查询子句到现有的查询中

$db = Db::table('user')->field('username AS name','age','id');
$db->where('id','>',2)->get();

使用 where 及运算符

第二个参数为null时,查询忽略

Db::table('user')->where('id','>',1)->get();
Db::table('user')->where('id','>',1)->where('id','<',10)->get();

where以数组形式传参

$where=[
    ['id','>',3],
    ['status',0]
];
Db::table('user')->where($where)->get();

whereNotEmpty内容为空时不设置

当查询参数为空时忽略本次条件设置,以下代码的where条件不会添加到SQL中。

Db::table('user')->whereNotEmpty('username','')->get();

使用andwhere

Db::table('user')->where('id','>',1)->andwhere('id','<',10)->get();

使用orwhere

Db::table('user')->where('id','>',1)->orwhere('id','<',10)->get();

使用 logic 条件连接符

Db::table('user')->where('id','>',1)->logic('or')->where('id','<',22)->get();

预准备whereRaw

Db::table('user')->whereRaw('age > ? and username =?', [1,'admin'])->get();

使用 whereBetween

Db::table('user')->whereBetween('id',[10,30])->get();

使用 WhereNotBetween

Db::table('user')->whereNotBetween('id',[10,30])->get();

使用 WhereIn

Db::table('user')->whereIn('id',[2,3,9])->get();

使用 WhereNotIn

Db::table('user')->whereNotIn('id',[3,5,6])->get();

使用 WhereNull

Db::table('user')->whereNull('username')->get();

使用 WhereNotNull

Db::table('user')->whereNotNull('id')->get();

指定条件关系

Db::table('user')->where('id','>',1)->logic('AND')->whereBetween('id',[1,10])->get();

排序(Order By)

Db::table('user')->orderBy('id','DESC')->get();
Db::table('user')->orderBy('id','DESC')->orderBy('rank','ASC')->get();
//多个排序条件

分组GROUP BY

Db::table('user')->groupBy('age')->get();

分组筛选HAVING

Db::table('user')->groupBy('age')->having('count(sex)','>',2)->get();

取部分数据LIMIT

Db::table('user')->limit(2)->get();
Db::table('user')->limit(2,5)->get();

聚合

max

Db::table("user")->max('id');

min

Db::table("user")->min('id');

avg

Db::table("user")->avg('id');

sum

Db::table("user")->sum('id');

JOIN多表关联

多表关联INNER JOIN

Db::table('user')
    ->join('class','user.cid','=','class.cid')
    ->join('contacts','user.id','=','contacts.uid')
    ->get()

多表关联LEFT JOIN

Db::table('user')->leftJoin('class','user.cid','=','class.cid')->get();

多表关联RIGHT JOIN

Db::table('user')->rightJoin('class','user.cid','=','class.cid')->get();
数据表
use bear\module\db\database\Schema;

索引管理

添加表主键

Schema::addPrimary('表名','字段');

获取表主键

Schema::getPrimaryKey('user');

添加索引

Schema::addIndex('表名','字段');

删除索引

Schema::dropIndex('表名','字段');

添加唯一索引

Schema::addUnique('表名','字段');

添加组合索引

Schema::addIndex('article',['aid','cid']);

表信息

获取表字段信息

获取user表的所有字段

Schema::getFields('user');

获取数据库大小

获得当前数据库大小即所有表碎片、数据、索引之和

Schema::getDataBaseSize('test')

获取表大小

获得 news 表大小,包含表碎片、数据、索引之和

Schema::getTableSize('news'); 

获所有表信息

获得当前数据库的所有表信息 , 数据大小包括碎片、数据、索引

Schema::getAllTableInfo('test')

检测表是否存在

Schema::tableExists('comment');

测表字段是否存在

Schema::fieldExists('title','news');
#检测 news 表是否存在 title 字段

表维护

修复表

Schema::repair('user'); 

优化表

Schema::optimize('user'); 

锁表

Schema::lock('ticket_record,ticket,member');
//多个表用半角逗号分隔
Schema::lock('user as u,member as m');
//锁定具有设置表前缀的表,多用在多表关联操作时

解锁表

Schema::unlock();

清空表

Schema::truncate('user');

删除表

Schema::drop('news');

删除字段

Schema::dropField('news','aid');
//删除news表中的aid字段

执行多条SQL语句

$sql = <<<EOF
    CREATE TABLE `hd_core_attachment` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `uid` int(11) NOT NULL COMMENT '会员id',
    `filename` varchar(300) NOT NULL COMMENT '文件名',
    `path` varchar(300) NOT NULL COMMENT '相对路径',
    `type` varchar(10) NOT NULL DEFAULT '' COMMENT '类型',
    `createtime` int(10) NOT NULL COMMENT '上传时间',
    `size` mediumint(9) NOT NULL COMMENT '文件大小',
    `user_type` tinyint(1) DEFAULT NULL COMMENT '1 管理员 0 会员',
    PRIMARY KEY (`id`),
    KEY `uid` (`uid`)
    ) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COMMENT='附件';

    CREATE TABLE `hd_rule` (
    `rid` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `siteid` int(10) unsigned NOT NULL COMMENT '站点编号',
    `name` varchar(45) DEFAULT NULL COMMENT '规则名称',
    `module` varchar(45) DEFAULT NULL COMMENT '模块名称',
    `rank` tinyint(3) unsigned DEFAULT NULL COMMENT '排序',
    `status` tinyint(1) unsigned DEFAULT NULL COMMENT '是否禁用',
    PRIMARY KEY (`rid`),
    KEY `fk_hd_rule_hd_site1_idx` (`siteid`)
    ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='回复规则';
EOF;
Schema::sql($sql);
附件上传(支持OSS)

[TOC]

使用

依赖扩展

use bear\sys\config\Config;
use bear\extend\oss\Oss;

关于上传

暂时只支持本地上传和OSS上传两种方式

配置参数 'mold' => 'oss' 'mold' => 'local'


use \bear\extend\file\File;
Config::set('upload.filter',true);
Bear::returnJson(0,'上传成功',File::upload());
  
  ##OSS 上传
      Config::set('upload.mold','oss');
      Config::set('oss.bucket','');
      Config::set('oss.endpoint','');
      Config::set('oss.host','');
      Config::set('aliyun.regionId','oss-cn-shenzhen');
      Config::set('aliyun.accessId','');
      Config::set('aliyun.accessKey','');

      $info = File::upload();
      if(!File::getError()){
        Bear::returnJson(0,'上传成功',['path'=>$info[0]['path']]);
      }

图片过滤

此功能需要DB扩展
开启此功能需要和MYSQL搭配使用,会检查数据库中图片HASH来判断是否存在此图片,如果存在就不会上传
配置参数 'filter' => true

数据库表结构

CREATE TABLE `attachment` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '用户id',
  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '文件名',
  `module` varchar(32) NOT NULL DEFAULT '' COMMENT '模块名,由哪个模块上传的',
  `path` varchar(255) NOT NULL DEFAULT '' COMMENT '文件路径',
  `thumb` varchar(255) NOT NULL DEFAULT '' COMMENT '缩略图路径',
  `url` varchar(255) NOT NULL DEFAULT '' COMMENT '文件链接',
  `mime` varchar(64) NOT NULL DEFAULT '' COMMENT '文件mime类型',
  `ext` char(4) NOT NULL DEFAULT '' COMMENT '文件类型',
  `size` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '文件大小',
  `md5` char(32) NOT NULL DEFAULT '' COMMENT '文件md5',
  `sha1` char(40) NOT NULL DEFAULT '' COMMENT 'sha1 散列值',
  `driver` varchar(16) NOT NULL DEFAULT 'local' COMMENT '上传驱动',
  `download` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '下载次数',
  `create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '上传时间',
  `update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
  `sort` int(11) NOT NULL DEFAULT '100' COMMENT '排序',
  `status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '状态',
  `up_type` varchar(50) DEFAULT NULL COMMENT '上传方式 oss:OSS上传  local:本地上传',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4144 DEFAULT CHARSET=utf8 COMMENT='附件表';

配置文件

默认是在入口文件目录下的attachment目录

有关上传处理的配置项位于 bear/framework/config/upload.php 配置文件中,请查看文件内容修改成满足项目需求的配置项。

上传

只需要执行组件的upload 方法,系统分自动分析上传数据完成上传处理,并将成功上传的文件列表返回。

$files = File::upload();

指定上传表单

File::upload('ico');

设置上传类型

File::type('jpg,png,txt')->upload();

设置上传大小

File::type('jpg,png,txt')->size(2000000)->upload();

获取上传错误

File::getError();

设置上传目录

File::path('News')->upload();

下载文件

//下载z.zip,下载文件名不a.zip
File::download('z.zip','a.zip');
图片处理

[TOC]

使用

配置

图片处理配置文件在 bear/config/image.php 文件中,请根据需要修改配置,也可以使用 Config 组件动态修改配置。

缩略图

语法

| 参数 | 含义 |
| ----------- | --------- |
| img | 图片 |
| outFile | 缩略图文件 |
| thumbWidth | 缩略宽度 |
| thumbHeight | 缩略高度 |
| thunbType | 缩略方式 |
| img | 图片 |

缩略方式
1: 固定宽度 高度自增 2: 固定高度 宽度自增 3: 固定宽度 高度裁切
4: 固定高度 宽度裁切 5: 缩放最大边 6: 缩略图尺寸不变,自动裁切图片
Image::thumb($file, $outFile, $thumbWidth, $thumbHeight, $thunbType);

应用

$obj->thumb('file.jpg','new.jpg',200,200,6);

水印

语法

| 参数 | 含义 |
| ----------- | --------- |
| img | 原图像 |
| outImg | 水印位置 |
| pos | 缩略宽度 |
| waterImg | 水印图片 |
| pct | 透明度 |
| text | 文字水印内容 |

返出类型

@return bool

应用

Image::water('file.jpg', 'new.jpg');
压缩&解压

[TOC]

开始使用

压缩

将src、tests目录压缩为test.zip

Zip::create('test.zip', ['src', 'tests']);

解压缩

解压test.zip文件到 storage目录

Zip::open('test.zip')->extract('storage');
RBAC

[TOC]

数据表

RBAC权限控制使用数据库进行管理,需要先创建使用的数据表。

CREATE TABLE IF NOT EXISTS `access` (
  `role_id` smallint(6) unsigned NOT NULL,
  `node_id` smallint(6) unsigned NOT NULL,
  KEY `role_id` (`role_id`),
  KEY `nodeId` (`node_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `node` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `title` varchar(50) DEFAULT NULL,
  `status` tinyint(1) DEFAULT '0',
  `remark` varchar(255) DEFAULT NULL,
  `sort` smallint(6) unsigned DEFAULT NULL,
  `pid` smallint(6) unsigned NOT NULL,
  `level` tinyint(1) unsigned NOT NULL,
  `show` tinyint(1) unsigned NOT NULL default 1,
  PRIMARY KEY (`id`),
  KEY `level` (`level`),
  KEY `pid` (`pid`),
  KEY `status` (`status`),
  KEY `name` (`name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `user` (
  `id` mediumint(9) unsigned NOT NULL AUTO_INCREMENT,auto_increment,
  `username` char(20) DEFAULT NULL,
  `password` char(32) DEFAULT NULL,
   PRIMARY KEY (`id`),
  KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `role` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `pid` smallint(6) DEFAULT NULL,
  `status` tinyint(1) unsigned DEFAULT NULL,
  `remark` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `pid` (`pid`),
  KEY `status` (`status`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `user_role` (
  `role_id` mediumint(9) unsigned DEFAULT NULL,
  `user_id` char(32) DEFAULT NULL,
  KEY `group_id` (`role_id`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

配置

<?php
return array(
    //1时时认证|2登录认证
     'type'                      => 1,           
    
    //站长名称(站长不需要验证)
    'super_user'               => 'admin', 
    
    //用户名字段
    'username_field'            => 'username',  
    
    //密码字段
    'password_field'            => 'password',  
    
    //用户SESSION名
    'auth_key'                  => 'id',       
    
    //不需要验证请求: array('Admin.User.add')
    //Admin模块 User控制器 add动作 不需要验证
    'no_auth'                   => array(),     

    //用户角色表
    'user_table'                => 'user',      

    //角色表
    'role_table'                => 'role',      

    //节点表
    'node_table'                => 'node',      

    //角色与用户关联表
    'user_role_table'           => 'user_role',

    //权限分配表
    'access_table'              => 'access',
);

\##操作
\####登录判断

Rbac::isLogin();

验证权限

Rbac::verify();

获取所有

Rbac::getUserNode(1);
//获取id为1的用户的权限节点

获取用户所有角色名称

Rbac::getRoleName(100);
//获取id为100的用户所有角色名称

获取系统所有节点信息,以层级显示

Rbac::getLevelNode();

判断超级管理员

Rbac::isSuperUser();
数组增强

[TOC]

递归数组合并

$a=['b'=>['b1'=>2]];
$b=['a'=>1,'b'=>['b1'=>2,'b2'=>3]];
Arr::merge($a,$b);

以上代码结果如下:

[
 'a'=> 1
 'b' =>['b1' => 2,'b2' => 3]
]

根据键名获取数据

如果键名不存在时返回默认值,支持键名的点语法

$d=['a'=>1,'b'=>2];
Arr::get($d,'c','没有数据哟');

使用点语法查找:

$d = ['web' => [ 'id' => 1, 'url' => 'houdunwang.com' ]];
print_r(Arr::get($d,'web.url'));

从数组中移除给定的值

$d = [1,2,3,4,5];
Arr::del($d,[3,4]);
//结果是 [1,2,5]

排队字段获取数据

以下代码获取除 id、url以外的数据

$d = [ 'id' => 1, 'url' => 'houdunwang.com' ,'name'=>'后盾人'];
print_r(Arr::getExtName($d,['id','url']));

设置数组元素值支持点语法

$data=[];
print_r(Arr::set($data,'a.b.c',99));

改变数组键名大小写

Arr::keyCase(array('name'=>'houdunwang',array('url'=>'hdphp.com')),1); 
第2个参数为类型: 1 大写  0 小写

不区分大小写检测键名是否存

Arr::keyExists('Hd',['hd'=>'后盾网']);

数组值大小写转换

Arr::valueCase(['name'=>'houdunwang'],1); 
第2个参数为类型: 1 大写  0 小写

数组进行整数映射转换

$data = ['status'=>1];
$d = Arr::intToString($data,['status'=>[0=>'关闭',1=>'开启']]); 

生成的结果如下

$d=['status'=>1,'_status'=>'开启'];

数组中的字符串数字转为数值类型

$data = ['status'=>'1','click'=>'200'];
$d = Arr::stringToInt($data); 

根据下标过滤数据元素

$d = [ 'id' => 1, 'url' => 'houdunwang.com','title'=>'后盾网' ];
print_r(Arr::filterKeys($d,['id','url']));
//过滤 下标为 id 的元素

当第三个参数为 0 时只保留指定的元素

$d = [ 'id' => 1, 'url' => 'houdunwang.com','title'=>'后盾网' ];
print_r(Arr::filterKeys($d,['id'],0));
//只显示id与title 的元素

获得树状结构

Arr::tree($data, $title, $fieldPri = 'cid', $fieldPid = 'pid');
参数                   说明
$data                     数组
$title                    字段名称
$fieldPri                 主键 id
$fieldPid                 父 id

示例

$data = [
    ['cid' => 1, 'pid' => 0, 'title' => '新闻'],
    ['cid' => 2, 'pid' => 1, 'title' => '国内新闻'],
];
$d    = Arr::tree($data, 'title', 'cid', 'pid');

获得目录列表

Arr::channelList($data, $pid = 0, $html = "&nbsp;", $fieldPri = 'cid', $fieldPid = 'pid');
参数                     说明 
data                     操作的数组
pid                      父级栏目的 id 值
html                    栏目名称前缀,用于在视图中显示层次感的栏目列表 
fieldPri                  唯一键名,如果是表则是表的主键
fieldPid                  父 ID 键名

获得多级目录列表(多维数组)

Arr::channelLevel($data, $pid = 0, $html = "&nbsp;", $fieldPri = 'cid', $fieldPid = 'pid') 
参数                         说明
data                          操作的数组
pid                          父级栏目的 id 值
html                         栏目名称前缀,用于在视图中显示层次感的栏目列表
fieldPri                     唯一键名,如果是表则是表的主键
fieldPid                      父 ID 键名

获得所有父级栏目

Arr::parentChannel($data, $sid, $fieldPri = 'cid', $fieldPid = 'pid');
参数                         说明
data                          操作的数组
sid                          子栏目
fieldPri                     唯一键名,如果是表则是表的主键
fieldPid                      父 ID 键名

是否为子栏目

Arr::isChild($data, $sid, $pid, $fieldPri = 'cid', $fieldPid = 'pid')
参数                         说明
data                          操作的数组
sid                          子栏目id
pid                          父栏目id
fieldPri                     唯一键名,如果是表则是表的主键
fieldPid                      父 ID 键名

是否有子栏目

Arr::hasChild($data, $cid, $fieldPid = 'pid')
参数                         说明
data                          操作的数组
cid                          栏目cid
fieldPid                      父 ID 键名

迪卡尔乘积

Arr::descarte($arr, $tmp = array())
目录

[TOC]

创建目录

Dir::create('home/view');

删除目录

Dir::del('Home');

复制目录

Dir::copy('a','b');

删除文件

Dir::delFile($file);

移动目录

Dir::move('a','b');

目录树

Dir::tree('Home');

目录大小

Dir::size('Home');

移动文件

Dir::moveFile('hd.php','data');
//将hd.php 移动到data目录

复制文件

Dir::copyFile('README.md', 'tests/README.md')
错误

Call to undefined function openssl_encrypt()

打开php.ini php_openssl扩展

格式
支持验证规则

accepted

验证字段值是否为 yeson1、或 true。这在确认「服务条款」是否同意时相当有用。

active_url

根据 PHP 函数 dns_get_record,判断要验证的字段必须具有有效的 A 或 AAAA 记录。

after:date

验证字段是否是在指定日期之后。这个日期将会通过 strtotime 函数来验证。

'start_date' => 'required|date|after:tomorrow'

作为替换 strtotime 传递的日期字符串,你可以指定其它的字段来比较日期:

'finish_date' => 'required|date|after:start_date'

after_or_equal:date

验证字段必需是等于指定日期或在指定日期之后。更多信息请参见 after 规则。

alpha

验证字段值是否仅包含字母字符。

alpha_dash

验证字段值是否仅包含字母、数字、破折号( - )以及下划线( _ )。

alpha_num

验证字段值是否仅包含字母、数字。

array

验证字段必须是一个 PHP 数组。

before:date

验证字段是否是在指定日期之前。这个日期将会通过 strtotime 函数来验证。

before_or_equal:date

验证字段是否是在指定日期之前。这个日期将会使用 PHP strtotime 函数来验证。

between:min,max

验证字段值的大小是否介于指定的 minmax 之间。字符串、数值或是文件大小的计算方式和 size 规则相同。

boolean

验证字段值是否能够转换为布尔值。可接受的参数为 truefalse10"1" 以及 "0"

confirmed

验证字段值必须和 foo_confirmation 的字段值一致。例如,如果要验证的字段是 password,就必须和输入数据里的 password_confirmation 的值保持一致。

date

验证字段值是否为有效日期,会根据 PHP 的 strtotime 函数来做验证。

date_format:format

验证字段值符合指定的日期格式 (format)。你应该只使用 datedate_format 当中的 其中一个 用于验证,而不应该同时使用两者。

different:field

验证字段值是否和指定的字段 (field) 有所不同。

digits:value

验证字段值是否为 numeric 且长度为 value

digits_between:min,max

验证字段值的长度是否在 minmax 之间。

dimensions

验证的文件必须是图片并且图片比例必须符合规则:

'avatar' => 'dimensions:min_width=100,min_height=200'

可用的规则为: min_widthmax_widthmin_heightmax_heightwidthheightratio

比例应该使用宽度除以高度的方式出现。能够使用 3/2 这样的形式设置,也可以使用 1.5 这样的浮点方式:

'avatar' => 'dimensions:ratio=3/2'

Since this rule requires several arguments, you may use the method to fluently construct the rule:

由于此规则需要多个参数,因此您可以 Rule::dimensions 方法来构造规则:

distinct

当你在验证数组的时候,你可以指定某个值必须是唯一的:

'foo.*.id' => 'distinct'

email

验证字段值是否符合 e-mail 格式。

exists:table,column

验证字段值是否存在指定的数据表中。

Exists 规则的基本使用方法

'state' => 'exists:states'

指定一个特定的字段名称

'state' => 'exists:states,abbreviation'

有时,您可能需要指定要用于 exists 查询的特定数据库连接。你可以使用点「.」语法将数据库连接名称添加到数据表前面来实现这个目的:

'email' => 'exists:connection.staff,email'

如果您想自定义由验证规则执行的查询,您可以使用 Rule 类流畅地定义规则。在这个例子中,我们还将使用数组指定验证规则,而不是使用 | 字符来分隔它们:

file

必须是成功上传的文件。

filled

验证的字段必须带有内容。

image

验证字段文件必须为图片格式( jpeg、png、bmp、gif、或 svg )。

in:foo,bar,...

验证字段值是否有在指定的列表里面。因为这个规则通常需要你 implode 一个数组,Rule::in 方法可以用来流利地构造规则:

in_array:anotherfield

验证的字段必须存在于 anotherfield 的值中。

integer

验证字段值是否是整数。

ip

验证字段值是否符合 IP address 的格式。

ipv4

验证字段值是否符合 IPv4 的格式。

ipv6

验证字段值是否符合 IPv6 的格式。

json

验证字段是否是一个有效的 JSON 字符串。

max:value

字段值必须小于或等于 value。字符串、数值或是文件大小的计算方式和 size 规则相同。

mimetypes:text/plain,...

验证的文件必须是这些 MIME 类型中的一个:

'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime'

要确定上传文件的 MIME 类型,会读取文件的内容,并且框架将尝试猜测 MIME 类型,这可能与客户端提供的 MIME 类型不同。

mimes:foo,bar,...

验证字段文件的 MIME 类型是否符合列表中指定的格式。

MIME 规则基本用法

'photo' => 'mimes:jpeg,bmp,png'

即使你可能只需要验证指定扩展名,但此规则实际上会验证文件的 MIME 类型,其通过读取文件的内容以猜测它的 MIME 类型。

完整的 MIME 类型及对应的扩展名列表可以在下方链接找到:

min:value

字段值必须大于或等于 value。字符串、数值或是文件大小的计算方式和 size 规则相同。

nullable

验证的字段可以为 null。这在验证基本数据类型,如字符串和整型这些能包含 null 值的数据类型中特别有用。

not_in:foo,bar,...

验证字段值是否不在指定的列表里。

numeric

验证字段值是否为数值。

present

验证的字段必须出现,并且数据可以为空。

regex:pattern

验证字段值是否符合指定的正则表达式。

Note: 当使用 regex 规则时,你必须使用数组,而不是使用管道分隔规则,特别是当正则表达式含有管道符号时。

required

验证字段必须存在输入数据,且不为空。字段符合下方任一条件时即为「空」:

  • 该值为 null.
  • 该值为空字符串。
  • 该值为空数组或空的 可数 对象。
  • 该值为没有路径的上传文件。

required_if:anotherfield,value,...

如果指定的其它字段( anotherfield )等于任何一个 value 时,此字段为必填。

required_unless:anotherfield,value,...

如果指定的其它字段( anotherfield )等于任何一个 value 时,此字段为不必填。

required_with:foo,bar,...

如果指定的字段中的 任意一个 有值且不为空,则此字段为必填。

required_with_all:foo,bar,...

如果指定的 所有 字段都有值,则此字段为必填。

required_without:foo,bar,...

如果缺少 任意一个 指定的字段,则此字段为必填。

required_without_all:foo,bar,...

如果所有指定的字段 都没有 值,则此字段为必填。

same:field

验证字段值和指定的 字段( field ) 值是否相同。

size:value

验证字段值的大小是否符合指定的 value 值。对于字符串来说,value 为字符数。对于数字来说,value 为某个整数值。对文件来说,size 对应的是文件大小(单位 kb )。

string

验证字段值的类型是否为字符串。如果你允许字段的值为 null ,那么你应该将 nullable 规则附加到字段中。

timezone

验证字段值是否是有效的时区,会根据 PHP 的 timezone_identifiers_list 函数来判断。

unique:table,column,except,idColumn

在指定的数据表中,验证字段必须是唯一的。如果没有指定 column,将会使用字段本身的名称。

指定一个特定的字段名称:

'email' => 'unique:users,email_address'

自定义数据库连接

有时,您可能需要为验证程序所做的数据库查询设置自定义连接。如上面所示,如上所示,将 unique:users 设置为验证规则将使用默认数据库连接来查询数据库。如果要修改数据库连接,请使用「点」语法指定连接和表名:

'email' => 'unique:connection.users,email_address'

强迫 Unique 规则忽略指定 ID:

有时候,你希望在进行字段唯一性验证时对指定 ID 进行忽略。例如,在「更新个人资料」页面会包含用户名、邮箱等字段。这时你会想要验证更新的 E-mail 值是否为唯一的。如果用户仅更改了名称字段而没有改 E-mail 字段,就不需要抛出验证错误,因为此用户已经是这个 E-mail 的拥有者了。若要用指定规则来忽略用户 ID,则应该把要发送的 ID 当作第三个参数:

为了指示验证器忽略用户的 ID,我们将使用 Rule 类流畅地定义规则。 在这个例子中,我们还将通过数组来指定验证规则,而不是使用 | 字符来分隔:

use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::unique('users')->ignore($user->id),
    ],
]);

如果你的数据表使用的主键名称不是 id,则可以在调用 ignore 方法时指定列的名称:

'email' => Rule::unique('users')->ignore($user->id, 'user_id')

增加额外的 Where 语句:

你也可以通过 where 方法指定额外的查询约束条件。例如,我们添加 account_id1 约束条件:

'email' => Rule::unique('users')->where(function ($query) {
    $query->where('account_id', 1);
})

url

验证字段必需是有效的 URL 格式。

按条件增加规则

当字段存在的时候进行验证

在某些情况下,你可能 只想 在输入数据中有此字段时才进行验证。可通过增加 sometimes 规则到规则列表来实现:

$v = Validator::make($data, [
    'email' => 'sometimes|required|email',
]);

在上面的例子中,email 字段的验证只会在 $data 数组有此字段时才会进行。

复杂的条件验证

有时候你可能希望增加更复杂的验证条件,例如,你可以希望某个指定字段在另一个字段的值超过 100 时才为必填。或者当某个指定字段有值时,另外两个字段要拥有符合的特定值。增加这样的验证条件并不难。首先,利用你熟悉的 static rules 来创建一个 Validator 实例:

$v = Validator::make($data, [
    'email' => 'required|email',
    'games' => 'required|numeric',
]);

假设我们有一个专为游戏收藏家所设计的网页应用程序。如果游戏收藏家收藏超过一百款游戏,我们会希望他们来说明下为什么他们会拥有这么多游戏。比如说他们有可能经营了一家二手游戏商店,或者只是为了享受收集的乐趣。为了在特定条件下加入此验证需求,可以在 Validator 实例中使用 sometimes 方法。

$v->sometimes('reason', 'required|max:500', function ($input) {
    return $input->games >= 100;
});

传入 sometimes 方法的第一个参数是我们要用条件认证的字段名称。第二个参数是我们想使用的验证规则。闭包作为第三个参数传入,如果其返回 true,则额外的规则就会被加入。这个方法可以轻松的创建复杂的条件式验证。你甚至可以一次对多个字段增加条件式验证:

$v->sometimes(['reason', 'cost'], 'required', function ($input) {
    return $input->games >= 100;
});
{tip} 传入 闭包$input 参数是 Illuminate\Support\Fluent 实例,可用来访问你的输入或文件对象。

验证数组

验证基于数组的表单输入字段并不一定是一件痛苦的事情。要验证指定数组输入字段中的每一个 email 是否唯一,可以这么做:

$validator = Validator::make($request->all(), [
    'person.*.email' => 'email|unique:users',
    'person.*.first_name' => 'required_with:person.*.last_name',
]);

同理,你在语言文件定义验证信息的时候可以使用星号 * 字符,可以更加容易的在基于数组格式的字段中使用相同的验证信息:

'custom' => [
    'person.*.email' => [
        'unique' => 'Each person must have a unique e-mail address',
    ]
],

自定义验证规则

数据插入前函数支持

支持所有PHP函数

支持自定义函数

encode :对称加密

'htmlspecialchars'=>'htmlspecialchars',

'encode'=>'encode',

'urlencode'=>'urlencode',

'htmlentities'=>'htmlentities',

'inter'=>'inter',

'abs'=>'abs',

'htmlspecialchars_decode'=>'htmlspecialchars_decode:反解',

'decode'=>'decode:解密',

'floor'=>'floor:向下舍入为最接近的整数',

'round'=>'round:四舍五入',

'ceil'=>'ceil:向上舍入为最接近的整数',

'urldecode'=>'urldecode',

数据查找函数处理

支持所有PHP函数

支持自定义函数

encode :对称加密

'htmlspecialchars'=>'htmlspecialchars',

'encode'=>'encode',

'urlencode'=>'urlencode',

'htmlentities'=>'htmlentities',

'inter'=>'inter',

'abs'=>'abs',

'htmlspecialchars_decode'=>'htmlspecialchars_decode:反解',

'decode'=>'decode:解密',

'floor'=>'floor:向下舍入为最接近的整数',

'round'=>'round:四舍五入',

'ceil'=>'ceil:向上舍入为最接近的整数',

函数名描述
dateFormate格式化时间戳 格式为 Y-m-d H:i:s
urldecode对称解密
manager

manager

`
基于 laravel 视频使用的是BEAR助手

`

fastsql 快速数据库表管理

[TOC]

数据库表管理工具

用法

可以快速管理表数据,而不用重复的写轮子来操作增删改查

绑定表字段信息

基本设置

[TOC]

数据库表管理工具

用法

可以快速管理表数据,而不用重复的写轮子来操作增删改查

绑定表字段信息

表名:table

表的名字,

字段:field

当前操作的字段

别名:alias_name

类型:mold

列表配置

[TOC]

 列表显示:is_show_list

列表显示此字段

列表显示排序:sort_list

列表显示时的排序
编辑设置

[TOC]

是否可编辑:is_write

表处理时,编辑的字段

编辑显示排序:sort_edit

编辑字段时显示的排序,降序

默认数据:default_data

编辑数据时的默认数据

`
支持函数写法,详情见 **编辑函数写法
`

数据插入:insert_before

在数据插入前,我们会先调函数进行处理,默认会执行htmlspecilchar,htmlentitie进行安全处理

`
支持函数写法,详情见 **编辑函数写法
`

默认数据:select_after

查出来的数据,进行函数处理,如解密

`
支持函数写法,详情见 **编辑函数写法
`

**编辑函数写法

[TOC]

数据库存入函数调用方法处理

函数支持

如果想使用多个用','(逗)号隔开 eg: sql|select * from table ,encode

`
原生sql
`

sql | select * from table

`
encode 数据加密
`

encode

`
decode :数据解密
`

decode

数组支持

有时候,我们传递参数时,会用到数组方式,这时候我们要指定KEY,默认我们会把第一个当成KEY,第二个当成VALUE,所有 就是 sql|select key,value from table

`
数组 arr|key=>value-key=>value
`

dbal表类型

[TOC]

DBAL类型

下表是dbal类型与mysqll类型的对应表, 其中requiredcomment属性是所有dbal类型天生具备的.

doctrine类型默认mysql类型lengthprecisionscaleautoincrementunsignedfixed
arraytext×××××
array_simpletext××××××
json_arraytext××××××
bigintbigint××××
booleantinyint(1)××××××
datetimedatetime××××××
datetimezdatetime××××××
datedate××××××
timetime××××××
decimalnumeric(10,0)××××
integerint××××
objecttext××××××
smallintsmallint××××
stringvarchar(255)××××
textlongtext××××××
binaryvarbinary(255)××××
bloblongblob××××××
floatdouble precision××××××
guidchar(36)××××××
textlongtext××××××

doctrine dbal types文档有详细说明

内置预定义类型

buildin typeDBAL typeoptions
boolboolean
moneydecimal['precision' => 20, 'scale' = 3]
emailstring
timeinteger['unsigned' => 'true']
regionstring
passwordstring['length' => 32]
numberinteger['unsigned' => true]
floatfloat
genderstring['length' => 6]
ipaddrstring['length' => 20]
serializetext
last_modifyinteger['unsigned' => true]
dbschema DEMO

[TOC]

<?php

//CREATE TABLE IF NOT EXISTS `topic_discuss`(
//     `dis_id` int UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL COMMENT "自增id",
//     `topic_id` int UNSIGNED NOT NULL DEFAULT 0 COMMENT "话题id",
//     `discuss_desc` varchar(2000) NOT NULL DEFAULT "" COMMENT "话题讨论详情",
//     `user_id` int UNSIGNED NOT NULL DEFAULT 0 COMMENT "用户id",
//     `color_id` tinyint UNSIGNED NOT NULL DEFAULT COMMENT "颜色样式",
//     `create_time` int UNSIGNED NOT NULL DEFAULT 0 COMMENT "发表时间",
//     `is_top` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT "是否置顶,0:不置顶;1:置顶",
//     `is_hide` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT "是否列表隐藏 0:展示;1隐藏",
//     `is_robot` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT "是否系统机器人 0:不是;1是",
//     `flag` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT "状态:0正常;1删除"
// )ENGINE=InnoDB DEFAULT CHARSET=utf8;
return array(
    'columns' => array(
        'discuss_id' =>array(
            'type' => 'number',
            'required' => true,
            'comment'=> '自增id',
            'autoincrement' => true,
            'width' => 50,
            'order'=>1,
            'label' => 'id',
            'default_in_list' => true,
            'in_list' => true,
        ),
        'topic_id' =>array(
            'type' => 'number',
            // 'required' => true,
            'width' => 50,
            'order'=>2,
            'label' =>'话题id',
            'default_in_list' => true,
            'in_list' => true,
            'comment'=> '所属话题表中的id号',
        ),
        'discuss_desc' =>array(
            'type' => 'string',
            'length' => 2000,
            'filterdefault' => 'true',
            'required' => true,
            'in_list' => true,
            'default_in_list' => true,
            'searchtype' => 'has',
            'order' => 3,
            'label' => '话题讨论详情',
            'comment'=> '话题讨论详情',
        ),
        'user_id' =>array(
            'type' => 'number',
            'required' => true,
            'width' => 50,
            'order'=>4,
            'label' => '用户id',
            'default_in_list' => true,
            'in_list' => true,
            'comment'=> '用户id',
        ),
        'color_id' =>array(
            'type' => 'number',
            'required' => true,
            'width' => 50,
            'order'=>5,
            'in_list' => true,
            'comment'=> '颜色样式',
        ),
        'create_time' => array(
            'type' => 'time',
            'editable' => true,
            'in_list' => true,
            'label' => '发布时间',
            'default_in_list' => true,
            'width' => 130,
            'order'=>7,
            'default' => 0,
            'comment' => '发布时间(无需精确到秒)',
        ),
        'is_top' => array(
            'type' => 'bool',
            'default' => 0,
            'comment' => '是否置顶,0:不置顶;1:置顶',
            'editable' => true,
            'in_list' => true,
            'label' => '是否置顶',
            'default_in_list' => true,
            'width' => 40,
            'order'=>8,
        ),
        'is_hide' => array(
            'type' => 'bool',
            'default' => 0,
            'comment' => '是否列表隐藏 0:展示;1隐藏',
            'editable' => true,
            'in_list' => true,
            'label' => '是否列表隐藏',
            'default_in_list' => true,
            'width' => 40,
            'order'=>9,
        ),
        'is_robot' => array(
            'type' => 'bool',
            'default' => 0,
            'comment' => '是否系统机器人 0:不是;1是',
            'editable' => true,
            'in_list' => true,
            'label' => '是否系统机器人',
            'default_in_list' => true,
            'width' => 40,
            'order'=>10,
        ),
        'flag' => array(
            'type' => 'bool',
            'default' => 0,
            'comment' => '是否发布:0正常/1删除',
            'editable' => true,
            'width' => 40,
            'order'=>11,
        ),
    ),
    'primary' => 'discuss_id',
    'comment' => '话题讨论表',
);
工具
阿里云 OSS

阿里云OSS

本服务用于管理阿里云OSS

本服务是对阿里云SDK的封装,所以方法名与阿里的SDK一样,下面是列举出的几个使用方法,其他OSS方法都是可以使用的,请参考阿里云 OSS参考文档

PHP上传

配置

配置查看
endPoint登录某个块查看 bucket概览
accessId登录阿里云后台查看右上角的 "访问控制(使用子帐号)" 或 "accesskeys(使用主帐号)"
accessKey同上 accessId
Config::set('oss',[
    'accessKeyId'=>'',
    'accessKeySecret'=>'',
    //外网Endpoint OSS开通Region和Endpoint对照表: https://help.aliyun.com/document_detail/31837.html
    'endpoint'=>'oss-cn-hangzhou.aliyuncs.com',
    //OSS块标识
    'bucket'=> "houdunren"
    ]
);

字符串上传

$object = "hd.txt";
$content = "Hi, OSS.";
$res = Oss::putObject($object, $content);
if(isset($res['oss-request-url'])){
    echo "文件:".$res['oss-request-url'];
}

上传本地文件

$object   = '1-test-upload.jpg';
$filePath = 'tests/1.jpg';
$res      = Oss::uploadFile($object, $filePath);
if(isset($res['oss-request-url'])){
    echo "文件:".$res['oss-request-url'];
}

其他OSS管理

组件与官网SDK无缝集成,比如我们拿删除资源举例。
下面是官方删除对象代码 官网查看

$ossClient->deleteObject($bucket, $object);

本组件实现的删除方法

Oss::deleteObject('hdphp.php');

也就是说我们在组件中调用SDK提供的方法时,不需要传递第一个块名称。

前台直接上传

后台签名

<?php
class Oss
{
    //生成供前台使用的签名
    public static function sign()
    {
        //阿里云 AccessKeyId
        $id = 'xxxxxx';
        //阿里云  AccessKeySecret
        $key = 'xxxxx';
        //OSS外网域名: 在阿里云后台OSS bucket中查看
        $host = 'http://hdxj.oss-cn-hangzhou.aliyuncs.com';
        //oss中本次上传存放文件的目录
        $dir = $_GET['dir'];
        function gmt_iso8601($time)
        {
            $dtStr      = date("c", $time);
            $mydatetime = new \DateTime($dtStr);
            $expiration = $mydatetime->format(\DateTime::ISO8601);
            $pos        = strpos($expiration, '+');
            $expiration = substr($expiration, 0, $pos);
            return $expiration."Z";
        }

        $now        = time();
        $expire     = 30; //设置该policy超时时间是10s. 即这个policy过了这个有效时间,将不能访问
        $end        = $now + $expire;
        $expiration = gmt_iso8601($end);

        //最大文件大小.用户可以自己设置
        $condition    = [0 => 'content-length-range', 1 => 0, 2 => 1048576000];
        $conditions[] = $condition;

        //表示用户上传的数据,必须是以$dir开始, 不然上传会失败,这一步不是必须项,只是为了安全起见,防止用户通过policy上传到别人的目录
        $start        = [0 => 'starts-with', 1 => '$key', 2 => $dir];
        $conditions[] = $start;

        $arr = ['expiration' => $expiration, 'conditions' => $conditions];
        //return;
        $policy         = json_encode($arr);
        $base64_policy  = base64_encode($policy);
        $string_to_sign = $base64_policy;
        $signature      = base64_encode(hash_hmac('sha1', $string_to_sign, $key, true));

        $response              = [];
        $response['accessid']  = $id;
        $response['host']      = $host;
        $response['policy']    = $base64_policy;
        $response['signature'] = $signature;
        $response['expire']    = $end;
        //这个参数是设置用户上传指定的前缀
        $response['dir'] = $dir;
        return json_encode($response);
    }
}
echo Oss::sign();

前台

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>OSS上传</title>
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
    <script>
        //模块配置项
        var hdjs = {
            //框架目录
            'base': '../../',
        };
    </script>
    <script src="../../app/util.js"></script>
    <script src="../../require.js"></script>
    <script src="../../config.js"></script>
</head>
<body>
<div class="input-group">
    <input type="text" class="form-control" v-model="v.path">
    <span class="input-group-btn">
        <button class="btn btn-default" type="button" id="pickVideo">上传文件</button>
   </span>
</div>
</div>
<script>
    function upload() {
        require(['oss'], function (oss) {
            var id = '#pickVideo';
            var uploader = oss.upload({
                //获取签名
                serverUrl: 'sign.php?',
                //上传目录
                dir: 'houdunwang/',
                //按钮元素
                pick: id,
                accept: {
                    title: 'Images',
//                  extensions: 'mp4',
//                  mimeTypes: 'video/mp4'
                }
            });
            //上传开始
            uploader.on('startUpload', function () {
                console.log('开始上传');
            });
            //上传成功
            uploader.on('uploadSuccess', function (file, response) {
                console.log('上传完成,文件名:' + oss.oss.host + '/' + oss.oss.object_name);
            });
            //上传中
            uploader.on('uploadProgress', function (file, percentage) {
                console.log('上传中,进度:' + parseInt(percentage * 100));
            })
            //上传结束
            uploader.on('uploadComplete', function () {
                console.log('上传结束');
            })
        });
    }
    upload();
</script>
</body>
</html>
Swoole 支持
模板文件

[TOC]

名称

预览图

用法

addAlert(field,title,kind)

demo

参数值

参数名备注
default默认

参数1

类型名类型
defaultstring