AdministratorController.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: woann <304550409@qq.com>
  5. * Date: 18-10-26下午1:23
  6. * Desc: 管理员
  7. */
  8. namespace App\Http\Controllers\Admin;
  9. use App\AdminMenu;
  10. use App\AdminPermission;
  11. use App\AdminRole;
  12. use App\AdminUser;
  13. use App\Http\Controllers\Controller;
  14. use App\Http\helper\Helper;
  15. use App\Services\GoogleAuthenticatorService;
  16. use App\Utility\Rbac;
  17. use Illuminate\Http\Request;
  18. use Illuminate\Support\Collection;
  19. use Illuminate\Support\Facades\DB;
  20. use Illuminate\Support\Facades\Redis;
  21. class AdministratorController extends Controller
  22. {
  23. /**
  24. * @Desc: 菜单列表
  25. * @Author: woann <304550409@qq.com>
  26. * @return \Illuminate\View\View
  27. */
  28. public function menuList()
  29. {
  30. // 获取一级菜单
  31. return view('admin.menu', ['list' => AdminMenu::where('pid', 0)->get()]);
  32. }
  33. /**
  34. * @Desc: 添加菜单
  35. * @Author: woann <304550409@qq.com>
  36. * @param Request $request
  37. * @return \Illuminate\View\View
  38. */
  39. public function menuAddView(Request $request)
  40. {
  41. $roles = AdminRole::get();
  42. $topMenu = AdminMenu::where('pid', 0)->get();
  43. return view('admin.menu_add', ['roles' => $roles, 'top_menu' => $topMenu]);
  44. }
  45. public function menuAdd(Request $request)
  46. {
  47. $data = $request->except(['role', 's']);
  48. $roles = new Collection($request->input('roles'));
  49. if ($roles->isEmpty()) {
  50. return $this->json(500, '未选择任何角色');
  51. }
  52. $menu = new AdminMenu();
  53. $menu->fill($data);
  54. $menu->save();
  55. // 保存菜单所属角色
  56. $roles->map(function ($roleId) use ($menu) {
  57. $role = AdminRole::find($roleId);
  58. $menu->roles()->attach($role);
  59. });
  60. return $this->json(200, '添加成功');
  61. }
  62. /**
  63. * @Desc: 修改菜单
  64. * @Author: woann <304550409@qq.com>
  65. * @param Request $request
  66. * @param $id
  67. * @return \Illuminate\View\View
  68. */
  69. public function menuUpdateView(Request $request, $id)
  70. {
  71. $roles = AdminRole::get();
  72. $menu = AdminMenu::findOrFail($id);
  73. $roles->map(function ($role) use ($menu) {
  74. $menu->roles->each(function ($mRole) use (&$role) {
  75. if ($mRole->id === $role->id) {
  76. $role->checked = true;
  77. }
  78. });
  79. return $role;
  80. });
  81. $topMenu = AdminMenu::where('pid', 0)->get();
  82. return view('admin.menu_update', [
  83. 'roles' => $roles,
  84. 'top_menu' => $topMenu,
  85. 'menu' => $menu,
  86. ]);
  87. }
  88. public function menuUpdate(Request $request, $id)
  89. {
  90. $menu = AdminMenu::findOrFail($id);
  91. $roles = new Collection($request->input('roles'));
  92. if ($roles->isEmpty()) {
  93. return $this->json(500, '未选择任何角色');
  94. }
  95. // 基础信息更新
  96. $data = $request->except(['role', 's']);
  97. $menu->fill($data)->save();
  98. // 删除原有关联数据
  99. $menu->roles()->detach();
  100. // 重新关联数据
  101. $roles->each(function ($roleId) use ($menu) {
  102. $role = AdminRole::find($roleId);
  103. $menu->roles()->attach($role);
  104. });
  105. return $this->json(200, '修改成功');
  106. }
  107. /**
  108. * @Desc: 删除菜单
  109. * @Author: woann <304550409@qq.com>
  110. * @param $id
  111. * @return mixed
  112. */
  113. public function menuDel($id)
  114. {
  115. $menu = AdminMenu::findOrFail($id);
  116. $menu->roles()->detach();
  117. $menu->delete();
  118. return $this->json(200, '删除成功');
  119. }
  120. public function roleList()
  121. {
  122. return view('admin.role', [
  123. 'list' => AdminRole::paginate(10),
  124. ]);
  125. }
  126. /**
  127. * @Desc: 添加角色
  128. * @Author: woann <304550409@qq.com>
  129. * @param Request $request
  130. * @return \Illuminate\View\View
  131. */
  132. public function roleAddView(Request $request)
  133. {
  134. return view('admin.role_add', [
  135. 'permissions' => AdminPermission::get(),
  136. ]);
  137. }
  138. public function roleAdd(Request $request)
  139. {
  140. $param = $request->post();
  141. $role = new AdminRole();
  142. $role->fill($param);
  143. $role->save();
  144. if (isset($param['permissions'])) {
  145. (new Collection($param['permissions']))->map(function ($permissionId) use ($role) {
  146. $permission = AdminPermission::find($permissionId);
  147. $role->permissions()->attach($permission);
  148. });
  149. }
  150. return $this->json(200, "添加成功");
  151. }
  152. /**
  153. * @Desc: 修改角色
  154. * @Author: woann <304550409@qq.com>
  155. * @param Request $request
  156. * @param $id
  157. * @return \Illuminate\View\View
  158. */
  159. public function roleUpdateView(Request $request, $id)
  160. {
  161. $role = AdminRole::findOrFail($id);
  162. $permissions = AdminPermission::get();
  163. $permissions->map(function ($permission) use ($role) {
  164. $permission->checked = false;
  165. $role->permissions->each(function ($rPermission) use ($role, &$permission) {
  166. if ($rPermission->id === $permission->id) {
  167. $permission->checked = true;
  168. return false;
  169. }
  170. });
  171. return $permission;
  172. });
  173. return view('admin.role_update', ['role' => $role, 'permissions' => $permissions]);
  174. }
  175. public function roleUpdate(Request $request, $id)
  176. {
  177. $param = $request->post();
  178. $role = AdminRole::findOrFail($id);
  179. $role->fill($param);
  180. $role->save();
  181. // 删除所有权限关联
  182. $role->permissions()->detach();
  183. // 录入权限关联
  184. if (isset($param['permissions'])) {
  185. (new Collection($param['permissions']))->map(function ($permissionId) use ($role) {
  186. $permission = AdminPermission::find($permissionId);
  187. $role->permissions()->attach($permission);
  188. });
  189. }
  190. return $this->json(200, "修改成功");
  191. }
  192. /**
  193. * @Desc: 删除角色
  194. * @Author: woann <304550409@qq.com>
  195. * @param $id
  196. * @return mixed
  197. */
  198. public function roleDel($id)
  199. {
  200. if ($id == 1) {
  201. return $this->json(500, '超级管理员不可删除');
  202. }
  203. $role = AdminRole::findOrFail($id);
  204. // 删除所有多对多关系
  205. $role->users()->detach();
  206. $role->menus()->detach();
  207. $role->permissions()->detach();
  208. $role->delete();
  209. return $this->json(200, '删除成功');
  210. }
  211. /**
  212. * @return mixed
  213. * 权限列表
  214. */
  215. public function permissionList()
  216. {
  217. return view('admin.permission', [
  218. 'list' => AdminPermission::get(),
  219. ]);
  220. }
  221. /**
  222. * @param Request $request
  223. * @return mixed
  224. * 添加权限
  225. */
  226. public function permissionAddView(Request $request)
  227. {
  228. //渲染页面
  229. $routes = Rbac::getAllRoutes();
  230. // foreach ($routes as $key => $value) {
  231. // print_r(json_decode(json_encode($value),true));
  232. // }
  233. return view('admin.permission_add', ['routes' => $routes]);
  234. // return view('admin.permission_add', ['routes' => AdminMenu::orderBy('id')->get()]);
  235. }
  236. public function permissionAdd(Request $request)
  237. {
  238. $data = $request->post();
  239. $permission = new AdminPermission();
  240. $permission->fill($data);
  241. $permission->save();
  242. return $this->json(200, '添加成功');
  243. }
  244. /**
  245. * @param Request $request
  246. * @param $id
  247. * @return mixed
  248. * 修改权限
  249. */
  250. public function permissionUpdateView(Request $request, $id)
  251. {
  252. $permission = AdminPermission::findOrFail($id);
  253. $rbacRoutes = Rbac::getAllRoutes();
  254. $checkRoutes = $permission->routes->map(function ($route) {
  255. $routeObj = new \StdClass();
  256. $routeObj->rbacRule = $route;
  257. return $routeObj;
  258. });
  259. $uncheckRoutes = new Collection();
  260. $rbacRoutes->each(function ($route) use ($permission, $checkRoutes, &$uncheckRoutes) {
  261. $uncheckFlag = true;
  262. $checkRoutes->each(function ($checkRoute) use ($route, &$uncheckFlag) {
  263. if ($route->rbacRule === $checkRoute->rbacRule) {
  264. $uncheckFlag = false;
  265. }
  266. });
  267. if ($uncheckFlag) {
  268. $uncheckRoutes->push($route);
  269. }
  270. });
  271. return view('admin.permission_update', [
  272. 'permission' => $permission,
  273. 'uncheck_routes' => $uncheckRoutes,
  274. 'check_routes' => $checkRoutes,
  275. ]);
  276. }
  277. public function permissionUpdate(Request $request, $id)
  278. {
  279. $data = $request->post();
  280. $permission = AdminPermission::findOrFail($id);
  281. $permission->fill($data);
  282. $permission->save();
  283. return $this->json(200, '修改成功');
  284. }
  285. /**
  286. * @return mixed
  287. * 删除权限
  288. */
  289. public function permissionDel($id)
  290. {
  291. $permission = AdminPermission::findOrFail($id);
  292. // 解除所有多对多关系
  293. $permission->roles()->detach();
  294. $permission->delete();
  295. return $this->json(200, '删除成功');
  296. }
  297. /**
  298. * @return mixed
  299. * 管理员列表
  300. */
  301. public function administratorList()
  302. {
  303. // $admin_user = AdminUser::pluck('account','id')->toArray();
  304. $admins = AdminUser::paginate(10);
  305. $admin_ids = [];
  306. foreach ($admins as &$val) {
  307. $admin_ids[] = $val->id;
  308. }
  309. $history_lottery_amount = DB::table('agent.dbo.admin_score')->where(['type' => 1])->whereIn('admin_id', $admin_ids)->selectRaw('IsNull(sum(change_score),0)as change_score,admin_id')->groupBy('admin_id')->pluck('change_score', 'admin_id')->toArray();
  310. $history_recharge_amount = DB::table('agent.dbo.admin_score')->where(['type' => 2])->whereIn('admin_id', $admin_ids)->selectRaw('IsNull(sum(change_score),0)as change_score,admin_id')->groupBy('admin_id')->pluck('change_score', 'admin_id')->toArray();
  311. foreach ($admins as &$val) {
  312. $val->history_lottery_amount = isset($history_lottery_amount[$val->id]) ? $history_lottery_amount[$val->id] : '';
  313. $val->history_recharge_amount = isset($history_recharge_amount[$val->id]) ? $history_recharge_amount[$val->id] : '';
  314. }
  315. return view('admin.administrator', [
  316. 'admins' => $admins,
  317. ]);
  318. }
  319. /**
  320. * @param Request $request
  321. * @return mixed
  322. * 添加管理员
  323. */
  324. public function administratorAddView(Request $request)
  325. {
  326. $roles = AdminRole::select('id', 'name')->get();
  327. $channels = DB::table('QPPlatformDB.dbo.ChannelPackageName')
  328. ->pluck('Channel', 'Channel');
  329. $types = [1 => '管理后台', 2 => '渠道后台', 3 => '数据统计新后台'];
  330. return view('admin.administrator_add', ['roles' => $roles, 'types' => $types,'channels'=>$channels]);
  331. }
  332. public function administratorAdd(Request $request)
  333. {
  334. $post = $request->post();
  335. $post['channel'] = json_encode($post['channel']);
  336. $roles = (new Collection($request->post('roles')));
  337. if (AdminUser::isExist($post['account'], $post['type'])) {
  338. return $this->json(500, '该账号已存在');
  339. }
  340. $admin = new AdminUser();
  341. $admin->fill($post);
  342. $admin->save();
  343. $roles->map(function ($roleId) use ($admin) {
  344. $role = AdminRole::find($roleId);
  345. $admin->roles()->attach($role);
  346. });
  347. return $this->json(200, '添加成功');
  348. }
  349. public function administratorUpdateView(Request $request, $id)
  350. {
  351. $roles = AdminRole::select('id', 'name')->get();
  352. $admin = AdminUser::findOrFail($id);
  353. $selectRoleIdArr = [];
  354. $admin->roles->map(function ($role) use (&$selectRoleIdArr) {
  355. $selectRoleIdArr[] = $role->id;
  356. });
  357. $admin->channel = json_decode($admin->channel,true);
  358. $channels = DB::table('QPPlatformDB.dbo.ChannelPackageName')
  359. ->pluck('Channel', 'Channel');
  360. $ga = $this->buildGaPayload($admin);
  361. return view('admin.administrator_update', [
  362. 'admin' => $admin,
  363. 'roles' => $roles,
  364. 'channels'=>$channels,
  365. 's_role_id_arr' => $selectRoleIdArr,
  366. 'ga' => $ga,
  367. ]);
  368. }
  369. public function administratorUpdate(Request $request, $id)
  370. {
  371. $post = $request->post();
  372. $roles = (new Collection($request->post('roles')));
  373. $admin = AdminUser::findOrFail($id);
  374. if ($admin->isExistForUpdate($post['account'], $post['type'])) {
  375. return $this->json(500, '该账号已存在');
  376. }
  377. $post['channel'] = json_encode($post['channel']);
  378. $post['ga_enabled'] = empty($post['ga_enabled']) ? 0 : 1;
  379. if ($post['ga_enabled'] == 1 && empty($post['ga_secret'])) {
  380. return $this->json(500, '请先生成GA密钥');
  381. }
  382. $post = array_filter($post, function ($value, $key) {
  383. if ($key === 'ga_enabled') {
  384. return true;
  385. }
  386. return !($value === null || $value === '');
  387. }, ARRAY_FILTER_USE_BOTH);
  388. $admin->fill($post)->save();
  389. // 删除用户的所有关联角色
  390. $admin->roles()->detach();
  391. $roles->map(function ($roleId) use ($admin) {
  392. $role = AdminRole::find($roleId);
  393. $admin->roles()->attach($role);
  394. });
  395. return $this->json(200, '修改成功');
  396. }
  397. public function resetGaSecret($id)
  398. {
  399. $admin = AdminUser::findOrFail($id);
  400. $gaService = new GoogleAuthenticatorService();
  401. $secret = $gaService->generateSecret(32);
  402. $admin->ga_secret = $secret;
  403. $admin->ga_enabled = 0;
  404. $admin->save();
  405. return $this->json(200, 'GA密钥已重置,请扫码后再启用', $this->buildGaPayload($admin));
  406. }
  407. /**
  408. * @return mixed
  409. * 删除管理员
  410. */
  411. public function administratorDel($id)
  412. {
  413. $admin = AdminUser::findOrFail($id);
  414. // 解除管理员角色多对多关系
  415. $admin->roles()->detach();
  416. $admin->delete();
  417. return $this->json(200, '删除成功');
  418. }
  419. public function administratorBlock($id)
  420. {
  421. $admin = AdminUser::where('id', $id)->value('status');
  422. if ($admin == 1) {
  423. AdminUser::where('id', $id)->update(['status' => -1]);
  424. return apiReturnSuc('success', '禁用成功');
  425. } else {
  426. AdminUser::where('id', $id)->update(['status' => 1]);
  427. return apiReturnSuc('success', '启用成功');
  428. }
  429. }
  430. /**
  431. * @param Request $request
  432. * @return mixed
  433. * 后台登录
  434. */
  435. public function login(Request $request)
  436. {
  437. if(!isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))return '';//$_SERVER['HTTP_ACCEPT_LANGUAGE']="zh_CN";
  438. $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 5); //只取前4位,这样只判断最优先的语言。如果取前5位,可能出现en,zh的情况,影响判断。
  439. if (preg_match("/zh/i", $lang)){
  440. \App::setLocale("zh_CN");
  441. }else{
  442. \App::setLocale("en_US");
  443. }
  444. return view('admin.login');
  445. }
  446. /**
  447. * 后台登录图形验证码(GD)
  448. */
  449. public function loginCaptcha(Request $request)
  450. {
  451. if (!function_exists('imagecreatetruecolor')) {
  452. abort(503, 'GD extension required');
  453. }
  454. $chars = '23456789ABCDEFGHJKLMNPQRSTUVWXY';
  455. $code = '';
  456. $len = strlen($chars) - 1;
  457. for ($i = 0; $i < 4; $i++) {
  458. $code .= $chars[random_int(0, $len)];
  459. }
  460. $request->session()->put('admin_login_captcha', strtolower($code));
  461. $w = 120;
  462. $h = 42;
  463. $im = imagecreatetruecolor($w, $h);
  464. $bg = imagecolorallocate($im, 248, 249, 250);
  465. imagefilledrectangle($im, 0, 0, $w, $h, $bg);
  466. for ($i = 0; $i < 5; $i++) {
  467. $lineColor = imagecolorallocate($im, random_int(180, 230), random_int(180, 230), random_int(180, 230));
  468. imageline($im, random_int(0, $w), random_int(0, $h), random_int(0, $w), random_int(0, $h), $lineColor);
  469. }
  470. for ($i = 0; $i < 50; $i++) {
  471. $px = imagecolorallocate($im, random_int(150, 200), random_int(150, 200), random_int(150, 200));
  472. imagesetpixel($im, random_int(0, $w - 1), random_int(0, $h - 1), $px);
  473. }
  474. $textColor = imagecolorallocate($im, random_int(40, 90), random_int(40, 90), random_int(40, 90));
  475. imagestring($im, 5, 32, 13, $code, $textColor);
  476. ob_start();
  477. imagepng($im);
  478. imagedestroy($im);
  479. $png = ob_get_clean();
  480. return response($png, 200)
  481. ->header('Content-Type', 'image/png')
  482. ->header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0')
  483. ->header('Pragma', 'no-cache');
  484. }
  485. public function checkLogin(Request $request)
  486. {
  487. $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 5); //只取前4位,这样只判断最优先的语言。如果取前5位,可能出现en,zh的情况,影响判断。
  488. if (preg_match("/zh/i", $lang)){
  489. \App::setLocale("zh_CN");
  490. }else{
  491. \App::setLocale("en_US");
  492. }
  493. $post = $request->post();
  494. if (empty($post['account'])) {
  495. return $this->json(500, trans('cs.login.notice_user'));
  496. }
  497. if (empty($post['password'])) {
  498. return $this->json(500, trans('cs.login.notice_pass'));
  499. }
  500. $captchaInput = isset($post['captcha']) ? strtolower(trim((string) $post['captcha'])) : '';
  501. $captchaSession = (string) $request->session()->pull('admin_login_captcha', '');
  502. if ($captchaInput === '' || $captchaSession === '' || !hash_equals($captchaSession, $captchaInput)) {
  503. return $this->json(500, trans('cs.login.wrong_captcha'));
  504. }
  505. $admin = AdminUser::where('account', $post['account'])->first();
  506. if (empty($admin) || $admin->type != 1) {
  507. return $this->json(500, trans('cs.login.cannotfinduser'));
  508. }
  509. if (!password_verify($post['password'], $admin->password)) {
  510. return $this->json(500, trans('cs.login.wrongpass'));
  511. }
  512. if ($admin->status == -1) {
  513. return $this->json(500, trans('cs.login.block'));
  514. }
  515. if ((int) $admin->ga_enabled !== 1 || empty($admin->ga_secret)) {
  516. return $this->json(500, trans('cs.login.ga_required'));
  517. }
  518. $gaCode = isset($post['ga_code']) ? trim((string) $post['ga_code']) : '';
  519. if ($gaCode === '') {
  520. return $this->json(500, trans('cs.login.notice_ga_code'));
  521. }
  522. $gaService = new GoogleAuthenticatorService();
  523. if (!$gaService->verifyCode($admin->ga_secret, $gaCode)) {
  524. return $this->json(500, trans('cs.login.wrong_ga_code'));
  525. }
  526. $roles = $admin->roles;
  527. $ip = $request->ip();
  528. // 超管不验证IP白名单
  529. $whiteListId = [];//[1, 12, 2010];
  530. foreach ($roles as $role) {
  531. if (in_array($role->id, $whiteListId)) {
  532. $white_ip = DB::table('agent.dbo.ip_white_list')->where('ip', $ip)->first();
  533. if (!$white_ip) {
  534. // return $this->json(500, '请联系管理员添加IP白名单!'.$ip);
  535. }
  536. }
  537. }
  538. //
  539. //
  540. // // 添加ip登录管理
  541. // $ip_data = [
  542. // 'admin_id' => $admin->id,
  543. // 'ip' => $ip,
  544. // 'ip_address' => Helper::get_ip_city($ip),
  545. // 'last_login_time' => date('Y-m-d H:i:s')
  546. // ];
  547. // $_where = [
  548. // 'admin_id' => $admin->id,
  549. // 'ip' => $ip
  550. // ];
  551. // $query = DB::table('agent.dbo.admin_login_ip')->where($_where)->first();
  552. // if (!$query) {
  553. // DB::table('agent.dbo.admin_login_ip')->insert($ip_data);
  554. // }
  555. $request->session()->put('admin', $admin);
  556. return $this->json(200, trans('cs.login.notice'));
  557. }
  558. /**
  559. * @param Request $request
  560. * @param $id
  561. * @return mixed
  562. * 修改信息
  563. */
  564. public function editInfoView(Request $request, $id)
  565. {
  566. return view('admin.edit_info', ['admin' => AdminUser::findOrFail($id)]);
  567. }
  568. public function editInfo(Request $request, $id)
  569. {
  570. $post = $request->post();
  571. $admin = AdminUser::findOrFail($id);
  572. $admin->fill($post);
  573. $admin->save();
  574. $request->session()->put('admin', $admin);
  575. return $this->json(200, '修改成功');
  576. }
  577. /**
  578. * @param Request $request
  579. * @return mixed
  580. * 退出登录
  581. */
  582. public function logout(Request $request)
  583. {
  584. $admin_id=$request->session()->get("admin")->id;
  585. $adminKey="adminuser_$admin_id";
  586. Redis::del($adminKey);
  587. $request->session()->flush();
  588. return redirect('/admin/login_op');
  589. }
  590. protected function buildGaPayload(AdminUser $admin)
  591. {
  592. $secret = $admin->ga_secret ?: '';
  593. $gaService = new GoogleAuthenticatorService();
  594. $issuer = config('app.name', 'Admin');
  595. $otpAuthUrl = '';
  596. $qrCodeUrl = '';
  597. if ($secret !== '') {
  598. $otpAuthUrl = $gaService->getOtpAuthUrl($issuer, $admin->account, $secret);
  599. $qrCodeUrl = $gaService->getQrCodeUrl($otpAuthUrl, 200);
  600. }
  601. return [
  602. 'secret' => $secret,
  603. 'otpauth_url' => $otpAuthUrl,
  604. 'qr_code_url' => $qrCodeUrl,
  605. 'enabled' => (int) $admin->ga_enabled,
  606. ];
  607. }
  608. }