UserController.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controllers\Admin;
  4. use App\Controllers\AuthController;
  5. use App\Controllers\BaseController;
  6. use App\Models\User;
  7. use App\Models\UserMoneyLog;
  8. use App\Utils\Hash;
  9. use App\Utils\Tools;
  10. use Exception;
  11. use Psr\Http\Message\ResponseInterface;
  12. use Slim\Http\Response;
  13. use Slim\Http\ServerRequest;
  14. use function str_replace;
  15. use const PHP_EOL;
  16. final class UserController extends BaseController
  17. {
  18. public static array $details = [
  19. 'field' => [
  20. 'op' => '操作',
  21. 'id' => '用户ID',
  22. 'user_name' => '昵称',
  23. 'email' => '邮箱',
  24. 'money' => '余额',
  25. 'ref_by' => '邀请人',
  26. 'transfer_enable' => '流量限制',
  27. 'transfer_used' => '当期用量',
  28. 'class' => '等级',
  29. 'is_admin' => '是否管理员',
  30. 'is_banned' => '是否封禁',
  31. 'is_inactive' => '是否闲置',
  32. 'reg_date' => '注册时间',
  33. 'class_expire' => '等级过期',
  34. ],
  35. 'create_dialog' => [
  36. [
  37. 'id' => 'email',
  38. 'info' => '登录邮箱',
  39. 'type' => 'input',
  40. 'placeholder' => '',
  41. ],
  42. [
  43. 'id' => 'password',
  44. 'info' => '登录密码',
  45. 'type' => 'input',
  46. 'placeholder' => '留空则随机生成',
  47. ],
  48. [
  49. 'id' => 'ref_by',
  50. 'info' => '邀请人',
  51. 'type' => 'input',
  52. 'placeholder' => '邀请人的用户id,可留空',
  53. ],
  54. [
  55. 'id' => 'balance',
  56. 'info' => '账户余额',
  57. 'type' => 'input',
  58. 'placeholder' => '-1为按默认设置,其他为指定值',
  59. ],
  60. ],
  61. ];
  62. public static array $update_field = [
  63. 'email',
  64. 'user_name',
  65. 'remark',
  66. 'pass',
  67. 'money',
  68. 'is_admin',
  69. 'ga_enable',
  70. 'is_banned',
  71. 'banned_reason',
  72. 'is_shadow_banned',
  73. 'transfer_enable',
  74. 'invite_num',
  75. 'ref_by',
  76. 'class_expire',
  77. 'expire_in',
  78. 'node_group',
  79. 'class',
  80. 'auto_reset_day',
  81. 'auto_reset_bandwidth',
  82. 'node_speedlimit',
  83. 'node_iplimit',
  84. 'port',
  85. 'passwd',
  86. 'method',
  87. 'forbidden_ip',
  88. 'forbidden_port',
  89. ];
  90. /**
  91. * @throws Exception
  92. */
  93. public function index(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  94. {
  95. return $response->write(
  96. $this->view()
  97. ->assign('details', self::$details)
  98. ->fetch('admin/user/index.tpl')
  99. );
  100. }
  101. /**
  102. * @throws Exception
  103. */
  104. public function createNewUser(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  105. {
  106. $email = $request->getParam('email');
  107. $ref_by = $request->getParam('ref_by');
  108. $password = $request->getParam('password');
  109. $balance = $request->getParam('balance');
  110. if ($email === '' || ! Tools::isEmailLegal($email)) {
  111. return $response->withJson([
  112. 'ret' => 0,
  113. 'msg' => '邮箱格式错误',
  114. ]);
  115. }
  116. $exist = User::where('email', $email)->first();
  117. if ($exist !== null) {
  118. return $response->withJson([
  119. 'ret' => 0,
  120. 'msg' => '邮箱已存在',
  121. ]);
  122. }
  123. if ($password === '') {
  124. $password = Tools::genRandomChar(16);
  125. }
  126. AuthController::registerHelper($response, 'user', $email, $password, '', 0, '', $balance, 1);
  127. $user = User::where('email', $email)->first();
  128. if ($ref_by !== '') {
  129. $user->ref_by = (int) $ref_by;
  130. $user->save();
  131. }
  132. return $response->withJson([
  133. 'ret' => 1,
  134. 'msg' => '添加成功,用户邮箱:'.$email.' 密码:'.$password,
  135. ]);
  136. }
  137. /**
  138. * @throws Exception
  139. */
  140. public function edit(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  141. {
  142. $user = User::find($args['id']);
  143. return $response->write(
  144. $this->view()
  145. ->assign('update_field', self::$update_field)
  146. ->assign('edit_user', $user)
  147. ->fetch('admin/user/edit.tpl')
  148. );
  149. }
  150. public function update(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  151. {
  152. $id = (int) $args['id'];
  153. $user = User::find($id);
  154. if ($request->getParam('pass') !== '' && $request->getParam('pass') !== null) {
  155. $user->pass = Hash::passwordHash($request->getParam('pass'));
  156. $user->cleanLink();
  157. }
  158. if ($request->getParam('money') !== '' &&
  159. $request->getParam('money') !== null &&
  160. (float) $request->getParam('money') !== (float) $user->money
  161. ) {
  162. $money = (float) $request->getParam('money');
  163. $diff = $money - $user->money;
  164. $remark = ($diff > 0 ? '管理员添加余额' : '管理员扣除余额');
  165. (new UserMoneyLog())->add($id, (float) $user->money, $money, $diff, $remark);
  166. $user->money = $money;
  167. }
  168. $user->email = $request->getParam('email');
  169. $user->user_name = $request->getParam('user_name');
  170. $user->remark = $request->getParam('remark');
  171. $user->is_admin = $request->getParam('is_admin') === 'true' ? 1 : 0;
  172. $user->ga_enable = $request->getParam('ga_enable') === 'true' ? 1 : 0;
  173. $user->is_banned = $request->getParam('is_banned') === 'true' ? 1 : 0;
  174. $user->banned_reason = $request->getParam('banned_reason');
  175. $user->is_shadow_banned = $request->getParam('is_shadow_banned') === 'true' ? 1 : 0;
  176. $user->transfer_enable = Tools::autoBytesR($request->getParam('transfer_enable'));
  177. $user->invite_num = $request->getParam('invite_num');
  178. $user->ref_by = $request->getParam('ref_by');
  179. $user->class_expire = $request->getParam('class_expire');
  180. $user->expire_in = $request->getParam('expire_in');
  181. $user->node_group = $request->getParam('node_group');
  182. $user->class = $request->getParam('class');
  183. $user->auto_reset_day = $request->getParam('auto_reset_day');
  184. $user->auto_reset_bandwidth = $request->getParam('auto_reset_bandwidth');
  185. $user->node_speedlimit = $request->getParam('node_speedlimit');
  186. $user->node_iplimit = $request->getParam('node_iplimit');
  187. $user->port = $request->getParam('port');
  188. $user->passwd = $request->getParam('passwd');
  189. $user->method = $request->getParam('method');
  190. $user->forbidden_ip = str_replace(PHP_EOL, ',', $request->getParam('forbidden_ip'));
  191. $user->forbidden_port = str_replace(PHP_EOL, ',', $request->getParam('forbidden_port'));
  192. if (! $user->save()) {
  193. return $response->withJson([
  194. 'ret' => 0,
  195. 'msg' => '修改失败',
  196. ]);
  197. }
  198. return $response->withJson([
  199. 'ret' => 1,
  200. 'msg' => '修改成功',
  201. ]);
  202. }
  203. public function delete(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  204. {
  205. $id = $args['id'];
  206. $user = User::find((int) $id);
  207. if (! $user->kill()) {
  208. return $response->withJson([
  209. 'ret' => 0,
  210. 'msg' => '删除失败',
  211. ]);
  212. }
  213. return $response->withJson([
  214. 'ret' => 1,
  215. 'msg' => '删除成功',
  216. ]);
  217. }
  218. public function ajax(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  219. {
  220. $users = User::orderBy('id', 'desc')->get();
  221. foreach ($users as $user) {
  222. $user->op = '<button type="button" class="btn btn-red" id="delete-user-' . $user->id . '"
  223. onclick="deleteUser(' . $user->id . ')">删除</button>
  224. <a class="btn btn-blue" href="/admin/user/' . $user->id . '/edit">编辑</a>';
  225. $user->transfer_enable = $user->enableTraffic();
  226. $user->transfer_used = $user->usedTraffic();
  227. $user->is_admin = $user->is_admin === 1 ? '是' : '否';
  228. $user->is_banned = $user->is_banned === 1 ? '是' : '否';
  229. $user->is_inactive = $user->is_inactive === 1 ? '是' : '否';
  230. }
  231. return $response->withJson([
  232. 'users' => $users,
  233. ]);
  234. }
  235. }