前/后台extensions目录
$redis = ...;
$hdl = 'userinfo_v'. Utils::cacheVer('userinfo');
$redis->get($hdl);
$redis->setex($hdl, 600, ['id'=>1, 'name'=>'A']);
$redis = ...;
$hdl = 'userinfo_v'. Utils::cacheVer('userinfo', true);
$redis->get($hdl);
$redis->setex($hdl, 600, ['id'=>1, 'name'=>'A']);
Utils::cacheVer('userinfo', true);
前后台extensions目录的Utils.php
Bot私信通知
调用 Utils::notifyToTelegram()
Bot频道/群组通知
调用 Utils::notifyToTelegram2()
接入文档
官方参考文档(用于了解参数含义)
封装API地址
使用
Utils::notifyToWecom ( 数据包Array, 消息类型, 自定义机器人名称 )
机器人管理(告警接入平台)
机器人源码地址
svn://svn.webdev.ouj.com/php/trunk/base_services/coderelease/protected/controllers/WecomController.php
机器人KEY更换建议
不必删除机器人,而是直接更改KEY。
这样就不会影响代码的调用。
后台 extensions/Utils.php
- 为了减少在后端循环中计算额外数据而增加的浏览器等待时间,特地将部分数据的获取过程转移到前端去做。
- 数据获取的过程,使用 [自定义PHP代码] 描述,并将此代码作为此方法的 $codeOrId 参数, 要求最后一句为return语句,且每句都要以分号结束,完全遵循PHP语法。
- 在smarty生成具体模板的同时,会将 [自定义PHP代码] 缓存,并将缓存ID作为前端模板的
<script>
标签ID。- 前端在获取标签ID对应的计算数据后,立即将自身
<script>
标签覆盖为数据。
准备一个HTTP(S)接口
地址例如:
/magic/async?id=xxx
接口代码示例:
@exit(Utils::magicAsyncValue($_REQUEST['id'], 'get'));
简单的例子
<{Utils::magicAsyncValue("return 123;")}>
稍微复杂的例子
<{foreach $list as $v}>
这句可执行,但用到转义符比较繁琐
<{Utils::magicAsyncValue("return HardwareInfo::ver2batches(\"<{$v.hardware_ver}>\");") nofilter}>
这句可执行,推荐使用
<{Utils::magicAsyncValue("return HardwareInfo::ver2batches('<{$v.hardware_ver}>');") nofilter}>
这句执行无效,不能提取v的属性
<{Utils::magicAsyncValue('return HardwareInfo::ver2batches("<{$v.hardware_ver}>")';) nofilter}>
这句执行无效,无法解析PHP数组元素的提取语法
<{Utils::magicAsyncValue("return HardwareInfo::ver2batches('{$v['hardware_ver']}')";) nofilter}>
<{/foreach}>
自动为含有 @var Xxxx 文档注释的属性,赋予初始化好的类实例,其中Xxxx是类名
类Xxxx的构造方法的参数必须为空
应用于后台的XxxController和多玩魔改Model(ModeldDwEx)
trait/VarDocTrait2.php
在 controllers/BaseController.php 中,“use VarDocTrait2;”,使所有XxxController中含有var注释的成员,自动获得注入。
在 extensions/ModelDwEx.php 中,“use VarDocTrait2;”,使所有model类中含有var注释的成员,自动获得注入。
避免在__contruct中new实例时,遇到类递归嵌套导致的死循环
例如 A声明了B类型的成员,B声明了A类型的成员
虽然解决了contruct嵌套问题,但也不要在任何contruct中调用 o() 方法
否则就是藏雷!
$obj->o()->xxx
$obj->o()->xxx->yyy
$obj->o()->xxx->zzz()
$obj->o()->xxx->aaa
$obj->o()->xxx->bbb()
$obj->o()->xxx->aaa->ccc //对于链式调用,需要再每一层类都部署好var文档注释
$obj->o(); $obj->a; $obj->a->b; //先执行o方法,之后就不再将o塞入调用链
$obj->a->b->c()
后台 controllers/ProductionController.php
后台 models/ShoesBatch.php
兼容了阿本的phpbase2,并追加了更多实用方法
ID -> 显示其它值
杜绝重复请求,减少单页加载等待时间
仅可定义一个ID参数,参数名可自定义
参数名 必选 类型 说明 sourceSelector 是 string 被替换ID所在DOM的JQ选择器,支持选择结果为单项和多项 apiUrl 是 string 通过ID获取数据的接口地址,要求仅可定义一个ID参数,返回结果也为JSON。例如 idField 是 string 请求数据接口用的自定义ID参数名,如“mgrId”
示例1
new id2valueRender('.mgrId2name');
示例2
new id2valueRender('.mgrId2name', '/manager/getById', 'mgrId', function(that, j){
if (j.rs) {
that.text(j.mgr.realname);
that.prop('title', "账号="+j.mgr.passport+", ID="+j.mgr.mgr_id);
} else {
that.text('-');
}
}, function(that){
return that.text();
});
后台 views/forum_blocknum.html
适应客户端合并请求的需求
合并任意多个接口,并按接口顺序返回对应的响应内容
前/后台 MergeController