UserController.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  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. private 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. private 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. 'ref_by',
  75. 'class_expire',
  76. 'node_group',
  77. 'class',
  78. 'auto_reset_day',
  79. 'auto_reset_bandwidth',
  80. 'node_speedlimit',
  81. 'node_iplimit',
  82. 'port',
  83. 'passwd',
  84. 'method',
  85. 'forbidden_ip',
  86. 'forbidden_port',
  87. ];
  88. /**
  89. * @throws Exception
  90. */
  91. public function index(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  92. {
  93. return $response->write(
  94. $this->view()
  95. ->assign('details', self::$details)
  96. ->fetch('admin/user/index.tpl')
  97. );
  98. }
  99. /**
  100. * @throws Exception
  101. */
  102. public function create(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  103. {
  104. $email = $request->getParam('email');
  105. $ref_by = $request->getParam('ref_by');
  106. $password = $request->getParam('password');
  107. $balance = $request->getParam('balance');
  108. if ($email === '') {
  109. return $response->withJson([
  110. 'ret' => 0,
  111. 'msg' => '邮箱不能为空',
  112. ]);
  113. }
  114. $exist = (new User())->where('email', $email)->first();
  115. if ($exist !== null) {
  116. return $response->withJson([
  117. 'ret' => 0,
  118. 'msg' => '邮箱已存在',
  119. ]);
  120. }
  121. if ($password === '') {
  122. $password = Tools::genRandomChar(16);
  123. }
  124. (new AuthController())->registerHelper($response, 'user', $email, $password, '', 0, '', $balance, 1);
  125. $user = (new User())->where('email', $email)->first();
  126. if ($ref_by !== '') {
  127. $user->ref_by = (int) $ref_by;
  128. $user->save();
  129. }
  130. return $response->withJson([
  131. 'ret' => 1,
  132. 'msg' => '添加成功,用户邮箱:'.$email.' 密码:'.$password,
  133. ]);
  134. }
  135. /**
  136. * @throws Exception
  137. */
  138. public function edit(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  139. {
  140. $user = (new User())->find($args['id']);
  141. return $response->write(
  142. $this->view()
  143. ->assign('update_field', self::$update_field)
  144. ->assign('edit_user', $user)
  145. ->fetch('admin/user/edit.tpl')
  146. );
  147. }
  148. public function update(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  149. {
  150. $id = (int) $args['id'];
  151. $user = (new User())->find($id);
  152. if ($request->getParam('pass') !== '' && $request->getParam('pass') !== null) {
  153. $user->pass = Hash::passwordHash($request->getParam('pass'));
  154. $user->cleanLink();
  155. }
  156. if ($request->getParam('money') !== '' &&
  157. $request->getParam('money') !== null &&
  158. (float) $request->getParam('money') !== $user->money
  159. ) {
  160. $money = (float) $request->getParam('money');
  161. $diff = $money - $user->money;
  162. $remark = ($diff > 0 ? '管理员添加余额' : '管理员扣除余额');
  163. (new UserMoneyLog())->add($id, (float) $user->money, $money, $diff, $remark);
  164. $user->money = $money;
  165. }
  166. $user->email = $request->getParam('email');
  167. $user->user_name = $request->getParam('user_name');
  168. $user->remark = $request->getParam('remark');
  169. $user->is_admin = $request->getParam('is_admin') === 'true' ? 1 : 0;
  170. $user->ga_enable = $request->getParam('ga_enable') === 'true' ? 1 : 0;
  171. $user->is_banned = $request->getParam('is_banned') === 'true' ? 1 : 0;
  172. $user->banned_reason = $request->getParam('banned_reason');
  173. $user->is_shadow_banned = $request->getParam('is_shadow_banned') === 'true' ? 1 : 0;
  174. $user->transfer_enable = Tools::autoBytesR($request->getParam('transfer_enable'));
  175. $user->ref_by = $request->getParam('ref_by');
  176. $user->class_expire = $request->getParam('class_expire');
  177. $user->node_group = $request->getParam('node_group');
  178. $user->class = $request->getParam('class');
  179. $user->auto_reset_day = $request->getParam('auto_reset_day');
  180. $user->auto_reset_bandwidth = $request->getParam('auto_reset_bandwidth');
  181. $user->node_speedlimit = $request->getParam('node_speedlimit');
  182. $user->node_iplimit = $request->getParam('node_iplimit');
  183. $user->port = $request->getParam('port');
  184. $user->passwd = $request->getParam('passwd');
  185. $user->method = $request->getParam('method');
  186. $user->forbidden_ip = str_replace(PHP_EOL, ',', $request->getParam('forbidden_ip'));
  187. $user->forbidden_port = str_replace(PHP_EOL, ',', $request->getParam('forbidden_port'));
  188. if (! $user->save()) {
  189. return $response->withJson([
  190. 'ret' => 0,
  191. 'msg' => '修改失败',
  192. ]);
  193. }
  194. return $response->withJson([
  195. 'ret' => 1,
  196. 'msg' => '修改成功',
  197. ]);
  198. }
  199. public function delete(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  200. {
  201. $id = $args['id'];
  202. $user = (new User())->find((int) $id);
  203. if (! $user->kill()) {
  204. return $response->withJson([
  205. 'ret' => 0,
  206. 'msg' => '删除失败',
  207. ]);
  208. }
  209. return $response->withJson([
  210. 'ret' => 1,
  211. 'msg' => '删除成功',
  212. ]);
  213. }
  214. public function ajax(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  215. {
  216. $users = (new User())->orderBy('id', 'desc')->get();
  217. foreach ($users as $user) {
  218. $user->op = '<button type="button" class="btn btn-red" id="delete-user-' . $user->id . '"
  219. onclick="deleteUser(' . $user->id . ')">删除</button>
  220. <a class="btn btn-blue" href="/admin/user/' . $user->id . '/edit">编辑</a>';
  221. $user->transfer_enable = $user->enableTraffic();
  222. $user->transfer_used = $user->usedTraffic();
  223. $user->is_admin = $user->is_admin === 1 ? '是' : '否';
  224. $user->is_banned = $user->is_banned === 1 ? '是' : '否';
  225. $user->is_inactive = $user->is_inactive === 1 ? '是' : '否';
  226. }
  227. return $response->withJson([
  228. 'users' => $users,
  229. ]);
  230. }
  231. }