作者 Karson

移除Auth.php类中的Ucenter

优化基类Backend.php中的逻辑
优化插件管理网络失败的逻辑
优化代码格式化
正在显示 49 个修改的文件 包含 735 行增加932 行删除
... ... @@ -23,10 +23,10 @@ FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架。
* 共用同一账号体系的Web端会员中心权限验证和API接口会员权限验证
* 二级域名部署支持,同时域名支持绑定到插件
* 多语言支持,服务端及客户端支持
* 强大的第三方模块支持([CMS](https://www.fastadmin.net/store/cms.html)[博客](https://www.fastadmin.net/store/blog.html)[文档生成](https://www.fastadmin.net/store/docs.html))
* 强大的第三方模块支持([CMS](https://www.fastadmin.net/store/cms.html)[博客](https://www.fastadmin.net/store/blog.html)[知识付费问答](https://www.fastadmin.net/store/ask.html))
* 整合第三方短信接口(阿里云、腾讯云短信)
* 无缝整合第三方云存储(七牛、阿里云OSS、又拍云)功能
* 第三方富文本编辑器支持(Summernote、Tinymce、百度编辑器)
* 第三方富文本编辑器支持(Summernote、Kindeditor、百度编辑器)
* 第三方登录(QQ、微信、微博)整合
* Ucenter整合第三方应用
... ... @@ -86,6 +86,6 @@ FastAdmin遵循Apache2开源协议发布,并提供免费使用。
本项目包含的第三方源码和二进制文件之版权信息另行标注。
版权所有Copyright © 2017-2018 by FastAdmin (https://www.fastadmin.net)
版权所有Copyright © 2017-2019 by FastAdmin (https://www.fastadmin.net)
All rights reserved。
\ No newline at end of file
... ...
... ... @@ -29,6 +29,9 @@ return [
'Not installed tips' => '请安装后再访问插件前台页面!',
'Not enabled tips' => '插件已经禁用,请启用后再访问插件前台页面!',
'New version tips' => '发现新版本:%s 点击查看更新日志',
'Store now available tips' => 'FastAdmin插件市场暂不可用,是否切换到本地插件?',
'Switch to the local' => '切换到本地插件',
'try to reload' => '重新尝试加载',
'Please disable addon first' => '请先禁用插件再进行升级',
'Login now' => '立即登录',
'Continue install' => '不登录,继续安装',
... ...
... ... @@ -12,7 +12,6 @@ use think\Session;
class Auth extends \fast\Auth
{
protected $_error = '';
protected $requestUri = '';
protected $breadcrumb = [];
... ... @@ -146,17 +145,17 @@ class Auth extends \fast\Auth
$request = Request::instance();
$arr = is_array($arr) ? $arr : explode(',', $arr);
if (!$arr) {
return FALSE;
return false;
}
$arr = array_map('strtolower', $arr);
// 是否存在
if (in_array(strtolower($request->action()), $arr) || in_array('*', $arr)) {
return TRUE;
return true;
}
// 没找到匹配
return FALSE;
return false;
}
/**
... ... @@ -229,7 +228,7 @@ class Auth extends \fast\Auth
public function isSuperAdmin()
{
return in_array('*', $this->getRuleIds()) ? TRUE : FALSE;
return in_array('*', $this->getRuleIds()) ? true : false;
}
/**
... ... @@ -322,8 +321,9 @@ class Auth extends \fast\Auth
*/
public function getBreadCrumb($path = '')
{
if ($this->breadcrumb || !$path)
if ($this->breadcrumb || !$path) {
return $this->breadcrumb;
}
$path_rule_id = 0;
foreach ($this->rules as $rule) {
$path_rule_id = $rule['name'] == $path ? $rule['id'] : $path_rule_id;
... ... @@ -455,5 +455,4 @@ class Auth extends \fast\Auth
{
return $this->_error ? __($this->_error) : '';
}
}
... ...
... ... @@ -7,7 +7,10 @@ use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Reader\Xls;
use PhpOffice\PhpSpreadsheet\Reader\Csv;
use think\Db;
use think\Exception;
use think\exception\PDOException;
use think\exception\ValidateException;
trait Backend
{
... ... @@ -108,6 +111,8 @@ trait Backend
if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
$params[$this->dataLimitField] = $this->auth->id;
}
$result = false;
Db::startTrans();
try {
//是否采用模型验证
if ($this->modelValidate) {
... ... @@ -116,16 +121,22 @@ trait Backend
$this->model->validate($validate);
}
$result = $this->model->allowField(true)->save($params);
if ($result !== false) {
$this->success();
} else {
$this->error($this->model->getError());
}
} catch (\think\exception\PDOException $e) {
Db::commit();
} catch (ValidateException $e) {
Db::rollback();
$this->error($e->getMessage());
} catch (\think\Exception $e) {
} catch (PDOException $e) {
Db::rollback();
$this->error($e->getMessage());
} catch (Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
if ($result) {
$this->success();
} else {
$this->error();
}
}
$this->error(__('Parameter %s can not be empty', ''));
}
... ... @@ -151,7 +162,8 @@ trait Backend
$params = $this->request->post("row/a");
if ($params) {
$params = $this->preExcludeFields($params);
$result = false;
Db::startTrans();
try {
//是否采用模型验证
if ($this->modelValidate) {
... ... @@ -160,15 +172,21 @@ trait Backend
$row->validate($validate);
}
$result = $row->allowField(true)->save($params);
if ($result !== false) {
$this->success();
} else {
$this->error($row->getError());
}
} catch (\think\exception\PDOException $e) {
Db::commit();
} catch (ValidateException $e) {
Db::rollback();
$this->error($e->getMessage());
} catch (\think\Exception $e) {
} catch (PDOException $e) {
Db::rollback();
$this->error($e->getMessage());
} catch (Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
if ($result) {
$this->success();
} else {
$this->error();
}
}
$this->error(__('Parameter %s can not be empty', ''));
... ... @@ -186,13 +204,24 @@ trait Backend
$pk = $this->model->getPk();
$adminIds = $this->getDataLimitAdminIds();
if (is_array($adminIds)) {
$count = $this->model->where($this->dataLimitField, 'in', $adminIds);
$this->model->where($this->dataLimitField, 'in', $adminIds);
}
$list = $this->model->where($pk, 'in', $ids)->select();
$count = 0;
Db::startTrans();
try {
foreach ($list as $k => $v) {
$count += $v->delete();
}
Db::commit();
} catch (PDOException $e) {
Db::rollback();
$this->error($e->getMessage());
} catch (Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
if ($count) {
$this->success();
} else {
... ... @@ -210,16 +239,26 @@ trait Backend
$pk = $this->model->getPk();
$adminIds = $this->getDataLimitAdminIds();
if (is_array($adminIds)) {
$count = $this->model->where($this->dataLimitField, 'in', $adminIds);
$this->model->where($this->dataLimitField, 'in', $adminIds);
}
if ($ids) {
$this->model->where($pk, 'in', $ids);
}
$count = 0;
Db::startTrans();
try {
$list = $this->model->onlyTrashed()->select();
foreach ($list as $k => $v) {
$count += $v->delete(true);
}
Db::commit();
} catch (PDOException $e) {
Db::rollback();
$this->error($e->getMessage());
} catch (Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
if ($count) {
$this->success();
} else {
... ... @@ -242,10 +281,20 @@ trait Backend
$this->model->where($pk, 'in', $ids);
}
$count = 0;
Db::startTrans();
try {
$list = $this->model->onlyTrashed()->select();
foreach ($list as $index => $item) {
$count += $item->restore();
}
Db::commit();
} catch (PDOException $e) {
Db::rollback();
$this->error($e->getMessage());
} catch (Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
if ($count) {
$this->success();
}
... ... @@ -268,10 +317,20 @@ trait Backend
$this->model->where($this->dataLimitField, 'in', $adminIds);
}
$count = 0;
Db::startTrans();
try {
$list = $this->model->where($this->model->getPk(), 'in', $ids)->select();
foreach ($list as $index => $item) {
$count += $item->allowField(true)->isUpdate(true)->save($values);
}
Db::commit();
} catch (PDOException $e) {
Db::rollback();
$this->error($e->getMessage());
} catch (Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
if ($count) {
$this->success();
} else {
... ... @@ -405,7 +464,7 @@ trait Backend
}
}
$this->model->saveAll($insert);
} catch (\think\exception\PDOException $exception) {
} catch (PDOException $exception) {
$msg = $exception->getMessage();
if (preg_match("/.+Integrity constraint violation: 1062 Duplicate entry '(.+)' for key '(.+)'/is", $msg, $matches)) {
$msg = "导入失败,包含【{$matches[1]}】的记录已存在";
... ...
... ... @@ -13,15 +13,9 @@ use think\Config;
*/
class Common extends Api
{
protected $noNeedLogin = ['init'];
protected $noNeedRight = '*';
public function _initialize()
{
parent::_initialize();
}
/**
* 加载初始化
*
... ... @@ -137,5 +131,4 @@ class Common extends Api
$this->error($file->getError());
}
}
}
... ...
... ... @@ -11,14 +11,13 @@ use app\common\model\User;
*/
class Ems extends Api
{
protected $noNeedLogin = '*';
protected $noNeedRight = '*';
public function _initialize()
{
parent::_initialize();
\think\Hook::add('ems_send', function($params) {
\think\Hook::add('ems_send', function ($params) {
$obj = \app\common\library\Email::instance();
$result = $obj
->to($params->email)
... ... @@ -42,36 +41,26 @@ class Ems extends Api
$event = $event ? $event : 'register';
$last = Emslib::get($email, $event);
if ($last && time() - $last['createtime'] < 60)
{
if ($last && time() - $last['createtime'] < 60) {
$this->error(__('发送频繁'));
}
if ($event)
{
if ($event) {
$userinfo = User::getByEmail($email);
if ($event == 'register' && $userinfo)
{
if ($event == 'register' && $userinfo) {
//已被注册
$this->error(__('已被注册'));
}
else if (in_array($event, ['changeemail']) && $userinfo)
{
} elseif (in_array($event, ['changeemail']) && $userinfo) {
//被占用
$this->error(__('已被占用'));
}
else if (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo)
{
} elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) {
//未注册
$this->error(__('未注册'));
}
}
$ret = Emslib::send($email, NULL, $event);
if ($ret)
{
$ret = Emslib::send($email, null, $event);
if ($ret) {
$this->success(__('发送成功'));
}
else
{
} else {
$this->error(__('发送失败'));
}
}
... ... @@ -90,34 +79,24 @@ class Ems extends Api
$event = $event ? $event : 'register';
$captcha = $this->request->request("captcha");
if ($event)
{
if ($event) {
$userinfo = User::getByEmail($email);
if ($event == 'register' && $userinfo)
{
if ($event == 'register' && $userinfo) {
//已被注册
$this->error(__('已被注册'));
}
else if (in_array($event, ['changeemail']) && $userinfo)
{
} elseif (in_array($event, ['changeemail']) && $userinfo) {
//被占用
$this->error(__('已被占用'));
}
else if (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo)
{
} elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) {
//未注册
$this->error(__('未注册'));
}
}
$ret = Emslib::check($email, $captcha, $event);
if ($ret)
{
if ($ret) {
$this->success(__('成功'));
}
else
{
} else {
$this->error(__('验证码不正确'));
}
}
}
... ...
... ... @@ -9,7 +9,6 @@ use app\common\controller\Api;
*/
class Index extends Api
{
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['*'];
... ... @@ -21,5 +20,4 @@ class Index extends Api
{
$this->success('请求成功');
}
}
... ...
... ... @@ -11,15 +11,9 @@ use app\common\model\User;
*/
class Sms extends Api
{
protected $noNeedLogin = '*';
protected $noNeedRight = '*';
public function _initialize()
{
parent::_initialize();
}
/**
* 发送验证码
*
... ... @@ -48,15 +42,15 @@ class Sms extends Api
if ($event == 'register' && $userinfo) {
//已被注册
$this->error(__('已被注册'));
} else if (in_array($event, ['changemobile']) && $userinfo) {
} elseif (in_array($event, ['changemobile']) && $userinfo) {
//被占用
$this->error(__('已被占用'));
} else if (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) {
} elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) {
//未注册
$this->error(__('未注册'));
}
}
$ret = Smslib::send($mobile, NULL, $event);
$ret = Smslib::send($mobile, null, $event);
if ($ret) {
$this->success(__('发送成功'));
} else {
... ... @@ -86,10 +80,10 @@ class Sms extends Api
if ($event == 'register' && $userinfo) {
//已被注册
$this->error(__('已被注册'));
} else if (in_array($event, ['changemobile']) && $userinfo) {
} elseif (in_array($event, ['changemobile']) && $userinfo) {
//被占用
$this->error(__('已被占用'));
} else if (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) {
} elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) {
//未注册
$this->error(__('未注册'));
}
... ... @@ -101,5 +95,4 @@ class Sms extends Api
$this->error(__('验证码不正确'));
}
}
}
... ...
... ... @@ -10,15 +10,9 @@ use fast\Random;
*/
class Token extends Api
{
protected $noNeedLogin = [];
protected $noNeedRight = '*';
public function _initialize()
{
parent::_initialize();
}
/**
* 检测Token是否过期
*
... ... @@ -45,5 +39,4 @@ class Token extends Api
$tokenInfo = \app\common\library\Token::get($token);
$this->success('', ['token' => $tokenInfo['token'], 'expires_in' => $tokenInfo['expires_in']]);
}
}
... ...
... ... @@ -13,7 +13,6 @@ use think\Validate;
*/
class User extends Api
{
protected $noNeedLogin = ['login', 'mobilelogin', 'register', 'resetpwd', 'changeemail', 'changemobile', 'third'];
protected $noNeedRight = '*';
... ... @@ -142,7 +141,7 @@ class User extends Api
$username = $this->request->request('username');
$nickname = $this->request->request('nickname');
$bio = $this->request->request('bio');
$avatar = $this->request->request('avatar');
$avatar = $this->request->request('avatar', '', 'trim,strip_tags,htmlspecialchars');
if ($username) {
$exists = \app\common\model\User::where('username', $username)->where('id', '<>', $this->auth->id)->find();
if ($exists) {
... ... @@ -309,5 +308,4 @@ class User extends Api
$this->error($this->auth->getError());
}
}
}
... ...
... ... @@ -10,7 +10,6 @@ use app\common\model\User;
*/
class Validate extends Api
{
protected $noNeedLogin = '*';
protected $layout = '';
protected $error = null;
... ... @@ -29,10 +28,9 @@ class Validate extends Api
public function check_email_available()
{
$email = $this->request->request('email');
$id = (int) $this->request->request('id');
$id = (int)$this->request->request('id');
$count = User::where('email', '=', $email)->where('id', '<>', $id)->count();
if ($count > 0)
{
if ($count > 0) {
$this->error(__('邮箱已经被占用'));
}
$this->success();
... ... @@ -47,10 +45,9 @@ class Validate extends Api
public function check_username_available()
{
$email = $this->request->request('username');
$id = (int) $this->request->request('id');
$id = (int)$this->request->request('id');
$count = User::where('username', '=', $email)->where('id', '<>', $id)->count();
if ($count > 0)
{
if ($count > 0) {
$this->error(__('用户名已经被占用'));
}
$this->success();
... ... @@ -65,10 +62,9 @@ class Validate extends Api
public function check_mobile_available()
{
$mobile = $this->request->request('mobile');
$id = (int) $this->request->request('id');
$id = (int)$this->request->request('id');
$count = User::where('mobile', '=', $mobile)->where('id', '<>', $id)->count();
if ($count > 0)
{
if ($count > 0) {
$this->error(__('该手机号已经占用'));
}
$this->success();
... ... @@ -83,8 +79,7 @@ class Validate extends Api
{
$mobile = $this->request->request('mobile');
$count = User::where('mobile', '=', $mobile)->count();
if (!$count)
{
if (!$count) {
$this->error(__('手机号不存在'));
}
$this->success();
... ... @@ -99,8 +94,7 @@ class Validate extends Api
{
$email = $this->request->request('email');
$count = User::where('email', '=', $email)->count();
if (!$count)
{
if (!$count) {
$this->error(__('邮箱不存在'));
}
$this->success();
... ... @@ -118,8 +112,7 @@ class Validate extends Api
$mobile = $this->request->request('mobile');
$captcha = $this->request->request('captcha');
$event = $this->request->request('event');
if (!\app\common\library\Sms::check($mobile, $captcha, $event))
{
if (!\app\common\library\Sms::check($mobile, $captcha, $event)) {
$this->error(__('验证码不正确'));
}
$this->success();
... ... @@ -137,11 +130,9 @@ class Validate extends Api
$email = $this->request->request('email');
$captcha = $this->request->request('captcha');
$event = $this->request->request('event');
if (!\app\common\library\Ems::check($email, $captcha, $event))
{
if (!\app\common\library\Ems::check($email, $captcha, $event)) {
$this->error(__('验证码不正确'));
}
$this->success();
}
}
... ...
... ... @@ -2,16 +2,13 @@
return [
'Keep login' => '保持会话',
'Sign in' => '登入',
'Username' => '用户名',
'User id' => '会员ID',
'Username' => '用户名',
'Nickname' => '昵称',
'Password' => '密码',
'Sign up' => '注 册',
'Sign in' => '登 录',
'Sign out' => '注 销',
'Keep login' => '保持会话',
'Guest' => '游客',
'Welcome' => '%s,你好!',
'Add' => '添加',
... ... @@ -56,13 +53,9 @@ return [
'Line' => '行号',
'File' => '文件',
'Menu' => '菜单',
'Name' => '名称',
'Weigh' => '权重',
'Type' => '类型',
'Title' => '标题',
'Content' => '内容',
'Status' => '状态',
'Operate' => '操作',
'Append' => '追加',
'Memo' => '备注',
'Parent' => '父级',
... ...
... ... @@ -9,7 +9,6 @@ return [
'Username must be 6 to 30 characters' => '用户名必须6-30个字符',
'Password can not be empty' => '密码不能为空',
'Password must be 6 to 30 characters' => '密码必须6-30个字符',
'Email is incorrect' => '邮箱格式不正确',
'Mobile is incorrect' => '手机格式不正确',
'Username already exist' => '用户名已经存在',
'Email already exist' => '邮箱已经存在',
... ... @@ -27,9 +26,7 @@ return [
'Profile' => '个人资料',
'Verify email' => '邮箱验证',
'Change password' => '修改密码',
'Change password successful' => '修改密码成功',
'Captcha is incorrect' => '验证码不正确',
'Sign up successful' => '注册成功',
'Logged in successful' => '登录成功',
'Logout successful' => '注销成功',
'Operation failed' => '操作失败',
... ...
... ... @@ -14,20 +14,17 @@ class ExceptionHandle extends Handle
public function render(Exception $e)
{
// 在生产环境下返回code信息
if (!\think\Config::get('app_debug'))
{
if (!\think\Config::get('app_debug')) {
$statuscode = $code = 500;
$msg = 'An error occurred';
// 验证异常
if ($e instanceof \think\exception\ValidateException)
{
if ($e instanceof \think\exception\ValidateException) {
$code = 0;
$statuscode = 200;
$msg = $e->getError();
}
// Http异常
if ($e instanceof \think\exception\HttpException)
{
if ($e instanceof \think\exception\HttpException) {
$statuscode = $code = $e->getStatusCode();
}
return json(['code' => $code, 'msg' => $msg, 'time' => time(), 'data' => null], $statuscode);
... ...
... ... @@ -8,7 +8,6 @@ use think\Loader;
class Common
{
public function moduleInit(&$request)
{
// 设置mbstring字符编码
... ... @@ -17,45 +16,37 @@ class Common
// 如果修改了index.php入口地址,则需要手动修改cdnurl的值
$url = preg_replace("/\/(\w+)\.php$/i", '', $request->root());
// 如果未设置__CDN__则自动匹配得出
if (!Config::get('view_replace_str.__CDN__'))
{
if (!Config::get('view_replace_str.__CDN__')) {
Config::set('view_replace_str.__CDN__', $url);
}
// 如果未设置__PUBLIC__则自动匹配得出
if (!Config::get('view_replace_str.__PUBLIC__'))
{
if (!Config::get('view_replace_str.__PUBLIC__')) {
Config::set('view_replace_str.__PUBLIC__', $url . '/');
}
// 如果未设置__ROOT__则自动匹配得出
if (!Config::get('view_replace_str.__ROOT__'))
{
if (!Config::get('view_replace_str.__ROOT__')) {
Config::set('view_replace_str.__ROOT__', preg_replace("/\/public\/$/", '', $url . '/'));
}
// 如果未设置cdnurl则自动匹配得出
if (!Config::get('site.cdnurl'))
{
if (!Config::get('site.cdnurl')) {
Config::set('site.cdnurl', $url);
}
// 如果未设置cdnurl则自动匹配得出
if (!Config::get('upload.cdnurl'))
{
if (!Config::get('upload.cdnurl')) {
Config::set('upload.cdnurl', $url);
}
if (Config::get('app_debug'))
{
if (Config::get('app_debug')) {
// 如果是调试模式将version置为当前的时间戳可避免缓存
Config::set('site.version', time());
// 如果是开发模式那么将异常模板修改成官方的
Config::set('exception_tmpl', THINK_PATH . 'tpl' . DS . 'think_exception.tpl');
}
// 如果是trace模式且Ajax的情况下关闭trace
if (Config::get('app_trace') && $request->isAjax())
{
if (Config::get('app_trace') && $request->isAjax()) {
Config::set('app_trace', false);
}
// 切换多语言
if (Config::get('lang_switch_on') && $request->get('lang'))
{
if (Config::get('lang_switch_on') && $request->get('lang')) {
\think\Cookie::set('think_var', $request->get('lang'));
}
// Form别名
... ... @@ -72,5 +63,4 @@ class Common
]);
$this->moduleInit($request);
}
}
... ...
... ... @@ -75,10 +75,8 @@ class Api
$this->_initialize();
// 前置操作方法
if ($this->beforeActionList)
{
foreach ($this->beforeActionList as $method => $options)
{
if ($this->beforeActionList) {
foreach ($this->beforeActionList as $method => $options) {
is_numeric($method) ?
$this->beforeAction($options) :
$this->beforeAction($method, $options);
... ... @@ -108,30 +106,23 @@ class Api
// 设置当前请求的URI
$this->auth->setRequestUri($path);
// 检测是否需要验证登录
if (!$this->auth->match($this->noNeedLogin))
{
if (!$this->auth->match($this->noNeedLogin)) {
//初始化
$this->auth->init($token);
//检测是否登录
if (!$this->auth->isLogin())
{
if (!$this->auth->isLogin()) {
$this->error(__('Please login first'), null, 401);
}
// 判断是否需要验证权限
if (!$this->auth->match($this->noNeedRight))
{
if (!$this->auth->match($this->noNeedRight)) {
// 判断控制器和方法判断是否有对应权限
if (!$this->auth->check($path))
{
if (!$this->auth->check($path)) {
$this->error(__('You have no permission'), null, 403);
}
}
}
else
{
} else {
// 如果有传递token才验证是否登录状态
if ($token)
{
if ($token) {
$this->auth->init($token);
}
}
... ... @@ -204,13 +195,10 @@ class Api
// 如果未设置类型则自动判断
$type = $type ? $type : ($this->request->param(config('var_jsonp_handler')) ? 'jsonp' : $this->responseType);
if (isset($header['statuscode']))
{
if (isset($header['statuscode'])) {
$code = $header['statuscode'];
unset($header['statuscode']);
}
else
{
} else {
//未设置状态码,根据code值判断
$code = $code >= 1000 || $code < 200 ? 200 : $code;
}
... ... @@ -227,27 +215,20 @@ class Api
*/
protected function beforeAction($method, $options = [])
{
if (isset($options['only']))
{
if (is_string($options['only']))
{
if (isset($options['only'])) {
if (is_string($options['only'])) {
$options['only'] = explode(',', $options['only']);
}
if (!in_array($this->request->action(), $options['only']))
{
if (!in_array($this->request->action(), $options['only'])) {
return;
}
}
elseif (isset($options['except']))
{
if (is_string($options['except']))
{
} elseif (isset($options['except'])) {
if (is_string($options['except'])) {
$options['except'] = explode(',', $options['except']);
}
if (in_array($this->request->action(), $options['except']))
{
if (in_array($this->request->action(), $options['except'])) {
return;
}
}
... ... @@ -281,16 +262,12 @@ class Api
*/
protected function validate($data, $validate, $message = [], $batch = false, $callback = null)
{
if (is_array($validate))
{
if (is_array($validate)) {
$v = Loader::validate();
$v->rule($validate);
}
else
{
} else {
// 支持场景
if (strpos($validate, '.'))
{
if (strpos($validate, '.')) {
list($validate, $scene) = explode('.', $validate);
}
... ... @@ -300,21 +277,20 @@ class Api
}
// 批量验证
if ($batch || $this->batchValidate)
if ($batch || $this->batchValidate) {
$v->batch(true);
}
// 设置错误信息
if (is_array($message))
if (is_array($message)) {
$v->message($message);
}
// 使用回调验证
if ($callback && is_callable($callback))
{
if ($callback && is_callable($callback)) {
call_user_func_array($callback, [$v, &$data]);
}
if (!$v->check($data))
{
if ($this->failException)
{
if (!$v->check($data)) {
if ($this->failException) {
throw new ValidateException($v->getError());
}
... ... @@ -323,5 +299,4 @@ class Api
return true;
}
}
... ...
... ... @@ -121,10 +121,10 @@ class Backend extends Controller
$path = str_replace('.', '/', $controllername) . '/' . $actionname;
// 定义是否Addtabs请求
!defined('IS_ADDTABS') && define('IS_ADDTABS', input("addtabs") ? TRUE : FALSE);
!defined('IS_ADDTABS') && define('IS_ADDTABS', input("addtabs") ? true : false);
// 定义是否Dialog请求
!defined('IS_DIALOG') && define('IS_DIALOG', input("dialog") ? TRUE : FALSE);
!defined('IS_DIALOG') && define('IS_DIALOG', input("dialog") ? true : false);
// 定义是否AJAX请求
!defined('IS_AJAX') && define('IS_AJAX', $this->request->isAjax());
... ... @@ -258,8 +258,8 @@ class Backend extends Controller
$order = $this->request->get("order", "DESC");
$offset = $this->request->get("offset", 0);
$limit = $this->request->get("limit", 0);
$filter = (array)json_decode($filter, TRUE);
$op = (array)json_decode($op, TRUE);
$filter = (array)json_decode($filter, true);
$op = (array)json_decode($op, true);
$filter = $filter ? $filter : [];
$where = [];
$tableName = '';
... ... @@ -325,13 +325,14 @@ class Backend extends Controller
case 'BETWEEN':
case 'NOT BETWEEN':
$arr = array_slice(explode(',', $v), 0, 2);
if (stripos($v, ',') === false || !array_filter($arr))
if (stripos($v, ',') === false || !array_filter($arr)) {
continue 2;
}
//当出现一边为空时改变操作符
if ($arr[0] === '') {
$sym = $sym == 'BETWEEN' ? '<=' : '>';
$arr = $arr[1];
} else if ($arr[1] === '') {
} elseif ($arr[1] === '') {
$sym = $sym == 'BETWEEN' ? '>=' : '<';
$arr = $arr[0];
}
... ... @@ -341,13 +342,14 @@ class Backend extends Controller
case 'NOT RANGE':
$v = str_replace(' - ', ',', $v);
$arr = array_slice(explode(',', $v), 0, 2);
if (stripos($v, ',') === false || !array_filter($arr))
if (stripos($v, ',') === false || !array_filter($arr)) {
continue 2;
}
//当出现一边为空时改变操作符
if ($arr[0] === '') {
$sym = $sym == 'RANGE' ? '<=' : '>';
$arr = $arr[1];
} else if ($arr[1] === '') {
} elseif ($arr[1] === '') {
$sym = $sym == 'RANGE' ? '>=' : '<';
$arr = $arr[0];
}
... ... @@ -488,11 +490,11 @@ class Backend extends Controller
'pid' => isset($item['pid']) ? $item['pid'] : 0
];
}
if($istree) {
if ($istree) {
$tree = Tree::instance();
$tree->init(collection($list)->toArray(), 'pid');
$list = $tree->getTreeList($tree->getTreeArray(0), $field);
if(!$ishtml){
if (!$ishtml) {
foreach ($list as &$item) {
$item = str_replace('&nbsp;', ' ', $item);
}
... ... @@ -503,5 +505,4 @@ class Backend extends Controller
//这里一定要返回有list这个字段,total是可选的,如果total<=list的数量,则会隐藏分页按钮
return json(['list' => $list, 'total' => $total]);
}
}
... ...
... ... @@ -134,5 +134,4 @@ class Frontend extends Controller
{
$this->view->config = array_merge($this->view->config ? $this->view->config : [], is_array($name) ? $name : [$name => $value]);
}
}
... ...
... ... @@ -7,17 +7,17 @@ use app\common\model\UserRule;
use fast\Random;
use think\Config;
use think\Db;
use think\Exception;
use think\Hook;
use think\Request;
use think\Validate;
class Auth
{
protected static $instance = null;
protected $_error = '';
protected $_logined = FALSE;
protected $_user = NULL;
protected $_logined = false;
protected $_user = null;
protected $_token = '';
//Token默认有效时长
protected $keeptime = 2592000;
... ... @@ -30,8 +30,7 @@ class Auth
public function __construct($options = [])
{
if ($config = Config::get('user'))
{
if ($config = Config::get('user')) {
$this->config = array_merge($this->config, $config);
}
$this->options = array_merge($this->config, $options);
... ... @@ -44,8 +43,7 @@ class Auth
*/
public static function instance($options = [])
{
if (is_null(self::$instance))
{
if (is_null(self::$instance)) {
self::$instance = new static($options);
}
... ... @@ -69,7 +67,7 @@ class Auth
*/
public function __get($name)
{
return $this->_user ? $this->_user->$name : NULL;
return $this->_user ? $this->_user->$name : null;
}
/**
... ... @@ -80,44 +78,38 @@ class Auth
*/
public function init($token)
{
if ($this->_logined)
{
return TRUE;
if ($this->_logined) {
return true;
}
if ($this->_error) {
return false;
}
if ($this->_error)
return FALSE;
$data = Token::get($token);
if (!$data)
{
return FALSE;
if (!$data) {
return false;
}
$user_id = intval($data['user_id']);
if ($user_id > 0)
{
if ($user_id > 0) {
$user = User::get($user_id);
if (!$user)
{
if (!$user) {
$this->setError('Account not exist');
return FALSE;
return false;
}
if ($user['status'] != 'normal')
{
if ($user['status'] != 'normal') {
$this->setError('Account is locked');
return FALSE;
return false;
}
$this->_user = $user;
$this->_logined = TRUE;
$this->_logined = true;
$this->_token = $token;
//初始化成功的事件
Hook::listen("user_init_successed", $this->_user);
return TRUE;
}
else
{
return true;
} else {
$this->setError('You are not logged in');
return FALSE;
return false;
}
}
... ... @@ -134,20 +126,17 @@ class Auth
public function register($username, $password, $email = '', $mobile = '', $extend = [])
{
// 检测用户名或邮箱、手机号是否存在
if (User::getByUsername($username))
{
if (User::getByUsername($username)) {
$this->setError('Username already exist');
return FALSE;
return false;
}
if ($email && User::getByEmail($email))
{
if ($email && User::getByEmail($email)) {
$this->setError('Email already exist');
return FALSE;
return false;
}
if ($mobile && User::getByMobile($mobile))
{
if ($mobile && User::getByMobile($mobile)) {
$this->setError('Mobile already exist');
return FALSE;
return false;
}
$ip = request()->ip();
... ... @@ -175,31 +164,11 @@ class Auth
$params['password'] = $this->getEncryptPassword($password, $params['salt']);
$params = array_merge($params, $extend);
////////////////同步到Ucenter////////////////
if (defined('UC_STATUS') && UC_STATUS)
{
$uc = new \addons\ucenter\library\client\Client();
$user_id = $uc->uc_user_register($username, $password, $email);
// 如果小于0则说明发生错误
if ($user_id <= 0)
{
$this->setError($user_id > -4 ? 'Username is incorrect' : 'Email is incorrect');
return FALSE;
}
else
{
$params['id'] = $user_id;
}
}
//账号注册时需要开启事务,避免出现垃圾数据
Db::startTrans();
try
{
$user = User::create($params);
Db::commit();
try {
$user = User::create($params, true);
// 此时的Model中只包含部分数据
$this->_user = User::get($user->id);
//设置Token
... ... @@ -207,16 +176,14 @@ class Auth
Token::set($this->_token, $user->id, $this->keeptime);
//注册成功的事件
Hook::listen("user_register_successed", $this->_user);
return TRUE;
}
catch (Exception $e)
{
Hook::listen("user_register_successed", $this->_user, $data);
Db::commit();
} catch (Exception $e) {
$this->setError($e->getMessage());
Db::rollback();
return FALSE;
return false;
}
return true;
}
/**
... ... @@ -230,27 +197,24 @@ class Auth
{
$field = Validate::is($account, 'email') ? 'email' : (Validate::regex($account, '/^1\d{10}$/') ? 'mobile' : 'username');
$user = User::get([$field => $account]);
if (!$user)
{
if (!$user) {
$this->setError('Account is incorrect');
return FALSE;
return false;
}
if ($user->status != 'normal')
{
if ($user->status != 'normal') {
$this->setError('Account is locked');
return FALSE;
return false;
}
if ($user->password != $this->getEncryptPassword($password, $user->salt))
{
if ($user->password != $this->getEncryptPassword($password, $user->salt)) {
$this->setError('Password is incorrect');
return FALSE;
return false;
}
//直接登录会员
$this->direct($user->id);
return TRUE;
return true;
}
/**
... ... @@ -260,18 +224,17 @@ class Auth
*/
public function logout()
{
if (!$this->_logined)
{
if (!$this->_logined) {
$this->setError('You are not logged in');
return false;
}
//设置登录标识
$this->_logined = FALSE;
$this->_logined = false;
//删除Token
Token::delete($this->_token);
//注销成功的事件
Hook::listen("user_logout_successed", $this->_user);
return TRUE;
return true;
}
/**
... ... @@ -283,14 +246,14 @@ class Auth
*/
public function changepwd($newpassword, $oldpassword = '', $ignoreoldpassword = false)
{
if (!$this->_logined)
{
if (!$this->_logined) {
$this->setError('You are not logged in');
return false;
}
//判断旧密码是否正确
if ($this->_user->password == $this->getEncryptPassword($oldpassword, $this->_user->salt) || $ignoreoldpassword)
{
if ($this->_user->password == $this->getEncryptPassword($oldpassword, $this->_user->salt) || $ignoreoldpassword) {
Db::startTrans();
try {
$salt = Random::alnum();
$newpassword = $this->getEncryptPassword($newpassword, $salt);
$this->_user->save(['password' => $newpassword, 'salt' => $salt]);
... ... @@ -298,10 +261,14 @@ class Auth
Token::delete($this->_token);
//修改密码成功的事件
Hook::listen("user_changepwd_successed", $this->_user);
return true;
Db::commit();
} catch (Exception $e) {
Db::rollback();
$this->setError($e->getMessage());
return false;
}
else
{
return true;
} else {
$this->setError('Password is incorrect');
return false;
}
... ... @@ -315,27 +282,14 @@ class Auth
public function direct($user_id)
{
$user = User::get($user_id);
if ($user)
{
////////////////同步到Ucenter////////////////
if (defined('UC_STATUS') && UC_STATUS)
{
$uc = new \addons\ucenter\library\client\Client();
$re = $uc->uc_user_login($this->user->id, $this->user->password . '#split#' . $this->user->salt, 3);
// 如果小于0则说明发生错误
if ($re <= 0)
{
$this->setError('Username or password is incorrect');
return FALSE;
}
}
if ($user) {
Db::startTrans();
try {
$ip = request()->ip();
$time = time();
//判断连续登录和最大连续登录
if ($user->logintime < \fast\Date::unixtime('day'))
{
if ($user->logintime < \fast\Date::unixtime('day')) {
$user->successions = $user->logintime < \fast\Date::unixtime('day', -1) ? 1 : $user->successions + 1;
$user->maxsuccessions = max($user->successions, $user->maxsuccessions);
}
... ... @@ -352,15 +306,19 @@ class Auth
$this->_token = Random::uuid();
Token::set($this->_token, $user->id, $this->keeptime);
$this->_logined = TRUE;
$this->_logined = true;
//登录成功的事件
Hook::listen("user_login_successed", $this->_user);
return TRUE;
Db::commit();
} catch (Exception $e) {
Db::rollback();
$this->setError($e->getMessage());
return false;
}
else
{
return FALSE;
return true;
} else {
return false;
}
}
... ... @@ -370,20 +328,20 @@ class Auth
* @param string $module 模块 默认为当前模块
* @return boolean
*/
public function check($path = NULL, $module = NULL)
public function check($path = null, $module = null)
{
if (!$this->_logined)
if (!$this->_logined) {
return false;
}
$ruleList = $this->getRuleList();
$rules = [];
foreach ($ruleList as $k => $v)
{
foreach ($ruleList as $k => $v) {
$rules[] = $v['name'];
}
$url = ($module ? $module : request()->module()) . '/' . (is_null($path) ? $this->getRequestUri() : $path);
$url = strtolower(str_replace('.', '/', $url));
return in_array($url, $rules) ? TRUE : FALSE;
return in_array($url, $rules) ? true : false;
}
/**
... ... @@ -392,8 +350,7 @@ class Auth
*/
public function isLogin()
{
if ($this->_logined)
{
if ($this->_logined) {
return true;
}
return false;
... ... @@ -426,11 +383,11 @@ class Auth
*/
public function getRuleList()
{
if ($this->rules)
if ($this->rules) {
return $this->rules;
}
$group = $this->_user->group;
if (!$group)
{
if (!$group) {
return [];
}
$rules = explode(',', $group->rules);
... ... @@ -482,37 +439,24 @@ class Auth
public function delete($user_id)
{
$user = User::get($user_id);
if (!$user)
{
return FALSE;
}
////////////////同步到Ucenter////////////////
if (defined('UC_STATUS') && UC_STATUS)
{
$uc = new \addons\ucenter\library\client\Client();
$re = $uc->uc_user_delete($user['id']);
// 如果小于0则说明发生错误
if ($re <= 0)
{
$this->setError('Account is locked');
return FALSE;
}
if (!$user) {
return false;
}
// 调用事务删除账号
$result = Db::transaction(function($db) use($user_id) {
Db::startTrans();
try {
// 删除会员
User::destroy($user_id);
// 删除会员指定的所有Token
Token::clear($user_id);
return TRUE;
});
if ($result)
{
Hook::listen("user_delete_successed", $user);
Db::commit();
} catch (Exception $e) {
Db::rollback();
$this->setError($e->getMessage());
return false;
}
return $result ? TRUE : FALSE;
return true;
}
/**
... ... @@ -536,19 +480,17 @@ class Auth
{
$request = Request::instance();
$arr = is_array($arr) ? $arr : explode(',', $arr);
if (!$arr)
{
return FALSE;
if (!$arr) {
return false;
}
$arr = array_map('strtolower', $arr);
// 是否存在
if (in_array(strtolower($request->action()), $arr) || in_array('*', $arr))
{
return TRUE;
if (in_array(strtolower($request->action()), $arr) || in_array('*', $arr)) {
return true;
}
// 没找到匹配
return FALSE;
return false;
}
/**
... ... @@ -572,29 +514,25 @@ class Auth
{
$fields = !$fields ? ['id', 'nickname', 'level', 'avatar'] : (is_array($fields) ? $fields : explode(',', $fields));
$ids = [];
foreach ($datalist as $k => $v)
{
if (!isset($v[$fieldkey]))
foreach ($datalist as $k => $v) {
if (!isset($v[$fieldkey])) {
continue;
}
$ids[] = $v[$fieldkey];
}
$list = [];
if ($ids)
{
if (!in_array('id', $fields))
{
if ($ids) {
if (!in_array('id', $fields)) {
$fields[] = 'id';
}
$ids = array_unique($ids);
$selectlist = User::where('id', 'in', $ids)->column($fields);
foreach ($selectlist as $k => $v)
{
foreach ($selectlist as $k => $v) {
$list[$v['id']] = $v;
}
}
foreach ($datalist as $k => &$v)
{
$v[$renderkey] = isset($list[$v[$fieldkey]]) ? $list[$v[$fieldkey]] : NULL;
foreach ($datalist as $k => &$v) {
$v[$renderkey] = isset($list[$v[$fieldkey]]) ? $list[$v[$fieldkey]] : null;
}
unset($v);
return $datalist;
... ... @@ -620,5 +558,4 @@ class Auth
{
return $this->_error ? __($this->_error) : '';
}
}
... ...
... ... @@ -38,8 +38,7 @@ class Email
*/
public static function instance($options = [])
{
if (is_null(self::$instance))
{
if (is_null(self::$instance)) {
self::$instance = new static($options);
}
... ... @@ -52,8 +51,7 @@ class Email
*/
public function __construct($options = [])
{
if ($config = Config::get('site'))
{
if ($config = Config::get('site')) {
$this->options = array_merge($this->options, $config);
}
$this->options = array_merge($this->options, $options);
... ... @@ -150,27 +148,20 @@ class Email
public function send()
{
$result = false;
switch ($this->options['mail_type'])
{
switch ($this->options['mail_type']) {
case 1:
//使用phpmailer发送
$this->mail->setFrom($this->options['from'], $this->options['from_name']);
$this->mail->addAddress($this->options['to'], $this->options['to_name']);
$this->mail->Subject = $this->options['subject'];
if ($this->options['ishtml'])
{
if ($this->options['ishtml']) {
$this->mail->msgHTML($this->options['body']);
}
else
{
} else {
$this->mail->Body = $this->options['body'];
}
try
{
try {
$result = $this->mail->send();
}
catch (\phpmailerException $e)
{
} catch (\phpmailerException $e) {
$this->setError($e->getMessage());
}
... ...
... ... @@ -36,7 +36,7 @@ class Ems
->order('id', 'DESC')
->find();
Hook::listen('ems_get', $ems, null, true);
return $ems ? $ems : NULL;
return $ems ? $ems : null;
}
/**
... ... @@ -47,19 +47,18 @@ class Ems
* @param string $event 事件
* @return boolean
*/
public static function send($email, $code = NULL, $event = 'default')
public static function send($email, $code = null, $event = 'default')
{
$code = is_null($code) ? mt_rand(1000, 9999) : $code;
$time = time();
$ip = request()->ip();
$ems = \app\common\model\Ems::create(['event' => $event, 'email' => $email, 'code' => $code, 'ip' => $ip, 'createtime' => $time]);
$result = Hook::listen('ems_send', $ems, null, true);
if (!$result)
{
if (!$result) {
$ems->delete();
return FALSE;
return false;
}
return TRUE;
return true;
}
/**
... ... @@ -70,7 +69,7 @@ class Ems
* @param string $template 消息模板
* @return boolean
*/
public static function notice($email, $msg = '', $template = NULL)
public static function notice($email, $msg = '', $template = null)
{
$params = [
'email' => $email,
... ... @@ -78,7 +77,7 @@ class Ems
'template' => $template
];
$result = Hook::listen('ems_notice', $params, null, true);
return $result ? TRUE : FALSE;
return $result ? true : false;
}
/**
... ... @@ -95,33 +94,24 @@ class Ems
$ems = \app\common\model\Ems::where(['email' => $email, 'event' => $event])
->order('id', 'DESC')
->find();
if ($ems)
{
if ($ems['createtime'] > $time && $ems['times'] <= self::$maxCheckNums)
{
if ($ems) {
if ($ems['createtime'] > $time && $ems['times'] <= self::$maxCheckNums) {
$correct = $code == $ems['code'];
if (!$correct)
{
if (!$correct) {
$ems->times = $ems->times + 1;
$ems->save();
return FALSE;
}
else
{
return false;
} else {
$result = Hook::listen('ems_check', $ems, null, true);
return TRUE;
return true;
}
}
else
{
} else {
// 过期则清空该邮箱验证码
self::flush($email, $event);
return FALSE;
return false;
}
}
else
{
return FALSE;
} else {
return false;
}
}
... ... @@ -138,7 +128,6 @@ class Ems
where(['email' => $email, 'event' => $event])
->delete();
Hook::listen('ems_flush');
return TRUE;
return true;
}
}
... ...
... ... @@ -17,18 +17,14 @@ class Menu
*/
public static function create($menu, $parent = 0)
{
if (!is_numeric($parent))
{
if (!is_numeric($parent)) {
$parentRule = AuthRule::getByName($parent);
$pid = $parentRule ? $parentRule['id'] : 0;
}
else
{
} else {
$pid = $parent;
}
$allow = array_flip(['file', 'name', 'title', 'icon', 'condition', 'remark', 'ismenu']);
foreach ($menu as $k => $v)
{
foreach ($menu as $k => $v) {
$hasChild = isset($v['sublist']) && $v['sublist'] ? true : false;
$data = array_intersect_key($v, $allow);
... ... @@ -37,16 +33,12 @@ class Menu
$data['icon'] = isset($data['icon']) ? $data['icon'] : ($hasChild ? 'fa fa-list' : 'fa fa-circle-o');
$data['pid'] = $pid;
$data['status'] = 'normal';
try
{
try {
$menu = AuthRule::create($data);
if ($hasChild)
{
if ($hasChild) {
self::create($v['sublist'], $menu->id);
}
}
catch (PDOException $e)
{
} catch (PDOException $e) {
throw new Exception($e->getMessage());
}
}
... ... @@ -60,8 +52,7 @@ class Menu
public static function delete($name)
{
$ids = self::getAuthRuleIdsByName($name);
if (!$ids)
{
if (!$ids) {
return false;
}
AuthRule::destroy($ids);
... ... @@ -76,8 +67,7 @@ class Menu
public static function enable($name)
{
$ids = self::getAuthRuleIdsByName($name);
if (!$ids)
{
if (!$ids) {
return false;
}
AuthRule::where('id', 'in', $ids)->update(['status' => 'normal']);
... ... @@ -92,8 +82,7 @@ class Menu
public static function disable($name)
{
$ids = self::getAuthRuleIdsByName($name);
if (!$ids)
{
if (!$ids) {
return false;
}
AuthRule::where('id', 'in', $ids)->update(['status' => 'hidden']);
... ... @@ -108,14 +97,12 @@ class Menu
public static function export($name)
{
$ids = self::getAuthRuleIdsByName($name);
if (!$ids)
{
if (!$ids) {
return [];
}
$menuList = [];
$menu = AuthRule::getByName($name);
if ($menu)
{
if ($menu) {
$ruleList = collection(AuthRule::where('id', 'in', $ids)->select())->toArray();
$menuList = Tree::instance()->init($ruleList)->getTreeArray($menu['id']);
}
... ... @@ -131,8 +118,7 @@ class Menu
{
$ids = [];
$menu = AuthRule::getByName($name);
if ($menu)
{
if ($menu) {
// 必须将结果集转换为数组
$ruleList = collection(AuthRule::order('weigh', 'desc')->field('id,pid,name')->select())->toArray();
// 构造菜单数据
... ...
... ... @@ -36,7 +36,7 @@ class Sms
->order('id', 'DESC')
->find();
Hook::listen('sms_get', $sms, null, true);
return $sms ? $sms : NULL;
return $sms ? $sms : null;
}
/**
... ... @@ -47,19 +47,18 @@ class Sms
* @param string $event 事件
* @return boolean
*/
public static function send($mobile, $code = NULL, $event = 'default')
public static function send($mobile, $code = null, $event = 'default')
{
$code = is_null($code) ? mt_rand(1000, 9999) : $code;
$time = time();
$ip = request()->ip();
$sms = \app\common\model\Sms::create(['event' => $event, 'mobile' => $mobile, 'code' => $code, 'ip' => $ip, 'createtime' => $time]);
$result = Hook::listen('sms_send', $sms, null, true);
if (!$result)
{
if (!$result) {
$sms->delete();
return FALSE;
return false;
}
return TRUE;
return true;
}
/**
... ... @@ -70,7 +69,7 @@ class Sms
* @param string $template 消息模板
* @return boolean
*/
public static function notice($mobile, $msg = '', $template = NULL)
public static function notice($mobile, $msg = '', $template = null)
{
$params = [
'mobile' => $mobile,
... ... @@ -78,7 +77,7 @@ class Sms
'template' => $template
];
$result = Hook::listen('sms_notice', $params, null, true);
return $result ? TRUE : FALSE;
return $result ? true : false;
}
/**
... ... @@ -95,33 +94,24 @@ class Sms
$sms = \app\common\model\Sms::where(['mobile' => $mobile, 'event' => $event])
->order('id', 'DESC')
->find();
if ($sms)
{
if ($sms['createtime'] > $time && $sms['times'] <= self::$maxCheckNums)
{
if ($sms) {
if ($sms['createtime'] > $time && $sms['times'] <= self::$maxCheckNums) {
$correct = $code == $sms['code'];
if (!$correct)
{
if (!$correct) {
$sms->times = $sms->times + 1;
$sms->save();
return FALSE;
}
else
{
return false;
} else {
$result = Hook::listen('sms_check', $sms, null, true);
return $result;
}
}
else
{
} else {
// 过期则清空该手机验证码
self::flush($mobile, $event);
return FALSE;
return false;
}
}
else
{
return FALSE;
} else {
return false;
}
}
... ... @@ -138,7 +128,6 @@ class Sms
where(['mobile' => $mobile, 'event' => $event])
->delete();
Hook::listen('sms_flush');
return TRUE;
return true;
}
}
... ...
... ... @@ -7,7 +7,7 @@ use think\Model;
/**
* 分类模型
*/
class Category Extends Model
class Category extends Model
{
// 开启自动写入时间戳字段
... ... @@ -40,8 +40,7 @@ class Category Extends Model
public static function getTypeList()
{
$typeList = config('site.categorytype');
foreach ($typeList as $k => &$v)
{
foreach ($typeList as $k => &$v) {
$v = __($v);
}
return $typeList;
... ... @@ -73,19 +72,16 @@ class Category Extends Model
* @param string $status 指定状态
* @return array
*/
public static function getCategoryArray($type = NULL, $status = NULL)
{
$list = collection(self::where(function($query) use($type, $status) {
if (!is_null($type))
public static function getCategoryArray($type = null, $status = null)
{
$list = collection(self::where(function ($query) use ($type, $status) {
if (!is_null($type)) {
$query->where('type', '=', $type);
}
if (!is_null($status))
{
if (!is_null($status)) {
$query->where('status', '=', $status);
}
})->order('weigh', 'desc')->select())->toArray();
return $list;
}
}
... ...
... ... @@ -25,17 +25,14 @@ class Version extends Model
public static function check($version)
{
$versionlist = self::where('status', 'normal')->cache('__version__')->order('weigh desc,id desc')->select();
foreach ($versionlist as $k => $v)
{
foreach ($versionlist as $k => $v) {
// 版本正常且新版本号不等于验证的版本号且找到匹配的旧版本
if ($v['status'] == 'normal' && $v['newversion'] !== $version && \fast\Version::check($version, $v['oldversion']))
{
if ($v['status'] == 'normal' && $v['newversion'] !== $version && \fast\Version::check($version, $v['oldversion'])) {
$updateversion = $v;
break;
}
}
if (isset($updateversion))
{
if (isset($updateversion)) {
$search = ['{version}', '{newversion}', '{downloadurl}', '{url}', '{packagesize}'];
$replace = [$version, $updateversion['newversion'], $updateversion['downloadurl'], $updateversion['downloadurl'], $updateversion['packagesize']];
$upgradetext = str_replace($search, $replace, $updateversion['content']);
... ... @@ -48,7 +45,6 @@ class Version extends Model
"upgradetext" => $upgradetext
];
}
return NULL;
return null;
}
}
... ...
... ... @@ -272,7 +272,7 @@ return [
//自动检测更新
'checkupdate' => false,
//版本号
'version' => '1.0.0.20190318_beta',
'version' => '1.0.0.20190407_beta',
//API接口地址
'api_url' => 'https://api.fastadmin.net',
],
... ...
... ... @@ -12,11 +12,6 @@ class Index extends Frontend
protected $noNeedRight = '*';
protected $layout = '';
public function _initialize()
{
parent::_initialize();
}
public function index()
{
return $this->view->fetch();
... ...
... ... @@ -61,7 +61,7 @@
<footer class="footer" style="clear:both">
<!-- FastAdmin是开源程序,建议在您的网站底部保留一个FastAdmin的链接 -->
<p class="copyright">Copyright&nbsp;©&nbsp;2017-2018 Powered by <a href="https://www.fastadmin.net" target="_blank">FastAdmin</a> All Rights Reserved {$site.name} {:__('Copyrights')} <a href="http://www.miibeian.gov.cn" target="_blank">{$site.beian}</a></p>
<p class="copyright">Copyright&nbsp;©&nbsp;2017-2019 Powered by <a href="https://www.fastadmin.net" target="_blank">FastAdmin</a> All Rights Reserved {$site.name} {:__('Copyrights')} <a href="http://www.miibeian.gov.cn" target="_blank">{$site.beian}</a></p>
</footer>
{include file="common/script" /}
... ...
... ... @@ -36,7 +36,7 @@
<div class="form-body">
<input type="hidden" name="action" value="resetpwd" />
<div class="form-group">
<label for="" class="control-label col-xs-12 col-sm-3">{:__('Type')}:</label>
<label class="control-label col-xs-12 col-sm-3">{:__('Type')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="radio">
<label for="type-email"><input id="type-email" checked="checked" name="type" data-send-url="{:url('api/ems/send')}" data-check-url="{:url('api/validate/check_ems_correct')}" type="radio" value="email"> {:__('Reset password by email')}</label>
... ...
... ... @@ -39,7 +39,7 @@
<h2 class="page-header">{:__('Profile')}</h2>
<form id="profile-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="{:url('api/user/profile')}">
{:token()}
<input type="hidden" name="avatar" id="c-avatar" value="{$user.avatar}" />
<input type="hidden" name="avatar" id="c-avatar" value="{:$user->getData('avatar')}" />
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-4">
... ...
... ... @@ -56,14 +56,9 @@ class Auth
'auth_user' => 'user', // 用户信息表
];
/**
* 类架构函数
* Auth constructor.
*/
public function __construct()
{
if ($auth = Config::get('auth'))
{
if ($auth = Config::get('auth')) {
$this->config = array_merge($this->config, $auth);
}
// 初始化request
... ... @@ -78,8 +73,7 @@ class Auth
*/
public static function instance($options = [])
{
if (is_null(self::$instance))
{
if (is_null(self::$instance)) {
self::$instance = new static($options);
}
... ... @@ -88,69 +82,56 @@ class Auth
/**
* 检查权限
* @param $name string|array 需要验证的规则列表,支持逗号分隔的权限规则或索引数组
* @param $uid int 认证用户的id
* @param string|array $name 需要验证的规则列表,支持逗号分隔的权限规则或索引数组
* @param int $uid 认证用户的id
* @param string $relation 如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证
* @param string $mode 执行验证的模式,可分为url,normal
* @return bool 通过验证返回true;失败返回false
*/
public function check($name, $uid, $relation = 'or', $mode = 'url')
{
if (!$this->config['auth_on'])
{
if (!$this->config['auth_on']) {
return true;
}
// 获取用户需要验证的所有有效规则列表
$rulelist = $this->getRuleList($uid);
if (in_array('*', $rulelist))
if (in_array('*', $rulelist)) {
return true;
}
if (is_string($name))
{
if (is_string($name)) {
$name = strtolower($name);
if (strpos($name, ',') !== false)
{
if (strpos($name, ',') !== false) {
$name = explode(',', $name);
}
else
{
} else {
$name = [$name];
}
}
$list = []; //保存验证通过的规则名
if ('url' == $mode)
{
if ('url' == $mode) {
$REQUEST = unserialize(strtolower(serialize($this->request->param())));
}
foreach ($rulelist as $rule)
{
foreach ($rulelist as $rule) {
$query = preg_replace('/^.+\?/U', '', $rule);
if ('url' == $mode && $query != $rule)
{
if ('url' == $mode && $query != $rule) {
parse_str($query, $param); //解析规则中的param
$intersect = array_intersect_assoc($REQUEST, $param);
$rule = preg_replace('/\?.*$/U', '', $rule);
if (in_array($rule, $name) && $intersect == $param)
{
if (in_array($rule, $name) && $intersect == $param) {
//如果节点相符且url参数满足
$list[] = $rule;
}
}
else
{
if (in_array($rule, $name))
{
} else {
if (in_array($rule, $name)) {
$list[] = $rule;
}
}
}
if ('or' == $relation && !empty($list))
{
if ('or' == $relation && !empty($list)) {
return true;
}
$diff = array_diff($name, $list);
if ('and' == $relation && empty($diff))
{
if ('and' == $relation && empty($diff)) {
return true;
}
... ... @@ -159,7 +140,7 @@ class Auth
/**
* 根据用户id获取用户组,返回值为数组
* @param $uid int 用户id
* @param int $uid 用户id
* @return array 用户所属的用户组 array(
* array('uid'=>'用户id','group_id'=>'用户组id','name'=>'用户组名称','rules'=>'用户组拥有的规则id,多个,号隔开'),
* ...)
... ... @@ -167,8 +148,7 @@ class Auth
public function getGroups($uid)
{
static $groups = [];
if (isset($groups[$uid]))
{
if (isset($groups[$uid])) {
return $groups[$uid];
}
... ... @@ -185,25 +165,22 @@ class Auth
/**
* 获得权限规则列表
* @param integer $uid 用户id
* @param int $uid 用户id
* @return array
*/
public function getRuleList($uid)
{
static $_rulelist = []; //保存用户验证通过的权限列表
if (isset($_rulelist[$uid]))
{
if (isset($_rulelist[$uid])) {
return $_rulelist[$uid];
}
if (2 == $this->config['auth_type'] && Session::has('_rule_list_' . $uid))
{
if (2 == $this->config['auth_type'] && Session::has('_rule_list_' . $uid)) {
return Session::get('_rule_list_' . $uid);
}
// 读取用户规则节点
$ids = $this->getRuleIds($uid);
if (empty($ids))
{
if (empty($ids)) {
$_rulelist[$uid] = [];
return [];
}
... ... @@ -212,8 +189,7 @@ class Auth
$where = [
'status' => 'normal'
];
if (!in_array('*', $ids))
{
if (!in_array('*', $ids)) {
$where['id'] = ['in', $ids];
}
//读取用户组所有权限规则
... ... @@ -221,34 +197,27 @@ class Auth
//循环规则,判断结果。
$rulelist = []; //
if (in_array('*', $ids))
{
if (in_array('*', $ids)) {
$rulelist[] = "*";
}
foreach ($this->rules as $rule)
{
foreach ($this->rules as $rule) {
//超级管理员无需验证condition
if (!empty($rule['condition']) && !in_array('*', $ids))
{
if (!empty($rule['condition']) && !in_array('*', $ids)) {
//根据condition进行验证
$user = $this->getUserInfo($uid); //获取用户信息,一维数组
$command = preg_replace('/\{(\w*?)\}/', '$user[\'\\1\']', $rule['condition']);
@(eval('$condition=(' . $command . ');'));
if ($condition)
{
if ($condition) {
$rulelist[$rule['id']] = strtolower($rule['name']);
}
}
else
{
} else {
//只要存在就记录
$rulelist[$rule['id']] = strtolower($rule['name']);
}
}
$_rulelist[$uid] = $rulelist;
//登录验证则需要保存规则列表
if (2 == $this->config['auth_type'])
{
if (2 == $this->config['auth_type']) {
//规则列表结果保存到session
Session::set('_rule_list_' . $uid, $rulelist);
}
... ... @@ -260,8 +229,7 @@ class Auth
//读取用户所属用户组
$groups = $this->getGroups($uid);
$ids = []; //保存用户所属用户组设置的所有权限规则id
foreach ($groups as $g)
{
foreach ($groups as $g) {
$ids = array_merge($ids, explode(',', trim($g['rules'], ',')));
}
$ids = array_unique($ids);
... ... @@ -270,7 +238,7 @@ class Auth
/**
* 获得用户资料
* @param $uid
* @param int $uid 用户id
* @return mixed
*/
protected function getUserInfo($uid)
... ... @@ -280,12 +248,10 @@ class Auth
$user = Db::name($this->config['auth_user']);
// 获取用户表主键
$_pk = is_string($user->getPk()) ? $user->getPk() : 'uid';
if (!isset($user_info[$uid]))
{
if (!isset($user_info[$uid])) {
$user_info[$uid] = $user->where($_pk, $uid)->find();
}
return $user_info[$uid];
}
}
\ No newline at end of file
... ...
... ... @@ -7,7 +7,6 @@ namespace fast;
*/
class Date
{
const YEAR = 31536000;
const MONTH = 2592000;
const WEEK = 604800;
... ... @@ -28,15 +27,13 @@ class Date
* @param mixed $now UNIX timestamp or date string
* @return integer
*/
public static function offset($remote, $local = NULL, $now = NULL)
{
if ($local === NULL)
public static function offset($remote, $local = null, $now = null)
{
if ($local === null) {
// Use the default timezone
$local = date_default_timezone_get();
}
if (is_int($now))
{
if (is_int($now)) {
// Convert the timestamp into a string
$now = date(DateTime::RFC2822, $now);
}
... ... @@ -64,14 +61,13 @@ class Date
* @return array associative list of all outputs requested
* @from https://github.com/kohana/ohanzee-helpers/blob/master/src/Date.php
*/
public static function span($remote, $local = NULL, $output = 'years,months,weeks,days,hours,minutes,seconds')
public static function span($remote, $local = null, $output = 'years,months,weeks,days,hours,minutes,seconds')
{
// Normalize output
$output = trim(strtolower((string) $output));
if (!$output)
{
$output = trim(strtolower((string)$output));
if (!$output) {
// Invalid output
return FALSE;
return false;
}
// Array with the output formats
$output = preg_split('/[^a-z]+/', $output);
... ... @@ -79,44 +75,35 @@ class Date
$output = array_combine($output, array_fill(0, count($output), 0));
// Make the output values into keys
extract(array_flip($output), EXTR_SKIP);
if ($local === NULL)
{
if ($local === null) {
// Calculate the span from the current time
$local = time();
}
// Calculate timespan (seconds)
$timespan = abs($remote - $local);
if (isset($output['years']))
{
$timespan -= self::YEAR * ($output['years'] = (int) floor($timespan / self::YEAR));
if (isset($output['years'])) {
$timespan -= self::YEAR * ($output['years'] = (int)floor($timespan / self::YEAR));
}
if (isset($output['months']))
{
$timespan -= self::MONTH * ($output['months'] = (int) floor($timespan / self::MONTH));
if (isset($output['months'])) {
$timespan -= self::MONTH * ($output['months'] = (int)floor($timespan / self::MONTH));
}
if (isset($output['weeks']))
{
$timespan -= self::WEEK * ($output['weeks'] = (int) floor($timespan / self::WEEK));
if (isset($output['weeks'])) {
$timespan -= self::WEEK * ($output['weeks'] = (int)floor($timespan / self::WEEK));
}
if (isset($output['days']))
{
$timespan -= self::DAY * ($output['days'] = (int) floor($timespan / self::DAY));
if (isset($output['days'])) {
$timespan -= self::DAY * ($output['days'] = (int)floor($timespan / self::DAY));
}
if (isset($output['hours']))
{
$timespan -= self::HOUR * ($output['hours'] = (int) floor($timespan / self::HOUR));
if (isset($output['hours'])) {
$timespan -= self::HOUR * ($output['hours'] = (int)floor($timespan / self::HOUR));
}
if (isset($output['minutes']))
{
$timespan -= self::MINUTE * ($output['minutes'] = (int) floor($timespan / self::MINUTE));
if (isset($output['minutes'])) {
$timespan -= self::MINUTE * ($output['minutes'] = (int)floor($timespan / self::MINUTE));
}
// Seconds ago, 1
if (isset($output['seconds']))
{
if (isset($output['seconds'])) {
$output['seconds'] = $timespan;
}
if (count($output) === 1)
{
if (count($output) === 1) {
// Only a single output was requested, return it
return array_pop($output);
}
... ... @@ -145,12 +132,10 @@ class Date
array(1, 'second')
);
for ($i = 0, $j = count($chunks); $i < $j; $i++)
{
for ($i = 0, $j = count($chunks); $i < $j; $i++) {
$seconds = $chunks[$i][0];
$name = $chunks[$i][1];
if (($count = floor($timediff / $seconds)) != 0)
{
if (($count = floor($timediff / $seconds)) != 0) {
break;
}
}
... ... @@ -179,8 +164,7 @@ class Date
$minute = is_null($minute) ? date('i') : $minute;
$position = in_array($position, array('begin', 'start', 'first', 'front'));
switch ($type)
{
switch ($type) {
case 'minute':
$time = $position ? mktime($hour, $minute + $offset, 0, $month, $day, $year) : mktime($hour, $minute + $offset, 59, $month, $day, $year);
break;
... ... @@ -212,5 +196,4 @@ class Date
}
return $time;
}
}
... ...
... ... @@ -51,11 +51,6 @@ use ArrayAccess;
class Form
{
public function __construct()
{
}
/**
* @param $name
* @param $arguments
... ... @@ -65,7 +60,6 @@ class Form
{
return call_user_func_array([FormBuilder::instance(), $name], $arguments);
}
}
/**
... ... @@ -105,11 +99,6 @@ class FormBuilder
protected $escapeHtml = true;
protected static $instance;
public function __construct()
{
}
/**
* 获取单例
* @param array $options
... ... @@ -206,8 +195,9 @@ class FormBuilder
*/
public function input($type, $name, $value = null, $options = [])
{
if (!isset($options['name']))
if (!isset($options['name'])) {
$options['name'] = $name;
}
$id = $this->getIdAttribute($name, $options);
... ... @@ -308,8 +298,9 @@ class FormBuilder
*/
public function textarea($name, $value = null, $options = [])
{
if (!isset($options['name']))
if (!isset($options['name'])) {
$options['name'] = $name;
}
$options = $this->setTextAreaSize($options);
$options['id'] = $this->getIdAttribute($name, $options);
... ... @@ -380,10 +371,11 @@ class FormBuilder
*/
public function slider($name, $min, $max, $step, $value = null, $options = [])
{
$options = array_merge($options, ['data-slider-min' => $min, 'data-slider-max' => $max, 'data-slider-step' => $step,'data-slider-value' => $value ? $value : '']);
$options = array_merge($options, ['data-slider-min' => $min, 'data-slider-max' => $max, 'data-slider-step' => $step, 'data-slider-value' => $value ? $value : '']);
$options['class'] = isset($options['class']) ? $options['class'] . (stripos($options['class'], 'form-control') !== false ? '' : ' slider form-control') : 'slider form-control';
return $this->input('text', $name, $value, $options);
}
/**
* 生成下拉列表框
*
... ... @@ -399,8 +391,9 @@ class FormBuilder
$options['id'] = $this->getIdAttribute($name, $options);
if (!isset($options['name']))
if (!isset($options['name'])) {
$options['name'] = $name;
}
$html = [];
foreach ($list as $value => $display) {
... ... @@ -854,8 +847,9 @@ EOD;
*/
public function checkbox($name, $value = 1, $checked = null, $options = [])
{
if ($checked)
if ($checked) {
$options['checked'] = 'checked';
}
return $this->input('checkbox', $name, $value, $options);
}
... ... @@ -892,11 +886,13 @@ EOD;
*/
public function radio($name, $value = null, $checked = null, $options = [])
{
if (is_null($value))
if (is_null($value)) {
$value = $name;
}
if ($checked)
if ($checked) {
$options['checked'] = 'checked';
}
return $this->input('radio', $name, $value, $options);
}
... ... @@ -935,7 +931,6 @@ EOD;
*/
public function image($name = null, $value, $inputAttr = [], $uploadAttr = [], $chooseAttr = [], $previewAttr = [])
{
$default = [
'data-mimetype' => 'image/gif,image/jpeg,image/png,image/jpg,image/bmp'
];
... ... @@ -1069,7 +1064,6 @@ EOD;
*/
public function getIdAttribute($name, $attributes)
{
if (array_key_exists('id', $attributes)) {
return $attributes['id'];
}
... ... @@ -1088,12 +1082,13 @@ EOD;
*/
public function getValueAttribute($name, $value = null)
{
if (is_null($name))
if (is_null($name)) {
return $value;
}
if (!is_null($value))
if (!is_null($value)) {
return $value;
}
}
/**
... ... @@ -1110,9 +1105,10 @@ EOD;
// 会已 required="required" 拼接起来,而不是用数字keys去拼接
foreach ((array)$attributes as $key => $value) {
$element = $this->attributeElement($key, $value);
if (!is_null($element))
if (!is_null($element)) {
$html[] = $element;
}
}
return count($html) > 0 ? ' ' . implode(' ', $html) : '';
}
... ... @@ -1125,8 +1121,9 @@ EOD;
*/
protected function attributeElement($key, $value)
{
if (is_numeric($key))
if (is_numeric($key)) {
$key = $value;
}
if (!is_null($value)) {
if (is_array($value) || stripos($value, '"') !== false) {
$value = is_array($value) ? json_encode($value, JSON_UNESCAPED_UNICODE) : $value;
... ... @@ -1136,7 +1133,6 @@ EOD;
}
}
}
}
class Arr
... ... @@ -1244,7 +1240,6 @@ class Arr
unset($array[array_shift($parts)]);
}
}
}
if (!function_exists('array_get')) {
... ... @@ -1261,7 +1256,6 @@ if (!function_exists('array_get')) {
{
return Arr::get($array, $key, $default);
}
}
if (!function_exists('e')) {
... ... @@ -1278,7 +1272,6 @@ if (!function_exists('e')) {
}
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8', false);
}
}
if (!function_exists('array_except')) {
... ... @@ -1293,5 +1286,4 @@ if (!function_exists('array_except')) {
{
return Arr::except($array, $keys);
}
}
... ...
... ... @@ -10,6 +10,10 @@ class Http
/**
* 发送一个POST请求
* @param string $url 请求URL
* @param array $params 请求参数
* @param array $options 扩展参数
* @return mixed|string
*/
public static function post($url, $params = [], $options = [])
{
... ... @@ -19,6 +23,10 @@ class Http
/**
* 发送一个GET请求
* @param string $url 请求URL
* @param array $params 请求参数
* @param array $options 扩展参数
* @return mixed|string
*/
public static function get($url, $params = [], $options = [])
{
... ... @@ -42,53 +50,45 @@ class Http
$ch = curl_init();
$defaults = [];
if ('GET' == $method)
{
$geturl = $query_string ? $url . (stripos($url, "?") !== FALSE ? "&" : "?") . $query_string : $url;
if ('GET' == $method) {
$geturl = $query_string ? $url . (stripos($url, "?") !== false ? "&" : "?") . $query_string : $url;
$defaults[CURLOPT_URL] = $geturl;
}
else
{
} else {
$defaults[CURLOPT_URL] = $url;
if ($method == 'POST')
{
if ($method == 'POST') {
$defaults[CURLOPT_POST] = 1;
}
else
{
} else {
$defaults[CURLOPT_CUSTOMREQUEST] = $method;
}
$defaults[CURLOPT_POSTFIELDS] = $query_string;
}
$defaults[CURLOPT_HEADER] = FALSE;
$defaults[CURLOPT_HEADER] = false;
$defaults[CURLOPT_USERAGENT] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.98 Safari/537.36";
$defaults[CURLOPT_FOLLOWLOCATION] = TRUE;
$defaults[CURLOPT_RETURNTRANSFER] = TRUE;
$defaults[CURLOPT_FOLLOWLOCATION] = true;
$defaults[CURLOPT_RETURNTRANSFER] = true;
$defaults[CURLOPT_CONNECTTIMEOUT] = 3;
$defaults[CURLOPT_TIMEOUT] = 3;
// disable 100-continue
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
if ('https' == $protocol)
{
$defaults[CURLOPT_SSL_VERIFYPEER] = FALSE;
$defaults[CURLOPT_SSL_VERIFYHOST] = FALSE;
if ('https' == $protocol) {
$defaults[CURLOPT_SSL_VERIFYPEER] = false;
$defaults[CURLOPT_SSL_VERIFYHOST] = false;
}
curl_setopt_array($ch, (array) $options + $defaults);
curl_setopt_array($ch, (array)$options + $defaults);
$ret = curl_exec($ch);
$err = curl_error($ch);
if (FALSE === $ret || !empty($err))
{
if (false === $ret || !empty($err)) {
$errno = curl_errno($ch);
$info = curl_getinfo($ch);
curl_close($ch);
return [
'ret' => FALSE,
'ret' => false,
'errno' => $errno,
'msg' => $err,
'info' => $info,
... ... @@ -96,7 +96,7 @@ class Http
}
curl_close($ch);
return [
'ret' => TRUE,
'ret' => true,
'msg' => $ret,
];
}
... ... @@ -113,46 +113,45 @@ class Http
$method = strtoupper($method);
$method = $method == 'POST' ? 'POST' : 'GET';
//构造传递的参数
if (is_array($params))
{
if (is_array($params)) {
$post_params = [];
foreach ($params as $k => &$v)
{
if (is_array($v))
foreach ($params as $k => &$v) {
if (is_array($v)) {
$v = implode(',', $v);
}
$post_params[] = $k . '=' . urlencode($v);
}
$post_string = implode('&', $post_params);
}else
{
} else {
$post_string = $params;
}
$parts = parse_url($url);
//构造查询的参数
if ($method == 'GET' && $post_string)
{
if ($method == 'GET' && $post_string) {
$parts['query'] = isset($parts['query']) ? $parts['query'] . '&' . $post_string : $post_string;
$post_string = '';
}
$parts['query'] = isset($parts['query']) && $parts['query'] ? '?' . $parts['query'] : '';
//发送socket请求,获得连接句柄
$fp = fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80, $errno, $errstr, 3);
if (!$fp)
return FALSE;
if (!$fp) {
return false;
}
//设置超时时间
stream_set_timeout($fp, 3);
$out = "{$method} {$parts['path']}{$parts['query']} HTTP/1.1\r\n";
$out.= "Host: {$parts['host']}\r\n";
$out.= "Content-Type: application/x-www-form-urlencoded\r\n";
$out.= "Content-Length: " . strlen($post_string) . "\r\n";
$out.= "Connection: Close\r\n\r\n";
if ($post_string !== '')
$out .= "Host: {$parts['host']}\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: " . strlen($post_string) . "\r\n";
$out .= "Connection: Close\r\n\r\n";
if ($post_string !== '') {
$out .= $post_string;
}
fwrite($fp, $out);
//不用关心服务器返回结果
//echo fread($fp, 1024);
fclose($fp);
return TRUE;
return true;
}
/**
... ... @@ -163,8 +162,7 @@ class Http
*/
public static function sendToBrowser($file, $delaftersend = true, $exitaftersend = true)
{
if (file_exists($file) && is_readable($file))
{
if (file_exists($file) && is_readable($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment;filename = ' . basename($file));
... ... @@ -176,15 +174,12 @@ class Http
ob_clean();
flush();
readfile($file);
if ($delaftersend)
{
if ($delaftersend) {
unlink($file);
}
if ($exitaftersend)
{
if ($exitaftersend) {
exit;
}
}
}
}
... ...
... ... @@ -7,7 +7,6 @@ namespace fast;
*/
class Pinyin
{
protected static $keys = "a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|bo|bu|ca|cai|can|cang|cao|ce|ceng|cha|chai|chan|chang|chao|che|chen|cheng|chi|chong|chou|chu|chuai|chuan|chuang|chui|chun|chuo|ci|cong|cou|cu|cuan|cui|cun|cuo|da|dai|dan|dang|dao|de|deng|di|dian|diao|die|ding|diu|dong|dou|du|duan|dui|dun|duo|e|en|er|fa|fan|fang|fei|fen|feng|fo|fou|fu|ga|gai|gan|gang|gao|ge|gei|gen|geng|gong|gou|gu|gua|guai|guan|guang|gui|gun|guo|ha|hai|han|hang|hao|he|hei|hen|heng|hong|hou|hu|hua|huai|huan|huang|hui|hun|huo|ji|jia|jian|jiang|jiao|jie|jin|jing|jiong|jiu|ju|juan|jue|jun|ka|kai|kan|kang|kao|ke|ken|keng|kong|kou|ku|kua|kuai|kuan|kuang|kui|kun|kuo|la|lai|lan|lang|lao|le|lei|leng|li|lia|lian|liang|liao|lie|lin|ling|liu|long|lou|lu|lv|luan|lue|lun|luo|ma|mai|man|mang|mao|me|mei|men|meng|mi|mian|miao|mie|min|ming|miu|mo|mou|mu|na|nai|nan|nang|nao|ne|nei|nen|neng|ni|nian|niang|niao|nie|nin|ning|niu|nong|nu|nv|nuan|nue|nuo|o|ou|pa|pai|pan|pang|pao|pei|pen|peng|pi|pian|piao|pie|pin|ping|po|pu|qi|qia|qian|qiang|qiao|qie|qin|qing|qiong|qiu|qu|quan|que|qun|ran|rang|rao|re|ren|reng|ri|rong|rou|ru|ruan|rui|run|ruo|sa|sai|san|sang|sao|se|sen|seng|sha|shai|shan|shang|shao|she|shen|sheng|shi|shou|shu|shua|shuai|shuan|shuang|shui|shun|shuo|si|song|sou|su|suan|sui|sun|suo|ta|tai|tan|tang|tao|te|teng|ti|tian|tiao|tie|ting|tong|tou|tu|tuan|tui|tun|tuo|wa|wai|wan|wang|wei|wen|weng|wo|wu|xi|xia|xian|xiang|xiao|xie|xin|xing|xiong|xiu|xu|xuan|xue|xun|ya|yan|yang|yao|ye|yi|yin|ying|yo|yong|you|yu|yuan|yue|yun|za|zai|zan|zang|zao|ze|zei|zen|zeng|zha|zhai|zhan|zhang|zhao|zhe|zhen|zheng|zhi|zhong|zhou|zhu|zhua|zhuai|zhuan|zhuang|zhui|zhun|zhuo|zi|zong|zou|zu|zuan|zui|zun|zuo";
protected static $values = "-20319|-20317|-20304|-20295|-20292|-20283|-20265|-20257|-20242|-20230|-20051|-20036|-20032|-20026|-20002|-19990|-19986|-19982|-19976|-19805|-19784|-19775|-19774|-19763|-19756|-19751|-19746|-19741|-19739|-19728|-19725|-19715|-19540|-19531|-19525|-19515|-19500|-19484|-19479|-19467|-19289|-19288|-19281|-19275|-19270|-19263|-19261|-19249|-19243|-19242|-19238|-19235|-19227|-19224|-19218|-19212|-19038|-19023|-19018|-19006|-19003|-18996|-18977|-18961|-18952|-18783|-18774|-18773|-18763|-18756|-18741|-18735|-18731|-18722|-18710|-18697|-18696|-18526|-18518|-18501|-18490|-18478|-18463|-18448|-18447|-18446|-18239|-18237|-18231|-18220|-18211|-18201|-18184|-18183|-18181|-18012|-17997|-17988|-17970|-17964|-17961|-17950|-17947|-17931|-17928|-17922|-17759|-17752|-17733|-17730|-17721|-17703|-17701|-17697|-17692|-17683|-17676|-17496|-17487|-17482|-17468|-17454|-17433|-17427|-17417|-17202|-17185|-16983|-16970|-16942|-16915|-16733|-16708|-16706|-16689|-16664|-16657|-16647|-16474|-16470|-16465|-16459|-16452|-16448|-16433|-16429|-16427|-16423|-16419|-16412|-16407|-16403|-16401|-16393|-16220|-16216|-16212|-16205|-16202|-16187|-16180|-16171|-16169|-16158|-16155|-15959|-15958|-15944|-15933|-15920|-15915|-15903|-15889|-15878|-15707|-15701|-15681|-15667|-15661|-15659|-15652|-15640|-15631|-15625|-15454|-15448|-15436|-15435|-15419|-15416|-15408|-15394|-15385|-15377|-15375|-15369|-15363|-15362|-15183|-15180|-15165|-15158|-15153|-15150|-15149|-15144|-15143|-15141|-15140|-15139|-15128|-15121|-15119|-15117|-15110|-15109|-14941|-14937|-14933|-14930|-14929|-14928|-14926|-14922|-14921|-14914|-14908|-14902|-14894|-14889|-14882|-14873|-14871|-14857|-14678|-14674|-14670|-14668|-14663|-14654|-14645|-14630|-14594|-14429|-14407|-14399|-14384|-14379|-14368|-14355|-14353|-14345|-14170|-14159|-14151|-14149|-14145|-14140|-14137|-14135|-14125|-14123|-14122|-14112|-14109|-14099|-14097|-14094|-14092|-14090|-14087|-14083|-13917|-13914|-13910|-13907|-13906|-13905|-13896|-13894|-13878|-13870|-13859|-13847|-13831|-13658|-13611|-13601|-13406|-13404|-13400|-13398|-13395|-13391|-13387|-13383|-13367|-13359|-13356|-13343|-13340|-13329|-13326|-13318|-13147|-13138|-13120|-13107|-13096|-13095|-13091|-13076|-13068|-13063|-13060|-12888|-12875|-12871|-12860|-12858|-12852|-12849|-12838|-12831|-12829|-12812|-12802|-12607|-12597|-12594|-12585|-12556|-12359|-12346|-12320|-12300|-12120|-12099|-12089|-12074|-12067|-12058|-12039|-11867|-11861|-11847|-11831|-11798|-11781|-11604|-11589|-11536|-11358|-11340|-11339|-11324|-11303|-11097|-11077|-11067|-11055|-11052|-11045|-11041|-11038|-11024|-11020|-11019|-11018|-11014|-10838|-10832|-10815|-10800|-10790|-10780|-10764|-10587|-10544|-10533|-10519|-10331|-10329|-10328|-10322|-10315|-10309|-10307|-10296|-10281|-10274|-10270|-10262|-10260|-10256|-10254";
... ... @@ -26,22 +25,20 @@ class Pinyin
$data = array_combine($keys_a, $values_a);
arsort($data);
reset($data);
if ($charset != 'gb2312')
if ($charset != 'gb2312') {
$chinese = self::_u2_utf8_gb($chinese);
}
$result = '';
for ($i = 0; $i < strlen($chinese); $i++)
{
for ($i = 0; $i < strlen($chinese); $i++) {
$_P = ord(substr($chinese, $i, 1));
if ($_P > 160)
{
if ($_P > 160) {
$_Q = ord(substr($chinese, ++$i, 1));
$_P = $_P * 256 + $_Q - 65536;
}
$result .= ($onlyfirst ? substr(self::_pinyin($_P, $data), 0, 1) : self::_pinyin($_P, $data));
$result .= $delimiter;
}
if ($delimiter)
{
if ($delimiter) {
$result = rtrim($result, $delimiter);
}
... ... @@ -50,17 +47,16 @@ class Pinyin
private static function _pinyin($num, $data)
{
if ($num > 0 && $num < 160)
if ($num > 0 && $num < 160) {
return chr($num);
elseif ($num < -20319 || $num > -10247)
} elseif ($num < -20319 || $num > -10247) {
return '';
else
{
foreach ($data as $k => $v)
{
if ($v <= $num)
} else {
foreach ($data as $k => $v) {
if ($v <= $num) {
break;
}
}
return $k;
}
... ... @@ -69,21 +65,16 @@ class Pinyin
private static function _u2_utf8_gb($c)
{
$string = '';
if ($c < 0x80)
if ($c < 0x80) {
$string .= $c;
elseif ($c < 0x800)
{
} elseif ($c < 0x800) {
$string .= chr(0xC0 | $c >> 6);
$string .= chr(0x80 | $c & 0x3F);
}
elseif ($c < 0x10000)
{
} elseif ($c < 0x10000) {
$string .= chr(0xE0 | $c >> 12);
$string .= chr(0x80 | $c >> 6 & 0x3F);
$string .= chr(0x80 | $c & 0x3F);
}
elseif ($c < 0x200000)
{
} elseif ($c < 0x200000) {
$string .= chr(0xF0 | $c >> 18);
$string .= chr(0x80 | $c >> 12 & 0x3F);
$string .= chr(0x80 | $c >> 6 & 0x3F);
... ... @@ -91,5 +82,4 @@ class Pinyin
}
return iconv('UTF-8', 'GB2312//IGNORE', $string);
}
}
... ...
... ... @@ -60,14 +60,12 @@ class Random
*/
public static function build($type = 'alnum', $len = 8)
{
switch ($type)
{
switch ($type) {
case 'alpha':
case 'alnum':
case 'numeric':
case 'nozero':
switch ($type)
{
switch ($type) {
case 'alpha':
$pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
break;
... ... @@ -87,7 +85,7 @@ class Random
return md5(uniqid(mt_rand()));
case 'encrypt':
case 'sha1':
return sha1(uniqid(mt_rand(), TRUE));
return sha1(uniqid(mt_rand(), true));
}
}
... ... @@ -95,72 +93,56 @@ class Random
* 根据数组元素的概率获得键名
*
* @param array $ps array('p1'=>20, 'p2'=>30, 'p3'=>50);
* @param array $num 默认为1,即随机出来的数量
* @param array $unique 默认为true,即当num>1时,随机出的数量是否唯一
* @param int $num 默认为1,即随机出来的数量
* @param bool $unique 默认为true,即当num>1时,随机出的数量是否唯一
* @return mixed 当num为1时返回键名,反之返回一维数组
*/
public static function lottery($ps, $num = 1, $unique = true)
{
if (!$ps)
{
if (!$ps) {
return $num == 1 ? '' : [];
}
if ($num >= count($ps) && $unique)
{
if ($num >= count($ps) && $unique) {
$res = array_keys($ps);
return $num == 1 ? $res[0] : $res;
}
$max_exp = 0;
$res = [];
foreach ($ps as $key => $value)
{
foreach ($ps as $key => $value) {
$value = substr($value, 0, stripos($value, ".") + 6);
$exp = strlen(strchr($value, '.')) - 1;
if ($exp > $max_exp)
{
if ($exp > $max_exp) {
$max_exp = $exp;
}
}
$pow_exp = pow(10, $max_exp);
if ($pow_exp > 1)
{
if ($pow_exp > 1) {
reset($ps);
foreach ($ps as $key => $value)
{
foreach ($ps as $key => $value) {
$ps[$key] = $value * $pow_exp;
}
}
$pro_sum = array_sum($ps);
if ($pro_sum < 1)
{
if ($pro_sum < 1) {
return $num == 1 ? '' : [];
}
for ($i = 0; $i < $num; $i++)
{
for ($i = 0; $i < $num; $i++) {
$rand_num = mt_rand(1, $pro_sum);
reset($ps);
foreach ($ps as $key => $value)
{
if ($rand_num <= $value)
{
foreach ($ps as $key => $value) {
if ($rand_num <= $value) {
break;
}
else
{
} else {
$rand_num -= $value;
}
}
if ($num == 1)
{
if ($num == 1) {
$res = $key;
break;
}
else
{
} else {
$res[$i] = $key;
}
if ($unique)
{
if ($unique) {
$pro_sum -= $value;
unset($ps[$key]);
}
... ... @@ -175,8 +157,15 @@ class Random
public static function uuid()
{
return sprintf(
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0x0fff) | 0x4000,
mt_rand(0, 0x3fff) | 0x8000,
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0xffff)
);
}
}
... ...
... ... @@ -7,7 +7,6 @@ namespace fast;
*/
class Rsa
{
public $publicKey = '';
public $privateKey = '';
private $_privKey;
... ... @@ -28,8 +27,10 @@ class Rsa
/**
* * the construtor,the param $path is the keys saving path
* @param string $publicKey 公钥
* @param string $privateKey 私钥
*/
function __construct($publicKey = null, $privateKey = null)
public function __construct($publicKey = null, $privateKey = null)
{
$this->setKey($publicKey, $privateKey);
}
... ... @@ -41,19 +42,20 @@ class Rsa
*/
public function setKey($publicKey = null, $privateKey = null)
{
if (!is_null($publicKey))
if (!is_null($publicKey)) {
$this->publicKey = $publicKey;
if (!is_null($privateKey))
}
if (!is_null($privateKey)) {
$this->privateKey = $privateKey;
}
}
/**
* * setup the private key
*/
private function setupPrivKey()
{
if (is_resource($this->_privKey))
{
if (is_resource($this->_privKey)) {
return true;
}
$pem = chunk_split($this->privateKey, 64, "\n");
... ... @@ -67,8 +69,7 @@ class Rsa
*/
private function setupPubKey()
{
if (is_resource($this->_pubKey))
{
if (is_resource($this->_pubKey)) {
return true;
}
$pem = chunk_split($this->publicKey, 64, "\n");
... ... @@ -82,14 +83,12 @@ class Rsa
*/
public function privEncrypt($data)
{
if (!is_string($data))
{
if (!is_string($data)) {
return null;
}
$this->setupPrivKey();
$r = openssl_private_encrypt($data, $encrypted, $this->_privKey);
if ($r)
{
if ($r) {
return base64_encode($encrypted);
}
return null;
... ... @@ -100,15 +99,13 @@ class Rsa
*/
public function privDecrypt($encrypted)
{
if (!is_string($encrypted))
{
if (!is_string($encrypted)) {
return null;
}
$this->setupPrivKey();
$encrypted = base64_decode($encrypted);
$r = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);
if ($r)
{
if ($r) {
return $decrypted;
}
return null;
... ... @@ -119,14 +116,12 @@ class Rsa
*/
public function pubEncrypt($data)
{
if (!is_string($data))
{
if (!is_string($data)) {
return null;
}
$this->setupPubKey();
$r = openssl_public_encrypt($data, $encrypted, $this->_pubKey);
if ($r)
{
if ($r) {
return base64_encode($encrypted);
}
return null;
... ... @@ -137,15 +132,13 @@ class Rsa
*/
public function pubDecrypt($crypted)
{
if (!is_string($crypted))
{
if (!is_string($crypted)) {
return null;
}
$this->setupPubKey();
$crypted = base64_decode($crypted);
$r = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);
if ($r)
{
if ($r) {
return $decrypted;
}
return null;
... ... @@ -183,5 +176,4 @@ class Rsa
is_resource($this->_privKey) && @openssl_free_key($this->_privKey);
is_resource($this->_pubKey) && @openssl_free_key($this->_pubKey);
}
}
... ...
... ... @@ -10,7 +10,6 @@ use think\Config;
*/
class Tree
{
protected static $instance;
//默认配置
protected $config = [];
... ... @@ -32,8 +31,7 @@ class Tree
public function __construct($options = [])
{
if ($config = Config::get('tree'))
{
if ($config = Config::get('tree')) {
$this->options = array_merge($this->config, $config);
}
$this->options = array_merge($this->config, $options);
... ... @@ -47,8 +45,7 @@ class Tree
*/
public static function instance($options = [])
{
if (is_null(self::$instance))
{
if (is_null(self::$instance)) {
self::$instance = new static($options);
}
... ... @@ -56,10 +53,8 @@ class Tree
}
/**
* 初始化方法
* @param array 2维数组,例如:
* @param array $arr 2维数组,例如:
* array(
* 1 => array('id'=>'1','pid'=>0,'name'=>'一级栏目一'),
* 2 => array('id'=>'2','pid'=>0,'name'=>'一级栏目二'),
... ... @@ -69,14 +64,19 @@ class Tree
* 6 => array('id'=>'6','pid'=>3,'name'=>'三级栏目一'),
* 7 => array('id'=>'7','pid'=>3,'name'=>'三级栏目二')
* )
* @param string $pidname 父字段名称
* @param string $nbsp 空格占位符
* @return Tree
*/
public function init($arr = [], $pidname = NULL, $nbsp = NULL)
public function init($arr = [], $pidname = null, $nbsp = null)
{
$this->arr = $arr;
if (!is_null($pidname))
if (!is_null($pidname)) {
$this->pidname = $pidname;
if (!is_null($nbsp))
}
if (!is_null($nbsp)) {
$this->nbsp = $nbsp;
}
return $this;
}
... ... @@ -88,37 +88,34 @@ class Tree
public function getChild($myid)
{
$newarr = [];
foreach ($this->arr as $value)
{
if (!isset($value['id']))
foreach ($this->arr as $value) {
if (!isset($value['id'])) {
continue;
if ($value[$this->pidname] == $myid)
}
if ($value[$this->pidname] == $myid) {
$newarr[$value['id']] = $value;
}
}
return $newarr;
}
/**
* 读取指定节点的所有孩子节点
* @param int $myid 节点ID
* @param boolean $withself 是否包含自身
* @return array
*/
public function getChildren($myid, $withself = FALSE)
public function getChildren($myid, $withself = false)
{
$newarr = [];
foreach ($this->arr as $value)
{
if (!isset($value['id']))
foreach ($this->arr as $value) {
if (!isset($value['id'])) {
continue;
if ($value[$this->pidname] == $myid)
{
}
if ($value[$this->pidname] == $myid) {
$newarr[] = $value;
$newarr = array_merge($newarr, $this->getChildren($value['id']));
}
else if ($withself && $value['id'] == $myid)
{
} elseif ($withself && $value['id'] == $myid) {
$newarr[] = $value;
}
}
... ... @@ -126,50 +123,42 @@ class Tree
}
/**
* 读取指定节点的所有孩子节点ID
* @param int $myid 节点ID
* @param boolean $withself 是否包含自身
* @return array
*/
public function getChildrenIds($myid, $withself = FALSE)
public function getChildrenIds($myid, $withself = false)
{
$childrenlist = $this->getChildren($myid, $withself);
$childrenids = [];
foreach ($childrenlist as $k => $v)
{
foreach ($childrenlist as $k => $v) {
$childrenids[] = $v['id'];
}
return $childrenids;
}
/**
* 得到当前位置父辈数组
* @param int
* @return array
*/
public function getParent($myid)
{
$pid = 0;
$newarr = [];
foreach ($this->arr as $value)
{
if (!isset($value['id']))
foreach ($this->arr as $value) {
if (!isset($value['id'])) {
continue;
if ($value['id'] == $myid)
{
}
if ($value['id'] == $myid) {
$pid = $value[$this->pidname];
break;
}
}
if ($pid)
{
foreach ($this->arr as $value)
{
if ($value['id'] == $pid)
{
if ($pid) {
foreach ($this->arr as $value) {
if ($value['id'] == $pid) {
$newarr[] = $value;
break;
}
... ... @@ -179,33 +168,29 @@ class Tree
}
/**
* 得到当前位置所有父辈数组
* @param int
* @param bool $withself 是否包含自己
* @return array
*/
public function getParents($myid, $withself = FALSE)
public function getParents($myid, $withself = false)
{
$pid = 0;
$newarr = [];
foreach ($this->arr as $value)
{
if (!isset($value['id']))
foreach ($this->arr as $value) {
if (!isset($value['id'])) {
continue;
if ($value['id'] == $myid)
{
if ($withself)
{
}
if ($value['id'] == $myid) {
if ($withself) {
$newarr[] = $value;
}
$pid = $value[$this->pidname];
break;
}
}
if ($pid)
{
$arr = $this->getParents($pid, TRUE);
if ($pid) {
$arr = $this->getParents($pid, true);
$newarr = array_merge($arr, $newarr);
}
return $newarr;
... ... @@ -217,19 +202,17 @@ class Tree
* @param boolean $withself
* @return array
*/
public function getParentsIds($myid, $withself = FALSE)
public function getParentsIds($myid, $withself = false)
{
$parentlist = $this->getParents($myid, $withself);
$parentsids = [];
foreach ($parentlist as $k => $v)
{
foreach ($parentlist as $k => $v) {
$parentsids[] = $v['id'];
}
return $parentsids;
}
/**
* 树型结构Option
* @param int $myid 表示获得这个ID下的所有子级
* @param string $itemtpl 条目模板 如:"<option value=@id @selected @disabled>@spacer@name</option>"
... ... @@ -238,27 +221,21 @@ class Tree
* @param string $itemprefix 每一项前缀
* @param string $toptpl 顶级栏目的模板
* @return string
*/
public function getTree($myid, $itemtpl = "<option value=@id @selected @disabled>@spacer@name</option>", $selectedids = '', $disabledids = '', $itemprefix = '', $toptpl = '')
{
$ret = '';
$number = 1;
$childs = $this->getChild($myid);
if ($childs)
{
if ($childs) {
$total = count($childs);
foreach ($childs as $value)
{
foreach ($childs as $value) {
$id = $value['id'];
$j = $k = '';
if ($number == $total)
{
if ($number == $total) {
$j .= $this->icon[2];
$k = $itemprefix ? $this->nbsp : '';
}
else
{
} else {
$j .= $this->icon[1];
$k = $itemprefix ? $this->icon[0] : '';
}
... ... @@ -266,10 +243,10 @@ class Tree
$selected = $selectedids && in_array($id, (is_array($selectedids) ? $selectedids : explode(',', $selectedids))) ? 'selected' : '';
$disabled = $disabledids && in_array($id, (is_array($disabledids) ? $disabledids : explode(',', $disabledids))) ? 'disabled' : '';
$value = array_merge($value, array('selected' => $selected, 'disabled' => $disabled, 'spacer' => $spacer));
$value = array_combine(array_map(function($k) {
$value = array_combine(array_map(function ($k) {
return '@' . $k;
}, array_keys($value)), $value);
$nstr = strtr((($value["@{$this->pidname}"] == 0 || $this->getChild($id) ) && $toptpl ? $toptpl : $itemtpl), $value);
$nstr = strtr((($value["@{$this->pidname}"] == 0 || $this->getChild($id)) && $toptpl ? $toptpl : $itemtpl), $value);
$ret .= $nstr;
$ret .= $this->getTree($id, $itemtpl, $selectedids, $disabledids, $itemprefix . $k . $this->nbsp, $toptpl);
$number++;
... ... @@ -279,30 +256,27 @@ class Tree
}
/**
* 树型结构UL
* @param int $myid 表示获得这个ID下的所有子级
* @param string $itemtpl 条目模板 如:"<li value=@id @selected @disabled>@name @childlist</li>"
* @param string $selectedids 选中的ID
* @param string $disabledids 禁用的ID
* @param string $wraptag 子列表包裹标签
* @param string $wrapattr 子列表包裹属性
* @return string
*/
public function getTreeUl($myid, $itemtpl, $selectedids = '', $disabledids = '', $wraptag = 'ul', $wrapattr = '')
{
$str = '';
$childs = $this->getChild($myid);
if ($childs)
{
foreach ($childs as $value)
{
if ($childs) {
foreach ($childs as $value) {
$id = $value['id'];
unset($value['child']);
$selected = $selectedids && in_array($id, (is_array($selectedids) ? $selectedids : explode(',', $selectedids))) ? 'selected' : '';
$disabled = $disabledids && in_array($id, (is_array($disabledids) ? $disabledids : explode(',', $disabledids))) ? 'disabled' : '';
$value = array_merge($value, array('selected' => $selected, 'disabled' => $disabled));
$value = array_combine(array_map(function($k) {
$value = array_combine(array_map(function ($k) {
return '@' . $k;
}, array_keys($value)), $value);
$nstr = strtr($itemtpl, $value);
... ... @@ -329,16 +303,14 @@ class Tree
{
$str = '';
$childs = $this->getChild($myid);
if ($childs)
{
foreach ($childs as $value)
{
if ($childs) {
foreach ($childs as $value) {
$id = $value['id'];
unset($value['child']);
$selected = in_array($id, (is_array($selectedids) ? $selectedids : explode(',', $selectedids))) ? 'selected' : '';
$disabled = in_array($id, (is_array($disabledids) ? $disabledids : explode(',', $disabledids))) ? 'disabled' : '';
$value = array_merge($value, array('selected' => $selected, 'disabled' => $disabled));
$value = array_combine(array_map(function($k) {
$value = array_combine(array_map(function ($k) {
return '@' . $k;
}, array_keys($value)), $value);
$bakvalue = array_intersect_key($value, array_flip(['@url', '@caret', '@class']));
... ... @@ -377,19 +349,14 @@ class Tree
$ret = '';
$number = 1;
$childs = $this->getChild($myid);
if ($childs)
{
if ($childs) {
$total = count($childs);
foreach ($childs as $id => $value)
{
foreach ($childs as $id => $value) {
$j = $k = '';
if ($number == $total)
{
if ($number == $total) {
$j .= $this->icon[2];
$k = $itemprefix ? $this->nbsp : '';
}
else
{
} else {
$j .= $this->icon[1];
$k = $itemprefix ? $this->icon[0] : '';
}
... ... @@ -397,7 +364,7 @@ class Tree
$selected = $selectedids && in_array($id, (is_array($selectedids) ? $selectedids : explode(',', $selectedids))) ? 'selected' : '';
$disabled = $disabledids && in_array($id, (is_array($disabledids) ? $disabledids : explode(',', $disabledids))) ? 'disabled' : '';
$value = array_merge($value, array('selected' => $selected, 'disabled' => $disabled, 'spacer' => $spacer));
$value = array_combine(array_map(function($k) {
$value = array_combine(array_map(function ($k) {
return '@' . $k;
}, array_keys($value)), $value);
$nstr = strtr(!isset($value['@disabled']) || !$value['@disabled'] ? $itemtpl1 : $itemtpl2, $value);
... ... @@ -423,19 +390,14 @@ class Tree
$n = 0;
$data = [];
$number = 1;
if ($childs)
{
if ($childs) {
$total = count($childs);
foreach ($childs as $id => $value)
{
foreach ($childs as $id => $value) {
$j = $k = '';
if ($number == $total)
{
if ($number == $total) {
$j .= $this->icon[2];
$k = $itemprefix ? $this->nbsp : '';
}
else
{
} else {
$j .= $this->icon[1];
$k = $itemprefix ? $this->icon[0] : '';
}
... ... @@ -453,25 +415,24 @@ class Tree
/**
* 将getTreeArray的结果返回为二维数组
* @param array $data
* @param string $field
* @return array
*/
public function getTreeList($data = [], $field = 'name')
{
$arr = [];
foreach ($data as $k => $v)
{
foreach ($data as $k => $v) {
$childlist = isset($v['childlist']) ? $v['childlist'] : [];
unset($v['childlist']);
$v[$field] = $v['spacer'] . ' ' . $v[$field];
$v['haschild'] = $childlist ? 1 : 0;
if ($v['id'])
if ($v['id']) {
$arr[] = $v;
if ($childlist)
{
}
if ($childlist) {
$arr = array_merge($arr, $this->getTreeList($childlist, $field));
}
}
return $arr;
}
}
... ...
... ... @@ -13,45 +13,40 @@ class Version
*
* @param string $version
* @param array $data
* @return bool
*/
public static function check($version, $data = [])
{
//版本号以.分隔
$data = is_array($data) ? $data : [$data];
if ($data)
{
if (in_array("*", $data) || in_array($version, $data))
{
return TRUE;
if ($data) {
if (in_array("*", $data) || in_array($version, $data)) {
return true;
}
$ver = explode('.', $version);
if ($ver)
{
if ($ver) {
$versize = count($ver);
//验证允许的版本
foreach ($data as $m)
{
foreach ($data as $m) {
$c = explode('.', $m);
if (!$c || $versize != count($c))
if (!$c || $versize != count($c)) {
continue;
}
$i = 0;
foreach ($c as $a => $k)
{
if (!self::compare($ver[$a], $k))
{
foreach ($c as $a => $k) {
if (!self::compare($ver[$a], $k)) {
continue 2;
}
else
{
} else {
$i++;
}
}
if ($i == $versize)
return TRUE;
if ($i == $versize) {
return true;
}
}
}
}
return FALSE;
return false;
}
/**
... ... @@ -63,31 +58,22 @@ class Version
*/
public static function compare($v1, $v2)
{
if ($v2 == "*" || $v1 == $v2)
{
return TRUE;
}
else
{
if ($v2 == "*" || $v1 == $v2) {
return true;
} else {
$values = [];
$k = explode(',', $v2);
foreach ($k as $v)
{
if (strpos($v, '-') !== FALSE)
{
foreach ($k as $v) {
if (strpos($v, '-') !== false) {
list($start, $stop) = explode('-', $v);
for ($i = $start; $i <= $stop; $i++)
{
for ($i = $start; $i <= $stop; $i++) {
$values[] = $i;
}
}
else
{
} else {
$values[] = $v;
}
}
return in_array($v1, $values) ? TRUE : FALSE;
return in_array($v1, $values) ? true : false;
}
}
}
... ...
... ... @@ -73,6 +73,9 @@ body {
#header-navbar li.dropdown ul.dropdown-menu {
min-width: 94px;
}
form.form-horizontal .control-label {
font-weight: normal;
}
.panel-default {
padding: 0 15px;
border-color: #e4ecf3;
... ...
... ... @@ -21,6 +21,21 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
});
}
});
table.on('load-error.bs.table', function (e, status, res) {
if (status == 404 && $(".btn-switch.active").data("type") != "local") {
Layer.confirm(__('Store now available tips'), {
title: __('Warmtips'),
btn: [__('Switch to the local'), __('Try to reload')]
}, function (index) {
layer.close(index);
$(".btn-switch[data-type='local']").trigger("click");
}, function (index) {
layer.close(index);
table.bootstrapTable('refresh');
});
return false;
}
});
table.on('post-body.bs.table', function (e, settings, json, xhr) {
var parenttable = table.closest('.bootstrap-table');
var d = $(".fixed-table-toolbar", parenttable).find(".search input");
... ...
... ... @@ -749,8 +749,14 @@ define('fast',['jquery', 'bootstrap', 'toastr', 'layer', 'lang'], function ($, u
return url;
},
//获取修复后可访问的cdn链接
cdnurl: function (url) {
return /^(?:[a-z]+:)?\/\//i.test(url) ? url : Config.upload.cdnurl + url;
cdnurl: function (url, domain) {
var rule = new RegExp("^((?:[a-z]+:)?\\/\\/|data:image\\/)", "i");
var url = rule.test(url) ? url : Config.upload.cdnurl + url;
if (domain && !rule.test(url)) {
domain = typeof domain === 'string' ? domain : location.origin;
url = domain + url;
}
return url;
},
//查询Url参数
query: function (name, url) {
... ... @@ -771,7 +777,7 @@ define('fast',['jquery', 'bootstrap', 'toastr', 'layer', 'lang'], function ($, u
title = options && options.title ? options.title : (title ? title : "");
url = Fast.api.fixurl(url);
url = url + (url.indexOf("?") > -1 ? "&" : "?") + "dialog=1";
var area = [$(window).width() > 800 ? '800px' : '95%', $(window).height() > 600 ? '600px' : '95%'];
var area = Fast.config.openArea != undefined ? Fast.config.openArea : [$(window).width() > 800 ? '800px' : '95%', $(window).height() > 600 ? '600px' : '95%'];
options = $.extend({
type: 2,
title: title,
... ... @@ -6468,6 +6474,52 @@ define('upload',['jquery', 'bootstrap', 'plupload', 'template'], function ($, un
$("#" + preview_id).trigger("fa.preview.change");
});
}
if (input_id) {
//粘贴上传
$("body").on('paste', "#" + input_id, function (event) {
var that = this;
var image, pasteEvent;
pasteEvent = event.originalEvent;
if (pasteEvent.clipboardData && pasteEvent.clipboardData.items) {
image = Upload.api.getImageFromClipboard(pasteEvent);
if (image) {
event.preventDefault();
var button = $(".plupload[data-input-id='" + $(that).attr("id") + "']");
Upload.api.send(image, function (data) {
var urlArr = [];
if (button && button.data("multiple") && $(that).val() !== '') {
urlArr.push($(that).val());
}
urlArr.push(data.url);
$(that).val(urlArr.join(",")).trigger("change");
});
}
}
});
//拖拽上传
$("body").on('drop', "#" + input_id, function (event) {
var that = this;
var images, pasteEvent;
pasteEvent = event.originalEvent;
if (pasteEvent.dataTransfer && pasteEvent.dataTransfer.files) {
images = Upload.api.getImageFromDrop(pasteEvent);
if (images.length > 0) {
event.preventDefault();
var button = $(".plupload[data-input-id='" + $(that).attr("id") + "']");
$.each(images, function (i, image) {
Upload.api.send(image, function (data) {
var urlArr = [];
if (button && button.data("multiple") && $(that).val() !== '') {
urlArr.push($(that).val());
}
urlArr.push(data.url);
$(that).val(urlArr.join(",")).trigger("change");
});
});
}
}
});
}
Upload.list[id].init();
});
},
... ... @@ -6495,8 +6547,34 @@ define('upload',['jquery', 'bootstrap', 'plupload', 'template'], function ($, un
alert("Custom Callback,Response URL:" + response.url);
},
},
getImageFromClipboard: function (data) {
var i, item;
i = 0;
while (i < data.clipboardData.items.length) {
item = data.clipboardData.items[i];
if (item.type.indexOf("image") !== -1) {
return item.getAsFile() || false;
}
};
i++;
}
return false;
},
getImageFromDrop: function (data) {
var i, item, images;
i = 0;
images = [];
while (i < data.dataTransfer.files.length) {
item = data.dataTransfer.files[i];
if (item.type.indexOf("image") !== -1) {
images.push(item);
}
i++;
}
return images;
}
}
}
;
return Upload;
});
... ... @@ -10244,14 +10322,20 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
var color = typeof this.color !== 'undefined' ? this.color : 'success';
var yes = typeof this.yes !== 'undefined' ? this.yes : 1;
var no = typeof this.no !== 'undefined' ? this.no : 0;
var url = typeof this.url !== 'undefined' ? this.url : '';
return "<a href='javascript:;' data-toggle='tooltip' title='" + __('Click to toggle') + "' class='btn-change' data-id='"
+ row.id + "' data-params='" + this.field + "=" + (value == yes ? no : yes) + "'><i class='fa fa-toggle-on " + (value == yes ? 'text-' + color : 'fa-flip-horizontal text-gray') + " fa-2x'></i></a>";
+ row.id + "' " + (url ? "data-url='" + url + "'" : "") + " data-params='" + this.field + "=" + (value == yes ? no : yes) + "'><i class='fa fa-toggle-on " + (value == yes ? 'text-' + color : 'fa-flip-horizontal text-gray') + " fa-2x'></i></a>";
},
url: function (value, row, index) {
return '<div class="input-group input-group-sm" style="width:250px;margin:0 auto;"><input type="text" class="form-control input-sm" value="' + value + '"><span class="input-group-btn input-group-sm"><a href="' + value + '" target="_blank" class="btn btn-default btn-sm"><i class="fa fa-link"></i></a></span></div>';
},
search: function (value, row, index) {
return '<a href="javascript:;" class="searchit" data-toggle="tooltip" title="' + __('Click to search %s', value) + '" data-field="' + this.field + '" data-value="' + value + '">' + value + '</a>';
var field = this.field;
if (typeof this.customField !== 'undefined' && typeof row[this.customField] !== 'undefined') {
value = row[this.customField];
field = this.customField;
}
return '<a href="javascript:;" class="searchit" data-toggle="tooltip" title="' + __('Click to search %s', value) + '" data-field="' + field + '" data-value="' + value + '">' + value + '</a>';
},
addtabs: function (value, row, index) {
var url = Table.api.replaceurl(this.url, row, this.table);
... ...
... ... @@ -748,8 +748,14 @@ define('fast',['jquery', 'bootstrap', 'toastr', 'layer', 'lang'], function ($, u
return url;
},
//获取修复后可访问的cdn链接
cdnurl: function (url) {
return /^(?:[a-z]+:)?\/\//i.test(url) ? url : Config.upload.cdnurl + url;
cdnurl: function (url, domain) {
var rule = new RegExp("^((?:[a-z]+:)?\\/\\/|data:image\\/)", "i");
var url = rule.test(url) ? url : Config.upload.cdnurl + url;
if (domain && !rule.test(url)) {
domain = typeof domain === 'string' ? domain : location.origin;
url = domain + url;
}
return url;
},
//查询Url参数
query: function (name, url) {
... ... @@ -770,7 +776,7 @@ define('fast',['jquery', 'bootstrap', 'toastr', 'layer', 'lang'], function ($, u
title = options && options.title ? options.title : (title ? title : "");
url = Fast.api.fixurl(url);
url = url + (url.indexOf("?") > -1 ? "&" : "?") + "dialog=1";
var area = [$(window).width() > 800 ? '800px' : '95%', $(window).height() > 600 ? '600px' : '95%'];
var area = Fast.config.openArea != undefined ? Fast.config.openArea : [$(window).width() > 800 ? '800px' : '95%', $(window).height() > 600 ? '600px' : '95%'];
options = $.extend({
type: 2,
title: title,
... ...
... ... @@ -96,6 +96,10 @@ body {
min-width:94px;
}
form.form-horizontal .control-label {
font-weight: normal;
}
.panel-default {
padding: 0 15px;
border-color: #e4ecf3;
... ...