插件说明

燃烧的冰2020-01-14  268

wellcms 主程序架构采用函数风格的 MVC,插件机制采用 AOP 机制,面向切面编程,也就是往代码里插入代码,合并后再执行(合并后的代码存放于 tmp 目录下),使得性能方面零损耗,不影响编译,强大而又简单。大大的简化了程序的复杂度,在同等复杂度的功能实现上比同类产品的代码简洁很多,核心只有 22 个表,非常利于二次开发。


wellcms程序结构

index.php 入口程序

conf/ 配置文件目录

lang/ 语言包

log/ 日志目录

tmp/ 临时目录

model/ 数据调用(复用度高)

route/ 业务逻辑(复用度低)

plugin/ 插件目录

upload/ 上传文件

view/ 模板、静态资源(js, css, img, htm, font)

xiunophp/ 公共的函数库

admin/ 后台管理


开发插件前 打开 index.php,修改 DEBUG 为 2 (这样可以及时看到效果,上线后还原为 0)

!defined('DEBUG') AND define('DEBUG', 2);


插件依赖 conf.json 文件:

{
    "name": "插件名",
    "brief": "插件介绍"
    "version": "1.0.0", // 插件版本
    "software_version": "2.0.0",
    "type": 0,
    "installed": 0, // 0卸载 1安装
    "enable": 0, // 0禁用 1启用
    "hooks_rank": [], // 最大值优先 hook 可以同时设置多个文件优先 hook 对应的数值越大越会被优先使用
    "overwrites_rank": [], // 最大值优先 overwrite 可以同时设置多个文件优先 overwrite 对应的数值越大越会被优先使用
    "dependencies": [] // 依赖其他插件
}


具体开发请看 hook功能 或 overwrite


插件目录命名约束:开发者英文前缀 + 功能,由下划线“_”分割,比如 well_random


插件配置信息,统一使用

setting_set('key', 'value');

setting_get('key');

setting_delete('key');


插件开发数据表约束

一、表和字段命名使用单词+下划线"_",不要使用拼音;

二、以下3个表禁止创建其他索引,如需增加索引,请在附表创建,或者新建表。创建索引前,请先灌100万数据进行测试,在 mysql 使用 explain 看是否走了创建的索引,以免创建无意义的索引。索引以左优先原则创建。

website_thread
website_data
website_comment

1.禁止使用未建索引的查询;

2.禁止使用索引类型 UNIQUE 所有业务逻辑在程序中完成;

3.禁止在 mysql 做运算查询,如 where views>10 或 group by 之类,实践表明高负载环境,数据库使用场景越简单越好,最好的结果就是所有查询语句除了 where 没其他;

4.禁止使用连表查询;

5.禁止使用非主键统计语句;

6.禁止在以下几个表建立非 tinyint 或 int 类型的字段;

website_comment_pid
website_thread_tid
website_flag_thread
website_tag_thread

7.查询、修改、删除尽可能的使用主键;

8.查询 SELECT * 不写字段,一次查完;

9.order by 必须建立在索引之上;

10.不要问为什么,听话照做,不进坑。


字段类型使用约束

尽可能的使用 tinyint 或 int


hook 代码的 php 文件 ( 仅限于 php 文件 ),请使用下面的方式,开头必须加上 exit; 目的是以防文件运行,影响安全。

例如 index_inc.php 这个文件有个 index_inc_after.php 钩子,那么,hook这个地方的文件命名 index_inc_after.php 代码如下

<?php exit;
$route = param(0, 'list');
/* 其他业务代码 */
?>