Skip to content

yangsuda/slimcms

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Latest Stable Version Total Downloads Latest Unstable Version PHP Version Require

预览

列表 添加编辑 接口文档
alt tag alt tag alt tag

说明

基于Slim4、PSR-7和PHP-DI容器实现。

debug默认是开启的,生产环境下CORE_DEBUG建议改成false

生产环境下建议opcache扩展开启,本地测试性能会有近10倍的提升

数据库连接默认通过“mysql:host=XXX:XXX;”方式连接,有些情况下会连接不成功,可改成“mysql:host=XXX;port=XXX;”试试, 操作方式:将config/settings.php中的connecttype参数置为空

CORE_DEBUG关闭情况下,系统配置默认会生成文件:/data/CompiledContainer.php,在部分情况下更新系统配置时,此文件不会更新,遇到此问题时,可将此文件直接删除,系统会重新再次生成,或将init.php中的$containerBuilder->enableCompilation(CSDATA);注释掉

开发版下载

composer create-project yangsuda/slimcms [my-app-name] dev-master

将“[my app name]”替换为新应用程序所需的目录名。

建议将虚拟主机文档根目录指向新应用程序的“public/”目录。

安装配置

通过运行“public/install/”进行安装

路由规则

控制层:app/Control,Control中的文件夹名称由入口文件中CURSCRIPT常量决定,如:默认前端入口对应是main文件夹

URL通过?p=CLASS/METHOD方式访问控制层相应的方法,如没在相应类中找到相应方法会在当前文件夹中的DefaultControl.php中寻找, 如果还没找到,会到上级app/Control/"CURSCRIPT"/DefaultControl中寻找,如还没找到,继续到app/DefaultControl寻找,再找不到就报错

如:访问/?p=view/abc/test

会先找app/Control/main/view/AbcControl中test方法,如果没找到相应的方法,则会按上面说的一级级去找,如果找不到就报错

如:访问/?p=view/test

会先找app/Control/main/ViewControl中test方法,如果没找到相应的方法,则会按上面说的一级级去找,如果找不到就报错

如:访问/?p=test

会先找app/Control/main/TestControl中test方法,如果没找到相应的方法,则会按上面说的一级级去找,如果找不到就报错

数据获取

通过self::input()获取外部传参

self::inputInt获取强转为int类型的外部传参

self::inputFloat获取强转为float类型的外部传参

self::inputString获取强转为string类型的外部传参

数据结构

Model层数据统一以Output对象形式返回,

通过getCode方法获取状态码,200为正确,其它为错误,如:$output->getCode()

通过withCode方法设置状态码,如:$output->withCode(24024)

通过getData方法获取返回值,如:$output->getData()

通过withData方法设置返回值,如:$output->withData(['value'=>'test'])

通过getTemplate方法获取模板,如:$output->getTemplate()

通过withTemplate方法设置设置解析的模板,如:$output->withTemplate('main/index')

通过getReferer方法获取来路URL,如:$output->getReferer()

通过withReferer方法设置来路URL,如:$output->withReferer('?p=test')

数据输出

共有5种输出方式

1、$this->view(),用于模板渲染加载输出

2、$this->directTo(),直接跳转,提示信息存储在cookie中,如需显示,在模板中通过$data[errorCode]、$data[errorMsg]加载

3、$this->json(),返回json数据

4、$this->jsonCallback(),用于跨域请求

5、self::response(),根据请求的content-type返回相应的数据类型

功能插件

框架本身只提供基础构建,一些具体功能通过插件化实现,目前有接口插件、支付插件、文件管理插件、文件安全校验插件四个插件,后期会根据实际需要增加更多插件。

通过在插件市场下载安装,对于已经下载的插件可开启或关闭,卸载插件时会提示是否删除安装时添加的相应表,如果不删除相应表,再次安装时将会提示安装失败

数据接口

需要先安装接口插件,接口文档和数据接口通过后台表单开放接口权限控制,分“列表、展示、添加修改、删除、导出、表单结构、审核、统计”8种权限, 如不能满足需求,可自定义接口。

数据统一以json格式返回,状态码200为正常,其它为错误

{
      "code": 200,
      "data": {},
      "msg": 操作成功
}  

默认增删改查定制化

可通过在/app/Table文件夹中创建对应表的类文件来实现数据输入输出的定制化,格式为“表名Table.php”,(注:第一个字母要大写),如admin表,在文件夹中创建AdminTable.php文件

数据列表(forms/dataList)

可在上面的类文件中定义 dataListInit、dataListBefore、dataListAfter 方法来实现列表的前、中、后三个阶段的数据输入输出控制,(注:状态码返回200为成功,其它为报错),具体参见Forms.php文件,如:

public function dataListBefore(&$param): int
{
    return 200;
} 

数据保存(forms/dataSave)

可在上面的类文件中定义 dataSaveInit、dataSaveBefore、dataSaveAfter 方法来实现数据保存的前、中、后三个阶段的数据输入输出控制,(注:状态码返回200为成功,其它为报错),具体参见Forms.php文件,如:

public function dataSaveBefore(&$data, $row = [], $options = []): int
{
    return 200;
}

数据详细(forms/dataView)

可在上面的类文件中定义 dataViewBefore、dataViewAfter 方法来实现数据详细的前、后两个阶段的数据输入输出控制,(注:状态码返回200为成功,其它为报错),具体参见Forms.php文件,如:

public function dataViewAfter(&$data): int
{
    return 200;
}

数据删除(forms/dataDel)

可在上面的类文件中定义 dataDelBefore、dataDelAfter 方法来实现数据删除的前、后两个阶段的数据输入输出控制,(注:状态码返回200为成功,其它为报错),具体参见Forms.php文件,如:

public function dataDelBefore($data, $options = []): int
{
    return 200;
}

数据审核(forms/dataCheck)

可在上面的类文件中定义 dataCheckBefore、dataCheckAfter 方法来实现数据审核的前、后两个阶段的数据输入输出控制,(注:状态码返回200为成功,其它为报错),具体参见Forms.php文件,如:

public function dataCheckBefore($ids, $ischeck, $options): int
{
    return 200;
}

数据统计(forms/dataCount)

可在上面的类文件中定义 dataCountBefore 方法来实现数据统计的前的数据输入控制,(注:状态码返回200为成功,其它为报错),具体参见Forms.php文件,如:

public function dataCountBefore($param)
{
    return 200;
}

生成的表单HTML(forms/dataFormHtml)

可在上面的类文件中定义 getFormHtmlBefore、getFormHtmlAfter 方法来实现生成的表单HTML的前、后两个阶段的数据输入输出控制,(注:状态码返回200为成功,其它为报错),具体参见Forms.php文件,如:

public function getFormHtmlBefore($fields, $row, $form, $options)
{
    return 200;
}

数据导出(forms/dataExport)

可在上面的类文件中定义 dataExportBefore、dataExportAfter 方法来实现数据导出的前、后两个阶段的数据输入输出控制,(注:状态码返回200为成功,其它为报错),具体参见Forms.php文件,如:

public function dataExportBefore($condition, $result)
{
    return 200;
}

前端web页面

前端web页面默认根据后台表单开放前端WEB功能权限控制显示,分“列表、展示、添加修改、删除、导出、表单结构、审核”7种权限, 对应列表、详细、编辑添加三种页面。

默认模板在template/forms/中,如自定义模板,先创建相应的文件夹,再根据表单ID(fid)创建相应的模板。

如:自定义fid为1的列表模板,在template/forms/中创建dataList文件夹,在其中创建1.htm模板,系统会自动加载此模板, 如不能满足需求,可自行开发

模板标签

模板中可直接加载变量 $code(状态码)、$msg(提示信息)、$referer(来路URL)、$data(数据)、$cfg(系统配置参数)

如加载数组中某一元素,模板中可通过$data[xxx][xxx]...加载。

注:在某些情况下,会导致变量加载失败,如在汉字或字母中间加载某一变量,变量需用{}括起来,如:{$data[xxx][xxx]}

条件判断标签

{if ...}
...
{elseif ...}
...
{else}
....
{/if}

<!--{if ...}-->
...
<!--{elseif ...}-->
...
<!--{else}-->
....
<!--{/if}-->

遍历循环标签

{loop $XXX $k $v}
$v[...]
...
{/loop}

<!--{loop $XXX $k $v}-->
$v[...]
...
<!--{/loop}-->

注:$k也可以不写,写成{loop $XXX $v}

表单列表数据标签

{list fid=表单ID}
$v[...]
...
{/list}

更多标签说明具体参见Template.php

附件上传

默认是上传附件本地存储, 如想改成阿里云的OSS存储

1、加载阿里云的SDK

composer require aliyuncs/oss-sdk-php

2、修改调用参数$accessKeyId、$accessKeySecret等:app/Model/aliyun/AliOss.php

3、修改加载的上传类:app/Core/settings.php

将new Upload()改成new AliOss(),注意相应的引用要改一下

数据库分表

对于像日志类的表如果长时间积累可能会导致表数据非常庞大,影响执行效率,所以可以考虑分表操作。

具体操作:

在app/Table/文件夹中创建相应表的类文件,文件名称格式:表名+'Table.php'(表名第一个字母大写),如:AdminlogTable.php

在构造函数中增加$this->subtable($tableName, $extendName);

如:

public function __construct(Request $request, string $tableName, string $extendName = null)
{
        //根据年份进行分表
        if (!isset($extendName)) {
            $extendName = date('Y');
            $this->subtable($tableName, $extendName);
        }
        parent::__construct($request, $tableName, $extendName);
}

以示例为例

数据库中将自动创建表adminlog2022

数据调用方式:self::t('adminlog')->...(默认调用当前年份数据),如需调用2021数据,:self::t('adminlog','2021')->...

apache伪静态规则

RewriteEngine On
RewriteRule ^(.*)/(ueditor|resources|uploads|install)/(.*) - [L]
RewriteRule ^(.*)/(ueditor|resources|uploads|install)(.*) - [L]
RewriteRule ^(.*)/([\w]+)/([\w]+)/([\w]+)/([\w]+)/([\w]+)/([\w-.%`]+).html?$ $1/index.php?p=$2/$3/$4/$5/$6&q=$7 [QSA,L]
RewriteRule ^(.*)/([\w]+)/([\w]+)/([\w]+)/([\w]+)/([\w]+)(/)?$ $1/index.php?p=$2/$3/$4/$5/$6 [QSA,L]
RewriteRule ^(.*)/([\w]+)/([\w]+)/([\w]+)/([\w]+)/([\w-.%`]+).html?$ $1/index.php?p=$2/$3/$4/$5&q=$6 [QSA,L]
RewriteRule ^(.*)/([\w]+)/([\w]+)/([\w]+)/([\w]+)(/)?$ $1/index.php?p=$2/$3/$4/$5 [QSA,L]
RewriteRule ^(.*)/([\w]+)/([\w]+)/([\w]+)/([\w-.%`]+).html?$ $1/index.php?p=$2/$3/$4&q=$5 [QSA,L]
RewriteRule ^(.*)/([\w]+)/([\w]+)/([\w]+)(/)?$ $1/index.php?p=$2/$3/$4 [QSA,L]
RewriteRule ^(.*)/([\w]+)/([\w]+)/([\w-.%`]+).html?$ $1/index.php?p=$2/$3&q=$4 [QSA,L]
RewriteRule ^(.*)/([\w]+)/([\w]+)(/)?$ $1/index.php?p=$2/$3 [QSA,L]
RewriteRule ^(.*)/([\w]+)/([\w-.%`]+).html?$ $1/index.php?p=$2&q=$3 [QSA,L]
RewriteRule ^(.*)/([\w]+)(/)?$ $1/index.php?p=$2 [QSA,L]

nginx伪静态规则

if (!-e $request_filename) {
	rewrite ^(.*)/([\w]+)/([\w]+)/([\w]+)/([\w]+)/([\w]+)/([\w-.%`]+).html?$ $1/index.php?p=$2/$3/$4/$5/$6&q=$7&$args last;
	rewrite ^(.*)/([\w]+)/([\w]+)/([\w]+)/([\w]+)/([\w]+)(/)?$ $1/index.php?p=$2/$3/$4/$5/$6&$args last;
	rewrite ^(.*)/([\w]+)/([\w]+)/([\w]+)/([\w]+)/([\w-.%`]+).html?$ $1/index.php?p=$2/$3/$4/$5&q=$6&$args last;
	rewrite ^(.*)/([\w]+)/([\w]+)/([\w]+)/([\w]+)(/)?$ $1/index.php?p=$2/$3/$4/$5&$args last;
	rewrite ^(.*)/([\w]+)/([\w]+)/([\w]+)/([\w-.%`]+).html?$ $1/index.php?p=$2/$3/$4&q=$5&$args last;
	rewrite ^(.*)/([\w]+)/([\w]+)/([\w]+)(/)?$ $1/index.php?p=$2/$3/$4&$args last;
	rewrite ^(.*)/([\w]+)/([\w]+)/([\w-.%`]+).html?$ $1/index.php?p=$2/$3&q=$4&$args last;
	rewrite ^(.*)/([\w]+)/([\w]+)(/)?$ $1/index.php?p=$2/$3&$args last;
	rewrite ^(.*)/([\w]+)/([\w-.%`]+).html?$ $1/index.php?p=$2&q=$3&$args last;
	rewrite ^(.*)/([\w]+)(/)?$ $1/index.php?p=$2&$args last;
}

注:此规则是在将根目录指向到“public/”目录的情况下的规则.