From 7d8b948543a01b8cd23eb73af2dc4079c37a4283 Mon Sep 17 00:00:00 2001 From: augushong Date: Sat, 12 Feb 2022 17:02:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=8A=A8=E6=B8=85?= =?UTF-8?q?=E9=99=A4=E7=BC=93=E5=AD=98=E7=89=B9=E6=80=A7;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/BaseController.php | 272 ++++++++++++++------------- app/common/model/Base.php | 10 + app/common/traits/AutoClearCache.php | 65 +++++++ app/index/controller/Common.php | 6 +- app/middleware.php | 2 +- app/model/Nav.php | 37 ++-- config/log.php | 22 ++- 7 files changed, 260 insertions(+), 154 deletions(-) create mode 100644 app/common/model/Base.php create mode 100644 app/common/traits/AutoClearCache.php diff --git a/app/BaseController.php b/app/BaseController.php index 8451177..104009c 100644 --- a/app/BaseController.php +++ b/app/BaseController.php @@ -18,157 +18,159 @@ use think\exception\ValidateException; use think\Validate; use think\facade\View; use think\exception\HttpResponseException; +use think\facade\Log; /** * 控制器基础类 */ abstract class BaseController { - /** - * Request实例 - * @var \think\Request - */ - protected $request; + /** + * Request实例 + * @var \think\Request + */ + protected $request; - /** - * 应用实例 - * @var \think\App - */ - protected $app; + /** + * 应用实例 + * @var \think\App + */ + protected $app; - /** - * 是否批量验证 - * @var bool - */ - protected $batchValidate = false; + /** + * 是否批量验证 + * @var bool + */ + protected $batchValidate = false; - /** - * 控制器中间件 - * @var array - */ - protected $middleware = []; + /** + * 控制器中间件 + * @var array + */ + protected $middleware = []; - /** - * 构造方法 - * @access public - * @param App $app 应用对象 - */ - public function __construct(App $app) - { - $this->app = $app; - $this->request = $this->app->request; + /** + * 构造方法 + * @access public + * @param App $app 应用对象 + */ + public function __construct(App $app) + { + $this->app = $app; + $this->request = $this->app->request; - // 控制器初始化 - $this->initialize(); - } - - // 初始化 - protected function initialize() - { - } - - /** - * 验证数据 - * @access protected - * @param array $data 数据 - * @param string|array $validate 验证器名或者验证规则数组 - * @param array $message 提示信息 - * @param bool $batch 是否批量验证 - * @return array|string|true - * @throws ValidateException - */ - protected function validate(array $data, $validate, array $message = [], bool $batch = false) - { - if (is_array($validate)) { - $v = new Validate(); - $v->rule($validate); - } else { - if (strpos($validate, '.')) { - // 支持场景 - list($validate, $scene) = explode('.', $validate); - } - $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate); - $v = new $class(); - if (!empty($scene)) { - $v->scene($scene); - } + // 控制器初始化 + $this->initialize(); } - $v->message($message); - - // 是否批量验证 - if ($batch || $this->batchValidate) { - $v->batch(true); + // 初始化 + protected function initialize() + { + Log::debug('request url :'.$this->request->url()); } - return $v->failException(true)->check($data); - } - - public function success($msg = '操作成功', $jump_to_url = null, $code = 200, $params = []) - { - $jump_to_url = $this->parseJumpUrl($jump_to_url); - $data = [ - 'msg' => $msg, - 'jump_to_url' => $jump_to_url, - 'params' => $params - ]; - - if (\request()->isAjax()) { - $data['jump_to_url'] = $jump_to_url; - if ($code == 200) { - $code = 0; - } - throw new HttpResponseException(json_message($data, $code, $msg)); - } - - View::assign($data); - throw new HttpResponseException(response(View::fetch('common@tpl/success'), $code)); - } - public function error($msg = '操作失败', $jump_to_url = null, $code = 200, $params = []) - { - - $jump_to_url = $this->parseJumpUrl($jump_to_url); - - $data = [ - 'msg' => $msg, - 'jump_to_url' => $jump_to_url, - 'params' => $params - ]; - - if (\request()->isAjax()) { - $data['jump_to_url'] = $jump_to_url; - if ($code == 200) { - $code = 500; - } - throw new HttpResponseException(json_message($data, $code, $msg)); - } - - View::assign($data); - throw new HttpResponseException(response(View::fetch('common@tpl/error'), $code)); - } - - public function redirect($jump_to_url, $code = 302) - { - $jump_to_url = $this->parseJumpUrl($jump_to_url); - - throw new HttpResponseException(redirect($jump_to_url), $code); - } - - public function parseJumpUrl($jump_to_url) - { - if (is_null($jump_to_url)) { - $jump_to_url = \request()->server('HTTP_REFERER'); - } else { - if ($jump_to_url instanceof Url) { - - $jump_to_url = (string)$jump_to_url; - } else { - if (strpos($jump_to_url, 'http') !== 0) { - $jump_to_url = url($jump_to_url); + /** + * 验证数据 + * @access protected + * @param array $data 数据 + * @param string|array $validate 验证器名或者验证规则数组 + * @param array $message 提示信息 + * @param bool $batch 是否批量验证 + * @return array|string|true + * @throws ValidateException + */ + protected function validate(array $data, $validate, array $message = [], bool $batch = false) + { + if (is_array($validate)) { + $v = new Validate(); + $v->rule($validate); + } else { + if (strpos($validate, '.')) { + // 支持场景 + list($validate, $scene) = explode('.', $validate); + } + $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate); + $v = new $class(); + if (!empty($scene)) { + $v->scene($scene); + } } - } + + $v->message($message); + + // 是否批量验证 + if ($batch || $this->batchValidate) { + $v->batch(true); + } + + return $v->failException(true)->check($data); } - return (string)$jump_to_url; - } + public function success($msg = '操作成功', $jump_to_url = null, $code = 200, $params = []) + { + $jump_to_url = $this->parseJumpUrl($jump_to_url); + $data = [ + 'msg' => $msg, + 'jump_to_url' => $jump_to_url, + 'params' => $params + ]; + + if (\request()->isAjax()) { + $data['jump_to_url'] = $jump_to_url; + if ($code == 200) { + $code = 0; + } + throw new HttpResponseException(json_message($data, $code, $msg)); + } + + View::assign($data); + throw new HttpResponseException(response(View::fetch('common@tpl/success'), $code)); + } + public function error($msg = '操作失败', $jump_to_url = null, $code = 200, $params = []) + { + + $jump_to_url = $this->parseJumpUrl($jump_to_url); + + $data = [ + 'msg' => $msg, + 'jump_to_url' => $jump_to_url, + 'params' => $params + ]; + + if (\request()->isAjax()) { + $data['jump_to_url'] = $jump_to_url; + if ($code == 200) { + $code = 500; + } + throw new HttpResponseException(json_message($data, $code, $msg)); + } + + View::assign($data); + throw new HttpResponseException(response(View::fetch('common@tpl/error'), $code)); + } + + public function redirect($jump_to_url, $code = 302) + { + $jump_to_url = $this->parseJumpUrl($jump_to_url); + + throw new HttpResponseException(redirect($jump_to_url), $code); + } + + public function parseJumpUrl($jump_to_url) + { + if (is_null($jump_to_url)) { + $jump_to_url = \request()->server('HTTP_REFERER'); + } else { + if ($jump_to_url instanceof Url) { + + $jump_to_url = (string)$jump_to_url; + } else { + if (strpos($jump_to_url, 'http') !== 0) { + $jump_to_url = url($jump_to_url); + } + } + } + + return (string)$jump_to_url; + } } diff --git a/app/common/model/Base.php b/app/common/model/Base.php new file mode 100644 index 0000000..eb4ea45 --- /dev/null +++ b/app/common/model/Base.php @@ -0,0 +1,10 @@ +'', + * 'type'=>'', // tag/key + * 'field'=>'' // 为空则不做拼接 + * ] + * + * @var array + */ + public static $autoClearCache = []; + + public static function onAfterWrite($model) + { + static::autoRemoveCache($model); + } + public static function onAfterDelete($model) + { + static::autoRemoveCache($model); + } + public static function onAfterRestore($model) + { + static::autoRemoveCache($model); + } + public static function autoRemoveCache($model) + { + + foreach (static::$autoClearCache as $cache_item) { + $type = $cache_item['type'] ?: 'key'; + + $field = $cache_item['field'] ?: ''; + + $cache_key = $cache_item['name'] ?: ''; + + if (empty($cache_key)) { + continue; + } + + if (!empty($field)) { + if (!is_null($model->$field)) { + $cache_key = $cache_key . '_' . $model->$field; + } + } + + if ($type == 'key') { + Cache::delete($type); + } else { + Cache::tag($cache_key)->clear(); + } + } + } +} diff --git a/app/index/controller/Common.php b/app/index/controller/Common.php index 9c89503..5a424d8 100644 --- a/app/index/controller/Common.php +++ b/app/index/controller/Common.php @@ -17,9 +17,11 @@ class Common extends BaseController { parent::initialize(); - $list_nav_slide = Nav::where('type', 3)->order('sort asc')->where('status', 1)->select(); + $list_nav_slide = Nav::where('type', 3)->cache('type_3_list')->order('sort asc')->where('status', 1)->select(); + View::assign('list_nav_slide', $list_nav_slide); - $list_nav_friend_url = Nav::where('type', 2)->order('sort asc')->where('status', 1)->select(); + + $list_nav_friend_url = Nav::where('type', 2)->cache('type_2_list')->order('sort asc')->where('status', 1)->select(); View::assign('list_nav_friend_url', $list_nav_friend_url); $list_header_nav = Nav::where('type', 11)->order('sort asc')->where('status', 1)->select(); diff --git a/app/middleware.php b/app/middleware.php index 50ecc6c..efadc7b 100644 --- a/app/middleware.php +++ b/app/middleware.php @@ -12,5 +12,5 @@ return [ // 页面Trace调试 // \think\middleware\TraceDebug::class, - '\app\\middleware\ConfigInit' + // '\app\\middleware\ConfigInit' ]; diff --git a/app/model/Nav.php b/app/model/Nav.php index 65cdfd2..9be23bd 100644 --- a/app/model/Nav.php +++ b/app/model/Nav.php @@ -4,26 +4,33 @@ declare(strict_types=1); namespace app\model; -use think\Model; +use app\common\model\Base; + /** * @mixin think\Model */ -class Nav extends Model +class Nav extends Base { - public static $statusName = [ - 0=>'不显示', - 1=>'显示' - ]; - // - public function getImgAttr($value) - { - return get_source_link($value); - } + public static $autoClearCache = [ + [ + 'name' => 'type_3_list' + ] + ]; - public function getStatusNameAttr() - { - return self::$statusName[$this->getData('status')]; - } + public static $statusName = [ + 0 => '不显示', + 1 => '显示' + ]; + // + public function getImgAttr($value) + { + return get_source_link($value); + } + + public function getStatusNameAttr() + { + return self::$statusName[$this->getData('status')]; + } } diff --git a/config/log.php b/config/log.php index 5f7afcb..24051dd 100644 --- a/config/log.php +++ b/config/log.php @@ -6,7 +6,7 @@ use think\facade\Env; // +---------------------------------------------------------------------- return [ // 默认日志记录通道 - 'default' => Env::get('log.channel', 'file'), + 'default' => Env::get('log.channel', 'debug_mysql'), // 日志记录级别 'level' => [], // 日志类型记录的通道 ['error'=>'email',...] @@ -41,6 +41,26 @@ return [ 'realtime_write' => false, ], // 其它日志通道配置 + // 其它日志通道配置 + 'debug_mysql' => [ + 'type' => 'DebugMysql', + // 服务器地址 + 'hostname' => Env::get('database.hostname', ''), + // 数据库名 + 'database' => Env::get('database.database', ''), + // 用户名 + 'username' => Env::get('database.username', ''), + // 密码 + 'password' => Env::get('database.password', ''), + // 端口 + 'hostport' => Env::get('database.hostport', '3306'), + // 数据库连接参数 + 'params' => [], + // 数据库编码默认采用utf8 + 'charset' => Env::get('database.charset', 'utf8'), + // 数据库表前缀 + 'prefix' => Env::get('database.prefix', 'ul_'), + ] ], ];