Skip to content

核心

操作

Poppy 核心模块, system 基于本模块

权限操作

php artisan py-core:permission {slug}
{slug}:
    - list   : 获取权限列表
    - init   : 权限初始化
    - menus  : 检查菜单[todo Undefined index: children]
    - assign : 将权限赋值给指定的用户组
    - check  : 权限检测

文档以及检查工具

php artisan py-core:doc {slug}
{slug}:
    - api   : 生成api文档[apidoc 生成目录]
    - cs    : code style - fix , 代码格式修复(todo 以后IDE 来做)
    - cs-pf :
    - lint  : 安装检测PHP语法错误的工具
    - php   : 生成 php api 文档
    - log   : 查看当天的 storage 日志

PHP-CS-Fixer

PHP-CS-Fixer is a tool to automatically fix PHP Coding Standards issues, We use it for Code Specification.

检查代码

php artisan py-core:inspect {type}
{type} :
    - class      : 方法检测
    - file       : 检测文件命名[文件类和文件位置不匹配]
    - controller : 列出所有功能点
    - action     : 列出所有业务逻辑
    - permission : 检测未在控制器使用的权限和已使用但是未定义的权限
    - seo        : 生成 seo 项目
    - trans      : 对 trans 数据进行导入验证
    - validation : 对通用验证项目进行校验

数据库

php artisan py-core:db {action}
{action} :
    - fields      : 生成数据库 db 缓存
    - suggest     : 生成数据库建议项目, 便于简单规则的验证
    - friendly    : 检查 Friendly trans 是否已定义

运维工具

php artisan py-core:op {slug}
{slug} :
    - mail   : 发送运维邮件

生成 php api 文档

先睹为快, 使用 doctum 生成的 php api 地址 PoppyV4 Api

生成配置文件

$ php artisan vendor:publish --tag=poppy
...
Copied File [/modules/system/resources/config/doctum-config.php] To [/storage/doctum/config.php]
Publishing complete.

下载 doctum

$ php artisan py-core:doc php

Please Run Command To Install doctum.phar:
curl https://doctum.long-term.support/releases/latest/doctum.phar --output /path/of/doctum/doctum.phar

# 下载之后再运行

$ php artisan py-core:doc php
Please Run Command:
php /path/of/doctum/doctum.phar update /path/of/doctum/config.php

我们运行命令来生成 php 文档

$ php /path/of/doctum/doctum.phar update /path/of/doctum/config.php
 Updating project

Version master
  Parsing   done
  Rendering done

 Version    Updated C    Removed C
   master         1224            0

 Version    Updated C    Updated N    Removed C    Removed N
   master            2            0            0            0

运行完成后会在 public/docs/php 文件夹下生成标准的 html 文档, 这样我们就可以进行访问了.

如果默认的配置无法满足你的要求可以编辑 resources/doctum/doctum.php 文件来修改需要生成文档的文件夹和目标路径.

生成文档如下

配置文件 : doctum-config.php

配置

文件位置 : config/poppy.php

apidoc

  • Type : array

api 接口文档配置, 改文档可以使用 php artisan py-core:doc api 来生成文档, 定义如下

'apidoc' => [
    ...
    'web' => [
        // 标题
        'title'            => '前台接口',
        // 方法
        'method'           => 'post',
        // 默认访问地址
        'default_url'      => 'api_v1/system/auth/login',
        // 匹配 src/Http/Request 的文件目录来生成文件, 使用 glob 规则匹配
        'match'      => 'api.*/web|ApiWeb|api/web|ApiV1',
    ],
    ...
]

op_mail

  • Type : string
  • Default : env('CORE_OP_MAIL', '')

后台可支持发送测试邮件, 这里配置发送人的邮箱

rbac

  • Type : array

设置 RBAC 模型以及外键 KEY, 这里默认设定的是 poppy/system 模块的模型, 不使用此模块可以自行实现模型定义以及关联关系

'rbac'       => [
    // 角色模型
    'role'            => \Poppy\System\Models\PamRole::class,
    // 账号模型
    'account'         => \Poppy\System\Models\PamAccount::class,
    // 角色账号模型
    'role_account'    => \Poppy\System\Models\PamRoleAccount::class,
    // 权限模型
    'permission'      => \Poppy\System\Models\PamPermission::class,
    // 角色权限模型
    'role_permission' => \Poppy\System\Models\PamPermissionRole::class,
    // 角色外键
    'role_fk'         => 'role_id',
    // 账号外键
    'account_fk'      => 'account_id',
    // 权限外键
    'permission_fk'   => 'permission_id',
],

缓存

缓存定义

缓存使用扁平化管理, 缓存函数是在 laravel 的基础上加了一层标签, 用法遵循 laravel 缓存使用

缓存一般采用如下命名

sys_tag('{slug}')->get('{name}')
slug    : 根据模块目录来进行判定
    例如 poppy system 模块命名为 py-system
    例如 poppy core 模块命名为 py-core
    例如 poppy core rbac 模块命名为 py-core-rbac(因为需要用到 flush 方法, 这里采用标签来区分, 而不是使用 type)
name    : 代表的是缓存的名称

为了保证缓存名称的唯一性我们约定 slug : poppy 模块 : py-{module}

name : name 使用静态方法定义, 支持传参

示例

例如 Area 模块的我们定义缓存函数

php
<?php namespace Poppy\Area\Classes;


class PyAreaDef
{
    /**
     * ID -> PID 映射
     * @return string
     */
    public static function ckMatchIdPid(): string
    {
        return 'match_id_pid';
    }
}

使用

php
/**
 * @param bool $clear 是否清除
 * @return mixed
 */
function matchKv($clear = false)
{
    if ($clear) {
        sys_tag('py-area')->forget(PyAreaDef::ckMatchIdPid());
    }

    return sys_tag('py-area')->remember(PyAreaDef::ckMatchIdPid(), 10, function () {
        return AreaContent::pluck('parent_id', 'id')->toArray();
    });
}

持久化

持久化的流程是将数据放入到缓存, 然后所有的操作都会缓存起来, 然后通过计划任务将数据同步到数据库

缓存

持久化使用的缓存是 tag:py-core:persist KEY

tag:py-core:persist:
    {table}_insert : redis 列表
        [{
            key,    # id
            insert  # 插入的条件语句
        }]
    {table}_update : redis hash
        [{
            where,  # 查询条件
            update  # 更新内容
        }]

insert 持久化

这里适用的场景是单条插入可以延迟的情况采用统一插入

RdsPersist::insert('pam_log', $items);

update 持久化

这里支持从数据库初始化数据, 如果数据不存在, 则创建一条数据并初始化到缓存中

2.24.1 版本之后持久化数据可以不进行初始化, 默认必须初始化

RdsPersist::update('gift_collection', $where, [
    'gift_num[+]' => 8,
]);

持久化使用的基本用法, 因为 persist 加入 facade, 所以可以使用 Persist 全局 Facade 来进行使用

$init = [
    'add' => 0,
];

$update = [
    'append' => 5,
];
$result = RdsPersist::calcUpdate($init, $update);

另外这里 update 支持额外的语法

<?php
$init = [
    'add'      => 0,
    'subtract' => 0,
    'preserve' => 0,
    'force'    => 0,
];¶

$update = [
    'add[+]'      => 5,   # 加语法, 保留两位小数, 使用 Number 来计算
    'subtract[-]' => 5,   # 减语法, 保留两位小数, 使用 Number 来计算
    'force'       => 8,   # 覆盖语法, 覆盖之前数据
                            # 不传值代表保留
];

$result = RdsPersist::calcUpdate($init, $update);
$result = [
    "add" => "5.00"
    "subtract" => "-5.00"
    "preserve" => 0
    "force" => 8
]

持久化到数据库

如果需要持久化到数据库则需要执行相关命令

Usage:
py-core:persist `<table>`

Arguments:
table  Table to exec. [pam_log...|all]
$this->app['events']->listen('console.schedule', function (Schedule $schedule) {
    ...
    $schedule->command('py-core:persist', ['chat_room'])
        ->daily()->appendOutputTo($this->consoleLog());
    ...
})