UsersController.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Controllers\Controller;
  4. use App\Model\DBCache;
  5. use App\Module\Base;
  6. use App\Module\Users;
  7. use DB;
  8. use Request;
  9. use Session;
  10. use SimpleDingTalk\User;
  11. /**
  12. * @apiDefine users
  13. *
  14. * 会员
  15. */
  16. class UsersController extends Controller
  17. {
  18. public function __invoke($method, $action = '')
  19. {
  20. $app = $method ? $method : 'main';
  21. if ($action) {
  22. $app .= "__" . $action;
  23. }
  24. return (method_exists($this, $app)) ? $this->$app() : Base::ajaxError("404 not found (" . str_replace("__", "/", $app) . ").");
  25. }
  26. /**
  27. * 登陆、注册
  28. *
  29. * @apiParam {String} type 类型
  30. * - login:登录(默认)
  31. * - reg:注册
  32. * @apiParam {String} username 用户名
  33. * @apiParam {String} userpass 密码
  34. */
  35. public function login()
  36. {
  37. $type = trim(Request::input('type'));
  38. $username = trim(Request::input('username'));
  39. $userpass = trim(Request::input('userpass'));
  40. if ($type == 'reg') {
  41. $setting = Base::setting('system');
  42. if ($setting['reg'] == 'close') {
  43. return Base::retError('未开放注册。');
  44. }
  45. $user = Users::reg($username, $userpass);
  46. if (Base::isError($user)) {
  47. return $user;
  48. } else {
  49. $user = $user['data'];
  50. }
  51. } else {
  52. $user = Base::DBC2A(DB::table('users')->where('username', $username)->first());
  53. if (empty($user)) {
  54. return Base::retError('账号或密码错误。');
  55. }
  56. if ($user['userpass'] != Base::md52($userpass, $user['encrypt'])) {
  57. return Base::retError('账号或密码错误!');
  58. }
  59. if (in_array($user['id'], [1, 2])) {
  60. $user['setting'] = Base::string2array($user['setting']);
  61. if (intval($user['setting']['version']) < 1) {
  62. $user['setting']['version'] = intval($user['setting']['version']) + 1;
  63. $user['identity'] = ',admin,';
  64. DB::table('users')->where('username', $username)->update([
  65. 'setting' => Base::array2string($user['setting']),
  66. 'identity' => $user['identity'],
  67. ]);
  68. }
  69. }
  70. }
  71. //
  72. $array = [
  73. 'token' => Users::token($user),
  74. 'loginnum' => $user['loginnum'] + 1,
  75. 'lastip' => Base::getIp(),
  76. 'lastdate' => Base::time(),
  77. 'lineip' => Base::getIp(),
  78. 'linedate' => Base::time(),
  79. ];
  80. Base::array_over($user, $array);
  81. DB::table('users')->where('id', $user['id'])->update($array);
  82. //
  83. return Base::retSuccess($type == 'reg' ? "注册成功!" : "登陆成功!", Users::retInfo($user));
  84. }
  85. /**
  86. * 获取我的信息
  87. *
  88. * @apiParam {String} [callback] jsonp返回字段
  89. */
  90. public function info()
  91. {
  92. $callback = Request::input('callback');
  93. //
  94. $user = Users::authE();
  95. if (Base::isError($user)) {
  96. if (strlen($callback) > 3) {
  97. return $callback . '(' . json_encode($user) . ')';
  98. }
  99. return $user;
  100. } else {
  101. $user = $user['data'];
  102. }
  103. //
  104. if (strlen($callback) > 3) {
  105. return $callback . '(' . json_encode(Base::retSuccess('success', Users::retInfo($user))) . ')';
  106. }
  107. return Base::retSuccess('success', Users::retInfo($user));
  108. }
  109. /**
  110. * 获取指定会员基本信息
  111. *
  112. * @apiParam {String|jsonArray} username 会员用户名(多个格式:jsonArray,一次最多30个)
  113. */
  114. public function basic()
  115. {
  116. $username = trim(Request::input('username'));
  117. $array = Base::json2array($username);
  118. if (empty($array)) {
  119. $array[] = $username;
  120. }
  121. if (count($array) > 50) {
  122. return Base::retError(['一次最多只能获取%条数据!', 50]);
  123. }
  124. $retArray = [];
  125. foreach ($array AS $name) {
  126. $basic = Users::username2basic($name);
  127. if ($basic) {
  128. $retArray[] = $basic;
  129. }
  130. }
  131. return Base::retSuccess('success', $retArray);
  132. }
  133. /**
  134. * 搜索会员列表
  135. *
  136. * @apiParam {Object} where 搜索条件
  137. * - where.usernameequal
  138. * - where.nousername
  139. * - where.username
  140. * - where.noidentity
  141. * - where.identity
  142. * - where.noprojectid
  143. * - where.projectid
  144. * - where.nobookid
  145. * @apiParam {Number} [take] 获取数量,10-100
  146. */
  147. public function searchinfo()
  148. {
  149. $keys = Request::input('where');
  150. $whereArr = [];
  151. $whereRaw = null;
  152. if ($keys['usernameequal']) $whereArr[] = ['username', '=', $keys['usernameequal']];
  153. if ($keys['identity']) $whereArr[] = ['identity', 'like', '%,' . $keys['identity'] . ',%'];
  154. if ($keys['noidentity']) $whereArr[] = ['identity', 'not like', '%,' . $keys['noidentity'] . ',%'];
  155. if ($keys['username']) {
  156. $whereRaw.= $whereRaw ? ' AND ' : '';
  157. $whereRaw.= "(`username` LIKE '%" . $keys['username'] . "%' OR `nickname` LIKE '%" . $keys['username'] . "%')";
  158. }
  159. if (intval($keys['projectid']) > 0) {
  160. $whereRaw.= $whereRaw ? ' AND ' : '';
  161. $whereRaw.= "`username` IN (SELECT username FROM `" . env('DB_PREFIX') . "project_users` WHERE `type`='成员' AND `projectid`=" . intval($keys['projectid']) .")";
  162. }
  163. if ($keys['nousername']) {
  164. $nousername = [];
  165. foreach (explode(",", $keys['nousername']) AS $name) {
  166. $name = trim($name);
  167. if ($name && !in_array($name, $nousername)) {
  168. $nousername[] = $name;
  169. }
  170. }
  171. if ($nousername) {
  172. $whereRaw.= $whereRaw ? ' AND ' : '';
  173. $whereRaw.= "(`username` NOT IN ('" . implode("','", $nousername) . "'))";
  174. }
  175. }
  176. if (intval($keys['noprojectid']) > 0) {
  177. $whereRaw.= $whereRaw ? ' AND ' : '';
  178. $whereRaw.= "`username` NOT IN (SELECT username FROM `" . env('DB_PREFIX') . "project_users` WHERE `type`='成员' AND `projectid`=" . intval($keys['noprojectid']) .")";
  179. }
  180. if (intval($keys['nobookid']) > 0) {
  181. $whereRaw.= $whereRaw ? ' AND ' : '';
  182. $whereRaw.= "`username` NOT IN (SELECT username FROM `" . env('DB_PREFIX') . "docs_users` WHERE `bookid`=" . intval($keys['nobookid']) .")";
  183. }
  184. //
  185. $lists = DBCache::table('users')->select(['id', 'username', 'nickname', 'userimg', 'profession'])
  186. ->where($whereArr)
  187. ->whereRaw($whereRaw)
  188. ->orderBy('id')
  189. ->cacheMinutes(now()->addSeconds(10))
  190. ->take(Base::getPaginate(100, 10, 'take'))
  191. ->get();
  192. foreach ($lists AS $key => $item) {
  193. $lists[$key]['userimg'] = Users::userimg($item['userimg']);
  194. $lists[$key]['identitys'] = explode(",", trim($item['identity'], ","));
  195. $lists[$key]['setting'] = Base::string2array($item['setting']);
  196. }
  197. return Base::retSuccess('success', $lists);
  198. }
  199. /**
  200. * 修改资料
  201. *
  202. * @apiParam {Object} [userimg] 会员头像
  203. * @apiParam {String} [nickname] 昵称
  204. * @apiParam {String} [profession] 职位/职称
  205. * @apiParam {String} [bgid] 背景编号
  206. */
  207. public function editdata()
  208. {
  209. $user = Users::authE();
  210. if (Base::isError($user)) {
  211. return $user;
  212. } else {
  213. $user = $user['data'];
  214. }
  215. //
  216. $array = [];
  217. //头像
  218. $userimg = Request::input('userimg');
  219. if ($userimg) {
  220. $userimg = is_array($userimg) ? $userimg[0]['path'] : $userimg;
  221. $array['userimg'] = Base::unFillUrl($userimg);
  222. }
  223. //昵称
  224. $nickname = trim(Request::input('nickname'));
  225. if ($nickname) {
  226. if (mb_strlen($nickname) < 2) {
  227. return Base::retError('昵称不可以少于2个字!');
  228. } elseif (mb_strlen($nickname) > 8) {
  229. return Base::retError('昵称最多只能设置8个字!');
  230. } else {
  231. $array['nickname'] = $nickname;
  232. }
  233. }
  234. //职位/职称
  235. $profession = trim(Request::input('profession'));
  236. if ($profession) {
  237. if (mb_strlen($profession) < 2) {
  238. return Base::retError('职位/职称不可以少于2个字!');
  239. } elseif (mb_strlen($profession) > 20) {
  240. return Base::retError('职位/职称最多只能设置20个字!');
  241. } else {
  242. $array['profession'] = $profession;
  243. }
  244. }
  245. //背景
  246. $bgid = intval(Request::input('bgid'));
  247. if ($bgid > 0) {
  248. $array['bgid'] = $bgid;
  249. }
  250. //
  251. if ($array) {
  252. DB::table('users')->where('id', $user['id'])->update($array);
  253. Users::AZUpdate($user['id']);
  254. } else {
  255. return Base::retError('请设置要修改的内容!');
  256. }
  257. return Base::retSuccess('修改成功!');
  258. }
  259. /**
  260. * 修改密码
  261. *
  262. * @apiParam {String} oldpass 旧密码
  263. * @apiParam {String} newpass 新密码
  264. */
  265. public function editpass()
  266. {
  267. $user = Users::authE();
  268. if (Base::isError($user)) {
  269. return $user;
  270. } else {
  271. $user = $user['data'];
  272. }
  273. //
  274. $oldpass = trim(Request::input('oldpass'));
  275. $newpass = trim(Request::input('newpass'));
  276. if (strlen($newpass) < 6) {
  277. return Base::retError('密码设置不能小于6位数!');
  278. } elseif (strlen($newpass) > 32) {
  279. return Base::retError('密码最多只能设置32位数!');
  280. }
  281. if ($oldpass == $newpass) {
  282. return Base::retError('新旧密码一致!');
  283. }
  284. //
  285. if (env("PASSWORD_ADMIN") == 'disabled') {
  286. if ($user['id'] == 1) {
  287. return Base::retError('当前环境禁止修改密码!');
  288. }
  289. }
  290. if (env("PASSWORD_OWNER") == 'disabled') {
  291. return Base::retError('当前环境禁止修改密码!');
  292. }
  293. //
  294. if ($user['setpass']) {
  295. $verify = DB::table('users')->where(['id'=>$user['id'], 'userpass'=>Base::md52($oldpass, Users::token2encrypt())])->count();
  296. if (empty($verify)) {
  297. return Base::retError('请填写正确的旧密码!');
  298. }
  299. }
  300. $encrypt = Base::generatePassword(6);
  301. DB::table('users')->where('id', $user['id'])->update([
  302. 'encrypt' => $encrypt,
  303. 'userpass' => Base::md52($newpass, $encrypt),
  304. 'changepass' => 0
  305. ]);
  306. return Base::retSuccess('修改成功');
  307. }
  308. /**
  309. * 团队列表
  310. *
  311. * @apiParam {Object} [sorts] 排序方式,格式:{key:'', order:''}
  312. * - key: username|az|id(默认)
  313. * - order: asc|desc
  314. * @apiParam {String} [username] 指定获取某个成员(返回对象)
  315. * @apiParam {Number} [page] 当前页,默认:1
  316. * @apiParam {Number} [pagesize] 每页显示数量,默认:10,最大:100
  317. */
  318. public function team__lists()
  319. {
  320. $user = Users::authE();
  321. if (Base::isError($user)) {
  322. return $user;
  323. } else {
  324. $user = $user['data'];
  325. }
  326. //
  327. $username = trim(Request::input('username'));
  328. $whereArray = [];
  329. if ($username) {
  330. $whereArray[] = ['username', '=', $username];
  331. }
  332. //
  333. $orderBy = '`id` DESC';
  334. $sorts = Base::json2array(Request::input('sorts'));
  335. if (in_array($sorts['order'], ['asc', 'desc'])) {
  336. switch ($sorts['key']) {
  337. case 'username':
  338. $orderBy = '`' . $sorts['key'] . '` ' . $sorts['order'] . ',`id` DESC';
  339. break;
  340. case 'az':
  341. $orderBy = '`' . $sorts['key'] . '` ' . $sorts['order'] . ',`username` ' . $sorts['order'] . ',`id` DESC';
  342. break;
  343. }
  344. }
  345. //
  346. $lists = DB::table('users')->where($whereArray)->select(['id', 'identity', 'username', 'nickname', 'az', 'userimg', 'profession', 'regdate'])->orderByRaw($orderBy)->paginate(Base::getPaginate(100, 10));
  347. $lists = Base::getPageList($lists);
  348. if ($lists['total'] == 0) {
  349. return Base::retError('未找到任何相关的团队成员');
  350. }
  351. foreach ($lists['lists'] AS $key => $item) {
  352. $lists['lists'][$key]['identity'] = is_array($item['identity']) ? $item['identity'] : explode(",", trim($item['identity'], ","));
  353. $lists['lists'][$key]['userimg'] = Users::userimg($item['userimg']);
  354. }
  355. if ($username) {
  356. return Base::retSuccess('success', $lists['lists'][0]);
  357. }
  358. return Base::retSuccess('success', $lists);
  359. }
  360. /**
  361. * 添加团队成员
  362. *
  363. * @apiParam {Number} [id] 用户ID(留空为添加用户)
  364. * @apiParam {String} username 用户名(修改时无效,多个用英文逗号分隔)
  365. * @apiParam {String} userpass 密码
  366. * @apiParam {Object} [userimg] 会员头像
  367. * @apiParam {String} [nickname] 昵称
  368. * @apiParam {String} [profession] 职位/职称
  369. * @apiParam {Number} changepass 登陆是否需要修改密码
  370. */
  371. public function team__add()
  372. {
  373. $user = Users::authE();
  374. if (Base::isError($user)) {
  375. return $user;
  376. } else {
  377. $user = $user['data'];
  378. }
  379. //
  380. if (Base::isError(Users::identity('admin'))) {
  381. return Base::retError('权限不足!', [], -1);
  382. }
  383. //头像
  384. $userimg = Request::input('userimg');
  385. if ($userimg) {
  386. $userimg = is_array($userimg) ? $userimg[0]['path'] : $userimg;
  387. }
  388. //昵称
  389. $nickname = trim(Request::input('nickname'));
  390. if ($nickname) {
  391. if (mb_strlen($nickname) < 2) {
  392. return Base::retError('昵称不可以少于2个字!');
  393. } elseif (mb_strlen($nickname) > 8) {
  394. return Base::retError('昵称最多只能设置8个字!');
  395. }
  396. }
  397. //职位/职称
  398. $profession = trim(Request::input('profession'));
  399. if ($profession) {
  400. if (mb_strlen($profession) < 2) {
  401. return Base::retError('职位/职称不可以少于2个字!');
  402. } elseif (mb_strlen($profession) > 20) {
  403. return Base::retError('职位/职称最多只能设置20个字!');
  404. }
  405. }
  406. //
  407. $id = intval(Request::input('id'));
  408. $userpass = trim(Request::input('userpass'));
  409. $otherArray = [
  410. 'userimg' => $userimg ?: '',
  411. 'nickname' => $nickname ?: '',
  412. 'profession' => $profession ?: '',
  413. 'changepass' => intval(Request::input('changepass')),
  414. ];
  415. if ($id > 0) {
  416. //开始修改
  417. if ($userpass) {
  418. if (strlen($userpass) < 6) {
  419. return Base::retError('密码设置不能小于6位数!');
  420. } elseif (strlen($userpass) > 32) {
  421. return Base::retError('密码最多只能设置32位数!');
  422. }
  423. $encrypt = Base::generatePassword(6);
  424. $otherArray['encrypt'] = $encrypt;
  425. $otherArray['userpass'] = Base::md52($userpass, $encrypt);
  426. }
  427. DB::table('users')->where('id', $id)->update($otherArray);
  428. Users::AZUpdate($id);
  429. return Base::retSuccess('修改成功!');
  430. } else {
  431. //开始注册
  432. if (strlen($userpass) < 6) {
  433. return Base::retError('密码设置不能小于6位数!');
  434. } elseif (strlen($userpass) > 32) {
  435. return Base::retError('密码最多只能设置32位数!');
  436. }
  437. $username = trim(Request::input('username'));
  438. $array = array_values(array_filter(array_unique(explode(",", $username))));
  439. if (empty($array)) {
  440. return Base::retError('请填写有效的用户名!');
  441. }
  442. if (count($array) > 500) {
  443. return Base::retError(['一次最多只能添加%个账号!', 500]);
  444. }
  445. foreach ($array AS $item) {
  446. $username = trim($item);
  447. if ($username) {
  448. $user = Users::reg($username, $userpass, $otherArray);
  449. if (Base::isError($user)) {
  450. return $user;
  451. }
  452. }
  453. }
  454. return Base::retSuccess('添加成功!');
  455. }
  456. }
  457. /**
  458. * 删除团队成员
  459. *
  460. * @apiParam {String} username 用户名
  461. */
  462. public function team__delete()
  463. {
  464. $user = Users::authE();
  465. if (Base::isError($user)) {
  466. return $user;
  467. } else {
  468. $user = $user['data'];
  469. }
  470. //
  471. if (Base::isError(Users::identity('admin'))) {
  472. return Base::retError('权限不足!', [], -1);
  473. }
  474. $username = trim(Request::input('username'));
  475. if ($user['username'] == $username) {
  476. return Base::retError('不能删除自己!');
  477. }
  478. //
  479. if (DB::table('users')->where('username', $username)->delete()) {
  480. return Base::retSuccess('删除成功!');
  481. } else {
  482. return Base::retError('删除失败!');
  483. }
  484. }
  485. /**
  486. * 设置、删除管理员
  487. *
  488. * @apiParam {String} act 操作
  489. * - set: 设置管理员
  490. * - del: 删除管理员
  491. * @apiParam {String} username 用户名
  492. */
  493. public function team__admin()
  494. {
  495. $user = Users::authE();
  496. if (Base::isError($user)) {
  497. return $user;
  498. } else {
  499. $user = $user['data'];
  500. }
  501. //
  502. if (Base::isError(Users::identity('admin'))) {
  503. return Base::retError('权限不足!', [], -1);
  504. }
  505. //
  506. $username = trim(Request::input('username'));
  507. if ($user['username'] == $username) {
  508. return Base::retError('不能操作自己!');
  509. }
  510. $userInfo = Base::DBC2A(DB::table('users')->where('username', $username)->first());
  511. if (empty($userInfo)) {
  512. return Base::retError('成员不存在!');
  513. }
  514. $identity = is_array($userInfo['identity']) ? $userInfo['identity'] : explode(",", trim($userInfo['identity'], ","));
  515. $isUp = false;
  516. if (trim(Request::input('act')) == 'del') {
  517. if (Users::identityRaw('admin', $identity)) {
  518. $identity = array_diff($identity, ['admin']);
  519. $isUp = true;
  520. }
  521. } else {
  522. if (!Users::identityRaw('admin', $identity)) {
  523. $identity[] = 'admin';
  524. $isUp = true;
  525. }
  526. }
  527. if ($isUp) {
  528. DB::table('users')->where('username', $username)->update([
  529. 'identity' => $identity ? (',' . implode(",", $identity) . ',') : ''
  530. ]);
  531. }
  532. return Base::retSuccess('操作成功!', [
  533. 'up' => $isUp ? 1 : 0,
  534. 'identity' => $identity
  535. ]);
  536. }
  537. /**
  538. * 设置、删除友盟token
  539. *
  540. * @apiParam {String} act 操作
  541. * - set: 设置token
  542. * - del: 删除token
  543. * @apiParam {String} token 友盟token
  544. * @apiParam {String} platform ios|android
  545. */
  546. public function umeng__token()
  547. {
  548. $act = trim(Request::input('act'));
  549. $token = trim(Request::input('token'));
  550. if (empty($token)) {
  551. return Base::retError('token empty');
  552. }
  553. $platform = strtolower(trim(Request::input('platform')));
  554. DB::table('umeng')->where('token', $token)->delete();
  555. //
  556. if ($act == 'set') {
  557. $user = Users::authE();
  558. if (Base::isError($user)) {
  559. return $user;
  560. } else {
  561. $user = $user['data'];
  562. }
  563. DB::table('umeng')->insert([
  564. 'token' => $token,
  565. 'username' => $user['username'],
  566. 'platform' => $platform,
  567. 'update' => Base::time(),
  568. ]);
  569. }
  570. //
  571. return Base::retSuccess('success');
  572. }
  573. }