0、杂项.md 7.2 KB

特定的缓存方式(Utils::cacheVer)

代码位置

前/后台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);


业务告警(已由Telegram过渡为企业微信机器人)

代码位置

前后台extensions目录的Utils.php

旧的Telegram方式

  1. Bot私信通知

    调用 Utils::notifyToTelegram()

  2. Bot频道/群组通知

    调用 Utils::notifyToTelegram2()

新的企业微信方式




用于smarty输出异步数据的模板语法

代码位置

后台 extensions/Utils.php

逻辑概要:

  1. 为了减少在后端循环中计算额外数据而增加的浏览器等待时间,特地将部分数据的获取过程转移到前端去做。
  2. 数据获取的过程,使用 [自定义PHP代码] 描述,并将此代码作为此方法的 $codeOrId 参数, 要求最后一句为return语句,且每句都要以分号结束,完全遵循PHP语法。
  3. 在smarty生成具体模板的同时,会将 [自定义PHP代码] 缓存,并将缓存ID作为前端模板的<script>标签ID。
  4. 前端在获取标签ID对应的计算数据后,立即将自身<script>标签覆盖为数据。

使用

  1. 准备一个HTTP(S)接口

    地址例如:/magic/async?id=xxx

    接口代码示例:@exit(Utils::magicAsyncValue($_REQUEST['id'], 'get'));

  2. 简单的例子

    <{Utils::magicAsyncValue("return 123;")}>

  3. 稍微复杂的例子

    <{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}>



VarDocTrait2 - 注释文档注入成员实例的用法

摘要

自动为含有 @var Xxxx 文档注释的属性,赋予初始化好的类实例,其中Xxxx是类名

使用要求

类Xxxx的构造方法的参数必须为空

用途

应用于后台的XxxController和多玩魔改Model(ModeldDwEx)

代码位置

trait/VarDocTrait2.php

部署步骤

  1. 在需要的类中 use VarDocTrait
  2. 为需要自动初始化实例的属性添加 "@var 类名" 注释
  3. 不要设置也不要初始化属性值,即保持为null

在鞋后台的部署点

在 controllers/BaseController.php 中,“use VarDocTrait2;”,使所有XxxController中含有var注释的成员,自动获得注入。

在 extensions/ModelDwEx.php 中,“use VarDocTrait2;”,使所有model类中含有var注释的成员,自动获得注入。

开发意义

  • 减少new代码
  • 避免在__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


ModelDwEx - 老多玩Model魔改后的特性

兼容了阿本的phpbase2,并追加了更多实用方法



id2valueRender.js - 简易前端异步ID置换为具体数据的工具

人话

ID -> 显示其它值

意义

杜绝重复请求,减少单页加载等待时间

前端依赖

  1. jQuery
  2. LtreLib.timing(timing.js)

用于置换数据的接口要求:

仅可定义一个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



接口合并请求 (merge/any)

用途

适应客户端合并请求的需求

合并任意多个接口,并按接口顺序返回对应的响应内容

代码位置

前/后台 MergeController

文档地址

http://svn.ouj.com:3000/0uj-de4au1t/shoes-doc/src/master/%e5%85%b6%e4%bb%96/%e9%9e%8b%e9%80%9a%e7%94%a8%e5%90%88%e5%b9%b6%e6%8e%a5%e5%8f%a3.md