diff --git a/.travis.yml b/.travis.yml old mode 100755 new mode 100644 diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/addons/alisms/Alisms.php b/addons/alisms/Alisms.php new file mode 100644 index 00000000..44dd9601 --- /dev/null +++ b/addons/alisms/Alisms.php @@ -0,0 +1,72 @@ +mobile($params->mobile) + ->template($config['template'][$params->event]) + ->param(['code' => $params->code]) + ->send(); + return $result; + } + + /** + * 短信发送通知 + * @param array $params + * @return boolean + */ + public function smsNotice(&$params) + { + $alisms = library\Alisms::instance(); + $result = $alisms->mobile($params['mobile']) + ->template($params['template']) + ->param($params) + ->send(); + return $result; + } + + /** + * 检测验证是否正确 + * @param Sms $params + * @return boolean + */ + public function smsCheck(&$params) + { + return TRUE; + } + +} diff --git a/addons/alisms/config.php b/addons/alisms/config.php new file mode 100644 index 00000000..6e69ecd9 --- /dev/null +++ b/addons/alisms/config.php @@ -0,0 +1,70 @@ + + array ( + 'name' => 'key', + 'title' => '应用key', + 'type' => 'string', + 'content' => + array ( + ), + 'value' => 'LTAIrWkYK52SWqlA', + 'rule' => 'required', + 'msg' => '', + 'tip' => '', + 'ok' => '', + 'extend' => '', + ), + 1 => + array ( + 'name' => 'secret', + 'title' => '密钥secret', + 'type' => 'string', + 'content' => + array ( + ), + 'value' => 'mAoToIZsRvuzM1n1Z66uj5cQctawCX', + 'rule' => 'required', + 'msg' => '', + 'tip' => '', + 'ok' => '', + 'extend' => '', + ), + 2 => + array ( + 'name' => 'sign', + 'title' => '签名', + 'type' => 'string', + 'content' => + array ( + ), + 'value' => '吉泰隆', + 'rule' => 'required', + 'msg' => '', + 'tip' => '', + 'ok' => '', + 'extend' => '', + ), + 3 => + array ( + 'name' => 'template', + 'title' => '短信模板', + 'type' => 'array', + 'content' => + array ( + ), + 'value' => + array ( + 'register' => 'SMS_114000000', + 'resetpwd' => 'SMS_114000000', + 'changepwd' => 'SMS_114000000', + '短信验证码' => 'SMS_119078242', + ), + 'rule' => 'required', + 'msg' => '', + 'tip' => '', + 'ok' => '', + 'extend' => '', + ), +); diff --git a/addons/alisms/controller/Index.php b/addons/alisms/controller/Index.php new file mode 100644 index 00000000..46d6ea2a --- /dev/null +++ b/addons/alisms/controller/Index.php @@ -0,0 +1,49 @@ +view->fetch(); + } + + public function send() + { + $mobile = $this->request->post('mobile'); + $template = $this->request->post('template'); + $sign = $this->request->post('sign'); + $param = (array) json_decode($this->request->post('param')); + $alisms = new \addons\alisms\library\Alisms(); + $ret = $alisms->mobile($mobile) + ->template($template) + ->sign($sign) + ->param($param) + ->send(); + if ($ret) + { + $this->success("发送成功"); + } + else + { + $this->error("发送失败!失败原因:" . $alisms->getError()); + } + } + +} diff --git a/addons/alisms/info.ini b/addons/alisms/info.ini new file mode 100644 index 00000000..3b8e23b5 --- /dev/null +++ b/addons/alisms/info.ini @@ -0,0 +1,7 @@ +name = alisms +title = 阿里短信发送 +intro = 阿里短信发送插件 +author = Karson +website = http://www.fastadmin.net +version = 1.0.1 +state = 1 diff --git a/addons/alisms/install.sql b/addons/alisms/install.sql new file mode 100644 index 00000000..c99efa08 --- /dev/null +++ b/addons/alisms/install.sql @@ -0,0 +1,10 @@ + +CREATE TABLE IF NOT EXISTS `__PREFIX__mobile_code` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `type` varchar(30) NOT NULL DEFAULT '' COMMENT '类型', + `mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号', + `code` varchar(10) DEFAULT '' COMMENT '验证码', + `times` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '验证次数', + `createtime` int(10) unsigned DEFAULT '0' COMMENT '创建时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='短信验证码表'; \ No newline at end of file diff --git a/addons/alisms/library/Alisms.php b/addons/alisms/library/Alisms.php new file mode 100644 index 00000000..1bfae92e --- /dev/null +++ b/addons/alisms/library/Alisms.php @@ -0,0 +1,178 @@ +config = array_merge($this->config, $config); + } + $this->config = array_merge($this->config, is_array($options) ? $options : []); + } + + /** + * 单例 + * @param array $options 参数 + * @return Alisms + */ + public static function instance($options = []) + { + if (is_null(self::$instance)) + { + self::$instance = new static($options); + } + + return self::$instance; + } + + /** + * 设置签名 + * @param string $sign + * @return Alisms + */ + public function sign($sign = '') + { + $this->_params['SignName'] = $sign; + return $this; + } + + /** + * 设置参数 + * @param array $param + * @return Alisms + */ + public function param(array $param = []) + { + foreach ($param as $k => &$v) + { + $v = (string) $v; + } + unset($v); + $this->_params['TemplateParam'] = json_encode($param); + return $this; + } + + /** + * 设置模板 + * @param string $code 短信模板 + * @return Alisms + */ + public function template($code = '') + { + $this->_params['TemplateCode'] = $code; + return $this; + } + + /** + * 接收手机 + * @param string $mobile 手机号码 + * @return Alisms + */ + public function mobile($mobile = '') + { + $this->_params['PhoneNumbers'] = $mobile; + return $this; + } + + /** + * 立即发送 + * @return boolean + */ + public function send() + { + $this->error = ''; + $params = $this->_params(); + $params['Signature'] = $this->_signed($params); + $response = $this->_curl($params); + if ($response !== FALSE) + { + $res = (array) json_decode($response, TRUE); + if (isset($res['Code']) && $res['Code'] == 'OK') + return TRUE; + $this->error = isset($res['Message']) ? $res['Message'] : 'InvalidResult'; + } + else + { + $this->error = 'InvalidResult'; + } + return FALSE; + } + + /** + * 获取错误信息 + * @return array + */ + public function getError() + { + return $this->error; + } + + private function _params() + { + return array_merge([ + 'AccessKeyId' => $this->config['key'], + 'SignName' => isset($this->config['sign']) ? $this->config['sign'] : '', + 'Action' => 'SendSms', + 'Format' => 'JSON', + 'Version' => '2017-05-25', + 'SignatureVersion' => '1.0', + 'SignatureMethod' => 'HMAC-SHA1', + 'SignatureNonce' => uniqid(), + 'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'), + ], $this->_params); + } + + private function percentEncode($string) + { + $string = urlencode($string); + $string = preg_replace('/\+/', '%20', $string); + $string = preg_replace('/\*/', '%2A', $string); + $string = preg_replace('/%7E/', '~', $string); + return $string; + } + + private function _signed($params) + { + $sign = $this->config['secret']; + ksort($params); + $canonicalizedQueryString = ''; + foreach ($params as $key => $value) + { + $canonicalizedQueryString .= '&' . $this->percentEncode($key) . '=' . $this->percentEncode($value); + } + $stringToSign = 'GET&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1)); + $signature = base64_encode(hash_hmac('sha1', $stringToSign, $sign . '&', true)); + return $signature; + } + + private function _curl($params) + { + $uri = 'http://dysmsapi.aliyuncs.com/?' . http_build_query($params); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); + curl_setopt($ch, CURLOPT_URL, $uri); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.98 Safari/537.36"); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); + $reponse = curl_exec($ch); + curl_close($ch); + return $reponse; + } + +} diff --git a/addons/alisms/view/index/index.html b/addons/alisms/view/index/index.html new file mode 100644 index 00000000..8e3d7253 --- /dev/null +++ b/addons/alisms/view/index/index.html @@ -0,0 +1,63 @@ + + + + + Alisms短信发送示例 + + + + + + + +
+
+
+
+ 阿里大于短信发送 +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/addons/crontab/Crontab.php b/addons/crontab/Crontab.php new file mode 100644 index 00000000..dac22429 --- /dev/null +++ b/addons/crontab/Crontab.php @@ -0,0 +1,49 @@ + 'general/crontab', + 'title' => '定时任务', + 'icon' => 'fa fa-tasks', + 'remark' => '类似于Linux的Crontab定时任务,可以按照设定的时间进行任务的执行,目前仅支持三种任务:请求URL、执行SQL、执行Shell', + 'sublist' => [ + ['name' => 'general/crontab/index', 'title' => '查看'], + ['name' => 'general/crontab/add', 'title' => '添加'], + ['name' => 'general/crontab/edit', 'title' => '编辑 '], + ['name' => 'general/crontab/del', 'title' => '删除'], + ['name' => 'general/crontab/multi', 'title' => '批量更新'], + ] + ] + ]; + Menu::create($menu, 'general'); + return true; + } + + /** + * 插件卸载方法 + * @return bool + */ + public function uninstall() + { + Menu::delete('general/crontab'); + return true; + } + +} diff --git a/addons/crontab/application/admin/controller/general/Crontab.php b/addons/crontab/application/admin/controller/general/Crontab.php new file mode 100644 index 00000000..73dfdd08 --- /dev/null +++ b/addons/crontab/application/admin/controller/general/Crontab.php @@ -0,0 +1,100 @@ +model = model('Crontab'); + $this->view->assign('typedata', \app\common\model\Crontab::getTypeList()); + } + + /** + * 查看 + */ + public function index() + { + if ($this->request->isAjax()) + { + list($where, $sort, $order, $offset, $limit) = $this->buildparams(); + $total = $this->model + ->where($where) + ->order($sort, $order) + ->count(); + + $list = $this->model + ->where($where) + ->order($sort, $order) + ->limit($offset, $limit) + ->select(); + foreach ($list as $k => &$v) + { + $cron = CronExpression::factory($v['schedule']); + $v['nexttime'] = $cron->getNextRunDate()->getTimestamp(); + } + $result = array("total" => $total, "rows" => $list); + + return json($result); + } + return $this->view->fetch(); + } + + /** + * 判断Crontab格式是否正确 + * @internal + */ + public function check_schedule() + { + $row = $this->request->post("row/a"); + $schedule = isset($row['schedule']) ? $row['schedule'] : ''; + if (CronExpression::isValidExpression($schedule)) + { + return json(['ok' => '']); + } + else + { + return json(['error' => __('Crontab format invalid')]); + } + } + + /** + * 根据Crontab表达式读取未来七次的时间 + * @internal + */ + public function get_schedule_future() + { + $time = []; + $schedule = $this->request->post('schedule'); + $days = (int) $this->request->post('days'); + try + { + $cron = CronExpression::factory($schedule); + for ($i = 0; $i < $days; $i++) + { + $time[] = $cron->getNextRunDate(null, $i)->format('Y-m-d H:i:s'); + } + } + catch (\Exception $e) + { + + } + + return json(['futuretime' => $time]); + } + +} diff --git a/addons/crontab/application/admin/lang/zh-cn/general/crontab.php b/addons/crontab/application/admin/lang/zh-cn/general/crontab.php new file mode 100644 index 00000000..6f51e6e7 --- /dev/null +++ b/addons/crontab/application/admin/lang/zh-cn/general/crontab.php @@ -0,0 +1,17 @@ + '任务标题', + 'Maximums' => '最多执行', + 'Sleep' => '延迟秒数', + 'Schedule' => '执行周期', + 'Executes' => '执行次数', + 'No limit' => '无限制', + 'Execute time' => '最后执行时间', + 'Request Url' => '请求URL', + 'Execute Sql Script' => '执行SQL', + 'Execute Shell' => '执行Shell', + 'Crontab format invalid' => 'Crontab格式错误', + 'Next execute time' => '下次预计时间', + 'The next %s times the execution time' => '接下来 %s 次的执行时间', +]; diff --git a/addons/crontab/application/admin/view/general/crontab/add.html b/addons/crontab/application/admin/view/general/crontab/add.html new file mode 100644 index 00000000..826e56b2 --- /dev/null +++ b/addons/crontab/application/admin/view/general/crontab/add.html @@ -0,0 +1,81 @@ + +
+
+ +
+ +
+
+
+ +
+ {:build_select('row[type]', $typedata, null, ['class'=>'form-control', 'data-rule'=>'required'])} +
+
+
+ +
+ +
+
+
+ +
+ +
+
*    *    *    *    *
+-    -    -    -    -
+|    |    |    |    +--- day of week (0 - 7) (Sunday=0 or 7)
+|    |    |    +-------- month (1 - 12)
+|    |    +------------- day of month (1 - 31)
+|    +------------------ hour (0 - 23)
++----------------------- min (0 - 59)
+
{:__('The next %s times the execution time', '')}
+
    +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')])} +
+
+ + +
diff --git a/addons/crontab/application/admin/view/general/crontab/edit.html b/addons/crontab/application/admin/view/general/crontab/edit.html new file mode 100644 index 00000000..caa2aea4 --- /dev/null +++ b/addons/crontab/application/admin/view/general/crontab/edit.html @@ -0,0 +1,81 @@ + +
+
+ +
+ +
+
+
+ +
+ {:build_select('row[type]', $typedata, $row['type'], ['class'=>'form-control', 'data-rule'=>'required'])} +
+
+
+ +
+ +
+
+
+ +
+ +
+
*    *    *    *    *
+-    -    -    -    -
+|    |    |    |    +--- day of week (0 - 7) (Sunday=0 or 7)
+|    |    |    +-------- month (1 - 12)
+|    |    +------------- day of month (1 - 31)
+|    +------------------ hour (0 - 23)
++----------------------- min (0 - 59)
+
{:__('The next %s times the execution time', '')}
+
    +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')], $row['status'])} +
+
+ + +
diff --git a/addons/crontab/application/admin/view/general/crontab/index.html b/addons/crontab/application/admin/view/general/crontab/index.html new file mode 100644 index 00000000..382ef043 --- /dev/null +++ b/addons/crontab/application/admin/view/general/crontab/index.html @@ -0,0 +1,28 @@ +
+ {:build_heading()} + +
+
+
+
+ + +
+
+
+ +
+
+
diff --git a/addons/crontab/application/common/model/Crontab.php b/addons/crontab/application/common/model/Crontab.php new file mode 100644 index 00000000..fa4d60a4 --- /dev/null +++ b/addons/crontab/application/common/model/Crontab.php @@ -0,0 +1,54 @@ + __('Request Url'), + 'sql' => __('Execute Sql Script'), + 'shell' => __('Execute Shell'), + ]; + } + + public function getTypeTextAttr($value, $data) + { + $typelist = self::getTypeList(); + $value = $value ? $value : $data['type']; + return $value && isset($typelist[$value]) ? $typelist[$value] : $value; + } + + protected function setBegintimeAttr($value) + { + return $value && !is_numeric($value) ? strtotime($value) : $value; + } + + protected function setEndtimeAttr($value) + { + return $value && !is_numeric($value) ? strtotime($value) : $value; + } + + protected function setExecutetimeAttr($value) + { + return $value && !is_numeric($value) ? strtotime($value) : $value; + } + +} diff --git a/addons/crontab/config.php b/addons/crontab/config.php new file mode 100644 index 00000000..b6251283 --- /dev/null +++ b/addons/crontab/config.php @@ -0,0 +1,4 @@ +request->isCli()) + $this->error('Autotask script only work at client!'); + + parent::_initialize(); + + // 清除错误 + error_reporting(0); + + // 设置永不超时 + set_time_limit(0); + } + + /** + * 执行定时任务 + */ + public function index() + { + $time = time(); + $logDir = LOG_PATH . 'crontab/'; + if (!is_dir($logDir)) + { + mkdir($logDir, 0755); + } + //筛选未过期且未完成的任务 + $crontabList = Crontab::where('status', '=', 'normal')->order('weigh desc,id desc')->select(); + foreach ($crontabList as $crontab) + { + $update = []; + $execute = FALSE; + if ($time < $crontab['begintime']) + { + //任务未开始 + continue; + } + if ($crontab['maximums'] && $crontab['executes'] > $crontab['maximums']) + { + //任务已超过最大执行次数 + $update['status'] = 'completed'; + } + else if ($crontab['endtime'] > 0 && $time > $crontab['endtime']) + { + //任务已过期 + $update['status'] = 'expired'; + } + else + { + //重复执行 + //如果未到执行时间则继续循环 + $cron = CronExpression::factory($crontab['schedule']); + if (!$cron->isDue() || date("YmdHi") === date("YmdHi", $crontab['executetime'])) + continue; + $execute = TRUE; + } + + // 如果允许执行 + if ($execute) + { + $update['executetime'] = $time; + $update['executes'] = $crontab['executes'] + 1; + $update['status'] = ($crontab['maximums'] > 0 && $update['executes'] >= $crontab['maximums']) ? 'completed' : 'normal'; + } + + // 如果需要更新状态 + if (!$update) + continue; + // 更新状态 + $crontab->save($update); + + // 将执行放在后面是为了避免超时导致多次执行 + if (!$execute) + continue; + try + { + if ($crontab['type'] == 'url') + { + if (substr($crontab['content'], 0, 1) == "/") + { + // 本地项目URL + exec('nohup php ' . ROOT_PATH . 'public/index.php ' . $crontab['content'] . ' >> ' . $logDir . date("Y-m-d") . '.log 2>&1 &'); + } + else + { + // 远程异步调用URL + Http::sendAsyncRequest($crontab['content']); + } + } + else if ($crontab['type'] == 'sql') + { + //这里需要强制重连数据库,使用已有的连接会报2014错误 + $connect = Db::connect([], true); + $connect->execute("select 1"); + // 执行SQL + $connect->getPdo()->exec($crontab['content']); + } + else if ($crontab['type'] == 'shell') + { + // 执行Shell + exec($crontab['content'] . ' >> ' . $logDir . date("Y-m-d") . '.log 2>&1 &'); + } + } + catch (Exception $e) + { + Log::record($e->getMessage()); + } + } + return 'Execute completed!'; + } + +} diff --git a/addons/crontab/controller/Index.php b/addons/crontab/controller/Index.php new file mode 100644 index 00000000..0ba12a93 --- /dev/null +++ b/addons/crontab/controller/Index.php @@ -0,0 +1,16 @@ +error("当前插件暂无前台页面"); + } + +} + diff --git a/addons/crontab/info.ini b/addons/crontab/info.ini new file mode 100644 index 00000000..52b5f232 --- /dev/null +++ b/addons/crontab/info.ini @@ -0,0 +1,7 @@ +name = crontab +title = 定时任务 +intro = 可在线管理Crontab定时任务 +author = Karson +website = http://www.fastadmin.net +version = 1.0.0 +state = 1 diff --git a/addons/crontab/install.sql b/addons/crontab/install.sql new file mode 100644 index 00000000..bc9fa3b6 --- /dev/null +++ b/addons/crontab/install.sql @@ -0,0 +1,24 @@ +CREATE TABLE IF NOT EXISTS `__PREFIX__crontab` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', + `type` varchar(10) NOT NULL DEFAULT '' COMMENT '事件类型', + `title` varchar(100) NOT NULL DEFAULT '' COMMENT '事件标题', + `content` text NOT NULL COMMENT '事件内容', + `schedule` varchar(100) NOT NULL DEFAULT '' COMMENT 'Crontab格式', + `sleep` tinyint(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '延迟秒数执行', + `maximums` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '最大执行次数 0为不限', + `executes` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '已经执行的次数', + `createtime` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '创建时间', + `updatetime` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '更新时间', + `begintime` int(10) NOT NULL DEFAULT '0' COMMENT '开始时间', + `endtime` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '结束时间', + `executetime` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '最后执行时间', + `weigh` int(10) NOT NULL DEFAULT '0' COMMENT '权重', + `status` enum('completed','expired','hidden','normal') NOT NULL DEFAULT 'normal' COMMENT '状态', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='定时任务表' ROW_FORMAT=DYNAMIC; + +BEGIN; +INSERT INTO `__PREFIX__crontab` (`id`, `type`, `title`, `content`, `schedule`, `sleep`, `maximums`, `executes`, `createtime`, `updatetime`, `begintime`, `endtime`, `executetime`, `weigh`, `status`) VALUES +(1, 'url', '请求FastAdmin', 'http://www.fastadmin.net', '* * * * *', 0, 0, 13548, 1497070825, 1501253101, 1483200000, 1546272000, 1501253101, 1, 'normal'), +(2, 'sql', '查询一条SQL', 'SELECT 1;', '* * * * *', 0, 0, 13548, 1497071095, 1501253101, 1483200000, 1546272000, 1501253101, 2, 'normal'); +COMMIT; diff --git a/addons/crontab/public/assets/js/backend/general/crontab.js b/addons/crontab/public/assets/js/backend/general/crontab.js new file mode 100644 index 00000000..cb5b415a --- /dev/null +++ b/addons/crontab/public/assets/js/backend/general/crontab.js @@ -0,0 +1,79 @@ +define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) { + + var Controller = { + index: function () { + // 初始化表格参数配置 + Table.api.init({ + extend: { + index_url: 'general/crontab/index', + add_url: 'general/crontab/add', + edit_url: 'general/crontab/edit', + del_url: 'general/crontab/del', + multi_url: 'general/crontab/multi', + table: 'crontab' + } + }); + + var table = $("#table"); + + // 初始化表格 + table.bootstrapTable({ + url: $.fn.bootstrapTable.defaults.extend.index_url, + sortName: 'weigh', + columns: [ + [ + {field: 'state', checkbox: true, }, + {field: 'id', title: 'ID'}, + {field: 'type_text', title: __('Type'), operate: false}, + {field: 'title', title: __('Title')}, + {field: 'maximums', title: __('Maximums'), formatter: Controller.api.formatter.maximums}, + {field: 'executes', title: __('Executes')}, + {field: 'begintime', title: __('Begin time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange'}, + {field: 'endtime', title: __('End time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange'}, + {field: 'nexttime', title: __('Next execute time'), formatter: Table.api.formatter.datetime, operate: false}, + {field: 'executetime', title: __('Execute time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange'}, + {field: 'weigh', title: __('Weigh')}, + {field: 'status', title: __('Status'), formatter: Table.api.formatter.status}, + {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate} + ] + ] + }); + + // 为表格绑定事件 + Table.api.bindevent(table); + }, + add: function () { + Controller.api.bindevent(); + }, + edit: function () { + Controller.api.bindevent(); + }, + api: { + bindevent: function () { + $('#schedule').on('valid.field', function (e, result) { + $("#pickdays").trigger("change"); + }); + Form.api.bindevent($("form[role=form]")); + $(document).on("change", "#pickdays", function () { + $("#scheduleresult").html(__('Loading')); + $.post("general/crontab/get_schedule_future", {schedule: $("#schedule").val(), days: $(this).val()}, function (ret) { + $("#scheduleresult").html(""); + if (typeof ret.futuretime !== 'undefined' && $.isArray(ret.futuretime)) { + $.each(ret.futuretime, function (i, j) { + $("#scheduleresult").append("
  • " + j + "" + (i + 1) + "
  • "); + }); + } + }, 'json'); + + }); + $("#pickdays").trigger("change"); + }, + formatter: { + maximums: function (value, row, index) { + return value === 0 ? __('No limit') : value; + } + } + } + }; + return Controller; +}); \ No newline at end of file diff --git a/addons/properties/Properties.php b/addons/properties/Properties.php new file mode 100644 index 00000000..4d338088 --- /dev/null +++ b/addons/properties/Properties.php @@ -0,0 +1,31 @@ + 0) { + require(['../addons/properties/Properties'], function (Properties){ + var obj=$("textarea[id$=Properties]", form); + +     var table=Properties.init(obj); + + $(form).on("click",".property_add",function(event){ + Properties.create(table); + }) + + $(form).on("click",".property_del",function(event){ + Properties.remove(table,$(this).parents("tr").data("index")); + }) + + $(form).on("click",".property_drag",function(event){ + Properties.sort(table,$(this).data("index"),$(this).data("direction")); + }) + + $(form).on("change","input",function(event){ + Properties.set(table,$(this).parents("tr").data("index")); + }) + + + +   }); + } + } catch (e) { + + } + + }; +}); diff --git a/addons/properties/config.php b/addons/properties/config.php new file mode 100644 index 00000000..28a3b2cc --- /dev/null +++ b/addons/properties/config.php @@ -0,0 +1,5 @@ +error("当前插件暂无前台页面"); + } + +} + diff --git a/addons/properties/info.ini b/addons/properties/info.ini new file mode 100644 index 00000000..fb84e4c9 --- /dev/null +++ b/addons/properties/info.ini @@ -0,0 +1,7 @@ +name = properties +title = 自定义属性插件 +intro = 自定义属性 +author = ChrisLeung +website = https://github.com/Chrisleung +version = 1.0.0 +state = 1 \ No newline at end of file diff --git a/addons/properties/public/assets/addons/Properties/Properties.js b/addons/properties/public/assets/addons/Properties/Properties.js new file mode 100644 index 00000000..3c8570f9 --- /dev/null +++ b/addons/properties/public/assets/addons/Properties/Properties.js @@ -0,0 +1,141 @@ +define([],function(){ + var Properties={ + formatter:{ + property: function (value, row, index) { + return '
    '; + }, + operate:function(value,row,index){ + return '\
    \ + \ + \ +
    '; + } + }, + //初始化表格 + init: function(obj) { + obj.hide(); + obj.before("") + .before('
    ') + .before(''); + var table=obj.parent().find("table.properties") + + if(obj.val()!=""){ + Properties.create(table); + table.bootstrapTable('load',JSON.parse(obj.val())); + } + + return table; + }, + //创建表头,若存在则添加一行 + create:function(table){ + if(table.find("tbody").size()==0){ + table.bootstrapTable({ + showHeader:true, + mobileResponsive:true, + columns: [{ + field: 'name', + title: '参数名', + class: 'property_input', + formatter:Properties.formatter.property + }, { + field: 'value', + title: '参数值', + class: 'property_input', + formatter:Properties.formatter.property + }, + { + field: 'operate', + title: '操作', + width: '150px', + formatter:Properties.formatter.operate + }], + data:[{name:'',value:''}] + + }); + }else{ + Properties.append(table); + } + }, + //添加 + append:function(table){ + var property={ + name:'', + value:'' + } + table.bootstrapTable('append',property) + }, + //删除 + remove:function(table,index){ + var data=table.bootstrapTable('getData',true); + data.splice(index,1), + table.bootstrapTable('load',data) + Properties.save(table); + }, + //排序 + sort:function(table,index,direction){ + var data=table.bootstrapTable('getData',true); + + switch(direction){ + case 'up': + if(index>0){ + table.bootstrapTable('load',Properties.swap(data,index,index-1)); + table.find("tr[data-index="+(index-1)+"]").addClass('swap_done') + }else{ + layer.tips('已经到达顶部', + table.find(".property_drag[data-index="+index+"][data-direction="+direction+"]"), + { + tips:1 + }); + } + break; + case 'down': + if(index 0) { + require(['summernote'], function () { + $(".summernote,.editor", form).summernote({ + height: 250, + lang: 'zh-CN', + fontNames: [ + 'Arial', 'Arial Black', 'Serif', 'Sans', 'Courier', + 'Courier New', 'Comic Sans MS', 'Helvetica', 'Impact', 'Lucida Grande', + "Open Sans", "Hiragino Sans GB", "Microsoft YaHei", + '微软雅黑', '宋体', '黑体', '仿宋', '楷体', '幼圆', + ], + fontNamesIgnoreCheck: [ + "Open Sans", "Microsoft YaHei", + '微软雅黑', '宋体', '黑体', '仿宋', '楷体', '幼圆' + ], + toolbar: [ + ['style', ['style', 'undo', 'redo']], + ['font', ['bold', 'underline', 'strikethrough', 'clear']], + ['fontname', ['color', 'fontname', 'fontsize']], + ['para', ['ul', 'ol', 'paragraph', 'height']], + ['table', ['table', 'hr']], + ['insert', ['link', 'picture', 'video']], + ['view', ['fullscreen', 'codeview', 'help']] + ], + dialogsInBody: true, + callbacks: { + onChange: function (contents) { + $(this).val(contents); + $(this).trigger('change'); + }, + onInit: function () { + }, + onImageUpload: function (files) { + var that = this; + //依次上传图片 + for (var i = 0; i < files.length; i++) { + Upload.api.send(files[i], function (data) { + var url = Fast.api.cdnurl(data.url); + $(that).summernote("insertImage", url, 'filename'); + }); + } + } + } + }); + }); + } + } catch (e) { + + } + + }; +}); diff --git a/addons/summernote/config.php b/addons/summernote/config.php new file mode 100644 index 00000000..28a3b2cc --- /dev/null +++ b/addons/summernote/config.php @@ -0,0 +1,5 @@ +error("当前插件暂无前台页面"); + } + +} + diff --git a/addons/summernote/info.ini b/addons/summernote/info.ini new file mode 100644 index 00000000..c9d91142 --- /dev/null +++ b/addons/summernote/info.ini @@ -0,0 +1,7 @@ +name = summernote +title = Summernote插件 +intro = 修改后台默认编辑器为Summernote +author = Karson +website = http://www.fastadmin.net +version = 1.0.1 +state = 1 diff --git a/addons/third/Third.php b/addons/third/Third.php new file mode 100644 index 00000000..4368d6cf --- /dev/null +++ b/addons/third/Third.php @@ -0,0 +1,31 @@ + + array( + 'name' => 'qq', + 'title' => 'QQ', + 'type' => 'array', + 'content' => + array( + 'app_id' => '', + 'app_secret' => '', + 'scope' => 'get_user_info', + ), + 'value' => + array( + 'app_id' => '100246200', + 'app_secret' => '0d4d1bf5210f167226c49f4eb3715512', + 'scope' => 'get_user_info', + ), + 'rule' => 'required', + 'msg' => '', + 'tip' => '', + 'ok' => '', + 'extend' => '', + ), + 1 => + array( + 'name' => 'wechat', + 'title' => '微信', + 'type' => 'array', + 'content' => + array( + 'app_id' => '', + 'app_secret' => '', + 'callback' => '', + 'scope' => 'snsapi_userinfo', + ), + 'value' => + array( + 'app_id' => 'wx91b3fe578d6467ac', + 'app_secret' => 'aa6726df5cb2b6278d7f373d009510d0', + 'scope' => 'get_user_info', + ), + 'rule' => 'required', + 'msg' => '', + 'tip' => '', + 'ok' => '', + 'extend' => '', + ), + 2 => + array( + 'name' => 'weibo', + 'title' => '微博', + 'type' => 'array', + 'content' => + array( + 'app_id' => '', + 'app_secret' => '', + 'scope' => 'get_user_info', + ), + 'value' => + array( + 'app_id' => '645217067', + 'app_secret' => '226b4baaf3799e88dec7fcabf5837185', + 'scope' => 'get_user_info', + ), + 'rule' => 'required', + 'msg' => '', + 'tip' => '', + 'ok' => '', + 'extend' => '', + ), +); diff --git a/addons/third/controller/Index.php b/addons/third/controller/Index.php new file mode 100644 index 00000000..b73261e0 --- /dev/null +++ b/addons/third/controller/Index.php @@ -0,0 +1,21 @@ +error("当前插件暂无前台页面"); + } + +} diff --git a/addons/third/info.ini b/addons/third/info.ini new file mode 100644 index 00000000..26674a36 --- /dev/null +++ b/addons/third/info.ini @@ -0,0 +1,7 @@ +name = third +title = 第三方登录 +intro = 使用微信、QQ、微博登录插件 +author = Karson +website = http://www.fastadmin.net +version = 1.0.1 +state = 1 diff --git a/addons/third/install.sql b/addons/third/install.sql new file mode 100644 index 00000000..1e586268 --- /dev/null +++ b/addons/third/install.sql @@ -0,0 +1,18 @@ + +CREATE TABLE IF NOT EXISTS `__PREFIX__third` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', + `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '会员ID', + `platform` enum('weibo','wechat','qq') NOT NULL COMMENT '第三方应用', + `openid` varchar(50) NOT NULL DEFAULT '' COMMENT '第三方唯一ID', + `openname` varchar(50) NOT NULL DEFAULT '' COMMENT '第三方会员昵称', + `access_token` varchar(100) NOT NULL DEFAULT '', + `refresh_token` varchar(100) NOT NULL DEFAULT '', + `expires_in` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '有效期', + `createtime` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '创建时间', + `updatetime` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '更新时间', + `logintime` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '登录时间', + `expiretime` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '过期时间', + PRIMARY KEY (`id`), + UNIQUE KEY `platform` (`platform`,`openid`), + KEY `user_id` (`user_id`,`platform`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='第三方登录表' ROW_FORMAT=DYNAMIC; \ No newline at end of file diff --git a/addons/third/library/Application.php b/addons/third/library/Application.php new file mode 100644 index 00000000..4e0c851d --- /dev/null +++ b/addons/third/library/Application.php @@ -0,0 +1,67 @@ + 'Qq', + 'weibo' => 'Weibo', + 'wechat' => 'Wechat', + ]; + + /** + * 服务对象信息 + * @var array + */ + protected $services = []; + + public function __construct($options = []) + { + $this->config = array_merge($this->config, is_array($options) ? $options : []); + + //注册服务器提供者 + $this->registerProviders(); + } + + /** + * 注册服务提供者 + */ + private function registerProviders() + { + foreach ($this->providers as $k => $v) + { + $this->services[$k] = function() use ($k, $v) { + $options = $this->config[$k]; + $options['app_id'] = isset($options['app_id']) ? $options['app_id'] : ''; + $options['app_secret'] = isset($options['app_secret']) ? $options['app_secret'] : ''; + // 如果未定义回调地址则自动生成 + $options['callback'] = isset($options['callback']) && $options['callback'] ? $options['callback'] : url('/', [], false, true); + $objname = __NAMESPACE__ . "\\{$v}"; + return new $objname($options); + }; + } + } + + public function __set($key, $value) + { + $this->services[$key] = $value; + } + + public function __get($key) + { + return $this->services[$key]($this); + } + +} diff --git a/addons/third/library/Qq.php b/addons/third/library/Qq.php new file mode 100644 index 00000000..fc5c1088 --- /dev/null +++ b/addons/third/library/Qq.php @@ -0,0 +1,145 @@ +config = array_merge($this->config, $config); + } + $this->config = array_merge($this->config, is_array($options) ? $options : []); + } + + /** + * 登陆 + */ + public function login() + { + header("Location:" . $this->getAuthorizeUrl()); + } + + /** + * 获取authorize_url + */ + public function getAuthorizeUrl() + { + $state = md5(uniqid(rand(), TRUE)); + Session::set('state', $state); + $queryarr = array( + "response_type" => "code", + "client_id" => $this->config['app_id'], + "redirect_uri" => $this->config['callback'], + "scope" => $this->config['scope'], + "state" => $state, + ); + request()->isMobile() && $queryarr['display'] = 'mobile'; + $url = self::GET_AUTH_CODE_URL . '?' . http_build_query($queryarr); + return $url; + } + + /** + * 获取用户信息 + * @param array $params + * @return array + */ + public function getUserInfo($params = []) + { + $params = $params ? $params : $_GET; + if (isset($params['access_token']) || (isset($params['state']) && $params['state'] == Session::get('state') && isset($params['code']))) + { + //获取access_token + $data = isset($params['code']) ? $this->getAccessToken($params['code']) : $params; + $access_token = isset($data['access_token']) ? $data['access_token'] : ''; + $refresh_token = isset($data['refresh_token']) ? $data['refresh_token'] : ''; + $expires_in = isset($data['expires_in']) ? $data['expires_in'] : 0; + if ($access_token) + { + $openid = $this->getOpenId($access_token); + //获取用户信息 + $queryarr = [ + "access_token" => $access_token, + "oauth_consumer_key" => $this->config['app_id'], + "openid" => $openid, + ]; + $ret = Http::get(self::GET_USERINFO_URL, $queryarr); + $userinfo = json_decode($ret, TRUE); + if (!$userinfo || !isset($userinfo['ret']) || $userinfo['ret'] !== 0) + return []; + $userinfo = $userinfo ? $userinfo : []; + $userinfo['avatar'] = isset($userinfo['figureurl_qq_2']) ? $userinfo['figureurl_qq_2'] : ''; + $data = [ + 'access_token' => $access_token, + 'refresh_token' => $refresh_token, + 'expires_in' => $expires_in, + 'openid' => $openid, + 'userinfo' => $userinfo + ]; + return $data; + } + } + return []; + } + + /** + * 获取access_token + * @param string $code + * @return array + */ + private function getAccessToken($code = '') + { + if (!$code) + return ''; + $queryarr = array( + "grant_type" => "authorization_code", + "client_id" => $this->config['app_id'], + "client_secret" => $this->config['app_secret'], + "redirect_uri" => $this->config['callback'], + "code" => $code, + ); + $ret = Http::get(self::GET_ACCESS_TOKEN_URL, $queryarr); + $params = []; + parse_str($ret, $params); + return $params ? $params : []; + } + + /** + * 获取open_id + * @param string $access_token + * @return string + */ + private function getOpenId($access_token = '') + { + $response = Http::get(self::GET_OPENID_URL, ['access_token' => $access_token]); + if (strpos($response, "callback") !== false) + { + $lpos = strpos($response, "("); + $rpos = strrpos($response, ")"); + $response = substr($response, $lpos + 1, $rpos - $lpos - 1); + } + $user = json_decode($response, TRUE); + return isset($user['openid']) ? $user['openid'] : ''; + } + +} diff --git a/addons/third/library/Service.php b/addons/third/library/Service.php new file mode 100644 index 00000000..fe6d8988 --- /dev/null +++ b/addons/third/library/Service.php @@ -0,0 +1,80 @@ + $platform, + 'openid' => $params['openid'], + 'openname' => isset($params['userinfo']['nickname']) ? $params['userinfo']['nickname'] : '', + 'access_token' => $params['access_token'], + 'refresh_token' => $params['refresh_token'], + 'expires_in' => $params['expires_in'], + 'logintime' => $time, + 'expiretime' => $time + $params['expires_in'], + ]; + $auth = \app\common\library\Auth::instance(); + + $auth->keeptime($keeptime); + $third = Third::get(['platform' => $platform, 'openid' => $params['openid']]); + if ($third) + { + $user = \addons\user\model\User::get($third['user_id']); + if (!$user) + { + return FALSE; + } + $third->save($values); + return $auth->direct($user->id); + } + else + { + // 先随机一个用户名,随后再变更为u+数字id + $username = Random::alnum(20); + $password = Random::alnum(6); + // 默认注册一个会员 + $result = $auth->register($username, $password, '', '', [], $keeptime); + if (!$result) + { + return FALSE; + } + $user = $auth->getUser(); + $fields = ['username' => 'u' . $user->id]; + if (isset($params['userinfo']['nickname'])) + $fields['nickname'] = $params['userinfo']['nickname']; + if (isset($params['userinfo']['avatar'])) + $fields['avatar'] = $params['userinfo']['avatar']; + + // 更新会员资料 + $user->save($fields); + + // 保存第三方信息 + $values['user_id'] = $user->id; + Third::create($values); + + // 写入登录Cookies和Token + return $auth->direct($user->id); + } + } + +} diff --git a/addons/third/library/Wechat.php b/addons/third/library/Wechat.php new file mode 100644 index 00000000..1088a293 --- /dev/null +++ b/addons/third/library/Wechat.php @@ -0,0 +1,126 @@ +config = array_merge($this->config, $config); + } + $this->config = array_merge($this->config, is_array($options) ? $options : []); + } + + /** + * 登陆 + */ + public function login() + { + header("Location:" . $this->getAuthorizeUrl()); + } + + /** + * 获取authorize_url + */ + public function getAuthorizeUrl() + { + $state = md5(uniqid(rand(), TRUE)); + Session::set('state', $state); + $queryarr = array( + "appid" => $this->config['app_id'], + "redirect_uri" => $this->config['callback'], + "response_type" => "code", + "scope" => $this->config['scope'], + "state" => $state, + ); + request()->isMobile() && $queryarr['display'] = 'mobile'; + $url = self::GET_AUTH_CODE_URL . '?' . http_build_query($queryarr) . '#wechat_redirect'; + return $url; + } + + /** + * 获取用户信息 + * @param array $params + * @return array + */ + public function getUserInfo($params = []) + { + $params = $params ? $params : $_GET; + if (isset($params['access_token']) || (isset($params['state']) && $params['state'] == Session::get('state') && isset($params['code']))) + { + //获取access_token + $data = isset($params['code']) ? $this->getAccessToken($params['code']) : $params; + $access_token = isset($data['access_token']) ? $data['access_token'] : ''; + $refresh_token = isset($data['refresh_token']) ? $data['refresh_token'] : ''; + $expires_in = isset($data['expires_in']) ? $data['expires_in'] : 0; + if ($access_token) + { + $openid = isset($data['openid']) ? $data['openid'] : ''; + $unionid = isset($data['unionid']) ? $data['unionid'] : ''; + //获取用户信息 + $queryarr = [ + "access_token" => $access_token, + "openid" => $openid, + "lang" => 'zh_CN' + ]; + $ret = Http::post(self::GET_USERINFO_URL, $queryarr); + $userinfo = json_decode($ret, TRUE); + if (!$userinfo || isset($userinfo['errcode'])) + return []; + $userinfo = $userinfo ? $userinfo : []; + $userinfo['avatar'] = isset($userinfo['headimgurl']) ? $userinfo['headimgurl'] : ''; + $data = [ + 'access_token' => $access_token, + 'refresh_token' => $refresh_token, + 'expires_in' => $expires_in, + 'openid' => $openid, + 'unionid' => $unionid, + 'userinfo' => $userinfo + ]; + return $data; + } + } + return []; + } + + /** + * 获取access_token + * @param string code + * @return array + */ + private function getAccessToken($code = '') + { + if (!$code) + return ''; + $queryarr = array( + "appid" => $this->config['app_id'], + "secret" => $this->config['app_secret'], + "code" => $code, + "grant_type" => "authorization_code", + ); + $response = Http::post(self::GET_ACCESS_TOKEN_URL, $queryarr); + $ret = json_decode($response, TRUE); + return $ret ? $ret : []; + } + +} diff --git a/addons/third/library/Weibo.php b/addons/third/library/Weibo.php new file mode 100644 index 00000000..8b53df73 --- /dev/null +++ b/addons/third/library/Weibo.php @@ -0,0 +1,124 @@ +config = array_merge($this->config, $config); + } + $this->config = array_merge($this->config, is_array($options) ? $options : []); + } + + /** + * 登陆 + */ + public function login() + { + header("Location:" . $this->getAuthorizeUrl()); + } + + /** + * 获取authorize_url + */ + public function getAuthorizeUrl() + { + $state = md5(uniqid(rand(), TRUE)); + Session::set('state', $state); + $queryarr = array( + "response_type" => "code", + "client_id" => $this->config['app_id'], + "redirect_uri" => $this->config['callback'], + "state" => $state, + ); + request()->isMobile() && $queryarr['display'] = 'mobile'; + $url = self::GET_AUTH_CODE_URL . '?' . http_build_query($queryarr); + return $url; + } + + /** + * 获取用户信息 + * @param array $params + * @return array + */ + public function getUserInfo($params = []) + { + $params = $params ? $params : $_GET; + if (isset($params['access_token']) || (isset($params['state']) && $params['state'] == Session::get('state') && isset($params['code']))) + { + //获取access_token + $data = isset($params['code']) ? $this->getAccessToken($params['code']) : $params; + $access_token = isset($data['access_token']) ? $data['access_token'] : ''; + $refresh_token = isset($data['refresh_token']) ? $data['refresh_token'] : ''; + $expires_in = isset($data['expires_in']) ? $data['expires_in'] : 0; + if ($access_token) + { + $uid = isset($data['uid']) ? $data['uid'] : ''; + //获取用户信息 + $queryarr = [ + "access_token" => $access_token, + "uid" => $uid, + ]; + $ret = Http::get(self::GET_USERINFO_URL, $queryarr); + $userinfo = json_decode($ret, TRUE); + if (!$userinfo || isset($userinfo['error_code'])) + return []; + $userinfo = $userinfo ? $userinfo : []; + $userinfo['nickname'] = isset($userinfo['screen_name']) ? $userinfo['screen_name'] : ''; + $userinfo['avatar'] = isset($userinfo['profile_image_url']) ? $userinfo['profile_image_url'] : ''; + $data = [ + 'access_token' => $access_token, + 'refresh_token' => $refresh_token, + 'expires_in' => $expires_in, + 'openid' => $uid, + 'userinfo' => $userinfo + ]; + return $data; + } + } + return []; + } + + /** + * 获取access_token + * @param string code + * @return array + */ + private function getAccessToken($code = '') + { + if (!$code) + return ''; + $queryarr = array( + "grant_type" => "authorization_code", + "client_id" => $this->config['app_id'], + "client_secret" => $this->config['app_secret'], + "redirect_uri" => $this->config['callback'], + "code" => $code, + ); + $response = Http::post(self::GET_ACCESS_TOKEN_URL, $queryarr); + $ret = json_decode($response, TRUE); + return $ret ? $ret : []; + } + +} diff --git a/addons/third/model/Third.php b/addons/third/model/Third.php new file mode 100644 index 00000000..3c396bbc --- /dev/null +++ b/addons/third/model/Third.php @@ -0,0 +1,22 @@ +model = model('Crontab'); + $this->view->assign('typedata', \app\common\model\Crontab::getTypeList()); + } + + /** + * 查看 + */ + public function index() + { + if ($this->request->isAjax()) + { + list($where, $sort, $order, $offset, $limit) = $this->buildparams(); + $total = $this->model + ->where($where) + ->order($sort, $order) + ->count(); + + $list = $this->model + ->where($where) + ->order($sort, $order) + ->limit($offset, $limit) + ->select(); + foreach ($list as $k => &$v) + { + $cron = CronExpression::factory($v['schedule']); + $v['nexttime'] = $cron->getNextRunDate()->getTimestamp(); + } + $result = array("total" => $total, "rows" => $list); + + return json($result); + } + return $this->view->fetch(); + } + + /** + * 判断Crontab格式是否正确 + * @internal + */ + public function check_schedule() + { + $row = $this->request->post("row/a"); + $schedule = isset($row['schedule']) ? $row['schedule'] : ''; + if (CronExpression::isValidExpression($schedule)) + { + return json(['ok' => '']); + } + else + { + return json(['error' => __('Crontab format invalid')]); + } + } + + /** + * 根据Crontab表达式读取未来七次的时间 + * @internal + */ + public function get_schedule_future() + { + $time = []; + $schedule = $this->request->post('schedule'); + $days = (int) $this->request->post('days'); + try + { + $cron = CronExpression::factory($schedule); + for ($i = 0; $i < $days; $i++) + { + $time[] = $cron->getNextRunDate(null, $i)->format('Y-m-d H:i:s'); + } + } + catch (\Exception $e) + { + + } + + return json(['futuretime' => $time]); + } + +} diff --git a/application/admin/lang/zh-cn/general/crontab.php b/application/admin/lang/zh-cn/general/crontab.php new file mode 100644 index 00000000..6f51e6e7 --- /dev/null +++ b/application/admin/lang/zh-cn/general/crontab.php @@ -0,0 +1,17 @@ + '任务标题', + 'Maximums' => '最多执行', + 'Sleep' => '延迟秒数', + 'Schedule' => '执行周期', + 'Executes' => '执行次数', + 'No limit' => '无限制', + 'Execute time' => '最后执行时间', + 'Request Url' => '请求URL', + 'Execute Sql Script' => '执行SQL', + 'Execute Shell' => '执行Shell', + 'Crontab format invalid' => 'Crontab格式错误', + 'Next execute time' => '下次预计时间', + 'The next %s times the execution time' => '接下来 %s 次的执行时间', +]; diff --git a/application/admin/view/general/crontab/add.html b/application/admin/view/general/crontab/add.html new file mode 100644 index 00000000..826e56b2 --- /dev/null +++ b/application/admin/view/general/crontab/add.html @@ -0,0 +1,81 @@ + +
    +
    + +
    + +
    +
    +
    + +
    + {:build_select('row[type]', $typedata, null, ['class'=>'form-control', 'data-rule'=>'required'])} +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    *    *    *    *    *
    +-    -    -    -    -
    +|    |    |    |    +--- day of week (0 - 7) (Sunday=0 or 7)
    +|    |    |    +-------- month (1 - 12)
    +|    |    +------------- day of month (1 - 31)
    +|    +------------------ hour (0 - 23)
    ++----------------------- min (0 - 59)
    +
    {:__('The next %s times the execution time', '')}
    +
      +
    +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')])} +
    +
    + + +
    diff --git a/application/admin/view/general/crontab/edit.html b/application/admin/view/general/crontab/edit.html new file mode 100644 index 00000000..caa2aea4 --- /dev/null +++ b/application/admin/view/general/crontab/edit.html @@ -0,0 +1,81 @@ + +
    +
    + +
    + +
    +
    +
    + +
    + {:build_select('row[type]', $typedata, $row['type'], ['class'=>'form-control', 'data-rule'=>'required'])} +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    *    *    *    *    *
    +-    -    -    -    -
    +|    |    |    |    +--- day of week (0 - 7) (Sunday=0 or 7)
    +|    |    |    +-------- month (1 - 12)
    +|    |    +------------- day of month (1 - 31)
    +|    +------------------ hour (0 - 23)
    ++----------------------- min (0 - 59)
    +
    {:__('The next %s times the execution time', '')}
    +
      +
    +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')], $row['status'])} +
    +
    + + +
    diff --git a/application/admin/view/general/crontab/index.html b/application/admin/view/general/crontab/index.html new file mode 100644 index 00000000..382ef043 --- /dev/null +++ b/application/admin/view/general/crontab/index.html @@ -0,0 +1,28 @@ +
    + {:build_heading()} + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    +
    diff --git a/application/command.php b/application/command.php old mode 100755 new mode 100644 diff --git a/application/common.php b/application/common.php old mode 100755 new mode 100644 diff --git a/application/common/model/Crontab.php b/application/common/model/Crontab.php new file mode 100644 index 00000000..fa4d60a4 --- /dev/null +++ b/application/common/model/Crontab.php @@ -0,0 +1,54 @@ + __('Request Url'), + 'sql' => __('Execute Sql Script'), + 'shell' => __('Execute Shell'), + ]; + } + + public function getTypeTextAttr($value, $data) + { + $typelist = self::getTypeList(); + $value = $value ? $value : $data['type']; + return $value && isset($typelist[$value]) ? $typelist[$value] : $value; + } + + protected function setBegintimeAttr($value) + { + return $value && !is_numeric($value) ? strtotime($value) : $value; + } + + protected function setEndtimeAttr($value) + { + return $value && !is_numeric($value) ? strtotime($value) : $value; + } + + protected function setExecutetimeAttr($value) + { + return $value && !is_numeric($value) ? strtotime($value) : $value; + } + +} diff --git a/application/config.php b/application/config.php old mode 100755 new mode 100644 diff --git a/application/database.php b/application/database.php old mode 100755 new mode 100644 index b89fb800..30af71a5 --- a/application/database.php +++ b/application/database.php @@ -1,56 +1,56 @@ - -// +---------------------------------------------------------------------- - -use think\Env; - -return [ - // 数据库类型 - 'type' => Env::get('database.type', 'mysql'), - // 服务器地址 - 'hostname' => Env::get('database.hostname', 'localhost'), - // 数据库名 - 'database' => Env::get('database.database', 'qulvxing'), - // 用户名 - 'username' => Env::get('database.username', 'root'), - // 密码 - 'password' => Env::get('database.password', 'root'), - // 端口 - 'hostport' => Env::get('database.hostport', ''), - // 连接dsn - 'dsn' => '', - // 数据库连接参数 - 'params' => [], - // 数据库编码默认采用utf8 - 'charset' => Env::get('database.charset', 'utf8'), - // 数据库表前缀 - 'prefix' => Env::get('database.prefix', 'fa_'), - // 数据库调试模式 - 'debug' => Env::get('database.debug', true), - // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) - 'deploy' => 0, - // 数据库读写是否分离 主从式有效 - 'rw_separate' => false, - // 读写分离后 主服务器数量 - 'master_num' => 1, - // 指定从服务器序号 - 'slave_no' => '', - // 是否严格检查字段是否存在 - 'fields_strict' => true, - // 数据集返回类型 - 'resultset_type' => 'array', - // 自动写入时间戳字段 - 'auto_timestamp' => false, - // 时间字段取出后的默认时间格式,默认为Y-m-d H:i:s - 'datetime_format' => false, - // 是否需要进行SQL性能分析 - 'sql_explain' => false, -]; + +// +---------------------------------------------------------------------- + +use think\Env; + +return [ + // 数据库类型 + 'type' => Env::get('database.type', 'mysql'), + // 服务器地址 + 'hostname' => Env::get('database.hostname', 'localhost'), + // 数据库名 + 'database' => Env::get('database.database', 'qulvxing'), + // 用户名 + 'username' => Env::get('database.username', 'jtl'), + // 密码 + 'password' => Env::get('database.password', '!jtl123361@GLOD.com'), + // 端口 + 'hostport' => Env::get('database.hostport', ''), + // 连接dsn + 'dsn' => '', + // 数据库连接参数 + 'params' => [], + // 数据库编码默认采用utf8 + 'charset' => Env::get('database.charset', 'utf8'), + // 数据库表前缀 + 'prefix' => Env::get('database.prefix', 'fa_'), + // 数据库调试模式 + 'debug' => Env::get('database.debug', true), + // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) + 'deploy' => 0, + // 数据库读写是否分离 主从式有效 + 'rw_separate' => false, + // 读写分离后 主服务器数量 + 'master_num' => 1, + // 指定从服务器序号 + 'slave_no' => '', + // 是否严格检查字段是否存在 + 'fields_strict' => true, + // 数据集返回类型 + 'resultset_type' => 'array', + // 自动写入时间戳字段 + 'auto_timestamp' => false, + // 时间字段取出后的默认时间格式,默认为Y-m-d H:i:s + 'datetime_format' => false, + // 是否需要进行SQL性能分析 + 'sql_explain' => false, +]; diff --git a/application/extra/addons.php b/application/extra/addons.php index e74b2f9c..33c2d447 100644 --- a/application/extra/addons.php +++ b/application/extra/addons.php @@ -4,6 +4,18 @@ return array ( 'autoload' => false, 'hooks' => array ( + 'sms_send' => + array ( + 0 => 'alisms', + ), + 'sms_notice' => + array ( + 0 => 'alisms', + ), + 'sms_check' => + array ( + 0 => 'alisms', + ), ), 'route' => array ( diff --git a/application/extra/site.php b/application/extra/site.php index 437899ac..7357d2b0 100644 --- a/application/extra/site.php +++ b/application/extra/site.php @@ -1,7 +1,7 @@ 'FastAdmin', + 'name' => '趣侣行', 'beian' => '', 'cdnurl' => '', 'version' => '1.0.1', @@ -18,6 +18,7 @@ return array ( 'default' => 'Default', 'page' => 'Page', 'article' => 'Article', + 'product_airport' => 'Product_airport', 'test' => 'Test', ), 'configgroup' => diff --git a/application/index/controller/Index.php b/application/index/controller/Index.php old mode 100755 new mode 100644 diff --git a/application/route.php b/application/route.php old mode 100755 new mode 100644 diff --git a/application/tags.php b/application/tags.php old mode 100755 new mode 100644 diff --git a/build.php b/build.php old mode 100755 new mode 100644 diff --git a/composer.json b/composer.json old mode 100755 new mode 100644 diff --git a/public/.htaccess b/public/.htaccess old mode 100755 new mode 100644 diff --git a/public/assets/addons/Properties/Properties.js b/public/assets/addons/Properties/Properties.js new file mode 100644 index 00000000..3c8570f9 --- /dev/null +++ b/public/assets/addons/Properties/Properties.js @@ -0,0 +1,141 @@ +define([],function(){ + var Properties={ + formatter:{ + property: function (value, row, index) { + return '
    '; + }, + operate:function(value,row,index){ + return '\
    \ + \ + \ +
    '; + } + }, + //初始化表格 + init: function(obj) { + obj.hide(); + obj.before("") + .before('
    ') + .before(''); + var table=obj.parent().find("table.properties") + + if(obj.val()!=""){ + Properties.create(table); + table.bootstrapTable('load',JSON.parse(obj.val())); + } + + return table; + }, + //创建表头,若存在则添加一行 + create:function(table){ + if(table.find("tbody").size()==0){ + table.bootstrapTable({ + showHeader:true, + mobileResponsive:true, + columns: [{ + field: 'name', + title: '参数名', + class: 'property_input', + formatter:Properties.formatter.property + }, { + field: 'value', + title: '参数值', + class: 'property_input', + formatter:Properties.formatter.property + }, + { + field: 'operate', + title: '操作', + width: '150px', + formatter:Properties.formatter.operate + }], + data:[{name:'',value:''}] + + }); + }else{ + Properties.append(table); + } + }, + //添加 + append:function(table){ + var property={ + name:'', + value:'' + } + table.bootstrapTable('append',property) + }, + //删除 + remove:function(table,index){ + var data=table.bootstrapTable('getData',true); + data.splice(index,1), + table.bootstrapTable('load',data) + Properties.save(table); + }, + //排序 + sort:function(table,index,direction){ + var data=table.bootstrapTable('getData',true); + + switch(direction){ + case 'up': + if(index>0){ + table.bootstrapTable('load',Properties.swap(data,index,index-1)); + table.find("tr[data-index="+(index-1)+"]").addClass('swap_done') + }else{ + layer.tips('已经到达顶部', + table.find(".property_drag[data-index="+index+"][data-direction="+direction+"]"), + { + tips:1 + }); + } + break; + case 'down': + if(index 0) { + require(['../addons/properties/Properties'], function (Properties){ + var obj=$("textarea[id$=Properties]", form); + +     var table=Properties.init(obj); + + $(form).on("click",".property_add",function(event){ + Properties.create(table); + }) + + $(form).on("click",".property_del",function(event){ + Properties.remove(table,$(this).parents("tr").data("index")); + }) + + $(form).on("click",".property_drag",function(event){ + Properties.sort(table,$(this).data("index"),$(this).data("direction")); + }) + + $(form).on("change","input",function(event){ + Properties.set(table,$(this).parents("tr").data("index")); + }) + + + +   }); + } + } catch (e) { + + } + + }; +}); + +require(['form', 'upload'], function (Form, Upload) { + var _bindevent = Form.events.bindevent; + Form.events.bindevent = function (form) { + _bindevent.apply(this, [form]); + try { + //绑定summernote事件 + if ($(".summernote,.editor", form).size() > 0) { + require(['summernote'], function () { + $(".summernote,.editor", form).summernote({ + height: 250, + lang: 'zh-CN', + fontNames: [ + 'Arial', 'Arial Black', 'Serif', 'Sans', 'Courier', + 'Courier New', 'Comic Sans MS', 'Helvetica', 'Impact', 'Lucida Grande', + "Open Sans", "Hiragino Sans GB", "Microsoft YaHei", + '微软雅黑', '宋体', '黑体', '仿宋', '楷体', '幼圆', + ], + fontNamesIgnoreCheck: [ + "Open Sans", "Microsoft YaHei", + '微软雅黑', '宋体', '黑体', '仿宋', '楷体', '幼圆' + ], + toolbar: [ + ['style', ['style', 'undo', 'redo']], + ['font', ['bold', 'underline', 'strikethrough', 'clear']], + ['fontname', ['color', 'fontname', 'fontsize']], + ['para', ['ul', 'ol', 'paragraph', 'height']], + ['table', ['table', 'hr']], + ['insert', ['link', 'picture', 'video']], + ['view', ['fullscreen', 'codeview', 'help']] + ], + dialogsInBody: true, + callbacks: { + onChange: function (contents) { + $(this).val(contents); + $(this).trigger('change'); + }, + onInit: function () { + }, + onImageUpload: function (files) { + var that = this; + //依次上传图片 + for (var i = 0; i < files.length; i++) { + Upload.api.send(files[i], function (data) { + var url = Fast.api.cdnurl(data.url); + $(that).summernote("insertImage", url, 'filename'); + }); + } + } + } + }); + }); + } + } catch (e) { + + } + + }; +}); + }); \ No newline at end of file diff --git a/public/assets/js/backend.js b/public/assets/js/backend.js old mode 100755 new mode 100644 diff --git a/public/assets/js/backend/auth/admin.js b/public/assets/js/backend/auth/admin.js old mode 100755 new mode 100644 diff --git a/public/assets/js/backend/auth/group.js b/public/assets/js/backend/auth/group.js old mode 100755 new mode 100644 diff --git a/public/assets/js/backend/auth/rule.js b/public/assets/js/backend/auth/rule.js old mode 100755 new mode 100644 diff --git a/public/assets/js/backend/dashboard.js b/public/assets/js/backend/dashboard.js old mode 100755 new mode 100644 diff --git a/public/assets/js/backend/general/crontab.js b/public/assets/js/backend/general/crontab.js new file mode 100644 index 00000000..cb5b415a --- /dev/null +++ b/public/assets/js/backend/general/crontab.js @@ -0,0 +1,79 @@ +define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) { + + var Controller = { + index: function () { + // 初始化表格参数配置 + Table.api.init({ + extend: { + index_url: 'general/crontab/index', + add_url: 'general/crontab/add', + edit_url: 'general/crontab/edit', + del_url: 'general/crontab/del', + multi_url: 'general/crontab/multi', + table: 'crontab' + } + }); + + var table = $("#table"); + + // 初始化表格 + table.bootstrapTable({ + url: $.fn.bootstrapTable.defaults.extend.index_url, + sortName: 'weigh', + columns: [ + [ + {field: 'state', checkbox: true, }, + {field: 'id', title: 'ID'}, + {field: 'type_text', title: __('Type'), operate: false}, + {field: 'title', title: __('Title')}, + {field: 'maximums', title: __('Maximums'), formatter: Controller.api.formatter.maximums}, + {field: 'executes', title: __('Executes')}, + {field: 'begintime', title: __('Begin time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange'}, + {field: 'endtime', title: __('End time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange'}, + {field: 'nexttime', title: __('Next execute time'), formatter: Table.api.formatter.datetime, operate: false}, + {field: 'executetime', title: __('Execute time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange'}, + {field: 'weigh', title: __('Weigh')}, + {field: 'status', title: __('Status'), formatter: Table.api.formatter.status}, + {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate} + ] + ] + }); + + // 为表格绑定事件 + Table.api.bindevent(table); + }, + add: function () { + Controller.api.bindevent(); + }, + edit: function () { + Controller.api.bindevent(); + }, + api: { + bindevent: function () { + $('#schedule').on('valid.field', function (e, result) { + $("#pickdays").trigger("change"); + }); + Form.api.bindevent($("form[role=form]")); + $(document).on("change", "#pickdays", function () { + $("#scheduleresult").html(__('Loading')); + $.post("general/crontab/get_schedule_future", {schedule: $("#schedule").val(), days: $(this).val()}, function (ret) { + $("#scheduleresult").html(""); + if (typeof ret.futuretime !== 'undefined' && $.isArray(ret.futuretime)) { + $.each(ret.futuretime, function (i, j) { + $("#scheduleresult").append("
  • " + j + "" + (i + 1) + "
  • "); + }); + } + }, 'json'); + + }); + $("#pickdays").trigger("change"); + }, + formatter: { + maximums: function (value, row, index) { + return value === 0 ? __('No limit') : value; + } + } + } + }; + return Controller; +}); \ No newline at end of file diff --git a/public/assets/js/backend/general/profile.js b/public/assets/js/backend/general/profile.js old mode 100755 new mode 100644 diff --git a/public/assets/js/backend/index.js b/public/assets/js/backend/index.js old mode 100755 new mode 100644 diff --git a/public/assets/js/html5shiv.js b/public/assets/js/html5shiv.js old mode 100755 new mode 100644 diff --git a/public/assets/js/jquery.drag.min.js b/public/assets/js/jquery.drag.min.js old mode 100755 new mode 100644 diff --git a/public/assets/js/jquery.drop.min.js b/public/assets/js/jquery.drop.min.js old mode 100755 new mode 100644 diff --git a/public/assets/js/require-css.min.js b/public/assets/js/require-css.min.js old mode 100755 new mode 100644 diff --git a/public/assets/js/require-form.js b/public/assets/js/require-form.js old mode 100755 new mode 100644 diff --git a/public/assets/js/require-upload.js b/public/assets/js/require-upload.js old mode 100755 new mode 100644 diff --git a/public/assets/js/require.js b/public/assets/js/require.js old mode 100755 new mode 100644 diff --git a/public/assets/js/respond.min.js b/public/assets/js/respond.min.js old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins.less b/public/assets/less/bootstrap-less/mixins.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/alerts.less b/public/assets/less/bootstrap-less/mixins/alerts.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/background-variant.less b/public/assets/less/bootstrap-less/mixins/background-variant.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/border-radius.less b/public/assets/less/bootstrap-less/mixins/border-radius.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/buttons.less b/public/assets/less/bootstrap-less/mixins/buttons.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/center-block.less b/public/assets/less/bootstrap-less/mixins/center-block.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/clearfix.less b/public/assets/less/bootstrap-less/mixins/clearfix.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/forms.less b/public/assets/less/bootstrap-less/mixins/forms.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/gradients.less b/public/assets/less/bootstrap-less/mixins/gradients.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/grid-framework.less b/public/assets/less/bootstrap-less/mixins/grid-framework.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/grid.less b/public/assets/less/bootstrap-less/mixins/grid.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/hide-text.less b/public/assets/less/bootstrap-less/mixins/hide-text.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/image.less b/public/assets/less/bootstrap-less/mixins/image.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/labels.less b/public/assets/less/bootstrap-less/mixins/labels.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/list-group.less b/public/assets/less/bootstrap-less/mixins/list-group.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/nav-divider.less b/public/assets/less/bootstrap-less/mixins/nav-divider.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/nav-vertical-align.less b/public/assets/less/bootstrap-less/mixins/nav-vertical-align.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/opacity.less b/public/assets/less/bootstrap-less/mixins/opacity.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/pagination.less b/public/assets/less/bootstrap-less/mixins/pagination.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/panels.less b/public/assets/less/bootstrap-less/mixins/panels.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/progress-bar.less b/public/assets/less/bootstrap-less/mixins/progress-bar.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/reset-filter.less b/public/assets/less/bootstrap-less/mixins/reset-filter.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/reset-text.less b/public/assets/less/bootstrap-less/mixins/reset-text.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/resize.less b/public/assets/less/bootstrap-less/mixins/resize.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/responsive-visibility.less b/public/assets/less/bootstrap-less/mixins/responsive-visibility.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/size.less b/public/assets/less/bootstrap-less/mixins/size.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/tab-focus.less b/public/assets/less/bootstrap-less/mixins/tab-focus.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/table-row.less b/public/assets/less/bootstrap-less/mixins/table-row.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/text-emphasis.less b/public/assets/less/bootstrap-less/mixins/text-emphasis.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/text-overflow.less b/public/assets/less/bootstrap-less/mixins/text-overflow.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/mixins/vendor-prefixes.less b/public/assets/less/bootstrap-less/mixins/vendor-prefixes.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap-less/variables.less b/public/assets/less/bootstrap-less/variables.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap.less b/public/assets/less/bootstrap.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/alerts.less b/public/assets/less/bootstrap/alerts.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/badges.less b/public/assets/less/bootstrap/badges.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/bootstrap.less b/public/assets/less/bootstrap/bootstrap.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/breadcrumbs.less b/public/assets/less/bootstrap/breadcrumbs.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/button-groups.less b/public/assets/less/bootstrap/button-groups.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/buttons.less b/public/assets/less/bootstrap/buttons.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/carousel.less b/public/assets/less/bootstrap/carousel.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/close.less b/public/assets/less/bootstrap/close.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/code.less b/public/assets/less/bootstrap/code.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/component-animations.less b/public/assets/less/bootstrap/component-animations.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/dropdowns.less b/public/assets/less/bootstrap/dropdowns.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/forms.less b/public/assets/less/bootstrap/forms.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/glyphicons.less b/public/assets/less/bootstrap/glyphicons.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/grid.less b/public/assets/less/bootstrap/grid.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/input-groups.less b/public/assets/less/bootstrap/input-groups.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/jumbotron.less b/public/assets/less/bootstrap/jumbotron.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/labels.less b/public/assets/less/bootstrap/labels.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/list-group.less b/public/assets/less/bootstrap/list-group.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/media.less b/public/assets/less/bootstrap/media.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins.less b/public/assets/less/bootstrap/mixins.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/alerts.less b/public/assets/less/bootstrap/mixins/alerts.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/background-variant.less b/public/assets/less/bootstrap/mixins/background-variant.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/border-radius.less b/public/assets/less/bootstrap/mixins/border-radius.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/buttons.less b/public/assets/less/bootstrap/mixins/buttons.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/center-block.less b/public/assets/less/bootstrap/mixins/center-block.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/clearfix.less b/public/assets/less/bootstrap/mixins/clearfix.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/forms.less b/public/assets/less/bootstrap/mixins/forms.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/gradients.less b/public/assets/less/bootstrap/mixins/gradients.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/grid-framework.less b/public/assets/less/bootstrap/mixins/grid-framework.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/grid.less b/public/assets/less/bootstrap/mixins/grid.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/hide-text.less b/public/assets/less/bootstrap/mixins/hide-text.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/image.less b/public/assets/less/bootstrap/mixins/image.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/labels.less b/public/assets/less/bootstrap/mixins/labels.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/list-group.less b/public/assets/less/bootstrap/mixins/list-group.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/nav-divider.less b/public/assets/less/bootstrap/mixins/nav-divider.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/nav-vertical-align.less b/public/assets/less/bootstrap/mixins/nav-vertical-align.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/opacity.less b/public/assets/less/bootstrap/mixins/opacity.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/pagination.less b/public/assets/less/bootstrap/mixins/pagination.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/panels.less b/public/assets/less/bootstrap/mixins/panels.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/progress-bar.less b/public/assets/less/bootstrap/mixins/progress-bar.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/reset-filter.less b/public/assets/less/bootstrap/mixins/reset-filter.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/reset-text.less b/public/assets/less/bootstrap/mixins/reset-text.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/resize.less b/public/assets/less/bootstrap/mixins/resize.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/responsive-visibility.less b/public/assets/less/bootstrap/mixins/responsive-visibility.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/size.less b/public/assets/less/bootstrap/mixins/size.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/tab-focus.less b/public/assets/less/bootstrap/mixins/tab-focus.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/table-row.less b/public/assets/less/bootstrap/mixins/table-row.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/text-emphasis.less b/public/assets/less/bootstrap/mixins/text-emphasis.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/text-overflow.less b/public/assets/less/bootstrap/mixins/text-overflow.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/mixins/vendor-prefixes.less b/public/assets/less/bootstrap/mixins/vendor-prefixes.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/modals.less b/public/assets/less/bootstrap/modals.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/navbar.less b/public/assets/less/bootstrap/navbar.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/navs.less b/public/assets/less/bootstrap/navs.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/normalize.less b/public/assets/less/bootstrap/normalize.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/pager.less b/public/assets/less/bootstrap/pager.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/pagination.less b/public/assets/less/bootstrap/pagination.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/panels.less b/public/assets/less/bootstrap/panels.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/popovers.less b/public/assets/less/bootstrap/popovers.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/print.less b/public/assets/less/bootstrap/print.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/progress-bars.less b/public/assets/less/bootstrap/progress-bars.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/responsive-embed.less b/public/assets/less/bootstrap/responsive-embed.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/responsive-utilities.less b/public/assets/less/bootstrap/responsive-utilities.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/scaffolding.less b/public/assets/less/bootstrap/scaffolding.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/tables.less b/public/assets/less/bootstrap/tables.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/theme.less b/public/assets/less/bootstrap/theme.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/thumbnails.less b/public/assets/less/bootstrap/thumbnails.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/tooltip.less b/public/assets/less/bootstrap/tooltip.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/type.less b/public/assets/less/bootstrap/type.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/utilities.less b/public/assets/less/bootstrap/utilities.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/variables.less b/public/assets/less/bootstrap/variables.less old mode 100755 new mode 100644 diff --git a/public/assets/less/bootstrap/wells.less b/public/assets/less/bootstrap/wells.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin.less b/public/assets/less/fastadmin.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/.csslintrc b/public/assets/less/fastadmin/.csslintrc old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/404_500_errors.less b/public/assets/less/fastadmin/404_500_errors.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/alerts.less b/public/assets/less/fastadmin/alerts.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/bootstrap-social.less b/public/assets/less/fastadmin/bootstrap-social.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/boxes.less b/public/assets/less/fastadmin/boxes.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/buttons.less b/public/assets/less/fastadmin/buttons.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/callout.less b/public/assets/less/fastadmin/callout.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/carousel.less b/public/assets/less/fastadmin/carousel.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/control-sidebar.less b/public/assets/less/fastadmin/control-sidebar.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/core.less b/public/assets/less/fastadmin/core.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/direct-chat.less b/public/assets/less/fastadmin/direct-chat.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/dropdown.less b/public/assets/less/fastadmin/dropdown.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/forms.less b/public/assets/less/fastadmin/forms.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/fullcalendar.less b/public/assets/less/fastadmin/fullcalendar.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/header.less b/public/assets/less/fastadmin/header.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/info-box.less b/public/assets/less/fastadmin/info-box.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/invoice.less b/public/assets/less/fastadmin/invoice.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/labels.less b/public/assets/less/fastadmin/labels.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/lockscreen.less b/public/assets/less/fastadmin/lockscreen.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/login_and_register.less b/public/assets/less/fastadmin/login_and_register.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/mailbox.less b/public/assets/less/fastadmin/mailbox.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/miscellaneous.less b/public/assets/less/fastadmin/miscellaneous.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/mixins.less b/public/assets/less/fastadmin/mixins.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/modal.less b/public/assets/less/fastadmin/modal.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/navs.less b/public/assets/less/fastadmin/navs.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/print.less b/public/assets/less/fastadmin/print.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/products.less b/public/assets/less/fastadmin/products.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/profile.less b/public/assets/less/fastadmin/profile.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/progress-bars.less b/public/assets/less/fastadmin/progress-bars.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/select2.less b/public/assets/less/fastadmin/select2.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/sidebar-mini.less b/public/assets/less/fastadmin/sidebar-mini.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/sidebar.less b/public/assets/less/fastadmin/sidebar.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/small-box.less b/public/assets/less/fastadmin/small-box.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/social-widgets.less b/public/assets/less/fastadmin/social-widgets.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/table.less b/public/assets/less/fastadmin/table.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/timeline.less b/public/assets/less/fastadmin/timeline.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/users-list.less b/public/assets/less/fastadmin/users-list.less old mode 100755 new mode 100644 diff --git a/public/assets/less/fastadmin/variables.less b/public/assets/less/fastadmin/variables.less old mode 100755 new mode 100644 diff --git a/public/assets/less/skins/_all-skins.less b/public/assets/less/skins/_all-skins.less old mode 100755 new mode 100644 diff --git a/public/assets/less/skins/skin-blue-light.less b/public/assets/less/skins/skin-blue-light.less old mode 100755 new mode 100644 diff --git a/public/assets/less/skins/skin-blue.less b/public/assets/less/skins/skin-blue.less old mode 100755 new mode 100644 diff --git a/public/assets/less/skins/skin-green-light.less b/public/assets/less/skins/skin-green-light.less old mode 100755 new mode 100644 diff --git a/public/assets/less/skins/skin-green.less b/public/assets/less/skins/skin-green.less old mode 100755 new mode 100644 diff --git a/public/assets/less/skins/skin-purple-light.less b/public/assets/less/skins/skin-purple-light.less old mode 100755 new mode 100644 diff --git a/public/assets/less/skins/skin-purple.less b/public/assets/less/skins/skin-purple.less old mode 100755 new mode 100644 diff --git a/public/assets/less/skins/skin-red-light.less b/public/assets/less/skins/skin-red-light.less old mode 100755 new mode 100644 diff --git a/public/assets/less/skins/skin-red.less b/public/assets/less/skins/skin-red.less old mode 100755 new mode 100644 diff --git a/public/assets/less/skins/skin-yellow-light.less b/public/assets/less/skins/skin-yellow-light.less old mode 100755 new mode 100644 diff --git a/public/assets/less/skins/skin-yellow.less b/public/assets/less/skins/skin-yellow.less old mode 100755 new mode 100644 diff --git a/public/index.php b/public/index.php old mode 100755 new mode 100644 diff --git a/public/robots.txt b/public/robots.txt old mode 100755 new mode 100644 diff --git a/public/router.php b/public/router.php old mode 100755 new mode 100644 diff --git a/runtime/cache/4e/819c837d54a6ed09abc77a8560a66f.php b/runtime/cache/4e/819c837d54a6ed09abc77a8560a66f.php new file mode 100644 index 00000000..427c48c5 --- /dev/null +++ b/runtime/cache/4e/819c837d54a6ed09abc77a8560a66f.php @@ -0,0 +1,4 @@ + +a:3:{s:8:"sms_send";a:1:{i:0;s:21:"\addons\alisms\Alisms";}s:10:"sms_notice";a:1:{i:0;s:21:"\addons\alisms\Alisms";}s:9:"sms_check";a:1:{i:0;s:21:"\addons\alisms\Alisms";}} \ No newline at end of file diff --git a/runtime/cache/cb/78ef4a9130f39208ff10858ddd8377.php b/runtime/cache/cb/78ef4a9130f39208ff10858ddd8377.php new file mode 100644 index 00000000..c3cc48df --- /dev/null +++ b/runtime/cache/cb/78ef4a9130f39208ff10858ddd8377.php @@ -0,0 +1,4 @@ + +a:40:{i:0;a:13:{s:2:"id";i:1;s:4:"type";s:4:"file";s:3:"pid";i:0;s:4:"name";s:9:"dashboard";s:5:"title";s:9:"控制台";s:4:"icon";s:15:"fa fa-dashboard";s:9:"condition";s:0:"";s:6:"remark";s:14:"Dashboard tips";s:6:"ismenu";i:1;s:10:"createtime";i:1497429920;s:10:"updatetime";i:1516776915;s:5:"weigh";i:143;s:6:"status";s:6:"hidden";}i:1;a:13:{s:2:"id";i:2;s:4:"type";s:4:"file";s:3:"pid";i:0;s:4:"name";s:7:"general";s:5:"title";s:7:"General";s:4:"icon";s:10:"fa fa-cogs";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1497429920;s:10:"updatetime";i:1497430169;s:5:"weigh";i:137;s:6:"status";s:6:"normal";}i:2;a:13:{s:2:"id";i:3;s:4:"type";s:4:"file";s:3:"pid";i:0;s:4:"name";s:8:"category";s:5:"title";s:8:"Category";s:4:"icon";s:10:"fa fa-list";s:9:"condition";s:0:"";s:6:"remark";s:13:"Category tips";s:6:"ismenu";i:1;s:10:"createtime";i:1497429920;s:10:"updatetime";i:1497429920;s:5:"weigh";i:119;s:6:"status";s:6:"normal";}i:3;a:13:{s:2:"id";i:9;s:4:"type";s:4:"file";s:3:"pid";i:5;s:4:"name";s:10:"auth/admin";s:5:"title";s:5:"Admin";s:4:"icon";s:10:"fa fa-user";s:9:"condition";s:0:"";s:6:"remark";s:10:"Admin tips";s:6:"ismenu";i:1;s:10:"createtime";i:1497429920;s:10:"updatetime";i:1497430320;s:5:"weigh";i:118;s:6:"status";s:6:"normal";}i:4;a:13:{s:2:"id";i:10;s:4:"type";s:4:"file";s:3:"pid";i:5;s:4:"name";s:13:"auth/adminlog";s:5:"title";s:9:"Admin log";s:4:"icon";s:14:"fa fa-list-alt";s:9:"condition";s:0:"";s:6:"remark";s:14:"Admin log tips";s:6:"ismenu";i:1;s:10:"createtime";i:1497429920;s:10:"updatetime";i:1497430307;s:5:"weigh";i:113;s:6:"status";s:6:"normal";}i:5;a:13:{s:2:"id";i:11;s:4:"type";s:4:"file";s:3:"pid";i:5;s:4:"name";s:10:"auth/group";s:5:"title";s:5:"Group";s:4:"icon";s:11:"fa fa-group";s:9:"condition";s:0:"";s:6:"remark";s:10:"Group tips";s:6:"ismenu";i:1;s:10:"createtime";i:1497429920;s:10:"updatetime";i:1497429920;s:5:"weigh";i:109;s:6:"status";s:6:"normal";}i:6;a:13:{s:2:"id";i:12;s:4:"type";s:4:"file";s:3:"pid";i:5;s:4:"name";s:9:"auth/rule";s:5:"title";s:4:"Rule";s:4:"icon";s:10:"fa fa-bars";s:9:"condition";s:0:"";s:6:"remark";s:9:"Rule tips";s:6:"ismenu";i:1;s:10:"createtime";i:1497429920;s:10:"updatetime";i:1497430581;s:5:"weigh";i:104;s:6:"status";s:6:"normal";}i:7;a:13:{s:2:"id";i:5;s:4:"type";s:4:"file";s:3:"pid";i:0;s:4:"name";s:4:"auth";s:5:"title";s:4:"Auth";s:4:"icon";s:11:"fa fa-group";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1497429920;s:10:"updatetime";i:1497430092;s:5:"weigh";i:99;s:6:"status";s:6:"normal";}i:8;a:13:{s:2:"id";i:6;s:4:"type";s:4:"file";s:3:"pid";i:2;s:4:"name";s:14:"general/config";s:5:"title";s:6:"Config";s:4:"icon";s:9:"fa fa-cog";s:9:"condition";s:0:"";s:6:"remark";s:11:"Config tips";s:6:"ismenu";i:1;s:10:"createtime";i:1497429920;s:10:"updatetime";i:1497430683;s:5:"weigh";i:60;s:6:"status";s:6:"normal";}i:9;a:13:{s:2:"id";i:7;s:4:"type";s:4:"file";s:3:"pid";i:2;s:4:"name";s:18:"general/attachment";s:5:"title";s:10:"Attachment";s:4:"icon";s:18:"fa fa-file-image-o";s:9:"condition";s:0:"";s:6:"remark";s:15:"Attachment tips";s:6:"ismenu";i:1;s:10:"createtime";i:1497429920;s:10:"updatetime";i:1497430699;s:5:"weigh";i:53;s:6:"status";s:6:"normal";}i:10;a:13:{s:2:"id";i:8;s:4:"type";s:4:"file";s:3:"pid";i:2;s:4:"name";s:15:"general/profile";s:5:"title";s:7:"Profile";s:4:"icon";s:10:"fa fa-user";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1497429920;s:10:"updatetime";i:1497429920;s:5:"weigh";i:34;s:6:"status";s:6:"normal";}i:11;a:13:{s:2:"id";i:257;s:4:"type";s:4:"file";s:3:"pid";i:230;s:4:"name";s:21:"example/tabletemplate";s:5:"title";s:18:"表格模板示例";s:4:"icon";s:11:"fa fa-table";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516859010;s:10:"updatetime";i:1516859010;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:12;a:13:{s:2:"id";i:4;s:4:"type";s:4:"file";s:3:"pid";i:0;s:4:"name";s:5:"addon";s:5:"title";s:5:"Addon";s:4:"icon";s:12:"fa fa-rocket";s:9:"condition";s:0:"";s:6:"remark";s:10:"Addon tips";s:6:"ismenu";i:1;s:10:"createtime";i:1502035509;s:10:"updatetime";i:1502035509;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:13;a:13:{s:2:"id";i:262;s:4:"type";s:4:"file";s:3:"pid";i:230;s:4:"name";s:16:"example/baidumap";s:5:"title";s:18:"百度地图示例";s:4:"icon";s:13:"fa fa-map-pin";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516859010;s:10:"updatetime";i:1516859010;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:14;a:13:{s:2:"id";i:272;s:4:"type";s:4:"file";s:3:"pid";i:75;s:4:"name";s:22:"product/productairport";s:5:"title";s:9:"接送机";s:4:"icon";s:15:"fa fa-circle-o ";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516871612;s:10:"updatetime";i:1516871612;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:15;a:13:{s:2:"id";i:281;s:4:"type";s:4:"file";s:3:"pid";i:0;s:4:"name";s:5:"order";s:5:"title";s:12:"订单管理";s:4:"icon";s:10:"fa fa-list";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516947913;s:10:"updatetime";i:1516947982;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:16;a:13:{s:2:"id";i:282;s:4:"type";s:4:"file";s:3:"pid";i:281;s:4:"name";s:11:"order/order";s:5:"title";s:15:"订单主管理";s:4:"icon";s:15:"fa fa-circle-o ";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516947913;s:10:"updatetime";i:1516947913;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:17;a:13:{s:2:"id";i:291;s:4:"type";s:4:"file";s:3:"pid";i:75;s:4:"name";s:18:"product/productday";s:5:"title";s:9:"一日游";s:4:"icon";s:15:"fa fa-circle-o ";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516958223;s:10:"updatetime";i:1516958223;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:18;a:13:{s:2:"id";i:66;s:4:"type";s:4:"file";s:3:"pid";i:0;s:4:"name";s:4:"test";s:5:"title";s:12:"测试管理";s:4:"icon";s:14:"fa fa-circle-o";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516687061;s:10:"updatetime";i:1517370557;s:5:"weigh";i:0;s:6:"status";s:6:"hidden";}i:19;a:13:{s:2:"id";i:75;s:4:"type";s:4:"file";s:3:"pid";i:0;s:4:"name";s:7:"product";s:5:"title";s:12:"产品管理";s:4:"icon";s:10:"fa fa-list";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516690698;s:10:"updatetime";i:1516694523;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:20;a:13:{s:2:"id";i:94;s:4:"type";s:4:"file";s:3:"pid";i:75;s:4:"name";s:22:"product/producttickets";s:5:"title";s:12:"景点门票";s:4:"icon";s:14:"fa fa-circle-o";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516696147;s:10:"updatetime";i:1516696147;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:21;a:13:{s:2:"id";i:112;s:4:"type";s:4:"file";s:3:"pid";i:75;s:4:"name";s:23:"product/productmanydays";s:5:"title";s:9:"多日游";s:4:"icon";s:14:"fa fa-circle-o";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516697295;s:10:"updatetime";i:1516697295;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:22;a:13:{s:2:"id";i:130;s:4:"type";s:4:"file";s:3:"pid";i:75;s:4:"name";s:20:"product/productlocal";s:5:"title";s:12:"当地定制";s:4:"icon";s:14:"fa fa-circle-o";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516762828;s:10:"updatetime";i:1516762828;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:23;a:13:{s:2:"id";i:148;s:4:"type";s:4:"file";s:3:"pid";i:75;s:4:"name";s:19:"product/productshow";s:5:"title";s:12:"演出展览";s:4:"icon";s:14:"fa fa-circle-o";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516770677;s:10:"updatetime";i:1516770677;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:24;a:13:{s:2:"id";i:157;s:4:"type";s:4:"file";s:3:"pid";i:75;s:4:"name";s:25:"product/productexperience";s:5:"title";s:12:"当地体验";s:4:"icon";s:14:"fa fa-circle-o";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516771505;s:10:"updatetime";i:1516771505;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:25;a:13:{s:2:"id";i:166;s:4:"type";s:4:"file";s:3:"pid";i:75;s:4:"name";s:19:"product/productfood";s:5:"title";s:6:"美食";s:4:"icon";s:14:"fa fa-circle-o";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516772190;s:10:"updatetime";i:1516772190;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:26;a:13:{s:2:"id";i:175;s:4:"type";s:4:"file";s:3:"pid";i:75;s:4:"name";s:18:"product/productcar";s:5:"title";s:13:"包车/拼车";s:4:"icon";s:14:"fa fa-circle-o";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516772536;s:10:"updatetime";i:1516772536;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:27;a:13:{s:2:"id";i:184;s:4:"type";s:4:"file";s:3:"pid";i:75;s:4:"name";s:22:"product/producttraffic";s:5:"title";s:13:"交通卡/劵";s:4:"icon";s:14:"fa fa-circle-o";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516772981;s:10:"updatetime";i:1516772981;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:28;a:13:{s:2:"id";i:193;s:4:"type";s:4:"file";s:3:"pid";i:75;s:4:"name";s:24:"product/productcarrental";s:5:"title";s:6:"租车";s:4:"icon";s:14:"fa fa-circle-o";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516773314;s:10:"updatetime";i:1516773314;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:29;a:13:{s:2:"id";i:202;s:4:"type";s:4:"file";s:3:"pid";i:0;s:4:"name";s:7:"company";s:5:"title";s:12:"店铺管理";s:4:"icon";s:10:"fa fa-list";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516776561;s:10:"updatetime";i:1516776752;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:30;a:13:{s:2:"id";i:203;s:4:"type";s:4:"file";s:3:"pid";i:202;s:4:"name";s:18:"company/companyset";s:5:"title";s:12:"店铺设置";s:4:"icon";s:14:"fa fa-circle-o";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516776561;s:10:"updatetime";i:1516776561;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:31;a:13:{s:2:"id";i:212;s:4:"type";s:4:"file";s:3:"pid";i:75;s:4:"name";s:17:"product/newtravel";s:5:"title";s:21:"NEW出行信息模板";s:4:"icon";s:14:"fa fa-circle-o";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516780758;s:10:"updatetime";i:1516780758;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:32;a:13:{s:2:"id";i:221;s:4:"type";s:4:"file";s:3:"pid";i:75;s:4:"name";s:22:"product/productaddress";s:5:"title";s:18:"取还地址管理";s:4:"icon";s:14:"fa fa-circle-o";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516782063;s:10:"updatetime";i:1516782063;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:33;a:13:{s:2:"id";i:230;s:4:"type";s:4:"file";s:3:"pid";i:0;s:4:"name";s:7:"example";s:5:"title";s:12:"示例管理";s:4:"icon";s:11:"fa fa-magic";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516859009;s:10:"updatetime";i:1517370569;s:5:"weigh";i:0;s:6:"status";s:6:"hidden";}i:34;a:13:{s:2:"id";i:231;s:4:"type";s:4:"file";s:3:"pid";i:230;s:4:"name";s:22:"example/bootstraptable";s:5:"title";s:18:"表格完整示例";s:4:"icon";s:11:"fa fa-table";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516859009;s:10:"updatetime";i:1516859009;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:35;a:13:{s:2:"id";i:237;s:4:"type";s:4:"file";s:3:"pid";i:230;s:4:"name";s:18:"example/colorbadge";s:5:"title";s:12:"彩色角标";s:4:"icon";s:11:"fa fa-table";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516859009;s:10:"updatetime";i:1516859009;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:36;a:13:{s:2:"id";i:241;s:4:"type";s:4:"file";s:3:"pid";i:230;s:4:"name";s:22:"example/controllerjump";s:5:"title";s:18:"控制器间跳转";s:4:"icon";s:11:"fa fa-table";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516859009;s:10:"updatetime";i:1516859009;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:37;a:13:{s:2:"id";i:245;s:4:"type";s:4:"file";s:3:"pid";i:230;s:4:"name";s:16:"example/cxselect";s:5:"title";s:12:"多级联动";s:4:"icon";s:11:"fa fa-table";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516859009;s:10:"updatetime";i:1516859009;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:38;a:13:{s:2:"id";i:249;s:4:"type";s:4:"file";s:3:"pid";i:230;s:4:"name";s:18:"example/multitable";s:5:"title";s:15:"多表格示例";s:4:"icon";s:11:"fa fa-table";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516859010;s:10:"updatetime";i:1516859010;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}i:39;a:13:{s:2:"id";i:253;s:4:"type";s:4:"file";s:3:"pid";i:230;s:4:"name";s:21:"example/relationmodel";s:5:"title";s:18:"关联模型示例";s:4:"icon";s:11:"fa fa-table";s:9:"condition";s:0:"";s:6:"remark";s:0:"";s:6:"ismenu";i:1;s:10:"createtime";i:1516859010;s:10:"updatetime";i:1516859010;s:5:"weigh";i:0;s:6:"status";s:6:"normal";}} \ No newline at end of file diff --git a/runtime/temp/00146abd3297af63d316dfb03785dbe2.php b/runtime/temp/00146abd3297af63d316dfb03785dbe2.php new file mode 100644 index 00000000..bc849b6c --- /dev/null +++ b/runtime/temp/00146abd3297af63d316dfb03785dbe2.php @@ -0,0 +1,95 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +

    + + +

    +
    + + +
    + + +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/runtime/temp/1556919aa94353e99bae9818c08ae279.php b/runtime/temp/1556919aa94353e99bae9818c08ae279.php new file mode 100644 index 00000000..0ba24ae0 --- /dev/null +++ b/runtime/temp/1556919aa94353e99bae9818c08ae279.php @@ -0,0 +1,144 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +

    + + +

    +
    + + +
    + + +
    + + +
    +
    + + + + + + + + + + + + + + + +
    +
    +
    + + /> + + + +
    +
    + + +
    + $vo): ?> +
    + + + + +
    + +
    +
    + + /> + + /> + $vo): ?> + + $vo): ?> + + + + +
    + + + +
      +
      + +
      + + + +
      + + + + +
      +
      +
      + +
      + +
      +
      +
      +
      +
      +
      +
      + + + \ No newline at end of file diff --git a/runtime/temp/2353ad30076699e3d332c1e259b0035e.php b/runtime/temp/2353ad30076699e3d332c1e259b0035e.php new file mode 100644 index 00000000..f90c5fa0 --- /dev/null +++ b/runtime/temp/2353ad30076699e3d332c1e259b0035e.php @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      +
      +
      +
      + +

      趣侣行

      + +
      +
      +
      +
      +
      +
      + + +
      +
      +

      © 2017 FastAdmin. All Rights Reserved.

      +
      +
      + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime/temp/255c213c4673ed473eeab9704969a896.php b/runtime/temp/255c213c4673ed473eeab9704969a896.php new file mode 100644 index 00000000..7a6b9921 --- /dev/null +++ b/runtime/temp/255c213c4673ed473eeab9704969a896.php @@ -0,0 +1,80 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
      +
      +
      +
      +
      +
      +

      + + +

      +
      + + +
      + + +
      + + +
      +
      + + +
      +
      +
      +
      +
      + +
      + +
      +
      +
      + +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + \ No newline at end of file diff --git a/runtime/temp/26cfca9d2fd60c18f1c802135a7183f0.php b/runtime/temp/26cfca9d2fd60c18f1c802135a7183f0.php new file mode 100644 index 00000000..184441e2 --- /dev/null +++ b/runtime/temp/26cfca9d2fd60c18f1c802135a7183f0.php @@ -0,0 +1,263 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
      +
      +
      +
      +
      +
      +

      + + +

      +
      + + +
      + + +
      + + +
      + +
      +
      + + +
      + +
      +
      + $vo): ?> +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + /> + + + + + +
      +
      + + +
      + $vo): ?> +
      + + + + +
      + +
      +
      + + /> + + /> + $vo): ?> + + $vo): ?> + + + + +
      + + + +
        +
        + +
        + + + +
        + + + + +
        +
        +
        + +
        + + +
        +
        +
        +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + + +
        +
        + +
        + +
        +
        +
        +
        + +
        +
        +
        +
        +
        +
        + + + \ No newline at end of file diff --git a/runtime/temp/3559b6c8d80df7fcc03cbf1c498ac7fa.php b/runtime/temp/3559b6c8d80df7fcc03cbf1c498ac7fa.php new file mode 100644 index 00000000..ad54e882 --- /dev/null +++ b/runtime/temp/3559b6c8d80df7fcc03cbf1c498ac7fa.php @@ -0,0 +1,167 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
        +
        +
        +
        +
        +
        +

        + + +

        +
        + + +
        + + +
        + + +
        + +
        +
        +
        +
        + +
        +
        + +
        + +
        + +
        + +
        + +
        + +

        + +

        +
        + + +
        +
        + + +
        +
        + + +
        +
        + + +
        +
        + + +
        + +
        +
        +
        +
        + +
        +
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + +
        + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        + + + \ No newline at end of file diff --git a/runtime/temp/416d4e2d48c346edb6ab9c9d3795948f.php b/runtime/temp/416d4e2d48c346edb6ab9c9d3795948f.php new file mode 100644 index 00000000..209b4c50 --- /dev/null +++ b/runtime/temp/416d4e2d48c346edb6ab9c9d3795948f.php @@ -0,0 +1,84 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
        +
        +
        +
        +
        +
        +

        + + +

        +
        + + +
        + + +
        + + +
        +
        + + +
        +
        +
        +
        +
        + + +
        + +
        +
        +
        + +
        +
        +
        + +
        +
        +
        +
        +
        +
        + + + \ No newline at end of file diff --git a/runtime/temp/4c2f3cffe82e4216c9770fac31f53479.php b/runtime/temp/4c2f3cffe82e4216c9770fac31f53479.php new file mode 100644 index 00000000..795b4a64 --- /dev/null +++ b/runtime/temp/4c2f3cffe82e4216c9770fac31f53479.php @@ -0,0 +1,238 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
        +
        +
        +
        +
        +
        +

        + + +

        +
        + + +
        + + +
        + + +
        +
        + +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        +
        + +
        + + +
        + +
        +
          +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          + $vo): ?> + + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          +
          + +
          + + +
          + +
          +
            +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + + + +
            +
            + +
            + +
            +
            +
            +
            +
            +
            + + + \ No newline at end of file diff --git a/runtime/temp/4ef3c2050379db88b4bef778511eea59.php b/runtime/temp/4ef3c2050379db88b4bef778511eea59.php new file mode 100644 index 00000000..c972525c --- /dev/null +++ b/runtime/temp/4ef3c2050379db88b4bef778511eea59.php @@ -0,0 +1,186 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
            +
            +
            +
            +
            +
            +

            + + +

            +
            + + +
            + + +
            + + +
            +
            + +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            + $vo): ?> + + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            + $vo): ?> + + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            + +
            + +
            +
            +
            +
            +
            +
            + + + \ No newline at end of file diff --git a/runtime/temp/52f752c152d26d536974e0810137493e.php b/runtime/temp/52f752c152d26d536974e0810137493e.php new file mode 100644 index 00000000..79fad10b --- /dev/null +++ b/runtime/temp/52f752c152d26d536974e0810137493e.php @@ -0,0 +1,95 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
            +
            +
            +
            +
            +
            +

            + + +

            +
            + + +
            + + +
            + + +
            +
            + + +
            +
            +
            +
            +
            + + + + + + + +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            +
            +
            +
            + + + \ No newline at end of file diff --git a/runtime/temp/57a564f326c5be8a8c49c20080d07181.php b/runtime/temp/57a564f326c5be8a8c49c20080d07181.php new file mode 100644 index 00000000..926d0811 --- /dev/null +++ b/runtime/temp/57a564f326c5be8a8c49c20080d07181.php @@ -0,0 +1,282 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
            +
            +
            +
            +
            +
            +

            + + +

            +
            + + +
            + + +
            + + +
            + +
            + + +
            +
            + + +
            +
            +
            +
            +
            + + + +
            + + +
            + +
            + + +
            + +
            +
            + +
            +
            +
            + + + + + + +
            +
            +
            +
            +
            +
            + + + \ No newline at end of file diff --git a/runtime/temp/58e25e2d7e90c46ae3455da8b8bf2e6a.php b/runtime/temp/58e25e2d7e90c46ae3455da8b8bf2e6a.php new file mode 100644 index 00000000..105ccab6 --- /dev/null +++ b/runtime/temp/58e25e2d7e90c46ae3455da8b8bf2e6a.php @@ -0,0 +1,184 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
            +
            +
            +
            +
            +
            +

            + + +

            +
            + + +
            + + +
            + + +
            +
            + +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            +
            + +
            + + +
            + +
            +
              +
              +
              +
              + +
              +
              + +
              + + +
              + +
              +
                +
                +
                +
                + +
                + +
                + $vo): ?> + + +
                + +
                +
                +
                + +
                + +
                +
                +
                + +
                + +
                +
                +
                + +
                + +
                +
                +
                + +
                + +
                + $vo): ?> + + +
                + +
                +
                +
                + +
                + +
                +
                +
                + +
                + +
                + $vo): ?> + + +
                + +
                +
                +
                + +
                + +
                + $vo): ?> + + +
                + +
                +
                + +
                + +
                +
                +
                +
                +
                +
                + + + \ No newline at end of file diff --git a/runtime/temp/6514e1be9a6ae348afc413b1f53c58d7.php b/runtime/temp/6514e1be9a6ae348afc413b1f53c58d7.php new file mode 100644 index 00000000..b66953a1 --- /dev/null +++ b/runtime/temp/6514e1be9a6ae348afc413b1f53c58d7.php @@ -0,0 +1,95 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
                +
                +
                +
                +
                +
                +

                + + +

                +
                + + +
                + + +
                + + +
                +
                + + +
                +
                +
                +
                +
                + + + + + + + +
                + +
                +
                +
                + +
                +
                +
                + +
                +
                +
                +
                +
                +
                + + + \ No newline at end of file diff --git a/runtime/temp/6b8ba4c18a923d1e42771ff38e0dcc88.php b/runtime/temp/6b8ba4c18a923d1e42771ff38e0dcc88.php new file mode 100644 index 00000000..07fc1cee --- /dev/null +++ b/runtime/temp/6b8ba4c18a923d1e42771ff38e0dcc88.php @@ -0,0 +1,184 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
                +
                +
                +
                +
                +
                +

                + + +

                +
                + + +
                + + +
                + + +
                +
                + +
                + +
                + +
                +
                +
                + +
                + +
                +
                +
                + +
                +
                + +
                + + +
                + +
                +
                  +
                  +
                  +
                  + +
                  +
                  + +
                  + + +
                  + +
                  +
                    +
                    +
                    +
                    + +
                    + +
                    + $vo): ?> + + +
                    + +
                    +
                    +
                    + +
                    + +
                    +
                    +
                    + +
                    + +
                    +
                    +
                    + +
                    + +
                    +
                    +
                    + +
                    + +
                    + $vo): ?> + + +
                    + +
                    +
                    +
                    + +
                    + +
                    +
                    +
                    + +
                    + +
                    + $vo): ?> + + +
                    + +
                    +
                    +
                    + +
                    + +
                    + $vo): ?> + + +
                    + +
                    +
                    + +
                    + +
                    +
                    +
                    +
                    +
                    +
                    + + + \ No newline at end of file diff --git a/runtime/temp/8a377f5e5603ce6b2a456c870c421016.php b/runtime/temp/8a377f5e5603ce6b2a456c870c421016.php new file mode 100644 index 00000000..9f089461 --- /dev/null +++ b/runtime/temp/8a377f5e5603ce6b2a456c870c421016.php @@ -0,0 +1,90 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
                    +
                    +
                    +
                    +
                    +
                    +

                    + + +

                    +
                    + + +
                    + + +
                    + + +
                    +
                    + + +
                    +
                    +
                    +
                    +
                    + + +
                    + +
                    +
                    +
                    + +
                    +
                    +
                    + +
                    +
                    +
                    +
                    +
                    +
                    + + + \ No newline at end of file diff --git a/runtime/temp/8bf3e96f30d60df47b7df3deeeefb02a.php b/runtime/temp/8bf3e96f30d60df47b7df3deeeefb02a.php new file mode 100644 index 00000000..9ce1a08b --- /dev/null +++ b/runtime/temp/8bf3e96f30d60df47b7df3deeeefb02a.php @@ -0,0 +1,125 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + + +
                    + +
                    + + + \ No newline at end of file diff --git a/runtime/temp/e385ae64c0c484dafdf1336fd251d2df.php b/runtime/temp/e385ae64c0c484dafdf1336fd251d2df.php new file mode 100644 index 00000000..82b7f672 --- /dev/null +++ b/runtime/temp/e385ae64c0c484dafdf1336fd251d2df.php @@ -0,0 +1,388 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + +
                    + + + + + + +
                    + +
                    + +
                    + + Copyright © 2017-2018 >. All rights + reserved. +
                    + + +
                    + + + + +
                    + + + + + \ No newline at end of file diff --git a/runtime/temp/f2ad31936a175df9f487e6d5dc0822d8.php b/runtime/temp/f2ad31936a175df9f487e6d5dc0822d8.php new file mode 100644 index 00000000..df8c1e7f --- /dev/null +++ b/runtime/temp/f2ad31936a175df9f487e6d5dc0822d8.php @@ -0,0 +1,169 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
                    +
                    +
                    +
                    +
                    +
                    +

                    + + +

                    +
                    + + +
                    + + +
                    + + +
                    +
                    +
                    + +
                    + __('Yes'), '0'=>__('No')], $row['ismenu']); ?> +
                    +
                    +
                    + +
                    + 'form-control', 'required'=>'']); ?> +
                    +
                    +
                    + +
                    + +
                    +
                    +
                    + +
                    + +
                    +
                    +
                    + +
                    +
                    + + +
                    +
                    +
                    +
                    + +
                    + +
                    +
                    +
                    + +
                    + +
                    +
                    +
                    + +
                    + +
                    +
                    +
                    + +
                    + __('Normal'), 'hidden'=>__('Hidden')], $row['status']); ?> +
                    +
                    + +
                    + + +
                    +
                    +
                    +
                    +
                    +
                    + + + \ No newline at end of file diff --git a/runtime/temp/f5d0cf98a8834c74c101a42f43ddc758.php b/runtime/temp/f5d0cf98a8834c74c101a42f43ddc758.php new file mode 100644 index 00000000..f75bfff2 --- /dev/null +++ b/runtime/temp/f5d0cf98a8834c74c101a42f43ddc758.php @@ -0,0 +1,95 @@ + + + + + +<?php echo (isset($title) && ($title !== '')?$title:''); ?> + + + + + + + + + + + + + +
                    +
                    +
                    +
                    +
                    +
                    +

                    + + +

                    +
                    + + +
                    + + +
                    + + +
                    +
                    + + +
                    +
                    +
                    +
                    +
                    + + + + + + + +
                    + +
                    +
                    +
                    + +
                    +
                    +
                    + +
                    +
                    +
                    +
                    +
                    +
                    + + + \ No newline at end of file diff --git a/think b/think old mode 100755 new mode 100644