UsersController.php 20 KB

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