筋斗云接口编程 / 虚拟表和视图

虚拟表和视图

表ApiLog中有一个字段叫app,表示前端应用名:

@ApiLog: id, tm, addr, app, userId

- userId: 如果app=user,则关联到User表;如果app=emp,则关联到员工表Employee

@Employee: id, name, phone, ...
@User: id, ...

当app=”emp”时,就表示是员工端应用的操作日志。
现在想对员工端操作日志进行查询,定义以下接口:

EmpLog.query() -> tbl(id, tm, userId, ac, ..., empName?, empPhone?)

返回
- empName/empPhone: 关联字段,通过userId关联到Employee表的name/phone字段。

应用逻辑
- 权限:AUTH_EMP

EmpLog是一个虚拟对象或虚拟表,实现时,一种办法是可以在数据库定义一个视图,如:

CREATE VIEW EmpLog AS
SELECT t0.id, tm, userId, ac, e.name empName, e.phone empPhone
FROM ApiLog t0
LEFT JOIN Employee e ON e.id=t0.userId
WHERE t0.app='emp' AND t0.userId IS NOT NULL
ORDER BY t0.id DESC

然后可将该视图当作表一样查询(但不可更新),如:

class AC2_EmpLog extends AccessControl 
{
    protected $allowedAc = ["query"];
}

这样就可以实现上述接口了。

另一种办法是直接使用AccessControl创建虚拟表,代码如下:

class AC2_EmpLog extends AccessControl 
{
    protected $allowedAc = ["query"];
    protected $table = 'ApiLog';
    protected $defaultSort = "t0.id DESC";
    protected $defaultRes = "id, tm, userId, ac, req, res, reqsz, ressz, empName, empPhone";
    protected $vcolDefs = [
        [
            "res" => ["e.name AS empName", "e.phone AS empPhone"],
            "join" => "LEFT JOIN Employee e ON e.id=t0.userId"
        ]
    ];

    // get/query操作都会走这里
    protected function onQuery() {
        $this->addCond("t0.app='emp' and t0.userId IS NOT NULL");
    }
}

与上例相比,它不仅无须在数据库中创建视图,还也可以进行更新。
其要点是:

  • 重写$table属性, 定义实际表
  • 用属性$vcolDefs定义虚拟字段
  • 用addCond方法添加缺省查询条件

属性$defaultSort$defaultRes可用于定义缺省返回字段及排序方式。

在get/query接口中可以用”res”指定返回字段,如果未指定,则会返回除了$hiddenFields定义的字段之外,所有主表中的字段,还会包括设置了default=>true的虚拟字段。
通过$defaultRes可以指定缺省返回字段列表。

query接口中可以通过”orderby”来指定排序方式,如果未指定,默认是按id排序的,通过$defaultSort可以修改默认排序方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Vue.js框架的筋斗云(一般指的是翻转动画效果,可能是指类似于武侠小说中的“筋斗云”那样的视觉效果)可以通过使用Vue的指令、过渡(transitions)和动画库(如Vue Transition Group或第三方库Vuetify等)来实现。以下是一个简单的示例: 1. Vue指令(v-if/v-else或v-show)配合过渡: ```html <template> <div v-if="flipped" class="flip"> <!-- 倒置内容 --> <div>{{ message }}</div> </div> <button @click="flip">Flip</button> </template> <script> export default { data() { return { flipped: false, message: "I'm a flipping Vue element", }; }, methods: { flip() { this.flipped = !this.flipped; }, }, }; </script> <style> .flip { transition: transform 0.5s; } .flip-enter-active, .flip-leave-active { transform: rotateY(180deg); } .flip-enter, .flip-leave-to { transform: rotateY(0deg); } </style> ``` 在这个例子中,点击按钮时,元素会旋转180度进行翻转,实现了简单的翻转效果。 2. 使用Vue Transition Group: ```html <template> <transition-group tag="div" name="flip"> <div v-for="(item, index) in messages" :key="index" :class="{ flipped: item.flipped }"> {{ item.message }} </div> </transition-group> <button @click="addMessage">Add Message</button> </template> <script> export default { data() { return { messages: [ { message: 'Message 1', flipped: false }, ], }; }, methods: { addMessage() { this.messages.push({ message: 'New Message', flipped: false }); }, }, computed: { // 为Vue Transition Group 提供动态切换状态的数组 messagesToAnimate() { return this.messages.filter((msg) => msg.flipped); }, }, }; </script> <style> .flip-enter-active, .flip-leave-active { transform: rotateY(180deg); transition: all 0.5s; } .flip-enter, .flip-leave-to { transform: rotateY(0deg); } </style> ``` 在这个版本中,你可以创建一个列,每次添加新消息时,新消息的元素会被添加到组中并自动执行翻转效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值