diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index cd13b271f4da5a519d7d2a0dcc6b73cd99053606..0000000000000000000000000000000000000000
--- a/.gitignore
+++ /dev/null
@@ -1,15 +0,0 @@
-/nbproject/
-/thinkphp/
-/vendor/
-/runtime/
-/addons/*
-/application/admin/command/Install/*.lock
-/public/assets/libs/
-/public/assets/addons/*
-/public/uploads/
-.idea
-composer.lock
-*.log
-*.css.map
-!.gitkeep
-.env
diff --git a/.idea/fastadmin.iml b/.idea/fastadmin.iml
new file mode 100644
index 0000000000000000000000000000000000000000..c956989b29ad0767edc6cf3a202545927c3d1e76
--- /dev/null
+++ b/.idea/fastadmin.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e62fe69269ae0f9962fed13e9d9f7b8dbce5f88f
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b61da76545c3641440032e8ad68e3453cd61ad6a
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..94a25f7f4cb416c083d265558da75d457237d671
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
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/.gitkeep b/addons/.gitkeep
deleted file mode 100644
index 8b137891791fe96927ad78e64b0aad7bded08bdc..0000000000000000000000000000000000000000
--- a/addons/.gitkeep
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/addons/alisms/Alisms.php b/addons/alisms/Alisms.php
new file mode 100644
index 0000000000000000000000000000000000000000..44dd9601ee05ad101ba3fb7957e5963acfee2977
--- /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 0000000000000000000000000000000000000000..73ee5d82c706cbce2a1fa346233b1e47bf15bd51
--- /dev/null
+++ b/addons/alisms/config.php
@@ -0,0 +1,69 @@
+
+ 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' => '',
+ 'changepwd' => 'SMS_114000000',
+ ),
+ '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 0000000000000000000000000000000000000000..46d6ea2a16a0100aa1f473155e03b6db1ad8a310
--- /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 0000000000000000000000000000000000000000..3b8e23b51b9885006d83b9843645114a136cc4a5
--- /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 0000000000000000000000000000000000000000..c99efa08af2dcdf5aea32bf36e3cd3cadfc7eeeb
--- /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 0000000000000000000000000000000000000000..1bfae92e2e1d10b9deb84148742a0786917625d2
--- /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 0000000000000000000000000000000000000000..8e3d7253fdc8dc214a3bee496a8004cdeae44f6d
--- /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 0000000000000000000000000000000000000000..dac224290ad2d683259fa7c65612d4c844d6bd72
--- /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 0000000000000000000000000000000000000000..73dfdd0820cb00053fcbdeab86c07d27fe1b1b98
--- /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 0000000000000000000000000000000000000000..6f51e6e7c4fc908c4cbd54ef46afb6c355628f9f
--- /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 0000000000000000000000000000000000000000..826e56b2c749e7b0e006dcb745764b92b923316a
--- /dev/null
+++ b/addons/crontab/application/admin/view/general/crontab/add.html
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 0000000000000000000000000000000000000000..caa2aea4b63e8b3520abd294ba3265b355c36d7c
--- /dev/null
+++ b/addons/crontab/application/admin/view/general/crontab/edit.html
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 0000000000000000000000000000000000000000..382ef043a5b880cf9a239a1e24b9d97b997ca803
--- /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 0000000000000000000000000000000000000000..fa4d60a4e9179f22d30aa3a677fab577b60bb1fc
--- /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 0000000000000000000000000000000000000000..b62512838d61fcfb139998b7643eec0db85d6ede
--- /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 0000000000000000000000000000000000000000..0ba12a9335c83eb32b10805a9da887e6e1dbbd9f
--- /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 0000000000000000000000000000000000000000..52b5f2328c2609022cf22462e8988ec4ab9c5f9c
--- /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 0000000000000000000000000000000000000000..bc9fa3b6db33b04c98cd46cdca34f34f2d839d55
--- /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 0000000000000000000000000000000000000000..cb5b415a0e9d785e345ff5d9bd04b4265888e367
--- /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 0000000000000000000000000000000000000000..4d338088ea1d05a7b5583a00845a2a8a01028048
--- /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 0000000000000000000000000000000000000000..28a3b2ccab10264dea24dc3641fd8d2656e88943
--- /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 0000000000000000000000000000000000000000..fb84e4c9da9fe43cd296c0bb6ce21a23e5c25ee4
--- /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 0000000000000000000000000000000000000000..3c8570f9ae42cf30b61e37de65a84a5dd20c530b
--- /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 0000000000000000000000000000000000000000..28a3b2ccab10264dea24dc3641fd8d2656e88943
--- /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 0000000000000000000000000000000000000000..c9d91142e24d0fdb043eb330a5fb15acd28ca914
--- /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 0000000000000000000000000000000000000000..4368d6cfa3d146d8948790d40107f60b30d1bf82
--- /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 0000000000000000000000000000000000000000..b73261e0dd3f55ef345981e68139f5e5a51222f4
--- /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 0000000000000000000000000000000000000000..26674a36dae173a2cace3b4e4b78d00842b9e7b5
--- /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 0000000000000000000000000000000000000000..1e5862680f8d02f6f0ef3523b737032bc475f71e
--- /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 0000000000000000000000000000000000000000..4e0c851d986afd200c6a8e8fe6151d44b80d5440
--- /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 0000000000000000000000000000000000000000..fc5c1088c4d135558e5c15c3f9863ff10384f386
--- /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 0000000000000000000000000000000000000000..fe6d8988ff02a9c4c3a4fe0dfd8f0cbd0f9c29ac
--- /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 0000000000000000000000000000000000000000..1088a2935026f5134f6f4badcd7b2b374f87e811
--- /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 0000000000000000000000000000000000000000..8b53df73781b368323fe429764c2f807ee6994af
--- /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 0000000000000000000000000000000000000000..3c396bbc7ad7faf872d7815be0c6f0f1e1fea91e
--- /dev/null
+++ b/addons/third/model/Third.php
@@ -0,0 +1,22 @@
+model = model('CompanySet');
+ $this->view->assign("companyscaledataList", $this->model->getCompanyscaledataList());
+ $this->view->assign("companresourcesdataList", $this->model->getCompanresourcesdataList());
+ $this->view->assign("offlinestoredataList", $this->model->getOfflinestoredataList());
+ $this->view->assign("cooperationplatformdataList", $this->model->getCooperationplatformdataList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/general/Crontab.php b/application/admin/controller/general/Crontab.php
new file mode 100644
index 0000000000000000000000000000000000000000..73dfdd0820cb00053fcbdeab86c07d27fe1b1b98
--- /dev/null
+++ b/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/application/admin/controller/order/Order.php b/application/admin/controller/order/Order.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e00ed5fe9b0c725381da117317b23306a0a582c
--- /dev/null
+++ b/application/admin/controller/order/Order.php
@@ -0,0 +1,38 @@
+model = model('Order');
+ $this->view->assign("orderStatusList", $this->model->getOrderStatusList());
+ $this->view->assign("commentStatusList", $this->model->getCommentStatusList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/product/Newtravel.php b/application/admin/controller/product/Newtravel.php
new file mode 100644
index 0000000000000000000000000000000000000000..b1eed94a80f4dbed3c940347ec080d2e6328d9a0
--- /dev/null
+++ b/application/admin/controller/product/Newtravel.php
@@ -0,0 +1,42 @@
+model = model('NewTravel');
+ $this->view->assign("typeslistList", $this->model->getTypeslistList());
+ $this->view->assign("travelersnumberdataList", $this->model->getTravelersnumberdataList());
+ $this->view->assign("travelerinformationdataList", $this->model->getTravelerinformationdataList());
+ $this->view->assign("tripinformationdataList", $this->model->getTripinformationdataList());
+ $this->view->assign("backaddressdataList", $this->model->getBackaddressdataList());
+ $this->view->assign("receivingaddressdataList", $this->model->getReceivingaddressdataList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/product/Productaddress.php b/application/admin/controller/product/Productaddress.php
new file mode 100644
index 0000000000000000000000000000000000000000..18959d538b6758d81c36075536dc3e7cee1c5a7e
--- /dev/null
+++ b/application/admin/controller/product/Productaddress.php
@@ -0,0 +1,37 @@
+model = model('ProductAddress');
+
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/product/Productairport.php b/application/admin/controller/product/Productairport.php
new file mode 100644
index 0000000000000000000000000000000000000000..acd45b8a79d0d58568510c5869e1e153dd043771
--- /dev/null
+++ b/application/admin/controller/product/Productairport.php
@@ -0,0 +1,39 @@
+model = model('ProductAirport');
+ $this->view->assign("advancedataList", $this->model->getAdvancedataList());
+ $this->view->assign("listList", $this->model->getListList());
+ $this->view->assign("statusList", $this->model->getStatusList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/product/Productcar.php b/application/admin/controller/product/Productcar.php
new file mode 100644
index 0000000000000000000000000000000000000000..440191b1f6765f84ba20377be47e0af947110838
--- /dev/null
+++ b/application/admin/controller/product/Productcar.php
@@ -0,0 +1,38 @@
+model = model('ProductCar');
+ $this->view->assign("advancedataList", $this->model->getAdvancedataList());
+ $this->view->assign("listList", $this->model->getListList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/product/Productcarrental.php b/application/admin/controller/product/Productcarrental.php
new file mode 100644
index 0000000000000000000000000000000000000000..7ffeb220b7dbc3bfd697d1075d7f1219c9ae3567
--- /dev/null
+++ b/application/admin/controller/product/Productcarrental.php
@@ -0,0 +1,38 @@
+model = model('ProductCarRental');
+ $this->view->assign("advancedataList", $this->model->getAdvancedataList());
+ $this->view->assign("listList", $this->model->getListList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/product/Productday.php b/application/admin/controller/product/Productday.php
new file mode 100644
index 0000000000000000000000000000000000000000..e3c09c37a62bfa6f5aaa17e6a835b631f1798d92
--- /dev/null
+++ b/application/admin/controller/product/Productday.php
@@ -0,0 +1,38 @@
+model = model('ProductDay');
+ $this->view->assign("advancedataList", $this->model->getAdvancedataList());
+ $this->view->assign("listList", $this->model->getListList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/product/Productexperience.php b/application/admin/controller/product/Productexperience.php
new file mode 100644
index 0000000000000000000000000000000000000000..ce027ec0a0c2a358f1b804d0e08192089d2eccf9
--- /dev/null
+++ b/application/admin/controller/product/Productexperience.php
@@ -0,0 +1,39 @@
+model = model('ProductExperience');
+ $this->view->assign("advancedataList", $this->model->getAdvancedataList());
+ $this->view->assign("outDataList", $this->model->getOutDataList());
+ $this->view->assign("listList", $this->model->getListList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/product/Productfood.php b/application/admin/controller/product/Productfood.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e97f01b2b03589ac06febb2a562b02f6fbeda3f
--- /dev/null
+++ b/application/admin/controller/product/Productfood.php
@@ -0,0 +1,38 @@
+model = model('ProductFood');
+ $this->view->assign("advancedataList", $this->model->getAdvancedataList());
+ $this->view->assign("listList", $this->model->getListList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/product/Producthotels.php b/application/admin/controller/product/Producthotels.php
new file mode 100644
index 0000000000000000000000000000000000000000..9ea8591f0b654cb6b463a54d4e1a13438ab3ca1f
--- /dev/null
+++ b/application/admin/controller/product/Producthotels.php
@@ -0,0 +1,40 @@
+model = model('ProductHotels');
+ $this->view->assign("advancedataList", $this->model->getAdvancedataList());
+ $this->view->assign("outDataList", $this->model->getOutDataList());
+ $this->view->assign("hotelListList", $this->model->getHotelListList());
+ $this->view->assign("listList", $this->model->getListList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/product/Productlocal.php b/application/admin/controller/product/Productlocal.php
new file mode 100644
index 0000000000000000000000000000000000000000..a85d3bcfb1f6ad647896bbdb91cfe837758d767d
--- /dev/null
+++ b/application/admin/controller/product/Productlocal.php
@@ -0,0 +1,38 @@
+model = model('ProductLocal');
+ $this->view->assign("outDataList", $this->model->getOutDataList());
+ $this->view->assign("listList", $this->model->getListList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/product/Productmanydays.php b/application/admin/controller/product/Productmanydays.php
new file mode 100644
index 0000000000000000000000000000000000000000..bde65a879781ce885971f0d94061d2684a4959c0
--- /dev/null
+++ b/application/admin/controller/product/Productmanydays.php
@@ -0,0 +1,41 @@
+model = model('ProductManydays');
+ $this->view->assign("advancedataList", $this->model->getAdvancedataList());
+ $this->view->assign("outDataList", $this->model->getOutDataList());
+ $this->view->assign("hotelListList", $this->model->getHotelListList());
+ $this->view->assign("listList", $this->model->getListList());
+ $this->view->assign("statusList", $this->model->getStatusList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/product/Productshow.php b/application/admin/controller/product/Productshow.php
new file mode 100644
index 0000000000000000000000000000000000000000..e7a75944c398e1b7be7663039a737fa55854deb1
--- /dev/null
+++ b/application/admin/controller/product/Productshow.php
@@ -0,0 +1,39 @@
+model = model('ProductShow');
+ $this->view->assign("advancedataList", $this->model->getAdvancedataList());
+ $this->view->assign("outDataList", $this->model->getOutDataList());
+ $this->view->assign("listList", $this->model->getListList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/product/Producttickets.php b/application/admin/controller/product/Producttickets.php
new file mode 100644
index 0000000000000000000000000000000000000000..a057418ad2a0f4ad802d4df3d793c9b817a24d82
--- /dev/null
+++ b/application/admin/controller/product/Producttickets.php
@@ -0,0 +1,39 @@
+model = model('ProductTickets');
+ $this->view->assign("advancedataList", $this->model->getAdvancedataList());
+ $this->view->assign("statusList", $this->model->getStatusList());
+ $this->view->assign("listList", $this->model->getListList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/product/Producttraffic.php b/application/admin/controller/product/Producttraffic.php
new file mode 100644
index 0000000000000000000000000000000000000000..c305b1783fbe628d0ba161b0ac452235dc3c3973
--- /dev/null
+++ b/application/admin/controller/product/Producttraffic.php
@@ -0,0 +1,39 @@
+model = model('ProductTraffic');
+ $this->view->assign("advancedataList", $this->model->getAdvancedataList());
+ $this->view->assign("outDataList", $this->model->getOutDataList());
+ $this->view->assign("listList", $this->model->getListList());
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/controller/raiders/Raiders.php b/application/admin/controller/raiders/Raiders.php
new file mode 100644
index 0000000000000000000000000000000000000000..d5ed50b9c85fb12584b4145ba9ed2834fb6b45b9
--- /dev/null
+++ b/application/admin/controller/raiders/Raiders.php
@@ -0,0 +1,37 @@
+model = model('Raiders');
+
+ }
+
+ /**
+ * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
+ * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
+ * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+ */
+
+
+}
diff --git a/application/admin/lang/zh-cn/company/companyset.php b/application/admin/lang/zh-cn/company/companyset.php
new file mode 100644
index 0000000000000000000000000000000000000000..3c8318c5407d11da09421adbc0176eab25522701
--- /dev/null
+++ b/application/admin/lang/zh-cn/company/companyset.php
@@ -0,0 +1,46 @@
+ '公司全称',
+ 'Storename' => '店铺名称',
+ 'Storeavatar' => '店铺LOGO',
+ 'Serveavatar' => '客服头像',
+ 'Companyscaledata' => '公司规模',
+ 'Companyscaledata 1' => '少于10人',
+ 'Companyscaledata 2' => '10-99人',
+ 'Companyscaledata 3' => '100-299人',
+ 'Companyscaledata 4' => '300-499人',
+ 'Companyscaledata 5' => '500人以上',
+ 'Companytime' => '公司成立日期',
+ 'Companyaddress' => '公司主要办公地址所在地',
+ 'Companyhttp' => '官网链接',
+ 'Companresourcesdata' => '公司自有的当地旅行资源',
+ 'Companresourcesdata 1' => '机票',
+ 'Companresourcesdata 2' => '酒店',
+ 'Companresourcesdata 3' => '景点门票',
+ 'Companresourcesdata 4' => '车',
+ 'Companresourcesdata 5' => '导游',
+ 'Companresourcesdata 6' => '交通票劵',
+ 'Companresourcesdata 7' => '餐饮',
+ 'Companresourcesdata 8' => '无',
+ 'Companresourcesdata 9' => '其他',
+ 'Resourcessuperiority' => '独家资源优势',
+ 'Offlinestoredata' => '线下是否有门店',
+ 'Offlinestoredata 1' => '无门店',
+ 'Offlinestoredata 2' => '1家',
+ 'Offlinestoredata 3' => '2-5家',
+ 'Offlinestoredata 4' => '6-10家',
+ 'Offlinestoredata 5' => '11-20家',
+ 'Offlinestoredata 6' => '20家以上',
+ 'Cooperationplatformdata' => '目前合作过的电商平台',
+ 'Cooperationplatformdata 1' => '携程',
+ 'Cooperationplatformdata 2' => '飞猪',
+ 'Cooperationplatformdata 3' => '去哪儿',
+ 'Cooperationplatformdata 4' => '穷游',
+ 'Cooperationplatformdata 5' => '途牛',
+ 'Cooperationplatformdata 6' => '同城',
+ 'Cooperationplatformdata 7' => '驴妈妈',
+ 'Cooperationplatformdata 8' => '美团',
+ 'Cooperationplatformdata 9' => '无',
+ 'Cooperationplatformdata 10' => '其他'
+];
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 0000000000000000000000000000000000000000..6f51e6e7c4fc908c4cbd54ef46afb6c355628f9f
--- /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/lang/zh-cn/order/order.php b/application/admin/lang/zh-cn/order/order.php
new file mode 100644
index 0000000000000000000000000000000000000000..7aaf007b63ddcc001f7c525f889142ea2ff2084e
--- /dev/null
+++ b/application/admin/lang/zh-cn/order/order.php
@@ -0,0 +1,26 @@
+ 'ID',
+ 'User_id' => '关联user表 用户id',
+ 'Order_num' => '订单编号',
+ 'Order_status' => '订单状态',
+ 'Order_status 0' => '未支付',
+ 'Order_status 1' => '已支付',
+ 'Travel_start_time' => '出行日期',
+ 'Travel_end_time' => '结束日期',
+ 'Product_name' => '产品名称',
+ 'Comment_status' => '点评状态',
+ 'Comment_status 0' => '未点评',
+ 'Comment_status 1' => '已点评',
+ 'Order_start_time' => '订单生成起始日期',
+ 'Total_num' => '订单金额',
+ 'Already_rechage_num' => '已付金额',
+ 'Notice' => '通知TODO',
+ 'Reconciliation_time' => '对账时间',
+ 'Buy_detail' => '购买详情',
+ 'Reduction_strategy' => '减价策略',
+ 'Ota_name' => 'OTA产品名称',
+ 'Pay_id' => '主支付信息id',
+ 'Supplier_id' => '供应商'
+];
diff --git a/application/admin/lang/zh-cn/product/newtravel.php b/application/admin/lang/zh-cn/product/newtravel.php
new file mode 100644
index 0000000000000000000000000000000000000000..821c4c8019cbe16e5aea281cbf2641ceb159f217
--- /dev/null
+++ b/application/admin/lang/zh-cn/product/newtravel.php
@@ -0,0 +1,122 @@
+ 'id',
+ 'Traveltext' => '模版名称',
+ 'Typeslist' => '模版适应类型',
+ 'Typeslist 1' => '全部',
+ 'Typeslist 2' => '机+酒',
+ 'Typeslist 3' => '特价机票',
+ 'Typeslist 4' => '半自助',
+ 'Typeslist 5' => '跟团',
+ 'Typeslist 6' => '景点门票',
+ 'Typeslist 7' => '一日游',
+ 'Typeslist 8' => '多日游',
+ 'Typeslist 9' => '当地订制',
+ 'Typeslist 10' => '酒店套餐',
+ 'Typeslist 11' => '演出展览',
+ 'Typeslist 12' => '当地体验',
+ 'Typeslist 13' => '美食',
+ 'Typeslist 14' => '接送机',
+ 'Typeslist 15' => '包车/拼车',
+ 'Typeslist 16' => '交通卡/劵',
+ 'Typeslist 17' => '租车',
+ 'Typeslist 18' => '签证',
+ 'Typeslist 19' => 'WIFI',
+ 'Typeslist 20' => '电话卡',
+ 'Typeslist 21' => '保险',
+ 'Typeslist 22' => '自由行定制',
+ 'Typeslist 23' => '游轮',
+ 'Typeslist 24' => '打折劵',
+ 'Typeslist 25' => '购物',
+ 'Travelersnumberdata' => '出行人信息',
+ 'Travelersnumberdata 1' => '一个人',
+ 'Travelersnumberdata 2' => '多人出行(仅出行人信息需要填写多份)',
+ 'Travelerinformationdata' => '出行人信息',
+ 'Travelerinformationdata 1' => '中文姓名',
+ 'Travelerinformationdata 2' => '姓(拼音)',
+ 'Travelerinformationdata 3' => '名(拼音)',
+ 'Travelerinformationdata 4' => '证件类型',
+ 'Travelerinformationdata 5' => '有效期',
+ 'Travelerinformationdata 6' => '出生日期',
+ 'Travelerinformationdata 7' => '性别',
+ 'Travelerinformationdata 8' => '国籍',
+ 'Travelerinformationdata 9' => '联系电话',
+ 'Travelerinformationdata 10' => '身高(cm)',
+ 'Travelerinformationdata 11' => '体重(kg)',
+ 'Travelerinformationdata 12' => '鞋码(欧码)',
+ 'Travelerinformationdata 13' => '左眼视力',
+ 'Travelerinformationdata 14' => '右眼视力',
+ 'Tripinformationdata' => '行程信息',
+ 'Tripinformationdata 1' => '境外联系电话',
+ 'Tripinformationdata 2' => '微信号',
+ 'Tripinformationdata 3' => '预约时间',
+ 'Tripinformationdata 4' => '出行人数',
+ 'Tripinformationdata 5' => '行李数',
+ 'Tripinformationdata 6' => '接人时间',
+ 'Tripinformationdata 7' => '接人地点',
+ 'Tripinformationdata 8' => '接人地点(英文)',
+ 'Tripinformationdata 9' => '送达地点',
+ 'Tripinformationdata 10' => '送达地点(英文)',
+ 'Tripinformationdata 11' => '接人酒店名称',
+ 'Tripinformationdata 12' => '接人酒店地址',
+ 'Tripinformationdata 13' => '接人酒店名称(英文)',
+ 'Tripinformationdata 14' => '接人酒店地址(英文)',
+ 'Tripinformationdata 15' => '接人酒店电话',
+ 'Tripinformationdata 16' => '接机航班号',
+ 'Tripinformationdata 17' => '航班抵达日期',
+ 'Tripinformationdata 18' => '航班抵达时间',
+ 'Tripinformationdata 19' => '送达酒店名称',
+ 'Tripinformationdata 20' => '送达酒店地址',
+ 'Tripinformationdata 21' => '送达酒店名称(英文)',
+ 'Tripinformationdata 22' => '送达酒店地址(英文)',
+ 'Tripinformationdata 23' => '送达酒店电话',
+ 'Tripinformationdata 24' => '送机航班号',
+ 'Tripinformationdata 25' => '航班起飞日期',
+ 'Tripinformationdata 26' => '航班起飞时间',
+ 'Tripinformationdata 27' => '出发酒店名称(英文)',
+ 'Tripinformationdata 28' => '出发酒店名称(中文)',
+ 'Tripinformationdata 29' => '出发酒店地址(英文)',
+ 'Tripinformationdata 30' => '出发酒店电话',
+ 'Tripinformationdata 31' => '接送酒店名称(英文)',
+ 'Tripinformationdata 32' => '接送酒店地址(英文)',
+ 'Tripinformationdata 33' => '接送酒店电话',
+ 'Tripinformationdata 34' => '过夜酒店名称(英文)',
+ 'Tripinformationdata 35' => '过夜酒店地址(英文)',
+ 'Tripinformationdata 36' => '用车时间',
+ 'Tripinformationdata 37' => '用车地点',
+ 'Tripinformationdata 38' => '接机/送机航班号',
+ 'Tripinformationdata 39' => '降落/起飞时间',
+ 'Tripinformationdata 40' => '接人/送达地点',
+ 'Tripinformationdata 41' => '用车人数',
+ 'Tripinformationdata 42' => '返回酒店名称(英文)',
+ 'Tripinformationdata 43' => '返回酒店地址(英文)',
+ 'Tripinformationdata 44' => '返回酒店电话',
+ 'Tripinformationdata 45' => '行程计划',
+ 'Tripinformationdata 46' => '返程送回酒店名称(英文)',
+ 'Tripinformationdata 47' => '返程送回酒店地址(英文)',
+ 'Tripinformationdata 48' => '返程送回酒店电话',
+ 'Tripinformationdata 49' => '酒店名称(英文)',
+ 'Tripinformationdata 50' => '酒店地址(英文)',
+ 'Tripinformationdata 51' => '酒店联系电话',
+ 'Tripinformationdata 52' => '入住酒店日期',
+ 'Tripinformationdata 53' => '离开酒店日期',
+ 'Tripinformationdata 54' => '返程航班号/火车列次',
+ 'Tripinformationdata 55' => '返程日期',
+ 'Tripinformationdata 56' => '返程航班/列次时间',
+ 'Tripinformationdata 57' => '取还设备地址',
+ 'Tripinformationdata 58' => '预计出行日期',
+ 'Tripinformationdata 59' => '到达火车车次',
+ 'Tripinformationdata 60' => '到达车站',
+ 'Tripinformationdata 61' => '出发时间(单选)',
+ 'Tripinformationdata 62' => '出发班次',
+ 'Tripinformationdata 63' => '出发酒店所在区域',
+ 'Tripinformationdata 64' => '用餐时间',
+ 'Backaddressdata' => '取还地址',
+ 'Backaddressdata 1' => '取件地址',
+ 'Backaddressdata 2' => '还回地址',
+ 'Receivingaddressdata' => '收货地址',
+ 'Receivingaddressdata 1' => '收货人姓名',
+ 'Receivingaddressdata 2' => '收货人电话',
+ 'Receivingaddressdata 3' => '收货地址'
+];
diff --git a/application/admin/lang/zh-cn/product/productaddress.php b/application/admin/lang/zh-cn/product/productaddress.php
new file mode 100644
index 0000000000000000000000000000000000000000..5330d36590de88687f48b55e72f52c2140b607a1
--- /dev/null
+++ b/application/admin/lang/zh-cn/product/productaddress.php
@@ -0,0 +1,13 @@
+ 'ID',
+ 'City' => '取件城市 ',
+ 'Airport' => '机场',
+ 'Terminal' => '航站楼',
+ 'Place' => '地点',
+ 'Username' => '姓名',
+ 'Tel' => '电话',
+ 'Opentime' => '开始营业时间',
+ 'Closetime' => '结束营业时间'
+];
diff --git a/application/admin/lang/zh-cn/product/productairport.php b/application/admin/lang/zh-cn/product/productairport.php
new file mode 100644
index 0000000000000000000000000000000000000000..838223379cd0333eed4140c9e8d5901bd536892e
--- /dev/null
+++ b/application/admin/lang/zh-cn/product/productairport.php
@@ -0,0 +1,33 @@
+ 'ID',
+ 'Name' => '产品名称(中文)',
+ 'Lightwords' => '亮点词',
+ 'Destination' => '目的地',
+ 'Homeimages' => '轮播图',
+ 'Cost_production' => '产品原价',
+ 'Advancedata' => '提前预定',
+ 'Advancedata 0' => '无',
+ 'Advancedata 1' => '可定今日',
+ 'Advancedata 2' => '可定明日',
+ 'Advancedata 3' => '提前预订',
+ 'Explanation' => '预订说明',
+ 'Travel_template_information' => '出行模板信息',
+ 'Supplier' => '产品提供商',
+ 'Supplier_price' => '供应商app减价',
+ 'Startdate' => '减价开始时间',
+ 'Enddate' => '减价结束时间',
+ 'Introductioncontent' => '产品介绍',
+ 'Descriptioncontent' => '费用说明',
+ 'Useinfocontent' => '使用说明',
+ 'Informationcontent' => '购买须知',
+ 'In_stock' => '库存',
+ 'List' => '状态',
+ 'List 0' => '未上线',
+ 'List 1' => '已上线',
+ 'List 2' => '人工下线',
+ 'List 3' => '系统下线',
+ 'List 4' => '审核下线',
+ 'Status' => '状态'
+];
diff --git a/application/admin/lang/zh-cn/product/productcar.php b/application/admin/lang/zh-cn/product/productcar.php
new file mode 100644
index 0000000000000000000000000000000000000000..ca31d222ce082cbb76c5db7de96d1ccbdfab29fa
--- /dev/null
+++ b/application/admin/lang/zh-cn/product/productcar.php
@@ -0,0 +1,37 @@
+ 'ID',
+ 'Name' => '产品名称(中文)',
+ 'Lightwords' => '亮点词',
+ 'Destination' => '目的地',
+ 'Topimages' => '轮播图',
+ 'Videofiles' => '头图视频',
+ 'Cost_production' => '产品原价',
+ 'Advancedata' => '提前预定',
+ 'Advancedata 0' => '无',
+ 'Advancedata 1' => '可定今日',
+ 'Advancedata 2' => '可定明日',
+ 'Advancedata 3' => '提前预订',
+ 'Explanation' => '预订说明',
+ 'Travel_template_information' => '出行模板信息',
+ 'Supplier' => '产品提供商',
+ 'Supplier_price' => '供应商app限时减价',
+ 'Supplier_start' => '减价开始时间',
+ 'Supplier_end' => '减价结束时间',
+ 'Introductioncontent' => '产品介绍',
+ 'Trip_length' => '行程时间',
+ 'Trip_theme' => '该时间段的行程主题',
+ 'Images' => '添加该时间段的行程活动相关图片',
+ 'Infomation' => '对该时段内行程的描述',
+ 'Descriptioncontent' => '费用说明',
+ 'Useinfocontent' => '使用说明',
+ 'Informationcontent' => '购买须知',
+ 'In_stock' => '库存',
+ 'List' => '状态',
+ 'List 0' => '未上线',
+ 'List 1' => '已上线',
+ 'List 2' => '人工下线',
+ 'List 3' => '系统下线',
+ 'List 4' => '审核下线'
+];
diff --git a/application/admin/lang/zh-cn/product/productcarrental.php b/application/admin/lang/zh-cn/product/productcarrental.php
new file mode 100644
index 0000000000000000000000000000000000000000..834196d05f09c7c18097b39e454c8f8a1c800bd1
--- /dev/null
+++ b/application/admin/lang/zh-cn/product/productcarrental.php
@@ -0,0 +1,32 @@
+ 'ID',
+ 'Name' => '产品名称(中文)',
+ 'Lightwords' => '亮点词',
+ 'Destination' => '目的地',
+ 'Images' => '轮播图',
+ 'Cost_production' => '产品原价',
+ 'Advancedata' => '提前预定',
+ 'Advancedata 0' => '无',
+ 'Advancedata 1' => '可定今日',
+ 'Advancedata 2' => '可定明日',
+ 'Advancedata 3' => '提前预订',
+ 'Explanation' => '预订说明',
+ 'Travel_template_information' => '出行模板信息',
+ 'Supplier' => '产品提供商',
+ 'Supplier_price' => '供应商app限时减价',
+ 'Supplier_start' => '减价开始时间',
+ 'Supplier_end' => '减价结束时间',
+ 'Introductioncontent' => '产品介绍',
+ 'Descriptioncontent' => '费用说明',
+ 'Useinfocontent' => '使用说明',
+ 'Informationcontent' => '购买须知',
+ 'In_stock' => '库存',
+ 'List' => '状态',
+ 'List 0' => '未上线',
+ 'List 1' => '已上线',
+ 'List 2' => '人工下线',
+ 'List 3' => '系统下线',
+ 'List 4' => '审核下线'
+];
diff --git a/application/admin/lang/zh-cn/product/productday.php b/application/admin/lang/zh-cn/product/productday.php
new file mode 100644
index 0000000000000000000000000000000000000000..515c8c5b1ebb2a8a11af086b2ea546a8afea0a0d
--- /dev/null
+++ b/application/admin/lang/zh-cn/product/productday.php
@@ -0,0 +1,37 @@
+ 'ID',
+ 'Name' => '产品名称(中文)',
+ 'Lightwords' => '亮点词',
+ 'Destination' => '目的地',
+ 'Homeimages' => '轮播图',
+ 'Cost_production' => '产品原价',
+ 'Advancedata' => '提前预定',
+ 'Advancedata 0' => '无',
+ 'Advancedata 1' => '可定今日',
+ 'Advancedata 2' => '可定明日',
+ 'Advancedata 3' => '提前预订',
+ 'Explanation' => '预订说明',
+ 'Travel_template_information' => '出行模板信息',
+ 'Out_postion' => '出发地',
+ 'Supplier' => '产品提供商',
+ 'Supplier_price' => '供应商app减价',
+ 'Supplier_start' => '减价开始时间',
+ 'Supplier_end' => '减价结束时间',
+ 'Introductioncontent' => '产品介绍',
+ 'Trip_length' => '行程时间',
+ 'Trip_theme' => '该时间段的行程主题',
+ 'Images' => '添加该时间段的行程活动相关图片',
+ 'Infomation' => '对该时段内行程的描述',
+ 'Descriptioncontent' => '费用说明',
+ 'Useinfocontent' => '使用说明',
+ 'Informationcontent' => '购买须知',
+ 'In_stock' => '库存',
+ 'List' => '状态',
+ 'List 0' => '未上线',
+ 'List 1' => '已上线',
+ 'List 2' => '人工下线',
+ 'List 3' => '系统下线',
+ 'List 4' => '审核下线'
+];
diff --git a/application/admin/lang/zh-cn/product/productexperience.php b/application/admin/lang/zh-cn/product/productexperience.php
new file mode 100644
index 0000000000000000000000000000000000000000..2f643574812d378c750458ef7f02a59ea23772dc
--- /dev/null
+++ b/application/admin/lang/zh-cn/product/productexperience.php
@@ -0,0 +1,54 @@
+ 'ID',
+ 'Name' => '产品名称(中文)',
+ 'Lightwords' => '亮点词',
+ 'Destination' => '目的地',
+ 'Topimages' => '轮播图',
+ 'Videofiles' => '头图视频',
+ 'Cost_production' => '产品原价',
+ 'Advancedata' => '提前预定',
+ 'Advancedata 0' => '无',
+ 'Advancedata 1' => '可定今日',
+ 'Advancedata 2' => '可定明日',
+ 'Advancedata 3' => '提前预订',
+ 'Explanation' => '预订说明',
+ 'Travel_template_information' => '出行模板信息',
+ 'Out_data' => '行程天数',
+ 'Out_data 0' => '1天',
+ 'Out_data 1' => '2天',
+ 'Out_data 2' => '3天',
+ 'Out_data 3' => '4天',
+ 'Out_data 4' => '5天',
+ 'Out_data 5' => '6天',
+ 'Out_data 6' => '7天',
+ 'Out_data 7' => '8天',
+ 'Out_data 8' => '9天',
+ 'Out_data 9' => '10天',
+ 'Out_data 10' => '11天',
+ 'Out_data 11' => '12天',
+ 'Out_data 12' => '13天',
+ 'Out_data 13' => '14天',
+ 'Out_data 14' => '15天',
+ 'Out_data 15' => '15天以上',
+ 'Supplier' => '产品提供商',
+ 'Supplier_price' => '供应商app限时减价',
+ 'Supplier_start' => '减价开始时间',
+ 'Supplier_end' => '减价结束时间',
+ 'Introductioncontent' => '产品介绍',
+ 'Trip_length' => '行程时间',
+ 'Trip_theme' => '该时间段的行程主题',
+ 'Images' => '添加该时间段的行程活动相关图片',
+ 'Infomation' => '对该时段内行程的描述',
+ 'Descriptioncontent' => '费用说明',
+ 'Useinfocontent' => '使用说明',
+ 'Informationcontent' => '购买须知',
+ 'In_stock' => '库存',
+ 'List' => '状态',
+ 'List 0' => '未上线',
+ 'List 1' => '已上线',
+ 'List 2' => '人工下线',
+ 'List 3' => '系统下线',
+ 'List 4' => '审核下线'
+];
diff --git a/application/admin/lang/zh-cn/product/productfood.php b/application/admin/lang/zh-cn/product/productfood.php
new file mode 100644
index 0000000000000000000000000000000000000000..834196d05f09c7c18097b39e454c8f8a1c800bd1
--- /dev/null
+++ b/application/admin/lang/zh-cn/product/productfood.php
@@ -0,0 +1,32 @@
+ 'ID',
+ 'Name' => '产品名称(中文)',
+ 'Lightwords' => '亮点词',
+ 'Destination' => '目的地',
+ 'Images' => '轮播图',
+ 'Cost_production' => '产品原价',
+ 'Advancedata' => '提前预定',
+ 'Advancedata 0' => '无',
+ 'Advancedata 1' => '可定今日',
+ 'Advancedata 2' => '可定明日',
+ 'Advancedata 3' => '提前预订',
+ 'Explanation' => '预订说明',
+ 'Travel_template_information' => '出行模板信息',
+ 'Supplier' => '产品提供商',
+ 'Supplier_price' => '供应商app限时减价',
+ 'Supplier_start' => '减价开始时间',
+ 'Supplier_end' => '减价结束时间',
+ 'Introductioncontent' => '产品介绍',
+ 'Descriptioncontent' => '费用说明',
+ 'Useinfocontent' => '使用说明',
+ 'Informationcontent' => '购买须知',
+ 'In_stock' => '库存',
+ 'List' => '状态',
+ 'List 0' => '未上线',
+ 'List 1' => '已上线',
+ 'List 2' => '人工下线',
+ 'List 3' => '系统下线',
+ 'List 4' => '审核下线'
+];
diff --git a/application/admin/lang/zh-cn/product/producthotels.php b/application/admin/lang/zh-cn/product/producthotels.php
new file mode 100644
index 0000000000000000000000000000000000000000..46ee152e12ae6fe6f305af06f2f48bd7ff747892
--- /dev/null
+++ b/application/admin/lang/zh-cn/product/producthotels.php
@@ -0,0 +1,62 @@
+ 'ID',
+ 'Name' => '产品名称(中文)',
+ 'Lightwords' => '亮点词',
+ 'Destination' => '目的地',
+ 'Homeimages' => '轮播图',
+ 'Cost_production' => '产品原价',
+ 'Advancedata' => '提前预定',
+ 'Advancedata 0' => '无',
+ 'Advancedata 1' => '可定今日',
+ 'Advancedata 2' => '可定明日',
+ 'Advancedata 3' => '提前预订',
+ 'Explanation' => '预订说明',
+ 'Travel_template_information' => '出行模板信息',
+ 'Out_data' => '行程天数',
+ 'Out_data 0' => '1天',
+ 'Out_data 1' => '2天',
+ 'Out_data 2' => '3天',
+ 'Out_data 3' => '4天',
+ 'Out_data 4' => '5天',
+ 'Out_data 5' => '6天',
+ 'Out_data 6' => '7天',
+ 'Out_data 7' => '8天',
+ 'Out_data 8' => '9天',
+ 'Out_data 9' => '10天',
+ 'Out_data 10' => '11天',
+ 'Out_data 11' => '12天',
+ 'Out_data 12' => '13天',
+ 'Out_data 13' => '14天',
+ 'Out_data 14' => '15天',
+ 'Out_data 15' => '15天以上',
+ 'Supplier' => '产品提供商',
+ 'Supplier_price' => '供应商app限时减价',
+ 'Supplier_start' => '减价开始时间',
+ 'Supplier_end' => '减价结束时间',
+ 'Introductioncontent' => '产品介绍',
+ 'Hotel_id' => '酒店ID',
+ 'Hotel_name' => '酒店名称',
+ 'Hotel_en_name' => '英文名称',
+ 'Hotel_list' => '前台显示',
+ 'Hotel_list 0' => '不显示',
+ 'Hotel_list 1' => '显示',
+ 'Hotel_address' => '酒店地址',
+ 'Hotel_info' => '酒店简介',
+ 'Hotel_images' => '酒店图片',
+ 'Trip_length' => '行程时间',
+ 'Trip_theme' => '该时间段的行程主题',
+ 'Images' => '添加该时间段的行程活动相关图片',
+ 'Infomation' => '对该时段内行程的描述',
+ 'Descriptioncontent' => '费用说明',
+ 'Useinfocontent' => '使用说明',
+ 'Informationcontent' => '购买须知',
+ 'In_stock' => '库存',
+ 'List' => '状态',
+ 'List 0' => '未上线',
+ 'List 1' => '已上线',
+ 'List 2' => '人工下线',
+ 'List 3' => '系统下线',
+ 'List 4' => '审核下线'
+];
diff --git a/application/admin/lang/zh-cn/product/productlocal.php b/application/admin/lang/zh-cn/product/productlocal.php
new file mode 100644
index 0000000000000000000000000000000000000000..68fd84c32d5d1c0d358bc9e37cdd1b65007945bb
--- /dev/null
+++ b/application/admin/lang/zh-cn/product/productlocal.php
@@ -0,0 +1,48 @@
+ 'ID',
+ 'Name' => '产品名称(中文)',
+ 'Lightwords' => '亮点词',
+ 'Destination' => '目的地',
+ 'Image' => '首页轮播图',
+ 'Topimages' => '更多轮播图',
+ 'Videofiles' => '头图视频',
+ 'Price_id' => '参考价格关联ID',
+ 'Explanation' => '预订说明',
+ 'Outlocal' => '出发地',
+ 'Out_postion' => '出发地',
+ 'Out_data' => '行程天数',
+ 'Out_data 0' => '1天',
+ 'Out_data 1' => '2天',
+ 'Out_data 2' => '3天',
+ 'Out_data 3' => '4天',
+ 'Out_data 4' => '5天',
+ 'Out_data 5' => '6天',
+ 'Out_data 6' => '7天',
+ 'Out_data 7' => '8天',
+ 'Out_data 8' => '9天',
+ 'Out_data 9' => '10天',
+ 'Out_data 10' => '11天',
+ 'Out_data 11' => '12天',
+ 'Out_data 12' => '13天',
+ 'Out_data 13' => '14天',
+ 'Out_data 14' => '15天',
+ 'Out_data 15' => '15天以上',
+ 'Supplier' => '产品提供商',
+ 'Introductioncontent' => '产品介绍',
+ 'Trip_length' => '行程时间',
+ 'Trip_theme' => '该时间段的行程主题',
+ 'Images' => '添加该时间段的行程活动相关图片',
+ 'Infomation' => '对该时段内行程的描述',
+ 'Descriptioncontent' => '费用说明',
+ 'Useinfocontent' => '使用说明',
+ 'Informationcontent' => '购买须知',
+ 'In_stock' => '库存',
+ 'List' => '状态',
+ 'List 0' => '未上线',
+ 'List 1' => '已上线',
+ 'List 2' => '人工下线',
+ 'List 3' => '系统下线',
+ 'List 4' => '审核下线'
+];
diff --git a/application/admin/lang/zh-cn/product/productmanydays.php b/application/admin/lang/zh-cn/product/productmanydays.php
new file mode 100644
index 0000000000000000000000000000000000000000..be2465b2c44e7235c3c1096a3e67cace9eb681eb
--- /dev/null
+++ b/application/admin/lang/zh-cn/product/productmanydays.php
@@ -0,0 +1,64 @@
+ 'ID',
+ 'Name' => '产品名称(中文)',
+ 'Lightwords' => '亮点词',
+ 'Destination' => '目的地',
+ 'Homeimages' => '轮播图',
+ 'Cost_production' => '产品原价',
+ 'Advancedata' => '提前预定',
+ 'Advancedata 0' => '无',
+ 'Advancedata 1' => '可定今日',
+ 'Advancedata 2' => '可定明日',
+ 'Advancedata 3' => '提前预订',
+ 'Explanation' => '预订说明',
+ 'Travel_template_information' => '出行模板信息',
+ 'Out_postion' => '出发地',
+ 'Out_data' => '行程天数',
+ 'Out_data 0' => '1天',
+ 'Out_data 1' => '2天',
+ 'Out_data 2' => '3天',
+ 'Out_data 3' => '4天',
+ 'Out_data 4' => '5天',
+ 'Out_data 5' => '6天',
+ 'Out_data 6' => '7天',
+ 'Out_data 7' => '8天',
+ 'Out_data 8' => '9天',
+ 'Out_data 9' => '10天',
+ 'Out_data 10' => '11天',
+ 'Out_data 11' => '12天',
+ 'Out_data 12' => '13天',
+ 'Out_data 13' => '14天',
+ 'Out_data 14' => '15天',
+ 'Out_data 15' => '15天以上',
+ 'Supplier' => '产品提供商',
+ 'Supplier_price' => '供应商app减价',
+ 'Supplier_start' => '减价开始时间',
+ 'Supplier_end' => '减价结束时间',
+ 'Introductioncontent' => '产品介绍',
+ 'Hotel_id' => '酒店ID',
+ 'Hotel_name' => '酒店名称',
+ 'Hotel_en_name' => '英文名称',
+ 'Hotel_list' => '前台显示',
+ 'Hotel_list 0' => '不显示',
+ 'Hotel_list 1' => '显示',
+ 'Hotel_address' => '酒店地址',
+ 'Hotel_info' => '酒店简介',
+ 'Hotel_images' => '酒店图片',
+ 'Trip_length' => '行程时间',
+ 'Trip_theme' => '该时间段的行程主题',
+ 'Images' => '添加该时间段的行程活动相关图片',
+ 'Infomation' => '对该时段内行程的描述',
+ 'Descriptioncontent' => '费用说明',
+ 'Useinfocontent' => '使用说明',
+ 'Informationcontent' => '购买须知',
+ 'In_stock' => '库存',
+ 'List' => '状态',
+ 'List 0' => '未上线',
+ 'List 1' => '已上线',
+ 'List 2' => '人工下线',
+ 'List 3' => '系统下线',
+ 'List 4' => '审核下线',
+ 'Status' => '状态'
+];
diff --git a/application/admin/lang/zh-cn/product/productshow.php b/application/admin/lang/zh-cn/product/productshow.php
new file mode 100644
index 0000000000000000000000000000000000000000..768a6149ca73369e7d8d4bfc4374657ddb0b99c6
--- /dev/null
+++ b/application/admin/lang/zh-cn/product/productshow.php
@@ -0,0 +1,50 @@
+ 'ID',
+ 'Name' => '产品名称(中文)',
+ 'Lightwords' => '亮点词',
+ 'Destination' => '目的地',
+ 'Homeimages' => '轮播图',
+ 'Videofiles' => '头图视频',
+ 'Cost_production' => '产品原价',
+ 'Advancedata' => '提前预定',
+ 'Advancedata 0' => '无',
+ 'Advancedata 1' => '可定今日',
+ 'Advancedata 2' => '可定明日',
+ 'Advancedata 3' => '提前预订',
+ 'Explanation' => '预订说明',
+ 'Travel_template_information' => '出行模板信息',
+ 'Out_data' => '行程天数',
+ 'Out_data 0' => '1天',
+ 'Out_data 1' => '2天',
+ 'Out_data 2' => '3天',
+ 'Out_data 3' => '4天',
+ 'Out_data 4' => '5天',
+ 'Out_data 5' => '6天',
+ 'Out_data 6' => '7天',
+ 'Out_data 7' => '8天',
+ 'Out_data 8' => '9天',
+ 'Out_data 9' => '10天',
+ 'Out_data 10' => '11天',
+ 'Out_data 11' => '12天',
+ 'Out_data 12' => '13天',
+ 'Out_data 13' => '14天',
+ 'Out_data 14' => '15天',
+ 'Out_data 15' => '15天以上',
+ 'Supplier' => '产品提供商',
+ 'Supplier_price' => '供应商app限时减价',
+ 'Supplier_start' => '减价开始时间',
+ 'Supplier_end' => '减价结束时间',
+ 'Introductioncontent' => '产品介绍',
+ 'Descriptioncontent' => '费用说明',
+ 'Useinfocontent' => '使用说明',
+ 'Informationcontent' => '购买须知',
+ 'In_stock' => '库存',
+ 'List' => '状态',
+ 'List 0' => '未上线',
+ 'List 1' => '已上线',
+ 'List 2' => '人工下线',
+ 'List 3' => '系统下线',
+ 'List 4' => '审核下线'
+];
diff --git a/application/admin/lang/zh-cn/product/producttickets.php b/application/admin/lang/zh-cn/product/producttickets.php
new file mode 100644
index 0000000000000000000000000000000000000000..23cb27edbe2d1bf75392b0f6175b2f596d4aecc4
--- /dev/null
+++ b/application/admin/lang/zh-cn/product/producttickets.php
@@ -0,0 +1,34 @@
+ 'ID',
+ 'Name' => '产品名称(中文)',
+ 'Lightwords' => '亮点词',
+ 'Destination' => '目的地',
+ 'Homeimages' => '轮播图',
+ 'Cost_production' => '产品原价',
+ 'Advancedata' => '提前预定',
+ 'Advancedata 0' => '无',
+ 'Advancedata 1' => '可定今日',
+ 'Advancedata 2' => '可定明日',
+ 'Advancedata 3' => '提前预订',
+ 'Explanation' => '预订说明',
+ 'Travel_template_information' => '出行模板信息',
+ 'Supplier' => '产品提供商',
+ 'Supplier_price' => '供应商app减价',
+ 'Supplier_start' => '减价开始时间',
+ 'Supplier_end' => '减价结束时间',
+ 'Introductioncontent' => '产品介绍',
+ 'Descriptioncontent' => '费用说明',
+ 'Useinfocontent' => '使用说明',
+ 'Informationcontent' => '购买须知',
+ 'In_stock' => '库存',
+ 'Category_id' => '分类ID(单选)',
+ 'Status' => '状态',
+ 'List' => '状态',
+ 'List 0' => '未上线',
+ 'List 1' => '已上线',
+ 'List 2' => '人工下线',
+ 'List 3' => '系统下线',
+ 'List 4' => '审核下线'
+];
diff --git a/application/admin/lang/zh-cn/product/producttraffic.php b/application/admin/lang/zh-cn/product/producttraffic.php
new file mode 100644
index 0000000000000000000000000000000000000000..e52e7ae11c58d77128b68b267a7bfe2f7865e86b
--- /dev/null
+++ b/application/admin/lang/zh-cn/product/producttraffic.php
@@ -0,0 +1,49 @@
+ 'ID',
+ 'Name' => '产品名称(中文)',
+ 'Lightwords' => '亮点词',
+ 'Destination' => '目的地',
+ 'Homeimages' => '轮播图',
+ 'Cost_production' => '产品原价',
+ 'Advancedata' => '提前预定',
+ 'Advancedata 0' => '无',
+ 'Advancedata 1' => '可定今日',
+ 'Advancedata 2' => '可定明日',
+ 'Advancedata 3' => '提前预订',
+ 'Explanation' => '预订说明',
+ 'Travel_template_information' => '出行模板信息',
+ 'Out_data' => '行程天数',
+ 'Out_data 0' => '1天',
+ 'Out_data 1' => '2天',
+ 'Out_data 2' => '3天',
+ 'Out_data 3' => '4天',
+ 'Out_data 4' => '5天',
+ 'Out_data 5' => '6天',
+ 'Out_data 6' => '7天',
+ 'Out_data 7' => '8天',
+ 'Out_data 8' => '9天',
+ 'Out_data 9' => '10天',
+ 'Out_data 10' => '11天',
+ 'Out_data 11' => '12天',
+ 'Out_data 12' => '13天',
+ 'Out_data 13' => '14天',
+ 'Out_data 14' => '15天',
+ 'Out_data 15' => '15天以上',
+ 'Supplier' => '产品提供商',
+ 'Supplier_price' => '供应商app限时减价',
+ 'Supplier_start' => '减价开始时间',
+ 'Supplier_end' => '减价结束时间',
+ 'Introductioncontent' => '产品介绍',
+ 'Descriptioncontent' => '费用说明',
+ 'Useinfocontent' => '使用说明',
+ 'Informationcontent' => '购买须知',
+ 'In_stock' => '库存',
+ 'List' => '状态',
+ 'List 0' => '未上线',
+ 'List 1' => '已上线',
+ 'List 2' => '人工下线',
+ 'List 3' => '系统下线',
+ 'List 4' => '审核下线'
+];
diff --git a/application/admin/lang/zh-cn/raiders/raiders.php b/application/admin/lang/zh-cn/raiders/raiders.php
new file mode 100644
index 0000000000000000000000000000000000000000..acb347f4d7261065f1f432d84faf82f03ff6f2b5
--- /dev/null
+++ b/application/admin/lang/zh-cn/raiders/raiders.php
@@ -0,0 +1,17 @@
+ 'ID',
+ 'Num' => '攻略编号',
+ 'Title' => '标题',
+ 'City' => '目的地',
+ 'Lead_language' => '攻略导语',
+ 'Image' => '封面图片',
+ 'Status' => '状态',
+ 'Status 0' => '审核通过',
+ 'Status 1' => '未审核',
+ 'Create_time' => '创建日期',
+ 'Update_time' => '更新日期',
+ 'Read_num' => '阅读人数',
+ 'User_id' => '关联发表攻略个人ID'
+];
diff --git a/application/admin/model/CompanySet.php b/application/admin/model/CompanySet.php
new file mode 100644
index 0000000000000000000000000000000000000000..be923ae40a8cabe2b046ee89951c3ae456c920d0
--- /dev/null
+++ b/application/admin/model/CompanySet.php
@@ -0,0 +1,94 @@
+ __('Companyscaledata 1'),'2' => __('Companyscaledata 2'),'3' => __('Companyscaledata 3'),'4' => __('Companyscaledata 4'),'5' => __('Companyscaledata 5')];
+ }
+
+ public function getCompanresourcesdataList()
+ {
+ return ['1' => __('Companresourcesdata 1'),'2' => __('Companresourcesdata 2'),'3' => __('Companresourcesdata 3'),'4' => __('Companresourcesdata 4'),'5' => __('Companresourcesdata 5'),'6' => __('Companresourcesdata 6'),'7' => __('Companresourcesdata 7'),'8' => __('Companresourcesdata 8'),'9' => __('Companresourcesdata 9')];
+ }
+
+ public function getOfflinestoredataList()
+ {
+ return ['1' => __('Offlinestoredata 1'),'2' => __('Offlinestoredata 2'),'3' => __('Offlinestoredata 3'),'4' => __('Offlinestoredata 4'),'5' => __('Offlinestoredata 5'),'6' => __('Offlinestoredata 6')];
+ }
+
+ public function getCooperationplatformdataList()
+ {
+ return ['1' => __('Cooperationplatformdata 1'),'2' => __('Cooperationplatformdata 2'),'3' => __('Cooperationplatformdata 3'),'4' => __('Cooperationplatformdata 4'),'5' => __('Cooperationplatformdata 5'),'6' => __('Cooperationplatformdata 6'),'7' => __('Cooperationplatformdata 7'),'8' => __('Cooperationplatformdata 8'),'9' => __('Cooperationplatformdata 9'),'10' => __('Cooperationplatformdata 10')];
+ }
+
+
+ public function getCompanyscaledataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['companyscaledata'];
+ $list = $this->getCompanyscaledataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getCompanresourcesdataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['companresourcesdata'];
+ $valueArr = explode(',', $value);
+ $list = $this->getCompanresourcesdataList();
+ return implode(',', array_intersect_key($list, array_flip($valueArr)));
+ }
+
+
+ public function getOfflinestoredataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['offlinestoredata'];
+ $list = $this->getOfflinestoredataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getCooperationplatformdataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['cooperationplatformdata'];
+ $valueArr = explode(',', $value);
+ $list = $this->getCooperationplatformdataList();
+ return implode(',', array_intersect_key($list, array_flip($valueArr)));
+ }
+
+ protected function setCompanresourcesdataAttr($value)
+ {
+ return is_array($value) ? implode(',', $value) : $value;
+ }
+
+ protected function setCooperationplatformdataAttr($value)
+ {
+ return is_array($value) ? implode(',', $value) : $value;
+ }
+
+
+}
diff --git a/application/admin/model/NewTravel.php b/application/admin/model/NewTravel.php
new file mode 100644
index 0000000000000000000000000000000000000000..8a6b9012ab4028dc6eccd50824da2f5a5c1ff047
--- /dev/null
+++ b/application/admin/model/NewTravel.php
@@ -0,0 +1,134 @@
+ __('Typeslist 1'),'2' => __('Typeslist 2'),'3' => __('Typeslist 3'),'4' => __('Typeslist 4'),'5' => __('Typeslist 5'),'6' => __('Typeslist 6'),'7' => __('Typeslist 7'),'8' => __('Typeslist 8'),'9' => __('Typeslist 9'),'10' => __('Typeslist 10'),'11' => __('Typeslist 11'),'12' => __('Typeslist 12'),'13' => __('Typeslist 13'),'14' => __('Typeslist 14'),'15' => __('Typeslist 15'),'16' => __('Typeslist 16'),'17' => __('Typeslist 17'),'18' => __('Typeslist 18'),'19' => __('Typeslist 19'),'20' => __('Typeslist 20'),'21' => __('Typeslist 21'),'22' => __('Typeslist 22'),'23' => __('Typeslist 23'),'24' => __('Typeslist 24'),'25' => __('Typeslist 25')];
+ }
+
+ public function getTravelersnumberdataList()
+ {
+ return ['1' => __('Travelersnumberdata 1'),'2' => __('Travelersnumberdata 2')];
+ }
+
+ public function getTravelerinformationdataList()
+ {
+ return ['1' => __('Travelerinformationdata 1'),'2' => __('Travelerinformationdata 2'),'3' => __('Travelerinformationdata 3'),'4' => __('Travelerinformationdata 4'),'5' => __('Travelerinformationdata 5'),'6' => __('Travelerinformationdata 6'),'7' => __('Travelerinformationdata 7'),'8' => __('Travelerinformationdata 8'),'9' => __('Travelerinformationdata 9'),'10' => __('Travelerinformationdata 10'),'11' => __('Travelerinformationdata 11'),'12' => __('Travelerinformationdata 12'),'13' => __('Travelerinformationdata 13'),'14' => __('Travelerinformationdata 14')];
+ }
+
+ public function getTripinformationdataList()
+ {
+ return ['1' => __('Tripinformationdata 1'),'2' => __('Tripinformationdata 2'),'3' => __('Tripinformationdata 3'),'4' => __('Tripinformationdata 4'),'5' => __('Tripinformationdata 5'),'6' => __('Tripinformationdata 6'),'7' => __('Tripinformationdata 7'),'8' => __('Tripinformationdata 8'),'9' => __('Tripinformationdata 9'),'10' => __('Tripinformationdata 10'),'11' => __('Tripinformationdata 11'),'12' => __('Tripinformationdata 12'),'13' => __('Tripinformationdata 13'),'14' => __('Tripinformationdata 14'),'15' => __('Tripinformationdata 15'),'16' => __('Tripinformationdata 16'),'17' => __('Tripinformationdata 17'),'18' => __('Tripinformationdata 18'),'19' => __('Tripinformationdata 19'),'20' => __('Tripinformationdata 20'),'21' => __('Tripinformationdata 21'),'22' => __('Tripinformationdata 22'),'23' => __('Tripinformationdata 23'),'24' => __('Tripinformationdata 24'),'25' => __('Tripinformationdata 25'),'26' => __('Tripinformationdata 26'),'27' => __('Tripinformationdata 27'),'28' => __('Tripinformationdata 28'),'29' => __('Tripinformationdata 29'),'30' => __('Tripinformationdata 30'),'31' => __('Tripinformationdata 31'),'32' => __('Tripinformationdata 32'),'33' => __('Tripinformationdata 33'),'34' => __('Tripinformationdata 34'),'35' => __('Tripinformationdata 35'),'36' => __('Tripinformationdata 36'),'37' => __('Tripinformationdata 37'),'38' => __('Tripinformationdata 38'),'39' => __('Tripinformationdata 39'),'40' => __('Tripinformationdata 40'),'41' => __('Tripinformationdata 41'),'42' => __('Tripinformationdata 42'),'43' => __('Tripinformationdata 43'),'44' => __('Tripinformationdata 44'),'45' => __('Tripinformationdata 45'),'46' => __('Tripinformationdata 46'),'47' => __('Tripinformationdata 47'),'48' => __('Tripinformationdata 48'),'49' => __('Tripinformationdata 49'),'50' => __('Tripinformationdata 50'),'51' => __('Tripinformationdata 51'),'52' => __('Tripinformationdata 52'),'53' => __('Tripinformationdata 53'),'54' => __('Tripinformationdata 54'),'55' => __('Tripinformationdata 55'),'56' => __('Tripinformationdata 56'),'57' => __('Tripinformationdata 57'),'58' => __('Tripinformationdata 58'),'59' => __('Tripinformationdata 59'),'60' => __('Tripinformationdata 60'),'61' => __('Tripinformationdata 61'),'62' => __('Tripinformationdata 62'),'63' => __('Tripinformationdata 63'),'64' => __('Tripinformationdata 64')];
+ }
+
+ public function getBackaddressdataList()
+ {
+ return ['1' => __('Backaddressdata 1'),'2' => __('Backaddressdata 2')];
+ }
+
+ public function getReceivingaddressdataList()
+ {
+ return ['1' => __('Receivingaddressdata 1'),'2' => __('Receivingaddressdata 2'),'3' => __('Receivingaddressdata 3')];
+ }
+
+
+ public function getTypeslistTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['typeslist'];
+ $list = $this->getTypeslistList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getTravelersnumberdataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['travelersnumberdata'];
+ $list = $this->getTravelersnumberdataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getTravelerinformationdataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['travelerinformationdata'];
+ $valueArr = explode(',', $value);
+ $list = $this->getTravelerinformationdataList();
+ return implode(',', array_intersect_key($list, array_flip($valueArr)));
+ }
+
+
+ public function getTripinformationdataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['tripinformationdata'];
+ $valueArr = explode(',', $value);
+ $list = $this->getTripinformationdataList();
+ return implode(',', array_intersect_key($list, array_flip($valueArr)));
+ }
+
+
+ public function getBackaddressdataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['backaddressdata'];
+ $valueArr = explode(',', $value);
+ $list = $this->getBackaddressdataList();
+ return implode(',', array_intersect_key($list, array_flip($valueArr)));
+ }
+
+
+ public function getReceivingaddressdataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['receivingaddressdata'];
+ $valueArr = explode(',', $value);
+ $list = $this->getReceivingaddressdataList();
+ return implode(',', array_intersect_key($list, array_flip($valueArr)));
+ }
+
+ protected function setTravelerinformationdataAttr($value)
+ {
+ return is_array($value) ? implode(',', $value) : $value;
+ }
+
+ protected function setTripinformationdataAttr($value)
+ {
+ return is_array($value) ? implode(',', $value) : $value;
+ }
+
+ protected function setBackaddressdataAttr($value)
+ {
+ return is_array($value) ? implode(',', $value) : $value;
+ }
+
+ protected function setReceivingaddressdataAttr($value)
+ {
+ return is_array($value) ? implode(',', $value) : $value;
+ }
+
+
+}
diff --git a/application/admin/model/Order.php b/application/admin/model/Order.php
new file mode 100644
index 0000000000000000000000000000000000000000..db21312b73bec31f9a634e08dbceb07368922ccc
--- /dev/null
+++ b/application/admin/model/Order.php
@@ -0,0 +1,67 @@
+ __('Order_status 0'),'1' => __('Order_status 1')];
+ }
+
+ public function getCommentStatusList()
+ {
+ return ['0' => __('Comment_status 0'),'1' => __('Comment_status 1')];
+ }
+
+
+ public function getOrderStatusTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['order_status'];
+ $list = $this->getOrderStatusList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getCommentStatusTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['comment_status'];
+ $list = $this->getCommentStatusList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getOrderStartTimeTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['order_start_time'];
+ return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
+ }
+
+ protected function setOrderStartTimeAttr($value)
+ {
+ return $value && !is_numeric($value) ? strtotime($value) : $value;
+ }
+
+
+}
diff --git a/application/admin/model/ProductAddress.php b/application/admin/model/ProductAddress.php
new file mode 100644
index 0000000000000000000000000000000000000000..25312f5bd1cc8bfb378a0a8796139fedd224b0ae
--- /dev/null
+++ b/application/admin/model/ProductAddress.php
@@ -0,0 +1,33 @@
+ __('Advancedata 0'),'1' => __('Advancedata 1'),'2' => __('Advancedata 2'),'3' => __('Advancedata 3')];
+ }
+
+ public function getListList()
+ {
+ return ['0' => __('List 0'),'1' => __('List 1'),'2' => __('List 2'),'3' => __('List 3'),'4' => __('List 4')];
+ }
+
+ public function getStatusList()
+ {
+ return ['normal' => __('Normal'),'hidden' => __('Hidden')];
+ }
+
+
+ public function getAdvancedataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['advancedata'];
+ $list = $this->getAdvancedataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getListTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['list'];
+ $list = $this->getListList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getStatusTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['status'];
+ $list = $this->getStatusList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+
+
+}
diff --git a/application/admin/model/ProductCar.php b/application/admin/model/ProductCar.php
new file mode 100644
index 0000000000000000000000000000000000000000..8e644fab1165691b7265ebdda64a1175089d90a7
--- /dev/null
+++ b/application/admin/model/ProductCar.php
@@ -0,0 +1,56 @@
+ __('Advancedata 0'),'1' => __('Advancedata 1'),'2' => __('Advancedata 2'),'3' => __('Advancedata 3')];
+ }
+
+ public function getListList()
+ {
+ return ['0' => __('List 0'),'1' => __('List 1'),'2' => __('List 2'),'3' => __('List 3'),'4' => __('List 4')];
+ }
+
+
+ public function getAdvancedataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['advancedata'];
+ $list = $this->getAdvancedataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getListTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['list'];
+ $list = $this->getListList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+
+
+}
diff --git a/application/admin/model/ProductCarRental.php b/application/admin/model/ProductCarRental.php
new file mode 100644
index 0000000000000000000000000000000000000000..fa15331db2f298b8b0e77a1519222542448fb97e
--- /dev/null
+++ b/application/admin/model/ProductCarRental.php
@@ -0,0 +1,56 @@
+ __('Advancedata 0'),'1' => __('Advancedata 1'),'2' => __('Advancedata 2'),'3' => __('Advancedata 3')];
+ }
+
+ public function getListList()
+ {
+ return ['0' => __('List 0'),'1' => __('List 1'),'2' => __('List 2'),'3' => __('List 3'),'4' => __('List 4')];
+ }
+
+
+ public function getAdvancedataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['advancedata'];
+ $list = $this->getAdvancedataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getListTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['list'];
+ $list = $this->getListList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+
+
+}
diff --git a/application/admin/model/ProductDay.php b/application/admin/model/ProductDay.php
new file mode 100644
index 0000000000000000000000000000000000000000..cd99f7a7178cf5d18bc1da56a0c9ccef0440d484
--- /dev/null
+++ b/application/admin/model/ProductDay.php
@@ -0,0 +1,56 @@
+ __('Advancedata 0'),'1' => __('Advancedata 1'),'2' => __('Advancedata 2'),'3' => __('Advancedata 3')];
+ }
+
+ public function getListList()
+ {
+ return ['0' => __('List 0'),'1' => __('List 1'),'2' => __('List 2'),'3' => __('List 3'),'4' => __('List 4')];
+ }
+
+
+ public function getAdvancedataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['advancedata'];
+ $list = $this->getAdvancedataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getListTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['list'];
+ $list = $this->getListList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+
+
+}
diff --git a/application/admin/model/ProductExperience.php b/application/admin/model/ProductExperience.php
new file mode 100644
index 0000000000000000000000000000000000000000..08cc522d2ab3bf2df4f687caf625c0cfdc2c42d3
--- /dev/null
+++ b/application/admin/model/ProductExperience.php
@@ -0,0 +1,70 @@
+ __('Advancedata 0'),'1' => __('Advancedata 1'),'2' => __('Advancedata 2'),'3' => __('Advancedata 3')];
+ }
+
+ public function getOutDataList()
+ {
+ return ['0' => __('Out_data 0'),'1' => __('Out_data 1'),'2' => __('Out_data 2'),'3' => __('Out_data 3'),'4' => __('Out_data 4'),'5' => __('Out_data 5'),'6' => __('Out_data 6'),'7' => __('Out_data 7'),'8' => __('Out_data 8'),'9' => __('Out_data 9'),'10' => __('Out_data 10'),'11' => __('Out_data 11'),'12' => __('Out_data 12'),'13' => __('Out_data 13'),'14' => __('Out_data 14'),'15' => __('Out_data 15')];
+ }
+
+ public function getListList()
+ {
+ return ['0' => __('List 0'),'1' => __('List 1'),'2' => __('List 2'),'3' => __('List 3'),'4' => __('List 4')];
+ }
+
+
+ public function getAdvancedataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['advancedata'];
+ $list = $this->getAdvancedataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getOutDataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['out_data'];
+ $list = $this->getOutDataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getListTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['list'];
+ $list = $this->getListList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+
+
+}
diff --git a/application/admin/model/ProductFood.php b/application/admin/model/ProductFood.php
new file mode 100644
index 0000000000000000000000000000000000000000..3b8d8c24d79b119c4cc3d151b635547d5a3b9b1c
--- /dev/null
+++ b/application/admin/model/ProductFood.php
@@ -0,0 +1,56 @@
+ __('Advancedata 0'),'1' => __('Advancedata 1'),'2' => __('Advancedata 2'),'3' => __('Advancedata 3')];
+ }
+
+ public function getListList()
+ {
+ return ['0' => __('List 0'),'1' => __('List 1'),'2' => __('List 2'),'3' => __('List 3'),'4' => __('List 4')];
+ }
+
+
+ public function getAdvancedataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['advancedata'];
+ $list = $this->getAdvancedataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getListTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['list'];
+ $list = $this->getListList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+
+
+}
diff --git a/application/admin/model/ProductHotels.php b/application/admin/model/ProductHotels.php
new file mode 100644
index 0000000000000000000000000000000000000000..e8c381ea4c313dccbb028de65b35dd8e8ecc25c8
--- /dev/null
+++ b/application/admin/model/ProductHotels.php
@@ -0,0 +1,84 @@
+ __('Advancedata 0'),'1' => __('Advancedata 1'),'2' => __('Advancedata 2'),'3' => __('Advancedata 3')];
+ }
+
+ public function getOutDataList()
+ {
+ return ['0' => __('Out_data 0'),'1' => __('Out_data 1'),'2' => __('Out_data 2'),'3' => __('Out_data 3'),'4' => __('Out_data 4'),'5' => __('Out_data 5'),'6' => __('Out_data 6'),'7' => __('Out_data 7'),'8' => __('Out_data 8'),'9' => __('Out_data 9'),'10' => __('Out_data 10'),'11' => __('Out_data 11'),'12' => __('Out_data 12'),'13' => __('Out_data 13'),'14' => __('Out_data 14'),'15' => __('Out_data 15')];
+ }
+
+ public function getHotelListList()
+ {
+ return ['0' => __('Hotel_list 0'),'1' => __('Hotel_list 1')];
+ }
+
+ public function getListList()
+ {
+ return ['0' => __('List 0'),'1' => __('List 1'),'2' => __('List 2'),'3' => __('List 3'),'4' => __('List 4')];
+ }
+
+
+ public function getAdvancedataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['advancedata'];
+ $list = $this->getAdvancedataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getOutDataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['out_data'];
+ $list = $this->getOutDataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getHotelListTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['hotel_list'];
+ $list = $this->getHotelListList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getListTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['list'];
+ $list = $this->getListList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+
+
+}
diff --git a/application/admin/model/ProductLocal.php b/application/admin/model/ProductLocal.php
new file mode 100644
index 0000000000000000000000000000000000000000..ab2be89e0fff184b64f8c08dae69f55d174389fc
--- /dev/null
+++ b/application/admin/model/ProductLocal.php
@@ -0,0 +1,56 @@
+ __('Out_data 0'),'1' => __('Out_data 1'),'2' => __('Out_data 2'),'3' => __('Out_data 3'),'4' => __('Out_data 4'),'5' => __('Out_data 5'),'6' => __('Out_data 6'),'7' => __('Out_data 7'),'8' => __('Out_data 8'),'9' => __('Out_data 9'),'10' => __('Out_data 10'),'11' => __('Out_data 11'),'12' => __('Out_data 12'),'13' => __('Out_data 13'),'14' => __('Out_data 14'),'15' => __('Out_data 15')];
+ }
+
+ public function getListList()
+ {
+ return ['0' => __('List 0'),'1' => __('List 1'),'2' => __('List 2'),'3' => __('List 3'),'4' => __('List 4')];
+ }
+
+
+ public function getOutDataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['out_data'];
+ $list = $this->getOutDataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getListTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['list'];
+ $list = $this->getListList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+
+
+}
diff --git a/application/admin/model/ProductManydays.php b/application/admin/model/ProductManydays.php
new file mode 100644
index 0000000000000000000000000000000000000000..3731e79cb0a2ffa85f95d2929eec6e7f0d724219
--- /dev/null
+++ b/application/admin/model/ProductManydays.php
@@ -0,0 +1,98 @@
+ __('Advancedata 0'),'1' => __('Advancedata 1'),'2' => __('Advancedata 2'),'3' => __('Advancedata 3')];
+ }
+
+ public function getOutDataList()
+ {
+ return ['0' => __('Out_data 0'),'1' => __('Out_data 1'),'2' => __('Out_data 2'),'3' => __('Out_data 3'),'4' => __('Out_data 4'),'5' => __('Out_data 5'),'6' => __('Out_data 6'),'7' => __('Out_data 7'),'8' => __('Out_data 8'),'9' => __('Out_data 9'),'10' => __('Out_data 10'),'11' => __('Out_data 11'),'12' => __('Out_data 12'),'13' => __('Out_data 13'),'14' => __('Out_data 14'),'15' => __('Out_data 15')];
+ }
+
+ public function getHotelListList()
+ {
+ return ['0' => __('Hotel_list 0'),'1' => __('Hotel_list 1')];
+ }
+
+ public function getListList()
+ {
+ return ['0' => __('List 0'),'1' => __('List 1'),'2' => __('List 2'),'3' => __('List 3'),'4' => __('List 4')];
+ }
+
+ public function getStatusList()
+ {
+ return ['normal' => __('Normal'),'hidden' => __('Hidden')];
+ }
+
+
+ public function getAdvancedataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['advancedata'];
+ $list = $this->getAdvancedataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getOutDataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['out_data'];
+ $list = $this->getOutDataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getHotelListTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['hotel_list'];
+ $list = $this->getHotelListList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getListTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['list'];
+ $list = $this->getListList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getStatusTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['status'];
+ $list = $this->getStatusList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+
+
+}
diff --git a/application/admin/model/ProductShow.php b/application/admin/model/ProductShow.php
new file mode 100644
index 0000000000000000000000000000000000000000..aad28c102e6e8acaf7f61138ef443cc985169bd6
--- /dev/null
+++ b/application/admin/model/ProductShow.php
@@ -0,0 +1,70 @@
+ __('Advancedata 0'),'1' => __('Advancedata 1'),'2' => __('Advancedata 2'),'3' => __('Advancedata 3')];
+ }
+
+ public function getOutDataList()
+ {
+ return ['0' => __('Out_data 0'),'1' => __('Out_data 1'),'2' => __('Out_data 2'),'3' => __('Out_data 3'),'4' => __('Out_data 4'),'5' => __('Out_data 5'),'6' => __('Out_data 6'),'7' => __('Out_data 7'),'8' => __('Out_data 8'),'9' => __('Out_data 9'),'10' => __('Out_data 10'),'11' => __('Out_data 11'),'12' => __('Out_data 12'),'13' => __('Out_data 13'),'14' => __('Out_data 14'),'15' => __('Out_data 15')];
+ }
+
+ public function getListList()
+ {
+ return ['0' => __('List 0'),'1' => __('List 1'),'2' => __('List 2'),'3' => __('List 3'),'4' => __('List 4')];
+ }
+
+
+ public function getAdvancedataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['advancedata'];
+ $list = $this->getAdvancedataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getOutDataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['out_data'];
+ $list = $this->getOutDataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getListTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['list'];
+ $list = $this->getListList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+
+
+}
diff --git a/application/admin/model/ProductTickets.php b/application/admin/model/ProductTickets.php
new file mode 100644
index 0000000000000000000000000000000000000000..3568eb0b430a152f960040556cc49dc443adb0b8
--- /dev/null
+++ b/application/admin/model/ProductTickets.php
@@ -0,0 +1,70 @@
+ __('Advancedata 0'),'1' => __('Advancedata 1'),'2' => __('Advancedata 2'),'3' => __('Advancedata 3')];
+ }
+
+ public function getStatusList()
+ {
+ return ['normal' => __('Normal'),'hidden' => __('Hidden')];
+ }
+
+ public function getListList()
+ {
+ return ['0' => __('List 0'),'1' => __('List 1'),'2' => __('List 2'),'3' => __('List 3'),'4' => __('List 4')];
+ }
+
+
+ public function getAdvancedataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['advancedata'];
+ $list = $this->getAdvancedataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getStatusTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['status'];
+ $list = $this->getStatusList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getListTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['list'];
+ $list = $this->getListList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+
+
+}
diff --git a/application/admin/model/ProductTraffic.php b/application/admin/model/ProductTraffic.php
new file mode 100644
index 0000000000000000000000000000000000000000..b216eb90ca0a7dc215b3792416e7ba97df97523b
--- /dev/null
+++ b/application/admin/model/ProductTraffic.php
@@ -0,0 +1,70 @@
+ __('Advancedata 0'),'1' => __('Advancedata 1'),'2' => __('Advancedata 2'),'3' => __('Advancedata 3')];
+ }
+
+ public function getOutDataList()
+ {
+ return ['0' => __('Out_data 0'),'1' => __('Out_data 1'),'2' => __('Out_data 2'),'3' => __('Out_data 3'),'4' => __('Out_data 4'),'5' => __('Out_data 5'),'6' => __('Out_data 6'),'7' => __('Out_data 7'),'8' => __('Out_data 8'),'9' => __('Out_data 9'),'10' => __('Out_data 10'),'11' => __('Out_data 11'),'12' => __('Out_data 12'),'13' => __('Out_data 13'),'14' => __('Out_data 14'),'15' => __('Out_data 15')];
+ }
+
+ public function getListList()
+ {
+ return ['0' => __('List 0'),'1' => __('List 1'),'2' => __('List 2'),'3' => __('List 3'),'4' => __('List 4')];
+ }
+
+
+ public function getAdvancedataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['advancedata'];
+ $list = $this->getAdvancedataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getOutDataTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['out_data'];
+ $list = $this->getOutDataList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+ public function getListTextAttr($value, $data)
+ {
+ $value = $value ? $value : $data['list'];
+ $list = $this->getListList();
+ return isset($list[$value]) ? $list[$value] : '';
+ }
+
+
+
+
+}
diff --git a/application/admin/model/Raiders.php b/application/admin/model/Raiders.php
new file mode 100644
index 0000000000000000000000000000000000000000..0c2a9a9d414654baee5f5e2e835919a23f94ed71
--- /dev/null
+++ b/application/admin/model/Raiders.php
@@ -0,0 +1,54 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/NewTravel.php b/application/admin/validate/NewTravel.php
new file mode 100644
index 0000000000000000000000000000000000000000..3aea7547d0b3fff590c33a42bcde9f67431d3ccc
--- /dev/null
+++ b/application/admin/validate/NewTravel.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/Order.php b/application/admin/validate/Order.php
new file mode 100644
index 0000000000000000000000000000000000000000..e0565c2261e142a74cdb88deb97d774f25c91ebb
--- /dev/null
+++ b/application/admin/validate/Order.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/ProductAddress.php b/application/admin/validate/ProductAddress.php
new file mode 100644
index 0000000000000000000000000000000000000000..2aae44349f993a666139883774050115c63cd6f7
--- /dev/null
+++ b/application/admin/validate/ProductAddress.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/ProductAirport.php b/application/admin/validate/ProductAirport.php
new file mode 100644
index 0000000000000000000000000000000000000000..57fcf02f3a76bca177f0fa00788c07974b9c6f40
--- /dev/null
+++ b/application/admin/validate/ProductAirport.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/ProductCar.php b/application/admin/validate/ProductCar.php
new file mode 100644
index 0000000000000000000000000000000000000000..aa1c030d58f11133b8fd96806d2853ae5bdf154a
--- /dev/null
+++ b/application/admin/validate/ProductCar.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/ProductCarRental.php b/application/admin/validate/ProductCarRental.php
new file mode 100644
index 0000000000000000000000000000000000000000..d2c685b19dc6a49a3f44e377b28f908232a92bbb
--- /dev/null
+++ b/application/admin/validate/ProductCarRental.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/ProductDay.php b/application/admin/validate/ProductDay.php
new file mode 100644
index 0000000000000000000000000000000000000000..5d79a071d270fb78edf3afd837e2e1528e0ff950
--- /dev/null
+++ b/application/admin/validate/ProductDay.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/ProductExperience.php b/application/admin/validate/ProductExperience.php
new file mode 100644
index 0000000000000000000000000000000000000000..f5212f223525e2148f36f9f45db72383f3272d64
--- /dev/null
+++ b/application/admin/validate/ProductExperience.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/ProductFood.php b/application/admin/validate/ProductFood.php
new file mode 100644
index 0000000000000000000000000000000000000000..8ea8a7d8a80833c304798a3e7f2755ffaf9fe50a
--- /dev/null
+++ b/application/admin/validate/ProductFood.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/ProductHotels.php b/application/admin/validate/ProductHotels.php
new file mode 100644
index 0000000000000000000000000000000000000000..4bada0a27d8550441a84efedc8babc34ab18aba3
--- /dev/null
+++ b/application/admin/validate/ProductHotels.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/ProductLocal.php b/application/admin/validate/ProductLocal.php
new file mode 100644
index 0000000000000000000000000000000000000000..f18c24f0d1fa73a94e1d379cb86699f19776072e
--- /dev/null
+++ b/application/admin/validate/ProductLocal.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/ProductManydays.php b/application/admin/validate/ProductManydays.php
new file mode 100644
index 0000000000000000000000000000000000000000..78a8617818a957cf24ccc52466349ef21a11d67b
--- /dev/null
+++ b/application/admin/validate/ProductManydays.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/ProductShow.php b/application/admin/validate/ProductShow.php
new file mode 100644
index 0000000000000000000000000000000000000000..561b4b2f49e36aec706bb9df4a6216dd0af9a281
--- /dev/null
+++ b/application/admin/validate/ProductShow.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/ProductTickets.php b/application/admin/validate/ProductTickets.php
new file mode 100644
index 0000000000000000000000000000000000000000..6a67965b9890fc94512fdfb678999b78cfcaba15
--- /dev/null
+++ b/application/admin/validate/ProductTickets.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/ProductTraffic.php b/application/admin/validate/ProductTraffic.php
new file mode 100644
index 0000000000000000000000000000000000000000..816a849327b45012f652450f69cfc30c1608a8bf
--- /dev/null
+++ b/application/admin/validate/ProductTraffic.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/validate/Raiders.php b/application/admin/validate/Raiders.php
new file mode 100644
index 0000000000000000000000000000000000000000..fa93e83d59861054a40c4a9cdc3e3b95d230aaf8
--- /dev/null
+++ b/application/admin/validate/Raiders.php
@@ -0,0 +1,27 @@
+ [],
+ 'edit' => [],
+ ];
+
+}
diff --git a/application/admin/view/common/header.html b/application/admin/view/common/header.html
index 485ce99a600b9f32a2635bd38d8dfb9761adc8af..9d124f7fb66e11a6d2d0515ca66be0981c6c9c34 100644
--- a/application/admin/view/common/header.html
+++ b/application/admin/view/common/header.html
@@ -87,19 +87,7 @@
-
-
-
+