最近有将AppSite框架进行公开发布(开源)的想法。 不过开源也就意味着更多的一份责任,如果是普通的个人系统还好,我们的系统商业化在很多中大型项目上,安全也是一个隐忧。
暂且先梳理一下
AppSite PHP全栈框架
Appsite的宗旨是用于快速开发网络云应用物联网
全栈支持引擎 Full stack Supporting Engine 介于CMS与Framework之间
AppSite 核心特色是极简的语义化编程
如果一个框架、一个语言、甚至一个程序他的可读性不好甚至很差,那么他就是我眼中的垃圾。 我们可以回想一下,高级语言的意义到底是什么? AppSite追求的就是当我们书写/维护我们的程序时,可以像读一篇文章一样,顺畅的知道别人写了什么,自己写过什么。 先不要跟我说什么设计模式、优雅还是什么安全的,首先,我们应该能阅读我们的代码,因为看明白代码之后,其他的都不耽误。
代码语言:javascript复制$validate = USER::mobileValidate('15000000000','123456');
if( $validate->isOk() ){
print( 'validated' );
}else{
print( $validate->status );
print( $validate->message );
}
AppSite 主要思想是面向数据编程
从某个侧面来看计算机信息技术本身就是对于数据的各种处理,而AppSite就是这样的思想,我们的核心引擎着重解决的是提供一个可以自适应处理各种不同结构数据的一套程序开发套件。 基于这些高度自适应的基础功能,我们可以方便的创建各种方法或对象、进而快速实现不同的业务逻辑的新增或调整。
例如,我们对于向数据库添加数据的时候,通用的使用的是:
代码语言:javascript复制$DB->add( $data, $table ); // 数据库实例化操作方法
USER::add( $data ); // 组件静态方法
这里相当于我们告诉程序 “我有这些数据,你添加一下。” 程序则通过设定好的规范自动去完成数据整理以及后续操作。
通过基础字段的设定就可以快速创建一个模块,这个类就快速拥有了全部基础能力,只要将数据和客户端进行通信就能完成一些基本的功能。
代码语言:javascript复制// 在当前类中,添加和更新会自动使用上述数组进行过滤和语句处理 进而向数据库进行提交
class MODULE extends ITEM{
private static $table = "item_module"; // 表
private static $primaryid = "moduleid"; // 主字段
private static $addFields = [
'categoryid','type','parentid','authorid','title','cover','description','introduce','viewtimes','sort','featured','status',
];
private static $updateFields = [
'categoryid','type','parentid','title','cover','description','introduce','viewtimes','sort','featured','status',
];
// 如果有非常特殊的需要,可以追加更多的数据来指定更多操作时的规范 如:
private static $spectialFields = [ 'cover','description' ];
}
这样做的话,我们只需要设定好我们期望的工作方式,而不需要过多的去进行 程序过程的书写,更像是在设计一个程序或工作流而不是做大量的编码。
面向跨平台开发、接口开发的网络服务引擎
AppSite是完全的前后端分离架构。 舍弃了开箱即用的CMS设计思路,特别是传统PHP,J2EE前后端混合写法的网站开发模式。 [当前版本的管理后台使用了PHP开发 不是完全的前后端分离,但其模型是分离的,后续考虑重构]
我们可以通过创建不同的客户端程序( WEB,H5,小程序,IOS,物联网终端 ) 来对接服务端的数据,而服务端在保持接口稳定的同时可以做到独立升级优化。
由于在接口的设计时我们遵循了同一套标准( AppSite Result 用于服务端内部以及接口通讯的数据格式 ) 很多时候,同一个接口在客户端可以得到不同的运用。 客户端只需要根据数据进行主动过滤或组合,便可以快速开发新功能点。
支持分布式 | 云架构 | 多语言
支持REDIS数据缓存 并发能力强
服务端入口
全局实例化对象:
代码语言:javascript复制/**
调用方式
PHP全局参数: $GLOBAL['user'],$GLOBALS['sql'] ...
基类静态方法: APS::APP(), APS::USER(), APS::ACCESS(), APS::SQL ...
**/
$APP
# 应用描述模块 默认全局注册,提供全局的参数、环境、通用缓存等
$USER
# 基础用户模块 通过header参数初始化 (无则启用Guest身份)
$ACCESS
# 权限模块 基于USER进行初始化
$SQL
# 数据库模块 通过配置文件初始化
$RDS
# REDIS服务 需要有服务端redis扩展支持 ?非必须
$RECORD
# 系统日志模块 基于USER初始化
$ROUTE
# 路由模块(API唯一入口)
$HOOK
# 勾子模块(API注册、调用模块 未注册的方法不会被路由调用)
基础类
BASE abstract
基类
提供封装过的基本数据库连接,对象/函数间的结果返回,日志记录
ITEM abstract
单元类
主要用于封装常用的CURD以及基本的高级CURD 例如设置字段状态、字段自增、联合查询等 基本上业务模块都可以基于item类进行扩展
ITEM 具有抽象接口用于函数过程注入或覆盖,以达到部分自定义或函数自定义的作用。
AppSite SQL 参数关键字
代码语言:javascript复制page # 列表翻页
size # 列表数据大小
sort # 排序
keyword # 关键词搜索(支持中文分词)
target # 关键词搜索命中字段(多字段)
value # 关键词搜索命中字段值
table # 表
field # 字段名
fields # 字段集合
distinct # 排重字段
filters # 过滤条件(KeyValue) 表内过滤
conditions # 过滤条件(KeyValue) 查询过滤
group # 按字段成集合
count # 统计字段集合数
alias # 数据表别称( JOIN查询有效 以子数组形式返回数据 )
key # 关键字段
bind # 绑定字段
data # 待插入数据
location # 使用定位数据格式
list # 待插入 批量数据(不严格要求格式一致,不能跨表)
arr # 批量查询 索引字段ID集合
sets # FIND_IN_SET查询方式 可选 ? 子集 field,values