You've already forked qlg.tsgz.moe
Init Repo
This commit is contained in:
1
vendor/5ini99/think-addons/.gitignore
vendored
Executable file
1
vendor/5ini99/think-addons/.gitignore
vendored
Executable file
@ -0,0 +1 @@
|
||||
|
32
vendor/5ini99/think-addons/LICENSE.txt
vendored
Executable file
32
vendor/5ini99/think-addons/LICENSE.txt
vendored
Executable file
@ -0,0 +1,32 @@
|
||||
|
||||
ThinkPHP遵循Apache2开源协议发布,并提供免费使用。
|
||||
版权所有Copyright © 2006-2016 by ThinkPHP (http://thinkphp.cn)
|
||||
All rights reserved。
|
||||
ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。
|
||||
|
||||
Apache Licence是著名的非盈利开源组织Apache采用的协议。
|
||||
该协议和BSD类似,鼓励代码共享和尊重原作者的著作权,
|
||||
允许代码修改,再作为开源或商业软件发布。需要满足
|
||||
的条件:
|
||||
1. 需要给代码的用户一份Apache Licence ;
|
||||
2. 如果你修改了代码,需要在被修改的文件中说明;
|
||||
3. 在延伸的代码中(修改和有源代码衍生的代码中)需要
|
||||
带有原来代码中的协议,商标,专利声明和其他原来作者规
|
||||
定需要包含的说明;
|
||||
4. 如果再发布的产品中包含一个Notice文件,则在Notice文
|
||||
件中需要带有本协议内容。你可以在Notice中增加自己的
|
||||
许可,但不可以表现为对Apache Licence构成更改。
|
||||
具体的协议参考:http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
190
vendor/5ini99/think-addons/README.md
vendored
Executable file
190
vendor/5ini99/think-addons/README.md
vendored
Executable file
@ -0,0 +1,190 @@
|
||||
# think-addons
|
||||
The ThinkPHP5 Addons Package
|
||||
|
||||
## 安装
|
||||
> composer require 5ini99/think-addons
|
||||
|
||||
## 配置
|
||||
### 公共配置
|
||||
```
|
||||
'addons'=>[
|
||||
// 可以定义多个钩子
|
||||
'testhook'=>'test' // 键为钩子名称,用于在业务中自定义钩子处理,值为实现该钩子的插件,
|
||||
// 多个插件可以用数组也可以用逗号分割
|
||||
]
|
||||
```
|
||||
|
||||
## 创建插件
|
||||
> 创建的插件可以在view视图中使用,也可以在php业务中使用
|
||||
|
||||
安装完成后访问系统时会在项目根目录生成名为`addons`的目录,在该目录中创建需要的插件。
|
||||
|
||||
下面写一个例子:
|
||||
|
||||
### 创建test插件
|
||||
> 在addons目录中创建test目录
|
||||
|
||||
### 创建钩子实现类
|
||||
> 在test目录中创建Test.php类文件。注意:类文件首字母需大写
|
||||
|
||||
```
|
||||
<?php
|
||||
namespace addons\test; // 注意命名空间规范
|
||||
|
||||
use think\addons\Addons;
|
||||
|
||||
/**
|
||||
* 插件测试
|
||||
* @author byron sampson
|
||||
*/
|
||||
class Test extends Addons // 需继承think\addons\Addons类
|
||||
{
|
||||
// 该插件的基础信息
|
||||
public $info = [
|
||||
'name' => 'test', // 插件标识
|
||||
'title' => '插件测试', // 插件名称
|
||||
'description' => 'thinkph5插件测试', // 插件简介
|
||||
'status' => 0, // 状态
|
||||
'author' => 'byron sampson',
|
||||
'version' => '0.1'
|
||||
];
|
||||
|
||||
/**
|
||||
* 插件安装方法
|
||||
* @return bool
|
||||
*/
|
||||
public function install()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 插件卸载方法
|
||||
* @return bool
|
||||
*/
|
||||
public function uninstall()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 实现的testhook钩子方法
|
||||
* @return mixed
|
||||
*/
|
||||
public function testhook($param)
|
||||
{
|
||||
// 调用钩子时候的参数信息
|
||||
print_r($param);
|
||||
// 当前插件的配置信息,配置信息存在当前目录的config.php文件中,见下方
|
||||
print_r($this->getConfig());
|
||||
// 可以返回模板,模板文件默认读取的为插件目录中的文件。模板名不能为空!
|
||||
return $this->fetch('info');
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
### 创建插件配置文件
|
||||
> 在test目录中创建config.php类文件,插件配置文件可以省略。
|
||||
|
||||
```
|
||||
<?php
|
||||
return [
|
||||
'display' => [
|
||||
'title' => '是否显示:',
|
||||
'type' => 'radio',
|
||||
'options' => [
|
||||
'1' => '显示',
|
||||
'0' => '不显示'
|
||||
],
|
||||
'value' => '1'
|
||||
]
|
||||
];
|
||||
```
|
||||
|
||||
### 创建钩子模板文件
|
||||
> 在test目录中创建info.html模板文件,钩子在使用fetch方法时对应的模板文件。
|
||||
|
||||
```
|
||||
<h1>hello tpl</h1>
|
||||
|
||||
如果插件中需要有链接或提交数据的业务,可以在插件中创建controller业务文件,
|
||||
要访问插件中的controller时使用addon_url生成url链接。
|
||||
如下:
|
||||
<a href="{:addon_url('test://Action/link')}">link test</a>
|
||||
格式为:
|
||||
test为插件名,Action为controller中的类名,link为controller中的方法
|
||||
```
|
||||
|
||||
### 创建插件的controller文件
|
||||
> 在test目录中创建controller目录,在controller目录中创建Action.php文件
|
||||
> controller类的用法与tp5中的controller一致
|
||||
|
||||
```
|
||||
<?php
|
||||
namespace addons\test\controller;
|
||||
|
||||
class Action
|
||||
{
|
||||
public function link()
|
||||
{
|
||||
echo 'hello link';
|
||||
}
|
||||
}
|
||||
```
|
||||
> 如果需要使用view模板则需要继承`\think\addons\Controller`类
|
||||
> 模板文件所在位置为插件目录的view中,规则与模块中的view规则一致
|
||||
|
||||
```
|
||||
<?php
|
||||
namespace addons\test\controller;
|
||||
|
||||
use think\addons\Controller;
|
||||
|
||||
class Action extends Controller
|
||||
{
|
||||
public function link()
|
||||
{
|
||||
return $this->fetch();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 使用钩子
|
||||
> 创建好插件后就可以在正常业务中使用该插件中的钩子了
|
||||
> 使用钩子的时候第二个参数可以省略
|
||||
|
||||
### 模板中使用钩子
|
||||
|
||||
```
|
||||
<div>{:hook('testhook', ['id'=>1])}</div>
|
||||
```
|
||||
|
||||
### php业务中使用
|
||||
> 只要是thinkphp5正常流程中的任意位置均可以使用
|
||||
|
||||
```
|
||||
hook('testhook', ['id'=>1])
|
||||
```
|
||||
|
||||
## 插件目录结构
|
||||
### 最终生成的目录结构为
|
||||
|
||||
```
|
||||
tp5
|
||||
- addons
|
||||
-- test
|
||||
--- controller
|
||||
---- Action.php
|
||||
--- view
|
||||
---- action
|
||||
----- link.html
|
||||
--- config.php
|
||||
--- info.html
|
||||
--- Test.php
|
||||
- application
|
||||
- thinkphp
|
||||
- extend
|
||||
- vendor
|
||||
- public
|
||||
```
|
28
vendor/5ini99/think-addons/composer.json
vendored
Executable file
28
vendor/5ini99/think-addons/composer.json
vendored
Executable file
@ -0,0 +1,28 @@
|
||||
{
|
||||
"name": "5ini99/think-addons",
|
||||
"description": "addons package for thinkphp5",
|
||||
"homepage": "https://github.com/5ini99/think-addons",
|
||||
"license": "Apache-2.0",
|
||||
"minimum-stability": "stable",
|
||||
"version": "1.2.0",
|
||||
"authors": [
|
||||
{
|
||||
"name": "xiaobo.sun",
|
||||
"email": "xiaobo.sun@qq.com"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/5ini99/think-addons/issues"
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"think\\addons\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/helper.php"
|
||||
]
|
||||
}
|
||||
}
|
202
vendor/5ini99/think-addons/src/Addons.php
vendored
Executable file
202
vendor/5ini99/think-addons/src/Addons.php
vendored
Executable file
@ -0,0 +1,202 @@
|
||||
<?php
|
||||
|
||||
namespace think\addons;
|
||||
|
||||
use think\Config;
|
||||
use think\View;
|
||||
use think\Db;
|
||||
|
||||
/**
|
||||
* 插件基类
|
||||
* Class Addons
|
||||
* @author Byron Sampson <xiaobo.sun@qq.com>
|
||||
* @package think\addons
|
||||
*/
|
||||
abstract class Addons{
|
||||
/**
|
||||
* 视图实例对象
|
||||
* @var view
|
||||
* @access protected
|
||||
*/
|
||||
protected $view = null;
|
||||
|
||||
// 当前错误信息
|
||||
protected $error;
|
||||
|
||||
/**
|
||||
* $info = [
|
||||
* 'name' => 'Test',
|
||||
* 'title' => '测试插件',
|
||||
* 'description' => '用于WSTMart的插件扩展演示',
|
||||
* 'status' => 1,
|
||||
* 'author' => 'WSTMart',
|
||||
* 'version' => '1.0.1'
|
||||
* ]
|
||||
*/
|
||||
public $info = [];
|
||||
public $addons_path = '';
|
||||
public $config_file = '';
|
||||
|
||||
/**
|
||||
* 架构函数
|
||||
* @access public
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
// 获取当前插件目录
|
||||
$this->addons_path = ADDON_PATH . $this->getName() . DS;
|
||||
// 读取当前插件配置信息
|
||||
if (is_file($this->addons_path . 'config.php')) {
|
||||
$this->config_file = $this->addons_path . 'config.php';
|
||||
}
|
||||
|
||||
// 初始化视图模型
|
||||
$config = ['view_path' => $this->addons_path];
|
||||
$config = array_merge(Config::get('template'), $config);
|
||||
$this->view = new View($config, Config::get('view_replace_str'));
|
||||
|
||||
// 控制器初始化
|
||||
if (method_exists($this, '_initialize')) {
|
||||
$this->_initialize();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取插件的配置数组
|
||||
* @param string $name 可选模块名
|
||||
* @return array|mixed|null
|
||||
*/
|
||||
final public function getConfig($name = '')
|
||||
{
|
||||
static $_config = array();
|
||||
if (empty($name)) {
|
||||
$name = $this->getName();
|
||||
}
|
||||
if (isset($_config[$name])) {
|
||||
return $_config[$name];
|
||||
}
|
||||
$map['name'] = $name;
|
||||
$map['status'] = 1;
|
||||
$config = [];
|
||||
if (is_file($this->config_file)) {
|
||||
$temp_arr = include $this->config_file;
|
||||
foreach ($temp_arr as $key => $value) {
|
||||
if ($value['type'] == 'group') {
|
||||
foreach ($value['options'] as $gkey => $gvalue) {
|
||||
foreach ($gvalue['options'] as $ikey => $ivalue) {
|
||||
$config[$ikey] = $ivalue['value'];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$config[$key] = $temp_arr[$key]['value'];
|
||||
}
|
||||
}
|
||||
unset($temp_arr);
|
||||
}
|
||||
$_config[$name] = $config;
|
||||
|
||||
return $config;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前模块名
|
||||
* @return string
|
||||
*/
|
||||
final public function getName(){
|
||||
$data = explode('\\', get_class($this));
|
||||
return strtolower(array_pop($data));
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查配置信息是否完整
|
||||
* @return bool
|
||||
*/
|
||||
final public function checkInfo(){
|
||||
$info_check_keys = ['name', 'title', 'description', 'status', 'author', 'version'];
|
||||
foreach ($info_check_keys as $value) {
|
||||
if (!array_key_exists($value, $this->info)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 加载模板和页面输出 可以返回输出内容
|
||||
* @access public
|
||||
* @param string $template 模板文件名或者内容
|
||||
* @param array $vars 模板输出变量
|
||||
* @param array $replace 替换内容
|
||||
* @param array $config 模板参数
|
||||
* @return mixed
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function fetch($template = '', $vars = [], $replace = [], $config = []){
|
||||
if (!is_file($template)) {
|
||||
$template = '/' . $template;
|
||||
}
|
||||
// 关闭模板布局
|
||||
$this->view->engine->layout(false);
|
||||
|
||||
echo $this->view->fetch($template, $vars, $replace, $config);
|
||||
}
|
||||
|
||||
/**
|
||||
* 渲染内容输出
|
||||
* @access public
|
||||
* @param string $content 内容
|
||||
* @param array $vars 模板输出变量
|
||||
* @param array $replace 替换内容
|
||||
* @param array $config 模板参数
|
||||
* @return mixed
|
||||
*/
|
||||
public function display($content, $vars = [], $replace = [], $config = []){
|
||||
// 关闭模板布局
|
||||
$this->view->engine->layout(false);
|
||||
echo $this->view->display($content, $vars, $replace, $config);
|
||||
}
|
||||
|
||||
/**
|
||||
* 渲染内容输出
|
||||
* @access public
|
||||
* @param string $content 内容
|
||||
* @param array $vars 模板输出变量
|
||||
* @return mixed
|
||||
*/
|
||||
public function show($content, $vars = []){
|
||||
// 关闭模板布局
|
||||
$this->view->engine->layout(false);
|
||||
echo $this->view->fetch($content, $vars, [], [], true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 模板变量赋值
|
||||
* @access protected
|
||||
* @param mixed $name 要显示的模板变量
|
||||
* @param mixed $value 变量的值
|
||||
* @return void
|
||||
*/
|
||||
public function assign($name, $value = ''){
|
||||
$this->view->assign($name, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前错误信息
|
||||
* @return mixed
|
||||
*/
|
||||
public function getError(){
|
||||
return $this->error;
|
||||
}
|
||||
|
||||
//必须实现安装
|
||||
abstract public function install();
|
||||
|
||||
//必须卸载插件方法
|
||||
abstract public function uninstall();
|
||||
|
||||
abstract public function enable();
|
||||
|
||||
abstract public function disable();
|
||||
|
||||
abstract public function saveConfig();
|
||||
}
|
41
vendor/5ini99/think-addons/src/AddonsController.php
vendored
Executable file
41
vendor/5ini99/think-addons/src/AddonsController.php
vendored
Executable file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace think\addons;
|
||||
|
||||
use think\Hook;
|
||||
use think\Request;
|
||||
|
||||
/**
|
||||
* 插件执行默认控制器
|
||||
* Class AddonsController
|
||||
* @package think\addons
|
||||
*/
|
||||
class AddonsController extends Controller
|
||||
{
|
||||
/**
|
||||
* 插件执行
|
||||
*/
|
||||
public function execute()
|
||||
{
|
||||
if (!empty($this->addon) && !empty($this->controller) && !empty($this->action)) {
|
||||
// 获取类的命名空间
|
||||
$class = get_addon_class($this->addon, 'controller', $this->controller);
|
||||
if (class_exists($class)) {
|
||||
$model = new $class();
|
||||
if ($model === false) {
|
||||
abort(500, lang('addon init fail'));
|
||||
}
|
||||
// 调用操作
|
||||
if (!method_exists($model, $this->action)) {
|
||||
abort(500, lang('Controller Class Method Not Exists'));
|
||||
}
|
||||
// 监听addons_init
|
||||
Hook::listen('addons_init', $this);
|
||||
return call_user_func_array([$model, $this->action], [Request::instance()]);
|
||||
} else {
|
||||
abort(500, lang('Controller Class Not Exists'));
|
||||
}
|
||||
}
|
||||
abort(500, lang('addon cannot name or action'));
|
||||
}
|
||||
}
|
88
vendor/5ini99/think-addons/src/BaseModel.php
vendored
Executable file
88
vendor/5ini99/think-addons/src/BaseModel.php
vendored
Executable file
@ -0,0 +1,88 @@
|
||||
<?php
|
||||
|
||||
namespace think\addons;
|
||||
use think\Db;
|
||||
|
||||
/**
|
||||
* 插件基类服务器
|
||||
* Class Model
|
||||
* @package think\addons
|
||||
*/
|
||||
class BaseModel extends \think\Model{
|
||||
/**
|
||||
* 获取插件配置内容
|
||||
*/
|
||||
public function getConf($addonsName){
|
||||
$data = cache('ADDONS_'.$addonsName);
|
||||
if(!$data){
|
||||
$rs = Db::name('addons')->where('name',$addonsName)->field('config')->find();
|
||||
$data = json_decode($rs['config'],true);
|
||||
cache('ADDONS_'.$addonsName,$data,31622400);
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function getAddonStatus($addonsName){
|
||||
$rs = Db::name('addons')->where('name',$addonsName)->field('status')->find();
|
||||
return (int)$rs["status"];
|
||||
}
|
||||
/**
|
||||
* 获取空模型
|
||||
*/
|
||||
public function getEModel($tables){
|
||||
$rs = Db::query('show columns FROM `'.config('database.prefix').$tables."`");
|
||||
$obj = [];
|
||||
if($rs){
|
||||
foreach($rs as $key => $v) {
|
||||
$obj[$v['Field']] = $v['Default'];
|
||||
if($v['Key'] == 'PRI')$obj[$v['Field']] = 0;
|
||||
}
|
||||
}
|
||||
return $obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* 绑定勾子
|
||||
* @param 插件名 $addonName
|
||||
* @param 勾子数组 $hooks
|
||||
*/
|
||||
public function bindHoods($addonName,$hooks){
|
||||
$list = Db::name('hooks')->where("name","in",$hooks)->field(["hookId","name","addons"])->select();
|
||||
for($i=0,$k=count($list);$i<$k;$i++){
|
||||
$hook = $list[$i];
|
||||
$objs = explode(",",$hook["addons"]);
|
||||
$objs = array_filter($objs);
|
||||
if(!in_array($addonName,$objs)){
|
||||
$addons = $addonName;
|
||||
if(!empty($objs)){
|
||||
$objs[] = $addonName;
|
||||
$addons = implode(",",$objs);
|
||||
}
|
||||
Db::name('hooks')->where(["hookId"=>$hook["hookId"]])->update(["addons"=>$addons]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 解绑勾子
|
||||
* @param 插件名 $addonName
|
||||
* @param 勾子数组 $hooks
|
||||
*/
|
||||
public function unbindHoods($addonName,$hooks){
|
||||
|
||||
$list = Db::name('hooks')->where("name","in",$hooks)->field(["hookId","name","addons"])->select();
|
||||
for($i=0,$k=count($list);$i<$k;$i++){
|
||||
$hook = $list[$i];
|
||||
$objs = explode(",",$hook["addons"]);
|
||||
$temps = array();
|
||||
for($m=0,$n=count($objs);$m<$n;$m++){
|
||||
if($objs[$m]!=$addonName){
|
||||
$temps[] = $objs[$m];
|
||||
}
|
||||
}
|
||||
$addons = implode(",",$temps);
|
||||
Db::name('hooks')->where(["hookId"=>$hook["hookId"]])->update(["addons"=>$addons]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
270
vendor/5ini99/think-addons/src/Controller.php
vendored
Executable file
270
vendor/5ini99/think-addons/src/Controller.php
vendored
Executable file
@ -0,0 +1,270 @@
|
||||
<?php
|
||||
|
||||
namespace think\addons;
|
||||
|
||||
use think\Request;
|
||||
use think\Config;
|
||||
use think\Loader;
|
||||
|
||||
/**
|
||||
* 插件基类控制器
|
||||
* Class Controller
|
||||
* @package think\addons
|
||||
*/
|
||||
class Controller extends \think\Controller
|
||||
{
|
||||
// 当前插件操作
|
||||
protected $addon = null;
|
||||
protected $controller = null;
|
||||
protected $action = null;
|
||||
// 当前template
|
||||
protected $template;
|
||||
// 模板配置信息
|
||||
protected $config = [
|
||||
'type' => 'Think',
|
||||
'view_path' => '',
|
||||
'view_suffix' => 'html',
|
||||
'strip_space' => true,
|
||||
'view_depr' => DS,
|
||||
'tpl_begin' => '{',
|
||||
'tpl_end' => '}',
|
||||
'taglib_begin' => '{',
|
||||
'taglib_end' => '}',
|
||||
];
|
||||
|
||||
/**
|
||||
* 架构函数
|
||||
* @param Request $request Request对象
|
||||
* @access public
|
||||
*/
|
||||
public function __construct(Request $request = null)
|
||||
{
|
||||
WSTConf('CONF.seoMallSwitch');
|
||||
if(WSTConf('CONF.seoMallSwitch')==0){
|
||||
$this->redirect('home/switchs/index');
|
||||
exit;
|
||||
}
|
||||
// 生成request对象
|
||||
$this->request = is_null($request) ? Request::instance() : $request;
|
||||
// 初始化配置信息
|
||||
$this->config = Config::get('template') ?: $this->config;
|
||||
// 处理路由参数
|
||||
$route = $this->request->param('route', '');
|
||||
$param = explode('-', $route);
|
||||
// 是否自动转换控制器和操作名
|
||||
$convert = \think\Config::get('url_convert');
|
||||
if('wechat/weixinpays/toaddonpay' != $this->request->path()){
|
||||
// 格式化路由的插件位置
|
||||
$this->action = $convert ? strtolower(array_pop($param)) : array_pop($param);
|
||||
$this->controller = $convert ? strtolower(array_pop($param)) : array_pop($param);
|
||||
$this->addon = $convert ? strtolower(array_pop($param)) : array_pop($param);
|
||||
$base = new \think\addons\BaseModel();
|
||||
$status = $base->getAddonStatus(ucfirst($this->addon));
|
||||
if(isset($status) && $status!=1){
|
||||
$request = request();
|
||||
$module = WSTVisitModule();
|
||||
header("Location:".url($module.'/error/message'));
|
||||
exit();
|
||||
}
|
||||
}
|
||||
// 生成view_path
|
||||
$view_path = $this->config['view_path'] ?: 'view';
|
||||
|
||||
// 重置配置
|
||||
Config::set('template.view_path', ADDON_PATH . $this->addon . DS . $view_path . DS);
|
||||
$this->checkPrivileges();
|
||||
parent::__construct($request);
|
||||
$this->assign("v",WSTConf('CONF.wstVersion')."_".WSTConf('CONF.wsthomeStyleId'));
|
||||
$this->initLayout();
|
||||
}
|
||||
/**
|
||||
* 定义模板
|
||||
*/
|
||||
public function initLayout(){
|
||||
$wsthomeStyle = WSTConf('CONF.wsthomeStyle')?WSTConf('CONF.wsthomeStyle'):'default';
|
||||
$wstmobileStyle = WSTConf('CONF.wstmobileStyle')?WSTConf('CONF.wstmobileStyle'):'default';
|
||||
$wstwechatStyle = WSTConf('CONF.wstwechatStyle')?WSTConf('CONF.wstwechatStyle'):'default';
|
||||
$this->assign('LAYOUT_HOME_BASE','home@'.$wsthomeStyle.'/base');
|
||||
$this->assign('LAYOUT_HOME_TOP','home@'.$wsthomeStyle.'/top');
|
||||
$this->assign('LAYOUT_HOME_HEADER','home@'.$wsthomeStyle.'/header');
|
||||
$this->assign('LAYOUT_HOME_SHOP_APPLY','home@'.$wsthomeStyle.'/shop_apply');
|
||||
$this->assign('LAYOUT_HOME_RIGHT_CART','home@'.$wsthomeStyle.'/right_cart');
|
||||
$this->assign('LAYOUT_HOME_FOOTER','home@'.$wsthomeStyle.'/footer');
|
||||
$this->assign('LAYOUT_HOME_SHOP_BASE','home@'.$wsthomeStyle.'/shops/base');
|
||||
$this->assign('LAYOUT_HOME_SHOP_HEADER','home@'.$wsthomeStyle.'/shops/header');
|
||||
$this->assign('LAYOUT_HOME_USER_BASE','home@'.$wsthomeStyle.'/users/base');
|
||||
$this->assign('LAYOUT_HOME_USER_HEADER','home@'.$wsthomeStyle.'/users/header');
|
||||
|
||||
$this->assign('LAYOUT_ADMIN_BASE','admin@base');
|
||||
|
||||
$this->assign('LAYOUT_MOBILE_BASE','mobile@'.$wstmobileStyle.'/base');
|
||||
$this->assign('LAYOUT_MOBILE_DIALOG','mobile@'.$wstmobileStyle.'/dialog');
|
||||
$this->assign('LAYOUT_MOBILE_FOOTER','mobile@'.$wstmobileStyle.'/footer');
|
||||
|
||||
$this->assign('LAYOUT_WECHAT_BASE','wechat@'.$wstwechatStyle.'/base');
|
||||
$this->assign('LAYOUT_WECHAT_DIALOG','wechat@'.$wstwechatStyle.'/dialog');
|
||||
$this->assign('LAYOUT_WECHAT_FOOTER','wechat@'.$wstwechatStyle.'/footer');
|
||||
}
|
||||
/**
|
||||
* @deprecated 建议使用 checkAuth和checkShopAuth区分商家 2017.04.25
|
||||
*/
|
||||
public function checkPrivileges(){
|
||||
$urls = model('home/HomeMenus')->getMenusUrl();
|
||||
$request = request();
|
||||
$visit = strtolower($request->path());
|
||||
if(isset($urls[$visit])){
|
||||
$menuType = (int)$urls[$visit];
|
||||
$userType = -1;
|
||||
if((int)session('WST_USER.userId')>0)$userType = 0;
|
||||
if((int)session('WST_USER.shopId')>0)$userType = 1;
|
||||
//未登录不允许访问受保护的资源
|
||||
if($userType==-1){
|
||||
if($request->isAjax()){
|
||||
echo json_encode(['status'=>-999,'msg'=>'对不起,您还没有登录,请先登录']);
|
||||
}else{
|
||||
header("Location:".url('home/users/login'));
|
||||
}
|
||||
exit();
|
||||
}
|
||||
//已登录但不是商家 则不允许访问受保护的商家资源
|
||||
if($userType==0 && $menuType==1){
|
||||
if($request->isAjax()){
|
||||
echo json_encode(['status'=>-999,'msg'=>'对不起,您不是商家,请先申请为商家再访问']);
|
||||
}else{
|
||||
header("Location:".url('home/shops/login'));
|
||||
}
|
||||
exit();
|
||||
}
|
||||
}
|
||||
}
|
||||
public function checkAdminAuth(){
|
||||
$STAFF = session('WST_STAFF');
|
||||
$request = request();
|
||||
if(empty($STAFF)){
|
||||
if($request->isAjax()){
|
||||
echo json_encode(['status'=>-999,'msg'=>'对不起,您还没有登录,请先登录']);
|
||||
}else{
|
||||
header("Location:".url('admin/index/login'));
|
||||
}
|
||||
exit();
|
||||
}else{
|
||||
$urls = WSTVisitPrivilege();
|
||||
$privileges = session('WST_STAFF.privileges');
|
||||
$visit = $request->path();
|
||||
if(!$privileges || (array_key_exists($visit,$urls) && !$this->checkUserCode($urls[$visit],$privileges))){
|
||||
if($request->isAjax()){
|
||||
echo json_encode(['status'=>-998,'msg'=>'对不起,您没有操作权限,请与管理员联系']);
|
||||
}else{
|
||||
header("Content-type: text/html; charset=utf-8");
|
||||
echo "对不起,您没有操作权限,请与管理员联系";
|
||||
}
|
||||
exit();
|
||||
}
|
||||
}
|
||||
}
|
||||
private function checkUserCode($urlCodes,$userCodes){
|
||||
foreach ($urlCodes as $key => $value) {
|
||||
if(in_array($key,$userCodes))return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* @deprecated 建议使用checkAdminAuth,将来可能会移除. 2017.04.25
|
||||
*/
|
||||
public function checkAdminPrivileges(){
|
||||
$this->checkAdminAuth();
|
||||
}
|
||||
// 登录验证方法--用户
|
||||
protected function checkAuth(){
|
||||
$USER = session('WST_USER');
|
||||
if(empty($USER)){
|
||||
if(request()->isAjax()){
|
||||
die('{"status":-999,"msg":"您还未登录"}');
|
||||
}else{
|
||||
$module = WSTVisitModule();
|
||||
$this->redirect($module.'/users/login');
|
||||
exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
//登录验证方法--商家
|
||||
protected function checkShopAuth(){
|
||||
$USER = session('WST_USER');
|
||||
if(empty($USER) || $USER['userType']!=1){
|
||||
if(request()->isAjax()){
|
||||
die('{"status":-998,"msg":"您还未登录"}');
|
||||
}else{
|
||||
$module = WSTVisitModule();
|
||||
$this->redirect($module.'/shops/login');
|
||||
exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 重写父类前置方法判断
|
||||
*/
|
||||
protected function beforeAction($method, $options = [])
|
||||
{
|
||||
// 设置当前访问的controller、action
|
||||
request()->controller($this->controller);
|
||||
request()->action($this->action);
|
||||
if (isset($options['only'])) {
|
||||
if (is_string($options['only'])) {
|
||||
$options['only'] = explode(',', $options['only']);
|
||||
}
|
||||
if (!in_array($this->request->action(), $options['only'])) {
|
||||
return;
|
||||
}
|
||||
} elseif (isset($options['except'])) {
|
||||
if (is_string($options['except'])) {
|
||||
$options['except'] = explode(',', $options['except']);
|
||||
}
|
||||
if (in_array($this->request->action(), $options['except'])) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
call_user_func([$this, $method]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 加载模板输出
|
||||
* @access protected
|
||||
* @param string $template 模板文件名
|
||||
* @param array $vars 模板输出变量
|
||||
* @param array $replace 模板替换
|
||||
* @param array $config 模板参数
|
||||
* @return mixed
|
||||
*/
|
||||
public function fetch($template = '', $vars = [], $replace = [], $config = []){
|
||||
$controller = Loader::parseName($this->controller);
|
||||
if ('think' == strtolower($this->config['type']) && $controller && 0 !== strpos($template, '/')) {
|
||||
$depr = $this->config['view_depr'];
|
||||
$template = str_replace(['/', ':'], $depr, $template);
|
||||
if ('' == $template) {
|
||||
// 如果模板文件名为空 按照默认规则定位
|
||||
$template = str_replace('.', DS, $controller) . $depr . $this->action;
|
||||
} elseif (false === strpos($template, $depr)) {
|
||||
$template = str_replace('.', DS, $controller) . $depr . $template;
|
||||
}
|
||||
}
|
||||
$replace['__STYLE__'] = str_replace('/index.php','',\think\Request::instance()->root()).'/hyhproject/home/view/'.WSTConf('CONF.wsthomeStyle');
|
||||
$replace['__ADMIN__'] = str_replace('/index.php','',\think\Request::instance()->root()).'/hyhproject/admin/view';
|
||||
$replace['__WECHAT__'] = str_replace('/index.php','',\think\Request::instance()->root()).'/hyhproject/wechat/view/'.WSTConf('CONF.wstwechatStyle');;
|
||||
$replace['__MOBILE__'] = str_replace('/index.php','',\think\Request::instance()->root()).'/hyhproject/mobile/view/default';
|
||||
return \Think\Controller::fetch($template, $vars, $replace, $config);
|
||||
}
|
||||
|
||||
/**
|
||||
* 模板变量赋值
|
||||
* @access protected
|
||||
* @param mixed $name 要显示的模板变量
|
||||
* @param mixed $value 变量的值
|
||||
* @return void
|
||||
*/
|
||||
public function assign($name, $value = ''){
|
||||
$this->view->assign($name, $value);
|
||||
}
|
||||
|
||||
}
|
207
vendor/5ini99/think-addons/src/helper.php
vendored
Executable file
207
vendor/5ini99/think-addons/src/helper.php
vendored
Executable file
@ -0,0 +1,207 @@
|
||||
<?php
|
||||
use think\Hook;
|
||||
use think\Config;
|
||||
use think\Loader;
|
||||
use think\Db;
|
||||
|
||||
// 插件目录
|
||||
define('ADDON_PATH', ROOT_PATH . 'addons' . DS);
|
||||
// 定义路由
|
||||
\think\Route::any('addon/:route', "\\think\\addons\\AddonsController@execute");
|
||||
// 如果插件目录不存在则创建
|
||||
if (!is_dir(ADDON_PATH)) {
|
||||
@mkdir(ADDON_PATH, 0777, true);
|
||||
}
|
||||
|
||||
// 注册类的根命名空间
|
||||
\think\Loader::addNamespace('addons', ADDON_PATH);
|
||||
|
||||
// 闭包初始化行为
|
||||
Hook::add('app_begin', function () {
|
||||
$hooks = cache('hooks');
|
||||
if(empty($hooks)){
|
||||
$addons = Db::name('hooks')->where("addons != ''")->column('name,addons');
|
||||
if(!empty($addons)){
|
||||
foreach ($addons as $key => $values) {
|
||||
if($values){
|
||||
$map['status'] = 1;
|
||||
$names = explode(',',$values);
|
||||
$map['name'] = array('IN',$names);
|
||||
$map['dataFlag'] = 1;
|
||||
$data = model('common/addons')->where($map)->column('addonId,name');
|
||||
if($data){
|
||||
$data = array_intersect($names, $data);
|
||||
$addons[$key] = array_filter(array_map('get_addon_class', $data));
|
||||
\think\Hook::add($key, $addons[$key]);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
array_filter($addons);
|
||||
cache('hooks', $addons);
|
||||
}
|
||||
}else{
|
||||
foreach ($hooks as $key => $values) {
|
||||
if(is_array($hooks[$key])){
|
||||
\think\Hook::add($key, $hooks[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
get_addon_function();
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* 处理插件钩子
|
||||
* @param string $hook 钩子名称
|
||||
* @param mixed $params 传入参数
|
||||
* @return void
|
||||
*/
|
||||
function hook($hook, $params = []){
|
||||
\think\Hook::listen($hook, $params);
|
||||
}
|
||||
/**
|
||||
* 加载插件函数
|
||||
*/
|
||||
function get_addon_function(){
|
||||
$addonsrs = cache('WST_ADDONS');
|
||||
if(!$addonsrs){
|
||||
$addonsrs = model('common/addons')->where('status =1 and dataFlag = 1')->column('addonId,name');
|
||||
cache('WST_ADDONS',$addonsrs);
|
||||
}
|
||||
if(!empty($addonsrs)){
|
||||
$adds = [];
|
||||
foreach ($addonsrs as $key => $value) {
|
||||
$name = strtolower($value);
|
||||
$adds[$name] = ['addonId'=>$key,'name'=>$name];
|
||||
if(is_file(ROOT_PATH.'addons'.DS.$name.DS.'common'.DS.'function.php')){
|
||||
include_once(ROOT_PATH.'addons'.DS.$name.DS.'common'.DS.'function.php');
|
||||
}
|
||||
}
|
||||
WSTConf('WST_ADDONS',$adds);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取插件类的类名
|
||||
* @param $name 插件名
|
||||
* @param string $type 返回命名空间类型
|
||||
* @param string $class 当前类名
|
||||
* @return string
|
||||
*/
|
||||
function get_addon_class($name, $type = 'hook', $class = null){
|
||||
$name = \think\Loader::parseName($name);
|
||||
// 处理多级控制器情况
|
||||
if (!is_null($class) && strpos($class, '.')) {
|
||||
$class = explode('.', $class);
|
||||
foreach ($class as $key => $cls) {
|
||||
$class[$key] = \think\Loader::parseName($cls, 1);
|
||||
}
|
||||
$class = implode('\\', $class);
|
||||
} else {
|
||||
$class = \think\Loader::parseName(is_null($class) ? $name : $class, 1);
|
||||
}
|
||||
switch ($type) {
|
||||
case 'controller':
|
||||
$namespace = "\\addons\\" . $name . "\\controller\\" . $class;
|
||||
break;
|
||||
default:
|
||||
$namespace = "\\addons\\" . $name . "\\" . $class;
|
||||
}
|
||||
|
||||
return class_exists($namespace) ? $namespace : '';
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取插件类的配置文件数组
|
||||
* @param string $name 插件名
|
||||
* @return array
|
||||
*/
|
||||
function get_addon_config($name){
|
||||
$class = get_addon_class($name);
|
||||
if (class_exists($class)) {
|
||||
$addon = new $class();
|
||||
return $addon->getConfig();
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 插件显示内容里生成访问插件的url
|
||||
* @param $url
|
||||
* @param array $param
|
||||
* @return bool|string
|
||||
* @param bool|string $suffix 生成的URL后缀
|
||||
* @param bool|string $domain 域名
|
||||
*/
|
||||
function addon_url($url, $param = [], $suffix = true, $domain = false){
|
||||
$url = parse_url($url);
|
||||
$case = config('url_convert');
|
||||
$addons = $case ? Loader::parseName($url['scheme']) : $url['scheme'];
|
||||
$controller = $case ? Loader::parseName($url['host']) : $url['host'];
|
||||
$action = trim($case ? strtolower($url['path']) : $url['path'], '/');
|
||||
|
||||
/* 解析URL带的参数 */
|
||||
if (isset($url['query'])) {
|
||||
parse_str($url['query'], $query);
|
||||
$param = array_merge($query, $param);
|
||||
}
|
||||
|
||||
// 生成插件链接新规则
|
||||
$actions = "{$addons}-{$controller}-{$action}";
|
||||
return url("/addon/{$actions}", $param, $suffix, $domain);
|
||||
}
|
||||
|
||||
/**
|
||||
* 安装插件执行sql
|
||||
*/
|
||||
function installSql($name){
|
||||
$sqlfile = WSTRootPath()."/addons/".$name."/install.sql";
|
||||
if(file_exists($sqlfile)){
|
||||
$sql = file_get_contents($sqlfile);
|
||||
excuteSql($sql,config('database')["prefix"]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 卸载插件执行sql
|
||||
*/
|
||||
function uninstallSql($name){
|
||||
$sqlfile = WSTRootPath()."/addons/".$name."/uninstall.sql";
|
||||
if(file_exists($sqlfile)){
|
||||
$sql = file_get_contents($sqlfile);
|
||||
excuteSql($sql,config('database')["prefix"]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行sql
|
||||
* @param string $db_prefix
|
||||
*/
|
||||
function excuteSql($sql,$db_prefix=''){
|
||||
if(!isset($sql) || empty($sql)) return;
|
||||
$sql = str_replace("\r", "\n", str_replace(' `wst_', ' `'.$db_prefix, $sql));
|
||||
$ret = array();
|
||||
$num = 0;
|
||||
foreach(explode(";\n", trim($sql)) as $query) {
|
||||
$ret[$num] = '';
|
||||
$queries = explode("\n", trim($query));
|
||||
foreach($queries as $query) {
|
||||
$ret[$num] .= (isset($query[0]) && $query[0] == '#') || (isset($query[1]) && isset($query[1]) && $query[0].$query[1] == '--') ? '' : $query;
|
||||
}
|
||||
$num++;
|
||||
}
|
||||
unset($sql);
|
||||
foreach($ret as $query){
|
||||
$query = trim($query);
|
||||
if($query) {
|
||||
if(strtoupper(substr($query, 0, 12)) == 'CREATE TABLE'){
|
||||
$type = strtoupper(preg_replace("/^\s*CREATE TABLE\s+.+\s+\(.+?\).*(ENGINE|TYPE)\s*=\s*([a-z]+?).*$/isU", "\\2", $query));
|
||||
$query = preg_replace("/^\s*(CREATE TABLE\s+.+\s+\(.+?\)).*$/isU", "\\1", $query)." ENGINE=InnoDB DEFAULT CHARSET=utf8";
|
||||
}
|
||||
Db::execute($query);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user