yangsuda / slimcms
The SlimCMS framework
Installs: 44
Dependents: 0
Suggesters: 0
Security: 0
Stars: 8
Watchers: 3
Forks: 1
Open Issues: 0
Language:JavaScript
Type:project
Requires
- php: ^7.3
- yangsuda/framework: ^2.1
This package is auto-updated.
Last update: 2024-12-27 06:50:50 UTC
README
预览
说明
基于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/”目录的情况下的规则.