| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- <?php
- /**
- * Niushop商城系统 - 团队十年电商经验汇集巨献!
- * =========================================================
- * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
- * ----------------------------------------------
- * 官方网址: https://www.niushop.com
- * =========================================================
- */
- namespace addon\v3tov4\shop\controller;
- use addon\v3tov4\model\Log;
- use app\model\system\Database;
- use app\shop\controller\BaseShop;
- use addon\v3tov4\model\Upgrade as UpgradeModel;
- use addon\v3tov4\model\Log as LogModel;
- use think\facade\Cache;
- /**
- * 升级
- * @author Administrator
- *
- */
- class Upgrade extends BaseShop
- {
- protected $replace = []; //视图输出字符串内容替换 相当于配置文件中的'view_replace_str'
- /**
- * 数据迁移
- */
- public function index()
- {
- $log = new LogModel();
- $upgrade = new UpgradeModel();
- $task_class = $upgrade->getTaskClass();
- if (request()->isAjax()) {
- $index = input('index', -1);
- $class = input('class', '');
- if ($index == -1) {
- // 添加迁移日志
- $class_array = explode(',', $class);
- $log_data = [];
- foreach ($class_array as $k => $v) {
- if ($task_class[ $v ][ 'is_show' ]) {
- $log_data[] = [
- 'module' => $v,
- 'title' => $task_class[ $v ][ 'name' ],
- 'remark' => $task_class[ $v ][ 'introduction' ],
- 'create_time' => time()
- ];
- }
- }
- $log->addLogList($log_data);
- $task_list = $upgrade->getSyncTask($class);
- if (empty($task_list[ 'code' ])) {
- Cache::set('upgrade_error_task', '');
- }
- Cache::set('upgrade_task', $task_list);
- } else {
- $task_list = Cache::get('upgrade_task');
- $run_res = $upgrade->run($task_list[ $index ]);
- if ($run_res[ 'code' ] < 0) {
- $task_error_list = Cache::get('upgrade_error_task');
- if (empty($task_error_list)) {
- $task_error_list = [
- 'data' => $task_list[ $index ],
- 'error' => $run_res[ 'message' ]
- ];
- } else {
- array_push($task_error_list, [ 'data' => $task_list[ $index ], 'error' => $run_res[ 'message' ] ]);
- }
- Cache::set('upgrade_error_task', $task_error_list);
- }
- }
- $task_error_list = Cache::get('upgrade_error_task');
- if (!empty($task_list[ 'code' ])) {
- return error(-1, $task_list[ 'message' ]);
- } elseif (!empty($task_error_list)) {
- $count = 0;
- foreach ($task_error_list as $k => $v) {
- if (!empty($v[ 'error' ])) {
- return error(-1, $v[ 'error' ]);
- } else {
- $count++;
- }
- }
- if ($count == count($task_error_list)) {
- return success(0, '', [ 'index' => $index, 'total' => count($task_list), 'page_size' => $upgrade->getPageSize() ]);
- }
- } else {
- return success(0, '', [ 'index' => $index, 'total' => count($task_list), 'page_size' => $upgrade->getPageSize() ]);
- }
- } else {
- $this->assign('task_class', $task_class);
- return $this->fetch("upgrade/index");
- }
- }
- /**
- * 备份数据库
- */
- public function backupSql()
- {
- if (request()->isAjax()) {
- try {
- $upgrade_no = date('YmdHi');
- $database = new Database();
- ini_set('memory_limit', '500M');
- $size = 300;
- $volumn = 1024 * 1024 * 2;
- $dump = '';
- $last_table = input('last_table', '');
- $series = max(1, input('series', 1));
- if (empty($last_table)) {
- $catch = true;
- } else {
- $catch = false;
- }
- $back_sql_root = "upload/backup/{$upgrade_no}/sql";
- if (!is_dir($back_sql_root)) {
- dir_mkdir($back_sql_root);
- }
- $tables = $database->getDatabaseList();
- if (empty($tables)) {
- return success();
- }
- foreach ($tables as $table) {
- $table = array_shift($table);
- if (!empty($last_table) && $table == $last_table) {
- $catch = true;
- }
- if (!$catch) {
- continue;
- }
- if (!empty($dump)) {
- $dump .= "\n\n";
- }
- if ($table != $last_table) {
- $row = $database->getTableSchemas($table);
- $dump .= $row;
- }
- $index = 0;
- if (!empty(input('index'))) {
- $index = input('index');
- }
- //枚举所有表的INSERT语句
- while (true) {
- $start = $index * $size;
- $result = $database->getTableInsertSql($table, $start, $size);
- if (!empty($result)) {
- $dump .= $result[ 'data' ];
- if (strlen($dump) > $volumn) {
- $bakfile = "{$back_sql_root}/backup-{$series}.sql";
- $dump .= "\n\n";
- file_put_contents($bakfile, $dump);
- ++$series;
- ++$index;
- $current = array (
- 'is_backup_end' => 0,
- 'last_table' => $table,
- 'index' => $index,
- 'series' => $series,
- );
- $current_series = $series - 1;
- return success(0, '正在导出数据, 请不要关闭浏览器, 当前第 ' . $current_series . ' 卷.', $current);
- }
- }
- if (empty($result) || count($result[ 'result' ]) < $size) {
- break;
- }
- ++$index;
- }
- }
- $back_file = "{$back_sql_root}/backup-{$series}.sql";
- $dump .= "\n\n----MySQL Dump End";
- file_put_contents($back_file, $dump);
- return success(0, '数据库备份完成', [ 'is_backup_end' => 1 ]);
- } catch (\Exception $e) {
- return error(-1, $e->getMessage());
- }
- }
- }
- /**
- * 获取最新的模块迁移状态,防止重复迁移
- * @return array
- */
- public function checkModuleIsUpgrade()
- {
- if (request()->isAjax()) {
- $log = new LogModel();
- $upgrade = new UpgradeModel();
- $task_class = $upgrade->getTaskClass();
- $module = input('module', '');
- if (!empty($module)) {
- $module_arr = explode(",", $module);
- $res = [];
- foreach ($module_arr as $k => $v) {
- if ($task_class[ $v ][ 'is_show' ]) {
- $item = $log->getLogFirstData($v, 1);
- $res[] = [
- 'module' => $v,
- 'title' => $task_class[ $v ][ 'name' ],
- 'count' => (int) ( $item[ 'data' ] )
- ];
- }
- }
- return success(0, '', $res);
- }
- }
- }
- /**
- * 更新迁移日志状态
- * @return array
- */
- public function updateLogStatus()
- {
- if (request()->isAjax()) {
- $log = new LogModel();
- $upgrade = new UpgradeModel();
- $task_class = $upgrade->getTaskClass();
- $module = input('module', '');
- if (!empty($module)) {
- $module_arr = explode(",", $module);
- $res = success(0, '', 0);
- foreach ($module_arr as $k => $v) {
- if ($task_class[ $v ][ 'is_show' ]) {
- $log_info = $log->getLogFirstData($v, 0);
- $log_info = $log_info[ 'data' ];
- if (!empty($log_info)) {
- $edit_res = $log->editLog([ 'status' => 1 ], [ [ 'id', '=', $log_info[ 'id' ] ] ]);
- $res[ 'data' ] = $edit_res[ 'data' ];
- }
- }
- }
- return $res;
- }
- }
- }
- public function log()
- {
- if (request()->isAjax()) {
- $log = new LogModel();
- $page = input('page', 1);
- $page_size = input('page_size', PAGE_LIST_ROWS);
- $condition = [];
- $list = $log->getLogPageList($condition, $page, $page_size);
- return $list;
- } else {
- return $this->fetch("upgrade/log");
- }
- }
- public function deleteLog()
- {
- if (request()->isAjax()) {
- $ids = input('ids', '');
- if (!empty($ids)) {
- $log = new LogModel();
- $res = $log->deleteLog($ids);
- return $res;
- }
- }
- }
- }
|