GamePackage.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. <?php
  2. /**
  3. * 游戏管理控制器
  4. */
  5. namespace app\admin\controller;
  6. use app\common\library\FileUpload;
  7. use app\common\library\MakeReport;
  8. use app\common\model\AndroidSdk;
  9. use app\common\model\GameBand;
  10. use app\common\model\Game as GameModel;
  11. use app\common\logic\SubPackage as SubChannel;
  12. use app\common\model\SdkGameList;
  13. use app\common\model\GameInfo;
  14. use app\common\model\GameNotify;
  15. use app\common\model\GameBanned;
  16. use app\common\model\GameExtraPointRatio;
  17. use Overtrue\Pinyin\Pinyin;
  18. use app\common\model\PromotionShortLink;
  19. use think\Config;
  20. use think\Db;
  21. use think\Env;
  22. use think\Exception;
  23. use think\Request;
  24. class GamePackage extends Admin
  25. {
  26. protected $gameModel;
  27. /**
  28. * 不进行父类的登录验证,所以增加构造方法重写了父类的初始化方法
  29. */
  30. protected function _initialize()
  31. {
  32. parent::_initialize();
  33. $this->subChannel = new SubChannel;
  34. $this->gameModel = new GameModel;
  35. $this->sdkgamelistModel = $this->cyModel('sdkgamelist');
  36. $this->gameList = $gameList = model('Common/Game')->getAllByCondition('id,name');
  37. $this->selfGameList = $selfGameList = model('Common/Game')->getAllByCondition('id,name,pinyin,package_name,type,sign_ver', [], '', 'self');
  38. }
  39. /**
  40. * 列表
  41. */
  42. public function index()
  43. {
  44. //查询参数
  45. $param = input('get.');
  46. $page_size = input('page_size', 15);
  47. $where = [];
  48. if (isset($param['game_id']) && $param['game_id']) {
  49. $where['game_id'] = $param['game_id'];
  50. }
  51. if (isset($param['game_name']) && $param['game_name']) {
  52. $where['game.name'] = ['like', '%' . $param['game_name'] . '%'];
  53. }
  54. $gamelist = Db::name('nw_game_package_upload')->field('game_id as id,game_name as name')->where('path != ""')->select();
  55. $list = Db::name('nw_game_package_upload')->alias('a')
  56. ->join('cy_game game', 'nw_game_package_upload.game_id = game.id', 'left')
  57. ->field('a.id,game.name as game_name,a.bag_name,a.platform_type,convert((bag_size/1024/1024),decimal(10,2)) as bag_size,from_unixtime(update_time) as create_time,control_name,path,game_id,game.pinyin,game.channel_version,game.sign_ver, from_unixtime(a.update_time) as update_time,game.type,a.remark')
  58. ->where($where)
  59. ->order('update_time desc')
  60. ->paginate($page_size, false, array('query' => $param));
  61. $meb_list = $list->toarray();
  62. // dump($meb_list);
  63. foreach ($meb_list['data'] as $key => $value) {
  64. $meb_list['data'][$key]['path_ext'] = substr(substr($value['path'], strrpos($value['path'], "/") + 1), 0, -4);
  65. }
  66. $this->assign('list', $meb_list['data']);
  67. $this->assign('total', $meb_list['total']);
  68. $this->assign('game_list', $gamelist);
  69. $this->assign('page', $list->render());
  70. $this->assign('gameList', $this->cyModel('game')->field('id,name')->select());
  71. return $this->fetch();
  72. }
  73. /**
  74. * [FunctionName description]
  75. *
  76. * @param string $value [description]
  77. */
  78. public function deleted()
  79. {
  80. $id = input('id');
  81. $game_id = input('game_id');
  82. if (empty($id) || empty($game_id)) {
  83. $this->error('删除失败,参数错误');
  84. }
  85. $game_package_name = db::name('cy_game')->where(['id' => $game_id])->value('pinyin');//文件拼音
  86. $path = Db::name('nw_game_package_upload')->where(['game_id' => $game_id])->value('path');
  87. if (!$path) {
  88. $this->error('无游戏原包 请先上传');
  89. }
  90. if (empty($game_package_name)) {
  91. $this->error('原包错误 请先刷新后重试');
  92. }
  93. $filed = substr(strrchr($path, "sygame/"), 6);
  94. if (empty($filed)) {
  95. $this->error('原包错误 请先刷新后重试');
  96. }
  97. $ups = Env::get('MUBAO_PATH') . 'sygame' . $filed;//服务器文件路劲
  98. if (file_exists($ups)) {
  99. @unlink(iconv('UTF-8', 'GBK', $ups));
  100. }
  101. Db::startTrans();
  102. try {
  103. $data['bag_name'] = '--';
  104. $data['bag_size'] = 0;
  105. $data['bag_version'] = '';
  106. $data['update_time'] = NOW_TIMESTAMP;
  107. $data['control_name'] = session('USERNAME');
  108. $data['path'] = '';
  109. $resultUpdate = Db::name('nw_game_package_upload')->where(['game_id' => $game_id])->update($data);
  110. if (!$resultUpdate) {
  111. throw new Exception("数据更新失败");
  112. }
  113. $cont = [];
  114. $cont['game_id'] = $game_id;
  115. $cont['create_time'] = NOW_TIMESTAMP;
  116. $cont['control_name'] = session('USERNAME');
  117. $cont['control_type'] = 3;
  118. $result = Db::name('game_upload_log')->insert($cont);
  119. Db::commit();
  120. } catch (Exception $e) {
  121. Db::rollback();
  122. $this->error("删除失败 " . $e->getMessage());
  123. }
  124. $this->success("删除成功");
  125. }
  126. /**
  127. * 查看记录
  128. *
  129. * @param string $value [description]
  130. */
  131. public function checklog()
  132. {
  133. $game_id = input('game_id', '');
  134. if (empty($game_id)) {
  135. $this->error('参数错误');
  136. }
  137. $list = db::name('game_upload_log')->field('id,game_id,from_unixtime(create_time) as create_time,control_name,CASE WHEN control_type = 1 THEN "新增原包" WHEN control_type = 2 THEN "更新原包" WHEN control_type = 3 THEN "删除原包" END as control_type')->where(['game_id' => $game_id])->order('id desc')->select();
  138. if ($list) {
  139. $this->success('添加成功', null, $list);
  140. } else {
  141. $this->error("暂无数据");
  142. }
  143. }
  144. /**
  145. * 新增原包
  146. */
  147. public function add()
  148. {
  149. $param = input('get.');
  150. $list = [];
  151. $exist_ids = Db::name('nw_game_package_upload')->column('game_id');
  152. $info = ['package_name' => '', 'pinyin' => '', 'type' => '', 'sign_ver' => 0, 'path' => '', 'remark' => ''];
  153. if (isset($param['game_id'])) {
  154. $info = Db::name('cy_game')->alias('g')
  155. ->join("nw_game_package_upload gpu", "g.id = gpu.game_id", 'left')
  156. ->field('g.id,g.name, g.pinyin,g.package_name, g.channel_version, gpu.path, g.sign_ver, g.type, gpu.remark')
  157. // ->field('id,name,channel_version,pinyin,package_name,type,sign_ver, "" as path')
  158. ->where(['g.id' => $param['game_id']])->find();
  159. $list[] = $info;
  160. } else {
  161. $list = Db::name('cy_game')
  162. ->where('id', 'not in', $exist_ids)
  163. ->field('id,name,channel_version,pinyin,package_name,type,sign_ver,"" as remark, "" as path')
  164. ->select();
  165. // $list = $this->get_diff_array_by_filter($this->selfGameList, $gamelist);
  166. }
  167. $this->assign('game_list', $list);
  168. $this->assign('info', $info);
  169. $this->assign('upload_url', Env::get('mubao.upload_url'));
  170. return $this->fetch('add');
  171. }
  172. /**
  173. * 数组取差集
  174. *
  175. * @param [type] $arr1 [description]
  176. * @param [type] $arr2 [description]
  177. *
  178. * @return [type] [description]
  179. */
  180. public function get_diff_array_by_filter($arr1, $arr2)
  181. {
  182. try {
  183. return array_filter($arr1, function ($v) use ($arr2) {
  184. return !in_array($v, $arr2);
  185. });
  186. } catch (\Exception $exception) {
  187. return $arr1;
  188. }
  189. }
  190. // 母包上传成功 - 用于新版分包
  191. public function uploadSuccess()
  192. {
  193. $postParam = input('post.');
  194. $game_package_name = db::name('cy_game')->where(['id' => $postParam['game_id']])->value('pinyin');
  195. if (empty($game_package_name)) {
  196. $this->error('游戏有误!');
  197. }
  198. if (!isset($postParam['file_name']) && $postParam['type'] != 3) {
  199. $this->error('请上传游戏包!');
  200. }
  201. //合并后记录数据库
  202. Db::startTrans();
  203. try {
  204. $info = Db::name('nw_game_package_upload')->where(['game_id' => $postParam['game_id']])->field('id,bag_version')->find();
  205. $game_name = db::name('cy_game')->where(['id' => $postParam['game_id']])->value('name');
  206. $data = [
  207. 'game_name' => $game_name,
  208. 'bag_version' => $postParam['bag_version'],
  209. 'platform_type' => $postParam['type'],
  210. 'create_time' => NOW_TIMESTAMP,
  211. 'update_time' => NOW_TIMESTAMP,
  212. 'control_name' => session('USERNAME'),
  213. 'game_id' => $postParam['game_id'],
  214. 'remark' => $postParam['remark'],
  215. ];
  216. if($postParam['type'] == 3){
  217. $data['path'] = $postParam['path'];
  218. }else{
  219. // 有上传文件 才更新游戏原包数据
  220. if (!empty($postParam['file_name'])) {
  221. $domain = Env::get('mubao.down_url');
  222. $ext_suffix = substr($postParam['file_name'], strripos($postParam['file_name'], ".") + 1);//后缀
  223. $data['bag_size'] = $postParam['size'];
  224. $data['bag_name'] = $postParam['bag_name'];
  225. $data['path'] = $domain . '/sygame/' . $game_package_name . '/' . $game_package_name . '.' . $ext_suffix;
  226. }
  227. }
  228. if ($info) {//存在记录的情况更新
  229. $control_type = 2;
  230. $resultUpdate = Db::name('nw_game_package_upload')->where(['game_id' => $postParam['game_id']])->update($data);
  231. // ## 通知直播平台更新游戏包
  232. if ($postParam['type'] != 3 && !empty($postParam['notice_status']) && $postParam['notice_status'] == 1) {
  233. $zb_config = Config::get('zb_str');
  234. $data = [
  235. "gameid" => $postParam['game_id'],
  236. "app_key" => 'qm_sdk',
  237. "timestamp" => time(),
  238. ];
  239. $data['sign'] = $this->getZbSign($data, $zb_config['sign_key']);
  240. if (APP_STATUS == 'stable') {
  241. $zb_url = $zb_config['pro_url'];
  242. } else {
  243. $zb_url = $zb_config['dev_url'];
  244. }
  245. $zb_res = curlHeader($zb_url . "/v1/api/game/pack/notice", $data, ['Content-Type' => 'application/x-www-form-urlencoded']);
  246. log_message("## ZB_API: " . json_encode(['url' => $zb_url . "/v1/api/game/pack/notice", 'body' => $data, 'result' => $zb_res]), 'log', LOG_PATH . 'admin/httplog/');
  247. }
  248. } else {
  249. $control_type = 1;
  250. $resultUpdate = Db::name('nw_game_package_upload')->insert($data);
  251. }
  252. if (!$resultUpdate) {
  253. throw new Exception("数据更新失败");
  254. }
  255. $cont = [];
  256. $cont['game_id'] = $postParam['game_id'];
  257. $cont['create_time'] = NOW_TIMESTAMP;
  258. $cont['control_name'] = session('USERNAME');
  259. $cont['control_type'] = $control_type;
  260. $result = Db::name('game_upload_log')->insert($cont);
  261. $sign_ver = input('sign_ver', 0);
  262. Db::name('cy_game')->where(['id' => $postParam['game_id']])->update(['channel_version' => $postParam['bag_version'], 'sign_ver' => $sign_ver]);
  263. Db::commit();
  264. } catch (Exception $e) {
  265. Db::rollback();
  266. $this->error("上传失败 " . $e->getMessage());
  267. }
  268. $this->success('上传成功');
  269. }
  270. /**
  271. * 开始上传
  272. *
  273. * @return [type] [description]
  274. */
  275. public function UploadBigFile()
  276. {
  277. $pinyin = new Pinyin();
  278. $getParam = input('get.');
  279. $postParam = input('post.');
  280. $game_id = $postParam['game_id'];
  281. if (!$game_id) {
  282. $this->error('上传失败,游戏ID不存在');
  283. }
  284. //放入sygame/temp 临时文件夹内
  285. $name = $pinyin->permalink(substr($postParam['name'], 0, strrpos($postParam['name'], ".")), '');//转中文
  286. $act = $getParam['act'];
  287. $tpm_ups = Env::get('MUBAO_PATH') . 'sygame/temp/' . $name . '/';
  288. $ext_suffix = substr($postParam['name'], strripos($postParam['name'], ".") + 1);//后缀
  289. $flag = true;
  290. !in_array($ext_suffix, ['ipa', 'apk']) && $flag = false;//判断后缀名是否符合
  291. if (!$flag) {
  292. $this->error('请选择ipa或者apk文件!');
  293. }
  294. $game_ext = db::name('cy_gameinfo')->where(['game_id' => $game_id])->value('platform');
  295. if ($game_ext == 1) {
  296. $game_ext = 'ipa';
  297. } else {
  298. $game_ext = 'apk';
  299. }
  300. if ($game_ext != $ext_suffix) {
  301. $this->error('文件类型选择错误');
  302. }
  303. if ($act == 'upload') {
  304. $index = $postParam['index'];
  305. $filename = $tpm_ups . "$index" . $name . '.' . $ext_suffix;
  306. if (!file_exists($tpm_ups))//如果文件夹不存在
  307. {
  308. mkdir($tpm_ups, 0777, 1);
  309. }
  310. //断点上传已经存在的就跳过
  311. if (file_exists($filename)) {
  312. $this->success('上传成功');
  313. } else {
  314. $result = move_uploaded_file($_FILES['data']['tmp_name'], iconv('UTF-8', 'GBK', $filename));
  315. }
  316. if ($result) {
  317. $this->success('上传成功');
  318. } else {
  319. $this->success('上传失败');
  320. }
  321. } elseif ($_GET['act'] == 'join') {
  322. $fileUpload = new FileUpload();
  323. $total = intval($postParam['total']);
  324. $filename = $tpm_ups . $name . '.' . $ext_suffix;
  325. $request = Request::instance();
  326. $domain = $request->domain();
  327. $game_package_name = db::name('cy_game')->where(['id' => $postParam['game_id']])->value('pinyin');
  328. if (empty($game_package_name)) {
  329. $this->error('游戏参数错误 请先刷新后重试');
  330. }
  331. $ups = Env::get('MUBAO_PATH') . 'sygame/' . $game_package_name . '/';
  332. if (!file_exists($ups))//如果文件夹不存在
  333. {
  334. mkdir($ups, 0777, 1);
  335. }
  336. //合并时候判断 存在之前上传过的文件就删除掉在合并
  337. @unlink(iconv('UTF-8', 'GBK', $ups . $game_package_name . '.' . $ext_suffix));
  338. for ($i = 1; $i <= $total; $i++) {
  339. file_put_contents($ups . iconv('UTF-8', 'GBK', $game_package_name . '.' . $ext_suffix), file_get_contents(iconv('UTF-8', 'GBK', $tpm_ups . "$i" . $name . '.' . $ext_suffix)), FILE_APPEND);
  340. @unlink(iconv('UTF-8', 'GBK', $tpm_ups . "$i" . $name . '.' . $ext_suffix));
  341. }
  342. //合并后记录数据库
  343. Db::startTrans();
  344. try {
  345. $data = [];
  346. if (Db::name('nw_game_package_upload')->where(['game_id' => $game_id])->value('id')) {//存在记录的情况更新
  347. $control_type = 2;
  348. $data['bag_size'] = $postParam['size'];
  349. $data['control_name'] = session('USERNAME');
  350. $data['update_time'] = NOW_TIMESTAMP;
  351. $data['bag_name'] = $postParam['bag_name'];
  352. $data['bag_version'] = $postParam['bag_version'];
  353. $data['remark'] = $postParam['remark'];
  354. $data['path'] = $domain . '/sygame/' . $game_package_name . '/' . $game_package_name . '.' . $ext_suffix;
  355. $resultUpdate = Db::name('nw_game_package_upload')->where(['game_id' => $game_id])->update($data);
  356. if ($resultUpdate) {
  357. $zb_config = Config::get('zb_str');
  358. $data = [
  359. "gameid" => $game_id,
  360. "app_key" => 'qm_sdk',
  361. "timestamp" => time(),
  362. ];
  363. $data['sign'] = $this->getZbSign($data, $zb_config['sign_key']);
  364. if (APP_STATUS == 'stable') {
  365. $zb_url = $zb_config['pro_url'];
  366. } else {
  367. $zb_url = $zb_config['dev_url'];
  368. }
  369. // 通知直播平台更新游戏包
  370. $zb_res = curlHeader($zb_url . "/v1/api/game/pack/notice", $data, ['Content-Type' => 'application/x-www-form-urlencoded']);
  371. trace("## ZB_API: " . json_encode(['url' => $zb_url . "/v1/api/game/pack/notice", 'body' => $data, 'result' => $zb_res]), 'info');
  372. }
  373. } else {
  374. $game_name = db::name('cy_game')->where(['id' => $postParam['game_id']])->value('name');
  375. $control_type = 1;
  376. $data['game_name'] = $game_name;
  377. $data['bag_name'] = $postParam['bag_name'];
  378. $data['bag_size'] = $postParam['size'];
  379. $data['bag_version'] = $postParam['bag_version'];
  380. $data['platform_type'] = $ext_suffix == 'apk' ? 1 : 2;
  381. $data['create_time'] = NOW_TIMESTAMP;
  382. $data['update_time'] = NOW_TIMESTAMP;
  383. $data['control_name'] = session('USERNAME');
  384. $data['game_id'] = $game_id;
  385. $data['remark'] = $postParam['remark'];
  386. $data['path'] = $domain . '/sygame/' . $game_package_name . '/' . $game_package_name . '.' . $ext_suffix;
  387. $resultUpdate = Db::name('nw_game_package_upload')->insert($data);
  388. }
  389. if (!$resultUpdate) {
  390. throw new Exception("数据更新失败");
  391. }
  392. $cont = [];
  393. $cont['game_id'] = $game_id;
  394. $cont['create_time'] = NOW_TIMESTAMP;
  395. $cont['control_name'] = session('USERNAME');
  396. $cont['control_type'] = $control_type;
  397. $result = Db::name('game_upload_log')->insert($cont);
  398. Db::name('cy_game')->where(['id' => $game_id])->update(['channel_version' => $postParam['bag_version']]);
  399. Db::commit();
  400. } catch (Exception $e) {
  401. Db::rollback();
  402. $this->error("上传失败 " . $e->getMessage());
  403. }
  404. $this->success('上传成功');
  405. // $datas = [];
  406. // $datas['game_name'] = $postParam['name'];
  407. // $datas['bag_name'] = $name.'.'.$ext_suffix;
  408. // $datas['bag_size'] = $postParam['size'];
  409. // $datas['platform_type'] = $ext_suffix == 'apk'?1:2;
  410. // $datas['create_time'] = NOW_TIMESTAMP;
  411. // $datas['control_type'] = 1;
  412. // $datas['control_name'] = session('USERNAME');
  413. // $datas['path'] = $domain.'/sygame/'.$name.'/'.$name.'.'.$ext_suffix;
  414. // // if (Db::name('nw_game_package_upload')->where(['bag_name'=>$datas['bag_name']])->value('id')) {
  415. // // $resultUpdate = Db::name('nw_game_package_upload')->where(['bag_name'=>$datas['bag_name']])->update($datas);
  416. // // }else{
  417. // $resultUpdate = Db::name('nw_game_package_upload')->insert($datas);
  418. // // }
  419. // $this->success('上传成功');
  420. }
  421. }
  422. // 直播接口交互签名
  423. private function getZbSign($data, $sign_key)
  424. {
  425. // TODO:注意&times会被转成×的问题,浏览器展示会处理,实际接口请求不影响
  426. // 1. 构建待拼接字符串
  427. $pre_sign_str = md5($sign_key);
  428. $sign_str = md5(sprintf('app_key=qm_sdk&timestamp=%d', $data['timestamp']));
  429. // 2. 进行两次 md5 计算
  430. $sign = md5($pre_sign_str . $sign_str);
  431. // 3. 返回签名
  432. return $sign;
  433. }
  434. // 测试包&物料管理
  435. public function testPackage(){
  436. if(request()->isPost()){
  437. $gameid = input('game_id', '');
  438. $where = [];
  439. if (!empty($gameid)) {
  440. $where['game_id'] = $gameid;
  441. }
  442. $list = Db::table('nw_game_package_test')->where($where)->page(input('page', 1), input('limit', 15))->order('id desc')->select();
  443. foreach ($list as &$value) {
  444. $value['tg_url'] = Env::get('HTTP_HOST_URL_ALL') .'/game/external?code='. base64_encode($value['game_id']);
  445. }
  446. $count = Db::table('nw_game_package_test')->where($where)->count();
  447. $this->result(['list' => $list, 'upload_url' => Env::get('mubao.upload_url'), 'count' => $count], 200, 'success', 'json');
  448. }
  449. // $gamne_ids = Db::table('nw_game_package_test')->column('game_id');
  450. // ->where('id','not in', $gamne_ids)
  451. $game_lsit = Db::table('cy_game')->whereIn('type', [1,2])->field('id,name,pinyin')->order('id desc')->select();
  452. $this->assign('gameLsit', $game_lsit);
  453. return $this->fetch();
  454. }
  455. public function testPackageSave()
  456. {
  457. if(request()->isPost()){
  458. $param = Request::instance()->only(['id', 'name', 'game_id', 'path_url', 'material_url', 'remarks', 'status', 'game_pinyin']);
  459. if (isset($param['id'])) {
  460. $id = $param['id'];
  461. unset($param['id']);
  462. $param['update_time'] = date('Y-m-d H:i:s', time());
  463. // TODO: 删除老文件
  464. $info = Db::table('nw_game_package_test')->where(['id' => $id])->update($param);
  465. }else{
  466. $param['create_time'] = date('Y-m-d H:i:s', time());
  467. $info = Db::table('nw_game_package_test')->insert($param);
  468. }
  469. if(!$info){
  470. $this->result([], -100, 'error', 'json');
  471. }
  472. $this->result([], 200, 'success', 'json');
  473. }
  474. $id = input('id', '');
  475. $info = Db::table('nw_game_package_test')->where(['id' => $id])->find();
  476. // 编辑模式下,排除其他记录的游戏ID,但包含当前记录的游戏
  477. $gamne_ids = Db::table('nw_game_package_test')->where('id', '<>', $id)->column('game_id');
  478. $game_lsit = Db::table('cy_game')->whereIn('type', [1,2])->whereNotIn('id', $gamne_ids)->field('id,name,pinyin')->order('id desc')->select();
  479. $this->assign('info', $info);
  480. $this->assign('gameLsit', $game_lsit);
  481. $this->assign('upload_url', Env::get('mubao.upload_url'));
  482. return $this->fetch();
  483. }
  484. public function testPackageDel(){
  485. $id = input('id', '');
  486. $res = Db::table('nw_game_package_test')->where(['id' => $id])->delete();
  487. if(!$res){
  488. $this->result([], -100, 'error', 'json');
  489. }
  490. $this->result([], 200, 'success', 'json');
  491. }
  492. }