diff --git a/app/common/dao/enter/EnterCompanyDao.php b/app/common/dao/enter/EnterCompanyDao.php
new file mode 100644
index 00000000..dd518453
--- /dev/null
+++ b/app/common/dao/enter/EnterCompanyDao.php
@@ -0,0 +1,40 @@
+
+// +----------------------------------------------------------------------
+
+
+namespace app\common\dao\enter;
+
+use think\Collection;
+use think\db\BaseQuery;
+use think\db\exception\DataNotFoundException;
+use think\db\exception\DbException;
+use think\db\exception\ModelNotFoundException;
+use think\facade\Db;
+use app\common\dao\BaseDao;
+use app\common\model\enter\EnterCompany;
+use app\common\model\BaseModel;
+use think\Model;
+
+class EnterCompanyDao extends BaseDao
+{
+
+ /**
+ * @return BaseModel
+ * @author xaboy
+ * @day 2020-03-30
+ */
+ protected function getModel(): string
+ {
+ return EnterCompany::class;
+ }
+
+}
diff --git a/app/common/model/enter/EnterCompany.php b/app/common/model/enter/EnterCompany.php
new file mode 100644
index 00000000..c5c57b50
--- /dev/null
+++ b/app/common/model/enter/EnterCompany.php
@@ -0,0 +1,43 @@
+
+// +----------------------------------------------------------------------
+
+
+namespace app\common\model\enter;
+
+
+use app\common\model\BaseModel;
+
+class EnterCompany extends BaseModel
+{
+
+ /**
+ * @return string
+ * @author xaboy
+ * @day 2020-03-30
+ */
+ public static function tablePk(): string
+ {
+ return 'id';
+ }
+
+ /**
+ * @return string
+ * @author xaboy
+ * @day 2020-03-30
+ */
+ public static function tableName(): string
+ {
+ return 'market_company';
+ }
+
+
+}
diff --git a/app/common/repositories/enter/EnterCompanyRepository.php b/app/common/repositories/enter/EnterCompanyRepository.php
new file mode 100644
index 00000000..4a93745b
--- /dev/null
+++ b/app/common/repositories/enter/EnterCompanyRepository.php
@@ -0,0 +1,15 @@
+dao = $dao;
+ }
+}
\ No newline at end of file
diff --git a/app/controller/Install.php b/app/controller/Install.php
index 4c09fc2a..77bd1cc1 100644
--- a/app/controller/Install.php
+++ b/app/controller/Install.php
@@ -1,856 +1,856 @@
-
-// +----------------------------------------------------------------------
-
-
-namespace app\controller;
-
-use crmeb\basic\BaseController;
-use Redis;
-use think\App;
-use think\Exception;
-use think\exception\ValidateException;
-use think\facade\Config;
-use think\facade\View;
-use think\Request;
-use think\Response;
-use Throwable;
-use ZipArchive;
-use ZipStream\ZipStream;
-
-class Install //extends BaseController
-{
-
- /**
- * Request实例
- * @var Request
- */
- protected $request;
-
- /**
- * 应用实例
- * @var App
- */
- protected $app;
- /**
- * sql文件
- * @var App
- */
- public $sqlFile;
- /**
- * 配置文件
- * @var App
- */
- public $configFile;
- public $env;
- public $installHost;
- public $_url;
-
- public function __construct(App $app)
- {
- if (file_exists(__DIR__ . '/../../install/install.lock')) {
- throw new ValidateException('你已经安装过该系统,如果想重新安装,请先删除install目录下的 install.lock 文件,然后再安装。');
- }
- if (!file_exists(__DIR__ . '/../../install/' . $this->sqlFile)) {
- throw new ValidateException('缺少数据库文件:"install/'.$this->sqlFile.'"');
- }
- if (!file_exists(__DIR__ . '/../../install/' . $this->configFile)) {
- throw new ValidateException('缺少配置文件:"install/'.$this->configFile.'"');
- }
- $this->app = $app;
- $this->request = $this->app->request;
- $this->sqlFile = 'crmeb_merchant.sql';
- $this->configFile = '.env';
- $this->env = [];
- $this->installHost = $this->request->domain();
- if (substr($this->installHost, 0, 5) == 'https'){
- $this->_url = str_replace('//' ,'\\\/\\\/', $this->installHost);
- } else {
- $this->_url = str_replace('http://' ,'http:\\\/\\\/', $this->installHost);
- }
- }
-
- /**
- * TODO 1 开始安装
- * @return string
- * @author Qinii
- * @day 2020-07-16
- */
- public function begin()
- {
- return View::fetch('/install/step1');
- }
-
- /**
- * TODO 2 环境检测
- * @return string
- * @author Qinii
- * @day 2020-07-16
- */
- public function environment()
- {
- $phpv = @ phpversion();
- $os = PHP_OS;
- $tmp = function_exists('gd_info') ? gd_info() : array();
- $max_execution_time = ini_get('max_execution_time');
- $allow_reference = (ini_get('allow_call_time_pass_reference') ? '[√]On' : '[×]Off');
- $allow_url_fopen = (ini_get('allow_url_fopen') ? '[√]On' : '[×]Off');
- $safe_mode = (ini_get('safe_mode') ? '[×]On' : '[√]Off');
-
-
-
- $err = 0;
- if (empty($tmp['GD Version'])) {
- $gd = '[×]Off';
- $err++;
- } else {
- $gd = '[√]On ' . $tmp['GD Version'];
- }
- if (function_exists('mysqli_connect')) {
- $mysql = '√ 已安装';
- } else {
- $mysql = '√ 请安装mysqli扩展';
- $err++;
- }
- if (ini_get('file_uploads')) {
- $uploadSize = '√ ' . ini_get('upload_max_filesize');
- } else {
- $uploadSize = '√禁止上传';
- }
- if (function_exists('session_start')) {
- $session = '√ 支持';
- } else {
- $session = '√ 不支持';
- $err++;
- }
- if (extension_loaded('zip')) {
- $zip = '[√]支持 ';
- } else {
- $zip = '[×]不支持';
- $err++;
- }
- if (extension_loaded(('redis'))) {
- $redis = '[√]支持 ';
- } else {
- $redis = '[×]不支持';
- $err++;
- }
- if (extension_loaded('swoole')) {
- $swoole = '[√]支持 ';
- } else {
- $swoole = '[×]不支持';
- $err++;
- }
- if (extension_loaded('swoole_loader')) {
- $swooleCompiler = '[√]支持 ';
- } else {
- $swooleCompiler = '√ 请安装swoole_loader扩展';
- $err++;
- }
-
- if (function_exists('curl_init')) {
- $curl = '[√]支持 ';
- } else {
- $curl = '[×]不支持';
- $err++;
- }
-
- if (function_exists('bcadd')) {
- $bcmath = '[√]支持 ';
- } else {
- $bcmath = '[×]不支持';
- $err++;
- }
- if (function_exists('openssl_encrypt')) {
- $openssl = '[√]支持 ';
- } else {
- $openssl = '[×]不支持';
- $err++;
- }
- if (function_exists('finfo_open')) {
- $finfo_open = '[√]支持 ';
- } else {
- $finfo_open = '[×]不支持';
- $err++;
- }
- $folder = array(
- 'public/install',
- 'public/uploads',
- 'runtime',
- '.env',
- );
- //必须开启函数
- if (function_exists('file_put_contents')) {
- $file_put_contents = '[√]开启 ';
- } else {
- $file_put_contents = '[×]关闭';
- $err++;
- }
- if (function_exists('imagettftext')) {
- $imagettftext = '[√]开启 ';
- } else {
- $imagettftext = '[×]关闭';
- $err++;
- }
- if (function_exists('pcntl_alarm')) {
- $pcntl_alarm = '[√]开启 ';
- } else {
- $pcntl_alarm = '[×]关闭';
- $err++;
- }
- if (function_exists('proc_open')) {
- $proc_open = '[√]开启 ';
- } else {
- $proc_open = '[×]关闭';
- $err++;
- }
- if (function_exists('pcntl_signal')) {
- $pcntl_signal = '[√]开启 ';
- } else {
- $pcntl_signal = '[×]关闭';
- $err++;
- }
- View::assign([
- 'max_execution_time' => $max_execution_time,
- 'allow_reference' => $allow_reference,
- 'swooleCompiler' => $swooleCompiler,
- 'phpv' => $phpv,
- 'allow_url_fopen' => $allow_url_fopen,
- 'safe_mode' => $safe_mode,
- 'gd' => $gd,
- 'mysql' => $mysql,
- 'uploadSize' => $uploadSize,
- 'redis' => $redis,
- 'session' => $session,
- 'swoole' => $swoole,
- 'curl' => $curl,
- 'bcmath' => $bcmath,
- 'openssl' => $openssl,
- 'finfo_open' => $finfo_open,
- 'file_put_contents' => $file_put_contents,
- 'imagettftext' => $imagettftext,
- 'folder' => $folder,
- 'zip' => $zip,
- 'proc_open' => $proc_open,
- 'pcntl_alarm' => $pcntl_alarm,
- 'pcntl_signal' => $pcntl_signal,
- ]);
- return View::fetch('/install/step2', ['err' => $err]);
- }
-
- /**
- * TODO 3 数据库填写表单
- * @return string
- * @author Qinii
- * @day 2020-07-15
- */
- public function databases()
- {
- return View::fetch('/install/step3');
- }
- /**
- * TODO 4 安装数据库
- * @return string
- * @author Qinii
- * @day 2020-07-16
- */
- public function create()
- {
- $data = $this->request->params(['dbhost', 'dbport', 'dbname', 'dbuser', 'dbpw', ['dbprefix','eb_'], 'manager', 'manager_pwd', ['rbhost', '127.0.0.1'], ['rbport', 6379], 'rbpw', ['rbselect', 0], 'demo']);
- $mysql = $this->checkDatabsaces($data);
- if ($mysql !== 1) throw new ValidateException('数据库链接失败' . $mysql);
- return View::fetch('/install/step4', ['data' => $data]);
- }
-
- /**
- * TODO 5 安装完成
- * @return string
- * @author Qinii
- * @day 2020-07-16
- */
- public function end()
- {
- $ip = $this->get_client_ip();
- $server = $this->request->server();
- $host = $server['HTTP_HOST'];
- $version = get_crmeb_version('未知');
- $this->installlog();
- @touch(__DIR__ . '/../../install/install.lock');
- $this->unzip();
- return View::fetch('/install/step5', [
- 'host' => $host,
- 'ip' => $ip,
- 'version' => $version,
- 'merchant' => Config::get('admin.merchant_prefix'),
- 'system' => Config::get('admin.admin_prefix'),
- ]);
- }
-
- /**
- * TODO 链接数据库 读取sql
- * @param $n
- * @return array
- * @author Qinii
- * @day 2020-07-16
- */
- public function perform($n)
- {
- $data = $this->request->param();
- $dbName = strtolower(trim($data['dbname']));
- $conn = @mysqli_connect($data['dbhost'], $data['dbuser'], $data['dbpw'], NULL, $data['dbport']);
- if (mysqli_connect_errno($conn)) {
- throw new ValidateException("连接数据库失败!" . mysqli_connect_error($conn));
- }
- if (!mysqli_select_db($conn, $dbName)) {
- //创建数据时同时设置编码
- if (!mysqli_query($conn, "CREATE DATABASE IF NOT EXISTS `" . $dbName . "` DEFAULT CHARACTER SET utf8;")) {
- throw new ValidateException('数据库 ' . $dbName . ' 不存在,也没权限创建新的数据库!');
- }
- }
- mysqli_select_db($conn, $dbName);
- mysqli_query($conn, 'SET NAMES utf8;');
- //读取数据文件
- $sqldata = file_get_contents(__DIR__ . '/../../install/' . $this->sqlFile);
- $sqlFormat = $this->sql_split($sqldata, $data['dbprefix']);
- $counts = count($sqlFormat);
- if ($n <= $counts && isset($sqlFormat[$n])) {
- $sql = trim($sqlFormat[$n]);
- $message = $this->install($sql, $conn, $data['dbprefix']);
- $n++;
- } else {
- if ($data['demo'] == '')
- $this->clear($conn, $data['dbprefix']);
- $this->setConfig($data);
- $message = $this->setDatabase($conn, $data);
- $n = -1;
- }
- return [
- 'n' => $n,
- 'msg' => $message
- ];
- }
-
-
- /**
- * TODO 执行数据库文件安装
- * @param $sql
- * @param $conn
- * @param $dbPrefix
- * @return string
- * @author Qinii
- * @day 2020-07-16
- */
- public function install($sql, $conn, $dbPrefix)
- {
- // 建表
- if (strstr($sql, 'CREATE TABLE')) {
- preg_match('/CREATE TABLE `eb_([^ ]*)`/is', $sql, $matches);
- mysqli_query($conn, "DROP TABLE IF EXISTS `$matches[1]");
- $sql = str_replace('`eb_', '`' . $dbPrefix, $sql);//替换表前缀
- $ret = mysqli_query($conn, $sql);
- if ($ret) {
- $message = '
√创建数据表[' . $dbPrefix . $matches[1] . ']完成!' . date('Y-m-d H:i:s') . ' ';
- } else {
- $message = '√创建数据表[' . $dbPrefix . $matches[1] . ']失败!' . date('Y-m-d H:i:s') . '';
- }
-
- } //插入数据
- else {
- $message = '';
- if (trim($sql) !== '') {
- $sql = str_replace('`eb_', '`' . $dbPrefix, $sql);//替换表前缀
- $sql = str_replace('https://mer1.crmeb.net', $this->installHost , $sql);
- $sql = str_replace('https:\\\/\\\/mer1.crmeb.net', $this->_url , $sql);
- $ret = mysqli_query($conn, $sql);
- $sql = htmlspecialchars($sql);
- $msg = substr($sql, 0, 30);
- if ($ret) {
- $message = '√执行 [' . $msg . '...]成功!' . date('Y-m-d H:i:s') . ' ';
- } else {
- $message = '√执行[' . $msg . '..]失败!' . date('Y-m-d H:i:s') . '';
- }
- }
- }
- return $message;
- }
-
- /**
- * TODO 清除测试数据
- * @param $conn
- * @param $dbPrefix
- * @author Qinii
- * @day 2020-07-16
- */
- public function clear($conn, $dbPrefix)
- {
- $result = mysqli_query($conn, "show tables");
- $tables = mysqli_fetch_all($result);//参数MYSQL_ASSOC、MYSQLI_NUM、MYSQLI_BOTH规定产生数组类型
- $bl_table = array(
- 'eb_system_admin',
- 'eb_system_menu',
- 'eb_system_role',
- 'eb_system_group',
- 'eb_system_group_data',
- 'eb_system_city',
- 'eb_express',
- 'eb_system_config',
- 'eb_system_config_classify',
- 'eb_system_config_value',
- 'eb_template_message',
- 'system_notice_config',
- 'eb_city_area',
- 'eb_diy',
- 'eb_page_category',
- 'eb_page_link',
- 'eb_system_notice_config'
- );
- foreach ($bl_table as $k => $v) {
- $bl_table[$k] = str_replace('eb_', $dbPrefix, $v);
- }
-
- foreach ($tables as $key => $val) {
- if (!in_array($val[0], $bl_table)) {
- mysqli_query($conn, "truncate table " . $val[0]);
- }
- }
- }
-
- /**
- * TODO 创建.env文件
- * @param $data
- * @author Qinii
- * @day 2020-07-16
- */
- public function setConfig($data)
- {
- //读取配置文件,并替换真实配置数据1
- $strConfig = file_get_contents(__DIR__ . '/../../install/' . $this->configFile);
- //'dbhost', 'dbport', 'dbname', 'dbuser', 'dbpw', 'dbprefix', 'manager', 'manager_pwd', ['rbhost', '127.0.0.1'], ['rbport', 6379], 'rbpw', ['rbselect', 0]
- $strConfig = str_replace('#DB_HOST#', $data['dbhost'], $strConfig);
- $strConfig = str_replace('#DB_NAME#', $data['dbname'], $strConfig);
- $strConfig = str_replace('#DB_USER#', $data['dbuser'], $strConfig);
- $strConfig = str_replace('#DB_PWD#', $data['dbpw'], $strConfig);
- $strConfig = str_replace('#DB_PORT#', $data['dbport'], $strConfig);
- $strConfig = str_replace('#DB_PREFIX#', $data['dbprefix'], $strConfig);
- $strConfig = str_replace('#DB_CHARSET#', 'utf8', $strConfig);
- //redis数据库信息
- $strConfig = str_replace('#RB_HOST#', $data['rbhost'], $strConfig);
- $strConfig = str_replace('#RB_PORT#', $data['rbport'], $strConfig);
- $strConfig = str_replace('#RB_PWD#', $data['rbpw'], $strConfig);
- $strConfig = str_replace('#RB_SELECT#', $data['rbselect'], $strConfig);
- $strConfig = str_replace('#APP_KEY#', md5(time() . random_int(10000000, 99999999)), $strConfig);
- @chmod(__DIR__ . '/../../.env', 0777);
- @file_put_contents(__DIR__ . '/../../.env', $strConfig); //数据库配置文件的地址
- }
-
- /**
- * TODO 修改后台管理员用户
- * @param $conn
- * @param $data
- * @return string
- * @author Qinii
- * @day 2020-07-16
- */
- public function setDatabase($conn, $data)
- {
- $time = date('Y-m-d H:i:s');
- $ip = $this->get_client_ip();
- $ip = empty($ip) ? "0.0.0.0" : $ip;
- $password = password_hash(trim($data['manager_pwd']), PASSWORD_BCRYPT);
- mysqli_query($conn, "truncate table {$data['dbprefix']}system_admin");
- $addadminsql = "INSERT INTO `{$data['dbprefix']}system_admin` (`admin_id`, `account`, `pwd`, `real_name`, `roles`, `last_ip`, `last_time`, `create_time`, `login_count`, `level`, `status`, `is_del`) VALUES
-(1, '" . $data['manager'] . "', '" . $password . "', '', '1', '" . $ip . "','$time' , '$time', 0, 0, 1, 0)";
- $res = mysqli_query($conn, $addadminsql);
- if ($res) {
- $message = '成功添加管理员
成功写入配置文件
安装完成.';
- } else {
- $message = '添加管理员失败
成功写入配置文件
安装完成.';
- }
- return $message;
- }
-
- /**
- * TODO 检测数据库链接是否成功以及版本
- * @param $data
- * @return false|int|string
- * @author Qinii
- * @day 2020-07-16
- */
- public function checkDatabsaces($data)
- {
- $dbName = strtolower(trim($data['dbname']));
- $conn = @mysqli_connect($data['dbhost'], $data['dbuser'], $data['dbpw'], NULL, $data['dbport']);
- if (mysqli_connect_errno($conn)) return 0;
- $result = mysqli_query($conn, "SELECT @@global.sql_mode");
- $result = $result->fetch_array();
- $version = mysqli_get_server_info($conn);
- if ($version < 5.6) return (json_encode(-4));
-
- if (strstr($result[0], 'STRICT_TRANS_TABLES') || strstr($result[0], 'STRICT_ALL_TABLES') || strstr($result[0], 'TRADITIONAL') || strstr($result[0], 'ANSI'))
- return ($version < 8.0) ? -1 : -2;
-
- $result = mysqli_query($conn, "select count(table_name) as c from information_schema.`TABLES` where table_schema='$dbName'");
- $result = $result->fetch_array();
- if ($result['c'] > 0) return -3;
- return 1;
- }
-
- /**
- * TODO 验证数据库及redis是否正常
- * @return false|int|string
- * @author Qinii
- * @day 2020-07-15
- */
- public function databasesCheck()
- {
- $data = $this->request->params(['dbhost', 'dbport', 'dbname', 'dbuser', 'dbpw',['dbprefix','eb_'], ['rbhost', '127.0.0.1'], ['rbport', 6379], 'rbpw', ['rbselect', 0]]);
- // mysql 检测
- $mysql = $this->checkDatabsaces($data);
- if ($mysql !== 1) return $mysql;
- // redis检测
- try {
- $redis = new Redis();
- $redis->connect($data['rbhost'], $data['rbport']);
- if ($data['rbpw']) $redis->auth($data['rbpw']);
- if ($data['rbselect']) $redis->select($data['rbselect']);
- $res = $redis->set('install', 1, 10);
- return $res ? 1 : -5;
- } catch (Throwable $e) {
- return -5;
- }
- }
-
- /**
- * TODO 安装记录文件生成
- * @author Qinii
- * @day 2020-07-16
- */
- public function installlog()
- {
- $mt_rand_str = $this->sp_random_string(6);
- $str_constant = "request->server();
- if (isset($server['REMOTE_ADDR']))
- $ip = $server['REMOTE_ADDR'];
- // IP地址合法验证
- $ip = (false !== ip2long($ip)) ? $ip : '0.0.0.0';
- return $ip;
- }
-
- /**
- * 生成基础文件
- * @Author:Qinii
- * @Date: 2020/8/31
- */
- public function unzip()
- {
- update_crmeb_compiled();
- }
-
-
- /**
- * TODO swoole_loader 安装向导
- * @Author:Qinii
- * @Date: 2020/9/10
- */
- public function swooleCompiler()
- {
- // Check os type
- $this->env['os'] = [];
- if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
- $this->env['os']['name'] = "windows";
- $this->env['os']['raw_name'] = php_uname();
- } else {
- $this->env['os']['name'] = "unix";
- $this->env['os']['raw_name'] = php_uname();
- }
- // Check php
- $this->env['php'] = [];
- $this->env['php']['version'] = phpversion();
- // Check run mode
- $sapi_type = php_sapi_name();
- if ("cli" == $sapi_type) {
- $this->env['php']['run_mode'] = "cli";
- } else {
- $this->env['php']['run_mode'] = "web";
- }
- // Check php bit
- if (PHP_INT_SIZE == 4) {
- $this->env['php']['bit'] = 32;
- } else {
- $this->env['php']['bit'] = 64;
- }
- $this->env['php']['sapi'] = $sapi_type;
- $this->env['php']['ini_loaded_file'] = php_ini_loaded_file();
- $this->env['php']['ini_scanned_files'] = php_ini_scanned_files();
- $this->env['php']['loaded_extensions'] = get_loaded_extensions();
- $this->env['php']['incompatible_extensions'] = ['xdebug', 'ionCube', 'zend_loader'];
- $this->env['php']['loaded_incompatible_extensions'] = [];
- $this->env['php']['extension_dir'] = ini_get('extension_dir');
- // Check incompatible extensions
- if (is_array($this->env['php']['loaded_extensions'])) {
- foreach ($this->env['php']['loaded_extensions'] as $loaded_extension) {
- foreach ($this->env['php']['incompatible_extensions'] as $incompatible_extension) {
- if (strpos(strtolower($loaded_extension), strtolower($incompatible_extension)) !== false) {
- $this->env['php']['loaded_incompatible_extensions'][] = $loaded_extension;
- }
- }
- }
- }
- $this->env['php']['loaded_incompatible_extensions'] = array_unique($this->env['php']['loaded_incompatible_extensions']);
- // Parse System Environment Info
- $sysInfo = $this->w_getSysInfo();
- // Check php thread safety
- $this->env['php']['raw_thread_safety'] = isset($sysInfo['thread_safety']) ? $sysInfo['thread_safety'] : false;
- if (isset($sysInfo['thread_safety'])) {
- $this->env['php']['thread_safety'] = $sysInfo['thread_safety'] ? '线程安全' : '非线程安全';
- } else {
- $this->env['php']['thread_safety'] = '未知';
- }
- // Check swoole loader installation
- if (isset($sysInfo['swoole_loader']) and isset($sysInfo['swoole_loader_version'])) {
- $this->env['php']['swoole_loader']['status'] = $sysInfo['swoole_loader'] ? "已安装"
- : '未安装';
- if ($sysInfo['swoole_loader_version'] !== false) {
- $this->env['php']['swoole_loader']['version'] = "" . $sysInfo['swoole_loader_version'] . "";
- } else {
- $this->env['php']['swoole_loader']['version'] = '未知';
- }
- } else {
- $this->env['php']['swoole_loader']['status'] = '未安装';
- $this->env['php']['swoole_loader']['version'] = '未知';
- }
- $this->html($sysInfo);
- }
-
- /**
- * 页面输出内容
- * @Author:Qinii
- * @Date: 2020/9/10
- * @param $this ->>env
- * @param $sysInfo
- */
- public function html($sysInfo)
- {
- $html = '';
- // Header
- $html_header = '
-
-
-
-
-
-
-
- %s
-
-
-
- ';
- $html_header = sprintf($html_header, 'CRMEB Swoole Compiler 安装向导');
- $html_body = '';
- $html_body_nav = '
';
- $html_body_nav .= '
CRMEB Swoole Compiler 安装向导
';
- $html_body_nav .= '
Version:2.0.2 Date:2019-01-09
';
- $html_body_nav .= '
';
-
- // Environment information
- $html_body_environment = '
-
-
检查当前环境
-
';
- $html_body_environment .= '- 操作系统 : ' . $this->env['os']['raw_name'] . '
';
- $html_body_environment .= '- PHP版本 : ' . $this->env['php']['version'] . '
';
- $html_body_environment .= '- PHP运行环境 : ' . $this->env['php']['sapi'] . '
';
- $html_body_environment .= '- PHP配置文件 : ' . $this->env['php']['ini_loaded_file'] . '
';
- $html_body_environment .= '- PHP扩展安装目录 : ' . $this->env['php']['extension_dir'] . '
';
- $html_body_environment .= '- PHP是否线程安全 : ' . $this->env['php']['thread_safety'] . '
';
- $html_body_environment .= '- 是否安装swoole_loader : ' . $this->env['php']['swoole_loader']['status'] . '
';
- if (isset($sysInfo['swoole_loader']) and $sysInfo['swoole_loader']) {
- $html_body_environment .= '- swoole_loader版本 : ' . $this->env['php']['swoole_loader']['version'] . '
';
- }
- if ($this->env['php']['bit'] == 32) {
- $html_body_environment .= '- 温馨提示:当前环境使用的PHP为 ' . $this->env['php']['bit'] . ' 位的PHP,Compiler 目前不支持 Debug 版本或 32 位的PHP,可在 phpinfo() 中查看对应位数,如果误报请忽略此提示
';
- }
- $html_body_environment .= '
';
-
- // Error infomation
- $html_error = "";
- if (!empty($this->env['php']['loaded_incompatible_extensions'])) {
- $html_error = '
-
- ';
- $err_msg = "当前PHP包含与swoole_compiler_loader扩展不兼容的扩展" . implode(',', $this->env['php']['loaded_incompatible_extensions']) . ",请移除不兼容的扩展。";
- $html_error = sprintf($html_error, $err_msg);
- }
-
- // Check Loader Status
- $html_body_loader = '
';
- if (empty($html_error)) {
- $html_body_loader .= '
';
- $html_body_loader .= '
安装和配置Swoole Loader
';
- $phpversion = substr($this->env['php']['version'], 0, 3);
- $phpversion = str_replace('.', '', $phpversion);
- $loaderFileName = '';
- if ($this->env['os']['name'] == "windows") {
- $loaderFileName = 'php_swoole_loader_php' . $phpversion;
- if ($this->env['php']['thread_safety'] == '非线程安全') {
- $loaderFileName .= '_nzts_x64.dll';
- } else {
- $loaderFileName .= '_zts_x64.dll';
- }
- } else {
- if ($this->env['php']['thread_safety'] != '非线程安全') {
- $loaderFileName = 'swoole_loader' . $phpversion . '_zts.so';
- } else {
-
- $loaderFileName = 'swoole_loader' . $phpversion . '.so';
- }
- }
- $html_body_loader .= '
1 - 安装Swoole Loader
前往根目录 /install/swoole-loader/' . $loaderFileName . '扩展文件上传到当前PHP的扩展安装目录中:
' . $this->env['php']['extension_dir'] . '
';
- $html_body_loader .= '
2 - 修改php.ini配置(如已修改配置,请忽略此步骤,不必重复添加)
';
- $html_body_loader .= '编辑此PHP配置文件:' . $this->env['php']['ini_loaded_file'] . ',在此文件底部结尾处加入如下配置
';
- if ($this->env['os']['name'] == "windows") {
- $html_body_loader .= '
extension=' . $this->env['php']['extension_dir'] . DIRECTORY_SEPARATOR . $loaderFileName . '
注意:需要名称和刚才上传到当前PHP的扩展安装目录中的文件名一致';
- } else {
- $html_body_loader .= '
extension=' . $this->env['php']['extension_dir'] . DIRECTORY_SEPARATOR . $loaderFileName . '
注意:需要名称和刚才上传到当前PHP的扩展安装目录中的文件名一致';
- }
- $html_body_loader .= '';
- $html_body_loader .= '
3 - 重启服务
重启或重载PHP配置
';
- $html_body_loader .= '
';
- }
-
- // Body footer
- $html_body_footer = '
';
- $html_body .= $html_body_nav . '
' . $html_body_environment . $html_error . $html_body_loader . '
' . $html_body_footer;
- $html_body .= '
';
- // Footer
- $html_footer = '
-
-
-
-
- ';
-
- $html = $html_header . $html_body . $html_footer;
- return Response::create()->content($html)->send();
- }
-
- public function w_getSysInfo()
- {
- $sysEnv = [];
- // Get content of phpinfo
- ob_start();
- phpinfo();
- $sysInfo = ob_get_contents();
- ob_end_clean();
- // Explode phpinfo content
- if ($this->env['php']['run_mode'] == 'cli') {
- $sysInfoList = explode('\n', $sysInfo);
- } else {
- $sysInfoList = explode('', $sysInfo);
- }
- foreach ($sysInfoList as $sysInfoItem) {
- if (preg_match('/thread safety/i', $sysInfoItem)) {
- $sysEnv['thread_safety'] = (preg_match('/(enabled|yes)/i', $sysInfoItem) != 0);
- }
- if (preg_match('/swoole_loader support/i', $sysInfoItem)) {
- $sysEnv['swoole_loader'] = (preg_match('/(enabled|yes)/i', $sysInfoItem) != 0);
- }
- if (preg_match('/swoole_loader version/i', $sysInfoItem)) {
- preg_match('/\d+.\d+.\d+/s', $sysInfoItem, $match);
- $sysEnv['swoole_loader_version'] = isset($match[0]) ? $match[0] : false;
- }
- }
- return $sysEnv;
- }
-}
+
+// +----------------------------------------------------------------------
+
+
+namespace app\controller;
+
+use crmeb\basic\BaseController;
+use Redis;
+use think\App;
+use think\Exception;
+use think\exception\ValidateException;
+use think\facade\Config;
+use think\facade\View;
+use think\Request;
+use think\Response;
+use Throwable;
+use ZipArchive;
+use ZipStream\ZipStream;
+
+class Install //extends BaseController
+{
+
+ /**
+ * Request实例
+ * @var Request
+ */
+ protected $request;
+
+ /**
+ * 应用实例
+ * @var App
+ */
+ protected $app;
+ /**
+ * sql文件
+ * @var App
+ */
+ public $sqlFile;
+ /**
+ * 配置文件
+ * @var App
+ */
+ public $configFile;
+ public $env;
+ public $installHost;
+ public $_url;
+
+ public function __construct(App $app)
+ {
+ if (file_exists(__DIR__ . '/../../install/install.lock')) {
+ throw new ValidateException('你已经安装过该系统,如果想重新安装,请先删除install目录下的 install.lock 文件,然后再安装。');
+ }
+ if (!file_exists(__DIR__ . '/../../install/' . $this->sqlFile)) {
+ throw new ValidateException('缺少数据库文件:"install/'.$this->sqlFile.'"');
+ }
+ if (!file_exists(__DIR__ . '/../../install/' . $this->configFile)) {
+ throw new ValidateException('缺少配置文件:"install/'.$this->configFile.'"');
+ }
+ $this->app = $app;
+ $this->request = $this->app->request;
+ $this->sqlFile = 'crmeb_merchant.sql';
+ $this->configFile = '.env';
+ $this->env = [];
+ $this->installHost = $this->request->domain();
+ if (substr($this->installHost, 0, 5) == 'https'){
+ $this->_url = str_replace('//' ,'\\\/\\\/', $this->installHost);
+ } else {
+ $this->_url = str_replace('http://' ,'http:\\\/\\\/', $this->installHost);
+ }
+ }
+
+ /**
+ * TODO 1 开始安装
+ * @return string
+ * @author Qinii
+ * @day 2020-07-16
+ */
+ public function begin()
+ {
+ return View::fetch('/install/step1');
+ }
+
+ /**
+ * TODO 2 环境检测
+ * @return string
+ * @author Qinii
+ * @day 2020-07-16
+ */
+ public function environment()
+ {
+ $phpv = @ phpversion();
+ $os = PHP_OS;
+ $tmp = function_exists('gd_info') ? gd_info() : array();
+ $max_execution_time = ini_get('max_execution_time');
+ $allow_reference = (ini_get('allow_call_time_pass_reference') ? '[√]On' : '[×]Off');
+ $allow_url_fopen = (ini_get('allow_url_fopen') ? '[√]On' : '[×]Off');
+ $safe_mode = (ini_get('safe_mode') ? '[×]On' : '[√]Off');
+
+
+
+ $err = 0;
+ if (empty($tmp['GD Version'])) {
+ $gd = '[×]Off';
+ $err++;
+ } else {
+ $gd = '[√]On ' . $tmp['GD Version'];
+ }
+ if (function_exists('mysqli_connect')) {
+ $mysql = '√ 已安装';
+ } else {
+ $mysql = '√ 请安装mysqli扩展';
+ $err++;
+ }
+ if (ini_get('file_uploads')) {
+ $uploadSize = '√ ' . ini_get('upload_max_filesize');
+ } else {
+ $uploadSize = '√禁止上传';
+ }
+ if (function_exists('session_start')) {
+ $session = '√ 支持';
+ } else {
+ $session = '√ 不支持';
+ $err++;
+ }
+ if (extension_loaded('zip')) {
+ $zip = '[√]支持 ';
+ } else {
+ $zip = '[×]不支持';
+ $err++;
+ }
+ if (extension_loaded(('redis'))) {
+ $redis = '[√]支持 ';
+ } else {
+ $redis = '[×]不支持';
+ $err++;
+ }
+ if (extension_loaded('swoole')) {
+ $swoole = '[√]支持 ';
+ } else {
+ $swoole = '[×]不支持';
+ $err++;
+ }
+ if (extension_loaded('swoole_loader')) {
+ $swooleCompiler = '[√]支持 ';
+ } else {
+ $swooleCompiler = '√ 请安装swoole_loader扩展';
+ $err++;
+ }
+
+ if (function_exists('curl_init')) {
+ $curl = '[√]支持 ';
+ } else {
+ $curl = '[×]不支持';
+ $err++;
+ }
+
+ if (function_exists('bcadd')) {
+ $bcmath = '[√]支持 ';
+ } else {
+ $bcmath = '[×]不支持';
+ $err++;
+ }
+ if (function_exists('openssl_encrypt')) {
+ $openssl = '[√]支持 ';
+ } else {
+ $openssl = '[×]不支持';
+ $err++;
+ }
+ if (function_exists('finfo_open')) {
+ $finfo_open = '[√]支持 ';
+ } else {
+ $finfo_open = '[×]不支持';
+ $err++;
+ }
+ $folder = array(
+ 'public/install',
+ 'public/uploads',
+ 'runtime',
+ '.env',
+ );
+ //必须开启函数
+ if (function_exists('file_put_contents')) {
+ $file_put_contents = '[√]开启 ';
+ } else {
+ $file_put_contents = '[×]关闭';
+ $err++;
+ }
+ if (function_exists('imagettftext')) {
+ $imagettftext = '[√]开启 ';
+ } else {
+ $imagettftext = '[×]关闭';
+ $err++;
+ }
+ if (function_exists('pcntl_alarm')) {
+ $pcntl_alarm = '[√]开启 ';
+ } else {
+ $pcntl_alarm = '[×]关闭';
+ $err++;
+ }
+ if (function_exists('proc_open')) {
+ $proc_open = '[√]开启 ';
+ } else {
+ $proc_open = '[×]关闭';
+ $err++;
+ }
+ if (function_exists('pcntl_signal')) {
+ $pcntl_signal = '[√]开启 ';
+ } else {
+ $pcntl_signal = '[×]关闭';
+ $err++;
+ }
+ View::assign([
+ 'max_execution_time' => $max_execution_time,
+ 'allow_reference' => $allow_reference,
+ 'swooleCompiler' => $swooleCompiler,
+ 'phpv' => $phpv,
+ 'allow_url_fopen' => $allow_url_fopen,
+ 'safe_mode' => $safe_mode,
+ 'gd' => $gd,
+ 'mysql' => $mysql,
+ 'uploadSize' => $uploadSize,
+ 'redis' => $redis,
+ 'session' => $session,
+ 'swoole' => $swoole,
+ 'curl' => $curl,
+ 'bcmath' => $bcmath,
+ 'openssl' => $openssl,
+ 'finfo_open' => $finfo_open,
+ 'file_put_contents' => $file_put_contents,
+ 'imagettftext' => $imagettftext,
+ 'folder' => $folder,
+ 'zip' => $zip,
+ 'proc_open' => $proc_open,
+ 'pcntl_alarm' => $pcntl_alarm,
+ 'pcntl_signal' => $pcntl_signal,
+ ]);
+ return View::fetch('/install/step2', ['err' => $err]);
+ }
+
+ /**
+ * TODO 3 数据库填写表单
+ * @return string
+ * @author Qinii
+ * @day 2020-07-15
+ */
+ public function databases()
+ {
+ return View::fetch('/install/step3');
+ }
+ /**
+ * TODO 4 安装数据库
+ * @return string
+ * @author Qinii
+ * @day 2020-07-16
+ */
+ public function create()
+ {
+ $data = $this->request->params(['dbhost', 'dbport', 'dbname', 'dbuser', 'dbpw', ['dbprefix','eb_'], 'manager', 'manager_pwd', ['rbhost', '127.0.0.1'], ['rbport', 6379], 'rbpw', ['rbselect', 0], 'demo']);
+ $mysql = $this->checkDatabsaces($data);
+ if ($mysql !== 1) throw new ValidateException('数据库链接失败' . $mysql);
+ return View::fetch('/install/step4', ['data' => $data]);
+ }
+
+ /**
+ * TODO 5 安装完成
+ * @return string
+ * @author Qinii
+ * @day 2020-07-16
+ */
+ public function end()
+ {
+ $ip = $this->get_client_ip();
+ $server = $this->request->server();
+ $host = $server['HTTP_HOST'];
+ $version = get_crmeb_version('未知');
+ $this->installlog();
+ @touch(__DIR__ . '/../../install/install.lock');
+ $this->unzip();
+ return View::fetch('/install/step5', [
+ 'host' => $host,
+ 'ip' => $ip,
+ 'version' => $version,
+ 'merchant' => Config::get('admin.merchant_prefix'),
+ 'system' => Config::get('admin.admin_prefix'),
+ ]);
+ }
+
+ /**
+ * TODO 链接数据库 读取sql
+ * @param $n
+ * @return array
+ * @author Qinii
+ * @day 2020-07-16
+ */
+ public function perform($n)
+ {
+ $data = $this->request->param();
+ $dbName = strtolower(trim($data['dbname']));
+ $conn = @mysqli_connect($data['dbhost'], $data['dbuser'], $data['dbpw'], NULL, $data['dbport']);
+ if (mysqli_connect_errno($conn)) {
+ throw new ValidateException("连接数据库失败!" . mysqli_connect_error($conn));
+ }
+ if (!mysqli_select_db($conn, $dbName)) {
+ //创建数据时同时设置编码
+ if (!mysqli_query($conn, "CREATE DATABASE IF NOT EXISTS `" . $dbName . "` DEFAULT CHARACTER SET utf8;")) {
+ throw new ValidateException('数据库 ' . $dbName . ' 不存在,也没权限创建新的数据库!');
+ }
+ }
+ mysqli_select_db($conn, $dbName);
+ mysqli_query($conn, 'SET NAMES utf8;');
+ //读取数据文件
+ $sqldata = file_get_contents(__DIR__ . '/../../install/' . $this->sqlFile);
+ $sqlFormat = $this->sql_split($sqldata, $data['dbprefix']);
+ $counts = count($sqlFormat);
+ if ($n <= $counts && isset($sqlFormat[$n])) {
+ $sql = trim($sqlFormat[$n]);
+ $message = $this->install($sql, $conn, $data['dbprefix']);
+ $n++;
+ } else {
+ if ($data['demo'] == '')
+ $this->clear($conn, $data['dbprefix']);
+ $this->setConfig($data);
+ $message = $this->setDatabase($conn, $data);
+ $n = -1;
+ }
+ return [
+ 'n' => $n,
+ 'msg' => $message
+ ];
+ }
+
+
+ /**
+ * TODO 执行数据库文件安装
+ * @param $sql
+ * @param $conn
+ * @param $dbPrefix
+ * @return string
+ * @author Qinii
+ * @day 2020-07-16
+ */
+ public function install($sql, $conn, $dbPrefix)
+ {
+ // 建表
+ if (strstr($sql, 'CREATE TABLE')) {
+ preg_match('/CREATE TABLE `eb_([^ ]*)`/is', $sql, $matches);
+ mysqli_query($conn, "DROP TABLE IF EXISTS `$matches[1]");
+ $sql = str_replace('`eb_', '`' . $dbPrefix, $sql);//替换表前缀
+ $ret = mysqli_query($conn, $sql);
+ if ($ret) {
+ $message = '√创建数据表[' . $dbPrefix . $matches[1] . ']完成!' . date('Y-m-d H:i:s') . ' ';
+ } else {
+ $message = '√创建数据表[' . $dbPrefix . $matches[1] . ']失败!' . date('Y-m-d H:i:s') . '';
+ }
+
+ } //插入数据
+ else {
+ $message = '';
+ if (trim($sql) !== '') {
+ $sql = str_replace('`eb_', '`' . $dbPrefix, $sql);//替换表前缀
+ $sql = str_replace('https://mer1.crmeb.net', $this->installHost , $sql);
+ $sql = str_replace('https:\\\/\\\/mer1.crmeb.net', $this->_url , $sql);
+ $ret = mysqli_query($conn, $sql);
+ $sql = htmlspecialchars($sql);
+ $msg = substr($sql, 0, 30);
+ if ($ret) {
+ $message = '√执行 [' . $msg . '...]成功!' . date('Y-m-d H:i:s') . ' ';
+ } else {
+ $message = '√执行[' . $msg . '..]失败!' . date('Y-m-d H:i:s') . '';
+ }
+ }
+ }
+ return $message;
+ }
+
+ /**
+ * TODO 清除测试数据
+ * @param $conn
+ * @param $dbPrefix
+ * @author Qinii
+ * @day 2020-07-16
+ */
+ public function clear($conn, $dbPrefix)
+ {
+ $result = mysqli_query($conn, "show tables");
+ $tables = mysqli_fetch_all($result);//参数MYSQL_ASSOC、MYSQLI_NUM、MYSQLI_BOTH规定产生数组类型
+ $bl_table = array(
+ 'eb_system_admin',
+ 'eb_system_menu',
+ 'eb_system_role',
+ 'eb_system_group',
+ 'eb_system_group_data',
+ 'eb_system_city',
+ 'eb_express',
+ 'eb_system_config',
+ 'eb_system_config_classify',
+ 'eb_system_config_value',
+ 'eb_template_message',
+ 'system_notice_config',
+ 'eb_city_area',
+ 'eb_diy',
+ 'eb_page_category',
+ 'eb_page_link',
+ 'eb_system_notice_config'
+ );
+ foreach ($bl_table as $k => $v) {
+ $bl_table[$k] = str_replace('eb_', $dbPrefix, $v);
+ }
+
+ foreach ($tables as $key => $val) {
+ if (!in_array($val[0], $bl_table)) {
+ mysqli_query($conn, "truncate table " . $val[0]);
+ }
+ }
+ }
+
+ /**
+ * TODO 创建.env文件
+ * @param $data
+ * @author Qinii
+ * @day 2020-07-16
+ */
+ public function setConfig($data)
+ {
+ //读取配置文件,并替换真实配置数据1
+ $strConfig = file_get_contents(__DIR__ . '/../../install/' . $this->configFile);
+ //'dbhost', 'dbport', 'dbname', 'dbuser', 'dbpw', 'dbprefix', 'manager', 'manager_pwd', ['rbhost', '127.0.0.1'], ['rbport', 6379], 'rbpw', ['rbselect', 0]
+ $strConfig = str_replace('#DB_HOST#', $data['dbhost'], $strConfig);
+ $strConfig = str_replace('#DB_NAME#', $data['dbname'], $strConfig);
+ $strConfig = str_replace('#DB_USER#', $data['dbuser'], $strConfig);
+ $strConfig = str_replace('#DB_PWD#', $data['dbpw'], $strConfig);
+ $strConfig = str_replace('#DB_PORT#', $data['dbport'], $strConfig);
+ $strConfig = str_replace('#DB_PREFIX#', $data['dbprefix'], $strConfig);
+ $strConfig = str_replace('#DB_CHARSET#', 'utf8', $strConfig);
+ //redis数据库信息
+ $strConfig = str_replace('#RB_HOST#', $data['rbhost'], $strConfig);
+ $strConfig = str_replace('#RB_PORT#', $data['rbport'], $strConfig);
+ $strConfig = str_replace('#RB_PWD#', $data['rbpw'], $strConfig);
+ $strConfig = str_replace('#RB_SELECT#', $data['rbselect'], $strConfig);
+ $strConfig = str_replace('#APP_KEY#', md5(time() . random_int(10000000, 99999999)), $strConfig);
+ @chmod(__DIR__ . '/../../.env', 0777);
+ @file_put_contents(__DIR__ . '/../../.env', $strConfig); //数据库配置文件的地址
+ }
+
+ /**
+ * TODO 修改后台管理员用户
+ * @param $conn
+ * @param $data
+ * @return string
+ * @author Qinii
+ * @day 2020-07-16
+ */
+ public function setDatabase($conn, $data)
+ {
+ $time = date('Y-m-d H:i:s');
+ $ip = $this->get_client_ip();
+ $ip = empty($ip) ? "0.0.0.0" : $ip;
+ $password = password_hash(trim($data['manager_pwd']), PASSWORD_BCRYPT);
+ mysqli_query($conn, "truncate table {$data['dbprefix']}system_admin");
+ $addadminsql = "INSERT INTO `{$data['dbprefix']}system_admin` (`admin_id`, `account`, `pwd`, `real_name`, `roles`, `last_ip`, `last_time`, `create_time`, `login_count`, `level`, `status`, `is_del`) VALUES
+(1, '" . $data['manager'] . "', '" . $password . "', '', '1', '" . $ip . "','$time' , '$time', 0, 0, 1, 0)";
+ $res = mysqli_query($conn, $addadminsql);
+ if ($res) {
+ $message = '成功添加管理员
成功写入配置文件
安装完成.';
+ } else {
+ $message = '添加管理员失败
成功写入配置文件
安装完成.';
+ }
+ return $message;
+ }
+
+ /**
+ * TODO 检测数据库链接是否成功以及版本
+ * @param $data
+ * @return false|int|string
+ * @author Qinii
+ * @day 2020-07-16
+ */
+ public function checkDatabsaces($data)
+ {
+ $dbName = strtolower(trim($data['dbname']));
+ $conn = @mysqli_connect($data['dbhost'], $data['dbuser'], $data['dbpw'], NULL, $data['dbport']);
+ if (mysqli_connect_errno($conn)) return 0;
+ $result = mysqli_query($conn, "SELECT @@global.sql_mode");
+ $result = $result->fetch_array();
+ $version = mysqli_get_server_info($conn);
+ if ($version < 5.6) return (json_encode(-4));
+
+ if (strstr($result[0], 'STRICT_TRANS_TABLES') || strstr($result[0], 'STRICT_ALL_TABLES') || strstr($result[0], 'TRADITIONAL') || strstr($result[0], 'ANSI'))
+ return ($version < 8.0) ? -1 : -2;
+
+ $result = mysqli_query($conn, "select count(table_name) as c from information_schema.`TABLES` where table_schema='$dbName'");
+ $result = $result->fetch_array();
+ if ($result['c'] > 0) return -3;
+ return 1;
+ }
+
+ /**
+ * TODO 验证数据库及redis是否正常
+ * @return false|int|string
+ * @author Qinii
+ * @day 2020-07-15
+ */
+ public function databasesCheck()
+ {
+ $data = $this->request->params(['dbhost', 'dbport', 'dbname', 'dbuser', 'dbpw',['dbprefix','eb_'], ['rbhost', '127.0.0.1'], ['rbport', 6379], 'rbpw', ['rbselect', 0]]);
+ // mysql 检测
+ $mysql = $this->checkDatabsaces($data);
+ if ($mysql !== 1) return $mysql;
+ // redis检测
+ try {
+ $redis = new Redis();
+ $redis->connect($data['rbhost'], $data['rbport']);
+ if ($data['rbpw']) $redis->auth($data['rbpw']);
+ if ($data['rbselect']) $redis->select($data['rbselect']);
+ $res = $redis->set('install', 1, 10);
+ return $res ? 1 : -5;
+ } catch (Throwable $e) {
+ return -5;
+ }
+ }
+
+ /**
+ * TODO 安装记录文件生成
+ * @author Qinii
+ * @day 2020-07-16
+ */
+ public function installlog()
+ {
+ $mt_rand_str = $this->sp_random_string(6);
+ $str_constant = "request->server();
+ if (isset($server['REMOTE_ADDR']))
+ $ip = $server['REMOTE_ADDR'];
+ // IP地址合法验证
+ $ip = (false !== ip2long($ip)) ? $ip : '0.0.0.0';
+ return $ip;
+ }
+
+ /**
+ * 生成基础文件
+ * @Author:Qinii
+ * @Date: 2020/8/31
+ */
+ public function unzip()
+ {
+ update_crmeb_compiled();
+ }
+
+
+ /**
+ * TODO swoole_loader 安装向导
+ * @Author:Qinii
+ * @Date: 2020/9/10
+ */
+ public function swooleCompiler()
+ {
+ // Check os type
+ $this->env['os'] = [];
+ if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
+ $this->env['os']['name'] = "windows";
+ $this->env['os']['raw_name'] = php_uname();
+ } else {
+ $this->env['os']['name'] = "unix";
+ $this->env['os']['raw_name'] = php_uname();
+ }
+ // Check php
+ $this->env['php'] = [];
+ $this->env['php']['version'] = phpversion();
+ // Check run mode
+ $sapi_type = php_sapi_name();
+ if ("cli" == $sapi_type) {
+ $this->env['php']['run_mode'] = "cli";
+ } else {
+ $this->env['php']['run_mode'] = "web";
+ }
+ // Check php bit
+ if (PHP_INT_SIZE == 4) {
+ $this->env['php']['bit'] = 32;
+ } else {
+ $this->env['php']['bit'] = 64;
+ }
+ $this->env['php']['sapi'] = $sapi_type;
+ $this->env['php']['ini_loaded_file'] = php_ini_loaded_file();
+ $this->env['php']['ini_scanned_files'] = php_ini_scanned_files();
+ $this->env['php']['loaded_extensions'] = get_loaded_extensions();
+ $this->env['php']['incompatible_extensions'] = ['xdebug', 'ionCube', 'zend_loader'];
+ $this->env['php']['loaded_incompatible_extensions'] = [];
+ $this->env['php']['extension_dir'] = ini_get('extension_dir');
+ // Check incompatible extensions
+ if (is_array($this->env['php']['loaded_extensions'])) {
+ foreach ($this->env['php']['loaded_extensions'] as $loaded_extension) {
+ foreach ($this->env['php']['incompatible_extensions'] as $incompatible_extension) {
+ if (strpos(strtolower($loaded_extension), strtolower($incompatible_extension)) !== false) {
+ $this->env['php']['loaded_incompatible_extensions'][] = $loaded_extension;
+ }
+ }
+ }
+ }
+ $this->env['php']['loaded_incompatible_extensions'] = array_unique($this->env['php']['loaded_incompatible_extensions']);
+ // Parse System Environment Info
+ $sysInfo = $this->w_getSysInfo();
+ // Check php thread safety
+ $this->env['php']['raw_thread_safety'] = isset($sysInfo['thread_safety']) ? $sysInfo['thread_safety'] : false;
+ if (isset($sysInfo['thread_safety'])) {
+ $this->env['php']['thread_safety'] = $sysInfo['thread_safety'] ? '线程安全' : '非线程安全';
+ } else {
+ $this->env['php']['thread_safety'] = '未知';
+ }
+ // Check swoole loader installation
+ if (isset($sysInfo['swoole_loader']) and isset($sysInfo['swoole_loader_version'])) {
+ $this->env['php']['swoole_loader']['status'] = $sysInfo['swoole_loader'] ? "已安装"
+ : '未安装';
+ if ($sysInfo['swoole_loader_version'] !== false) {
+ $this->env['php']['swoole_loader']['version'] = "" . $sysInfo['swoole_loader_version'] . "";
+ } else {
+ $this->env['php']['swoole_loader']['version'] = '未知';
+ }
+ } else {
+ $this->env['php']['swoole_loader']['status'] = '未安装';
+ $this->env['php']['swoole_loader']['version'] = '未知';
+ }
+ $this->html($sysInfo);
+ }
+
+ /**
+ * 页面输出内容
+ * @Author:Qinii
+ * @Date: 2020/9/10
+ * @param $this ->>env
+ * @param $sysInfo
+ */
+ public function html($sysInfo)
+ {
+ $html = '';
+ // Header
+ $html_header = '
+
+
+
+
+
+
+
+ %s
+
+
+
+ ';
+ $html_header = sprintf($html_header, 'CRMEB Swoole Compiler 安装向导');
+ $html_body = '';
+ $html_body_nav = '
';
+ $html_body_nav .= '
CRMEB Swoole Compiler 安装向导
';
+ $html_body_nav .= '
Version:2.0.2 Date:2019-01-09
';
+ $html_body_nav .= '
';
+
+ // Environment information
+ $html_body_environment = '
+
+
检查当前环境
+
';
+ $html_body_environment .= '- 操作系统 : ' . $this->env['os']['raw_name'] . '
';
+ $html_body_environment .= '- PHP版本 : ' . $this->env['php']['version'] . '
';
+ $html_body_environment .= '- PHP运行环境 : ' . $this->env['php']['sapi'] . '
';
+ $html_body_environment .= '- PHP配置文件 : ' . $this->env['php']['ini_loaded_file'] . '
';
+ $html_body_environment .= '- PHP扩展安装目录 : ' . $this->env['php']['extension_dir'] . '
';
+ $html_body_environment .= '- PHP是否线程安全 : ' . $this->env['php']['thread_safety'] . '
';
+ $html_body_environment .= '- 是否安装swoole_loader : ' . $this->env['php']['swoole_loader']['status'] . '
';
+ if (isset($sysInfo['swoole_loader']) and $sysInfo['swoole_loader']) {
+ $html_body_environment .= '- swoole_loader版本 : ' . $this->env['php']['swoole_loader']['version'] . '
';
+ }
+ if ($this->env['php']['bit'] == 32) {
+ $html_body_environment .= '- 温馨提示:当前环境使用的PHP为 ' . $this->env['php']['bit'] . ' 位的PHP,Compiler 目前不支持 Debug 版本或 32 位的PHP,可在 phpinfo() 中查看对应位数,如果误报请忽略此提示
';
+ }
+ $html_body_environment .= '
';
+
+ // Error infomation
+ $html_error = "";
+ if (!empty($this->env['php']['loaded_incompatible_extensions'])) {
+ $html_error = '
+
+ ';
+ $err_msg = "当前PHP包含与swoole_compiler_loader扩展不兼容的扩展" . implode(',', $this->env['php']['loaded_incompatible_extensions']) . ",请移除不兼容的扩展。";
+ $html_error = sprintf($html_error, $err_msg);
+ }
+
+ // Check Loader Status
+ $html_body_loader = '
';
+ if (empty($html_error)) {
+ $html_body_loader .= '
';
+ $html_body_loader .= '
安装和配置Swoole Loader
';
+ $phpversion = substr($this->env['php']['version'], 0, 3);
+ $phpversion = str_replace('.', '', $phpversion);
+ $loaderFileName = '';
+ if ($this->env['os']['name'] == "windows") {
+ $loaderFileName = 'php_swoole_loader_php' . $phpversion;
+ if ($this->env['php']['thread_safety'] == '非线程安全') {
+ $loaderFileName .= '_nzts_x64.dll';
+ } else {
+ $loaderFileName .= '_zts_x64.dll';
+ }
+ } else {
+ if ($this->env['php']['thread_safety'] != '非线程安全') {
+ $loaderFileName = 'swoole_loader' . $phpversion . '_zts.so';
+ } else {
+
+ $loaderFileName = 'swoole_loader' . $phpversion . '.so';
+ }
+ }
+ $html_body_loader .= '
1 - 安装Swoole Loader
前往根目录 /install/swoole-loader/' . $loaderFileName . '扩展文件上传到当前PHP的扩展安装目录中:
' . $this->env['php']['extension_dir'] . '
';
+ $html_body_loader .= '
2 - 修改php.ini配置(如已修改配置,请忽略此步骤,不必重复添加)
';
+ $html_body_loader .= '编辑此PHP配置文件:' . $this->env['php']['ini_loaded_file'] . ',在此文件底部结尾处加入如下配置
';
+ if ($this->env['os']['name'] == "windows") {
+ $html_body_loader .= '
extension=' . $this->env['php']['extension_dir'] . DIRECTORY_SEPARATOR . $loaderFileName . '
注意:需要名称和刚才上传到当前PHP的扩展安装目录中的文件名一致';
+ } else {
+ $html_body_loader .= '
extension=' . $this->env['php']['extension_dir'] . DIRECTORY_SEPARATOR . $loaderFileName . '
注意:需要名称和刚才上传到当前PHP的扩展安装目录中的文件名一致';
+ }
+ $html_body_loader .= '';
+ $html_body_loader .= '
3 - 重启服务
重启或重载PHP配置
';
+ $html_body_loader .= '
';
+ }
+
+ // Body footer
+ $html_body_footer = '
';
+ $html_body .= $html_body_nav . '
' . $html_body_environment . $html_error . $html_body_loader . '
' . $html_body_footer;
+ $html_body .= '
';
+ // Footer
+ $html_footer = '
+
+
+
+
+ ';
+
+ $html = $html_header . $html_body . $html_footer;
+ return Response::create()->content($html)->send();
+ }
+
+ public function w_getSysInfo()
+ {
+ $sysEnv = [];
+ // Get content of phpinfo
+ ob_start();
+ phpinfo();
+ $sysInfo = ob_get_contents();
+ ob_end_clean();
+ // Explode phpinfo content
+ if ($this->env['php']['run_mode'] == 'cli') {
+ $sysInfoList = explode('\n', $sysInfo);
+ } else {
+ $sysInfoList = explode('', $sysInfo);
+ }
+ foreach ($sysInfoList as $sysInfoItem) {
+ if (preg_match('/thread safety/i', $sysInfoItem)) {
+ $sysEnv['thread_safety'] = (preg_match('/(enabled|yes)/i', $sysInfoItem) != 0);
+ }
+ if (preg_match('/swoole_loader support/i', $sysInfoItem)) {
+ $sysEnv['swoole_loader'] = (preg_match('/(enabled|yes)/i', $sysInfoItem) != 0);
+ }
+ if (preg_match('/swoole_loader version/i', $sysInfoItem)) {
+ preg_match('/\d+.\d+.\d+/s', $sysInfoItem, $match);
+ $sysEnv['swoole_loader_version'] = isset($match[0]) ? $match[0] : false;
+ }
+ }
+ return $sysEnv;
+ }
+}
diff --git a/app/controller/api/Auth.php b/app/controller/api/Auth.php
index 5b7833e2..169f96ef 100644
--- a/app/controller/api/Auth.php
+++ b/app/controller/api/Auth.php
@@ -382,12 +382,15 @@ class Auth extends BaseController
$repository->loginAfter($user);
$find=Db::name('nk_user')->where('user_id',$user['uid'])->find();
$user['no_update']=1;
+ $user['group_ids'] = 1;
if ($find && $find['n_user_id']!=0){
+ $user['group_ids'] = $find['group_id'];
$msg=Db::connect('nongke')->name('szxc_information_usermsg')->where('user_id',$find['n_user_id'])->cache(true)->find();
if ($msg){
$user['no_update']=0;
}
}
+
if ($user['phone']==''){
Db::name('user')->where('uid',$user['uid'])->update(['phone'=>$user['account']]);
$user['phone']=$user['account'];
diff --git a/app/controller/api/enter/EnterCompany.php b/app/controller/api/enter/EnterCompany.php
new file mode 100644
index 00000000..85b62461
--- /dev/null
+++ b/app/controller/api/enter/EnterCompany.php
@@ -0,0 +1,73 @@
+
+// +----------------------------------------------------------------------
+
+
+namespace app\controller\api\enter;
+
+use crmeb\basic\BaseController;
+use app\common\repositories\enter\EnterCompanyRepository;
+use think\App;
+use think\facade\Db;
+use app\common\model\user\User;
+use app\validate\api\EnterCompanyValidate;
+
+use function GuzzleHttp\json_decode;
+
+class EnterCompany extends BaseController
+{
+ protected $repository;
+
+ public function __construct(App $app, EnterCompanyRepository $repository)
+ {
+ parent::__construct($app);
+ $this->repository = $repository;
+ }
+
+ /**
+ *
+ * @param EnterCompanyValidate $validate
+ * @return mixed
+ * @author xaboy
+ * @day 2020/5/28
+ */
+ public function add(EnterCompanyValidate $validate)
+ {
+ $data = $this->request->params(['company', ['company_image', []],['master_idcar_positive', []],['master_idcar_negative', []], 'master', 'supervisor','director']);
+ $validate->check($data);
+ $data['create_time'] = time();
+ $data['shop_user_id'] = $this->request->uid();
+ $res = Db::connect('dev')->name('market_company')->insert($data);
+ return app('json')->success('添加成功');
+ }
+
+ public function list($page=1,$limit=10)
+ {
+ $where = ['shop_user_id' => $this->request->uid()];
+ $list = Db::connect('dev')->name('market_company')->where($where)->page($page,$limit)->order('id desc')->field('id,shop_user_id,company,company_image,master,master_idcar_positive,master_idcar_negative,supervisor,director,create_time')
+ ->withAttr('supervisor',function($value,$data){
+ return json_decode($value,true);
+ })
+ ->withAttr('director',function($value,$data){
+ return json_decode($value,true);
+ })
+ ->withAttr('create_time',function($value,$data){
+ return date('Y-m-d H:i:s',$value);
+ })
+ ->withAttr('shop_user',function($value,$data){
+ return User::where('uid',$data['shop_user_id'])->field('nickname,phone')->find();
+ })
+ ->select();
+ return app('json')->success($list);
+ }
+
+
+}
diff --git a/app/validate/api/EnterCompanyValidate.php b/app/validate/api/EnterCompanyValidate.php
new file mode 100644
index 00000000..e5e22d66
--- /dev/null
+++ b/app/validate/api/EnterCompanyValidate.php
@@ -0,0 +1,30 @@
+
+// +----------------------------------------------------------------------
+
+
+namespace app\validate\api;
+
+
+use think\Validate;
+
+class EnterCompanyValidate extends Validate
+{
+ protected $failException = true;
+
+ protected $rule = [
+ 'company|公司名称' => 'require',
+ 'company_image|公司证件' => 'require',
+ 'master|法人' => 'require',
+ 'master_idcar_positive|身份证正面' => 'require',
+ 'master_idcar_negative|身份证反面' => 'require',
+ ];
+}
diff --git a/config/database.php b/config/database.php
index 85e3be31..b4248f09 100644
--- a/config/database.php
+++ b/config/database.php
@@ -68,24 +68,63 @@ return [
'schema_cache_path' => app()->getRuntimePath() . 'schema' . DIRECTORY_SEPARATOR,
],
'nongke' => [
- // 数据库类型
- 'type' => Env::get('databasenk.type', 'mysql'),
- // 服务器地址
- 'hostname' => Env::get('databasenk.hostname', '127.0.0.1'),
- // 数据库名
- 'database' => Env::get('databasenk.database', ''),
- // 用户名
- 'username' => Env::get('databasenk.username', 'root'),
- // 密码
- 'password' => Env::get('databasenk.password', ''),
- // 端口
- 'hostport' => Env::get('databasenk.hostport', '3306'),
- // 数据库连接参数
- 'params' => [],
- // 数据库编码默认采用utf8
- 'charset' => Env::get('databasenk.charset', 'utf8'),
- // 数据库表前缀
- 'prefix' => Env::get('databasenk.prefix', ''),
+ // 数据库类型
+ 'type' => Env::get('databasenk.type', 'mysql'),
+ // 服务器地址
+ 'hostname' => Env::get('databasenk.hostname', '127.0.0.1'),
+ // 数据库名
+ 'database' => Env::get('databasenk.database', ''),
+ // 用户名
+ 'username' => Env::get('databasenk.username', 'root'),
+ // 密码
+ 'password' => Env::get('databasenk.password', ''),
+ // 端口
+ 'hostport' => Env::get('databasenk.hostport', '3306'),
+ // 数据库连接参数
+ 'params' => [],
+ // 数据库编码默认采用utf8
+ 'charset' => Env::get('databasenk.charset', 'utf8'),
+ // 数据库表前缀
+ 'prefix' => Env::get('databasenk.prefix', ''),
+ ],
+ 'dev' => [
+ // 数据库类型
+ 'type' => env('database3.type', 'mysql'),
+ // 服务器地址
+ 'hostname' => env('database3.hostname', '127.0.0.1'),
+ // 数据库名
+ 'database' => env('database3.database', ''),
+ // 用户名
+ 'username' => env('database3.username', 'root'),
+ // 密码
+ 'password' => env('database3.password', ''),
+ // 端口
+ 'hostport' => env('database3.hostport', '3306'),
+ // 数据库连接参数
+ 'params' => [],
+ // 数据库编码默认采用utf8
+ 'charset' => env('database3.charset', 'utf8'),
+ // 数据库表前缀
+ 'prefix' => env('database3.prefix', ''),
+
+ // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
+ 'deploy' => 0,
+ // 数据库读写是否分离 主从式有效
+ 'rw_separate' => false,
+ // 读写分离后 主服务器数量
+ 'master_num' => 1,
+ // 指定从服务器序号
+ 'slave_no' => '',
+ // 是否严格检查字段是否存在
+ 'fields_strict' => true,
+ // 是否需要断线重连
+ 'break_reconnect' => true,
+ // 监听SQL
+ 'trigger_sql' => env('app_debug', true),
+ // 开启字段缓存
+ 'fields_cache' => false,
+ // 字段缓存路径
+ 'schema_cache_path' => app()->getRuntimePath() . 'schema' . DIRECTORY_SEPARATOR,
],
// 更多的数据库配置信息
],
diff --git a/route/api.php b/route/api.php
index 306959ce..bd62f86f 100644
--- a/route/api.php
+++ b/route/api.php
@@ -333,6 +333,12 @@ Route::group('api/', function () {
Route::get('order/:id', 'Community/getSpuByOrder');
})->prefix('api.community.');
+
+ //录入公司信息
+ Route::post('entercompany', 'api.enter.EnterCompany/add');
+ // 获取已录入公司
+ Route::get('enter/list', 'api.enter.EnterCompany/list');
+
})->middleware(UserTokenMiddleware::class, true);
//非强制登录
@@ -578,6 +584,9 @@ Route::group('api/', function () {
Route::get('ajcaptcha', 'api.Auth/ajcaptcha');
Route::post('ajcheck', 'api.Auth/ajcheck');
+
+
+
})->middleware(AllowOriginMiddleware::class)->middleware(InstallMiddleware::class)
->middleware(CheckSiteOpenMiddleware::class);
@@ -593,3 +602,4 @@ Route::group('/open-location', function () {
Route::miss('View/h5');
})->middleware(InstallMiddleware::class)
->middleware(CheckSiteOpenMiddleware::class);
+