MemberLogic.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. <?php
  2. /**
  3. * MemberLogic.php UTF-8
  4. *
  5. *
  6. * @date : 2018/1/23 15:25
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : linjiebin <ljb@huosdk.com>
  10. * @version : HUOSDK 8.0
  11. */
  12. namespace web\pc\logic;
  13. use huo\model\common\CommonModel;
  14. use huo\model\member\MemberModel;
  15. use huolib\constant\MemConst;
  16. use huolib\status\MemberStatus;
  17. use think\Session;
  18. use think\Validate;
  19. use think\Db;
  20. use huolib\sms\Sms;
  21. class MemberLogic extends CommonModel {
  22. private $mem_id;
  23. public function initialize($mem_id = 0) {
  24. parent::initialize();
  25. $this->mem_id = $mem_id;
  26. if (empty($this->mem_id)) {
  27. $this->mem_id = Session::get('user.id');
  28. }
  29. }
  30. /**
  31. * 获取玩家信息
  32. */
  33. public function getMemberInfo() {
  34. $id = $this->mem_id;
  35. if (empty($id)) {
  36. return [];
  37. } else {
  38. $field = 'id, username, nickname, reg_mobile ,avatar';
  39. $member = Db::name('member')
  40. ->alias('m')
  41. ->field($field)
  42. ->where('id', $id)
  43. ->find();
  44. if (empty($member['avatar'])) {
  45. $member['avatar'] = '';
  46. }
  47. return $member;
  48. }
  49. }
  50. /**
  51. * 玩家登陆
  52. *
  53. * @param $data
  54. *
  55. * @return array
  56. */
  57. public function login($data) {
  58. $validate = new Validate(
  59. [
  60. 'username' => 'require',
  61. 'password' => 'require|min:6|max:32',
  62. ]
  63. );
  64. $validate->message(
  65. [
  66. 'username.require' => '用户名不能为空',
  67. 'password.require' => '密码不能为空',
  68. 'password.max' => '密码不能超过32个字符',
  69. 'password.min' => '密码不能小于6个字符',
  70. ]
  71. );
  72. if (!$validate->check($data)) {
  73. return [
  74. 'error' => 1,
  75. 'msg' => $validate->getError()
  76. ];
  77. }
  78. if (preg_match('/(^(13\d|15[^4\D]|17[013678]|18\d)\d{8})$/', $data['username'])) {
  79. $_user['username'] = $data['username'];
  80. $_user['password'] = $data['password'];
  81. $_log = $this->loginMobile($_user);
  82. } else {
  83. $_user['username'] = $data['username'];
  84. $_user['password'] = $data['password'];
  85. $_log = $this->loginUsername($_user);
  86. }
  87. $_loginRes = $this->checkUsernameStatus($_log);
  88. if (0 == $_loginRes['error']) {
  89. Session::set('user', $_log);
  90. // 记录登陆记录
  91. $this->loginLog($_log);
  92. $_loginRes['data'] = $_log;
  93. return $_loginRes;
  94. } else {
  95. return $_loginRes;
  96. }
  97. }
  98. /**
  99. * 手机号登陆
  100. *
  101. * @param array $data
  102. *
  103. * @return array|false|\PDOStatement|string|\think\Model
  104. */
  105. public function loginMobile($data = []) {
  106. $_map['reg_mobile'] = $data['username'];
  107. $_mem_info = $this->where($_map)->find();;
  108. if (!empty($_mem_info)) {
  109. $comparePasswordResult = cmf_compare_password($data['password'], $_mem_info['password']);
  110. if ($comparePasswordResult) {
  111. session('user', $_mem_info);
  112. } else {
  113. $_mem_info = [];
  114. }
  115. }
  116. return $_mem_info;
  117. }
  118. /**
  119. * 用户名登陆
  120. *
  121. * @param $data
  122. *
  123. * @return array|false|\PDOStatement|string|\think\Model
  124. */
  125. public function loginUsername($data) {
  126. $_map['username'] = $data['username'];
  127. $_mem_info = $this->where($_map)->find();
  128. if (!empty($_mem_info)) {
  129. $comparePasswordResult = cmf_compare_password($data['password'], $_mem_info['password']);
  130. if ($comparePasswordResult) {
  131. session('user', $_mem_info);
  132. } else {
  133. $_mem_info = [];
  134. }
  135. }
  136. return $_mem_info;
  137. }
  138. /**
  139. * 判断玩家的账户状态
  140. *
  141. * @param $userinfo
  142. *
  143. * @return array
  144. */
  145. public function checkUsernameStatus($userinfo) {
  146. if (empty($userinfo)) {
  147. return array(
  148. 'error' => "1",
  149. 'msg' => '玩家的账户或密码不正确'
  150. );
  151. } else if ("3" == $userinfo['status']) {
  152. return array('error' => "1", 'msg' => '玩家的账户被冻结');
  153. } else if ("2" == $userinfo['status']) {
  154. return array('error' => "0", 'msg' => '登陆成功');
  155. }
  156. }
  157. /**
  158. * 记录登陆记录
  159. *
  160. * @param $userinfo
  161. *
  162. * @return int|string
  163. */
  164. public function loginLog($userinfo) {
  165. // $data['mem_id'] = $userinfo['id'];
  166. // $data['app_id'] = 0;
  167. // $data['create_time'] = time();
  168. // $data['from'] = 1; //1-WEB、2-WAP、3-Android、4-IOS、5-WP
  169. // $data['reg_time'] = $userinfo['create_time'];
  170. // $data['flag'] = 0;
  171. // $data['login_ip'] = request()->ip();
  172. // $res = Db::name('mem_login_log')->insertGetId($data);
  173. //
  174. // return $res;
  175. }
  176. /**
  177. * 注册
  178. *
  179. * @param array $data
  180. *
  181. * @return array
  182. */
  183. public function reg($data = []) {
  184. //获取注册设置
  185. $_option_class = new OptionLogic();
  186. $_reg_setting = $_option_class->getValue('web_member');
  187. if (isset($_reg_setting['reg_is_allowed']) && $_reg_setting['reg_is_allowed'] == 1) {//不允许注册
  188. return [
  189. 'error' => 1,
  190. 'msg' => '当前不允许注册'
  191. ];
  192. }
  193. $rules = [
  194. 'code' => 'require',
  195. 'password' => 'require|min:6|max:32',
  196. ];
  197. $validate = new Validate($rules);
  198. $validate->message(
  199. [
  200. 'code.require' => '验证码不能为空',
  201. 'password.require' => '密码不能为空',
  202. 'password.max' => '密码不能超过32个字符',
  203. 'password.min' => '密码不能小于6个字符',
  204. ]
  205. );
  206. if (!$validate->check($data)) {
  207. return [
  208. 'error' => 1,
  209. 'msg' => $validate->getError()
  210. ];
  211. }
  212. if (preg_match('/^[1][23456789][0-9]{9}$/', $data['username'])) {
  213. // $_check_res = $this->checkMobileCode($data['username'], $data['code']);
  214. $_sms_rs = (new Sms())->check($data['username'], $data['code'], 1);
  215. if ($_sms_rs['code'] != 200) {
  216. return [
  217. 'error' => '1',
  218. 'msg' => $_sms_rs['msg']
  219. ];
  220. }
  221. $_user['username'] = $data['username'];
  222. $_user['password'] = $data['password'];
  223. $_log = $this->regMobile($_user);
  224. if ($_log['error'] == 0) {
  225. session('user', $_log['data']);
  226. Session::set('mobile', null, 'sms');
  227. Session::set('smstype', null, 'sms');
  228. Session::set('smscode', null, 'sms');
  229. Session::set('expire_time', null, 'sms');
  230. $_log['data']['reg_setting'] = $_reg_setting;
  231. return $_log;
  232. } else {
  233. return $_log;
  234. }
  235. }
  236. return [
  237. 'error' => 1,
  238. 'msg' => '注册必须是手机号注册'
  239. ];
  240. }
  241. /**
  242. * 手机号注册
  243. *
  244. * @param $user
  245. *
  246. * @return array
  247. */
  248. public function regMobile($user) {
  249. $_map['username|mobile|reg_mobile'] = $user['username'];
  250. $result = (new MemberModel())->where($_map)->find();
  251. if (!empty($result)) {
  252. return [
  253. 'error' => 1,
  254. 'msg' => '该账号已经被注册过了'
  255. ];
  256. }
  257. $data = [
  258. 'username' => $user['username'],
  259. 'mobile' => $user['username'],
  260. 'nickname' => $user['username'],
  261. 'reg_mobile' => $user['username'],
  262. 'password' => cmf_password($user['password']),
  263. 'pay_pwd' => cmf_password($user['password']),
  264. 'from_device' => 'web',
  265. 'reg_ip' => get_client_ip(0, true),
  266. 'create_time' => time(),
  267. 'update_time' => time(),
  268. 'status' => MemConst::STATUS_NORMAL,
  269. ];
  270. $data['id'] = (new MemberModel())->addMem($data);
  271. // $userId = Db::name("member")->insertGetId($data);
  272. // $data = Db::name("member")->where('id', $userId)->find();
  273. // $this->loginLog($data);
  274. return [
  275. 'error' => 0,
  276. 'msg' => '注册成功',
  277. 'data' => $data
  278. ];
  279. }
  280. /**
  281. * 退出登录
  282. *
  283. * @return array
  284. */
  285. public function logout() {
  286. Session::clear(null);
  287. return array('error' => 0, 'msg' => '退出成功');
  288. }
  289. /**
  290. * 修改密码
  291. *
  292. * @param array $data
  293. *
  294. * @return array
  295. */
  296. public function editPassword($data = []) {
  297. $_mem_info = $this->where(['id' => $data['id']])->find();
  298. if (!empty($_mem_info)) {
  299. $comparePasswordResult = cmf_compare_password($data['old_password'], $_mem_info['password']);
  300. if ($comparePasswordResult) {
  301. $_data = [
  302. 'password' => cmf_password($data['new_password']),
  303. ];
  304. $_res = Db::name("member")->where(['id' => $data['id']])->update($_data);
  305. if ($_res) {
  306. return [
  307. 'error' => 0,
  308. 'msg' => '修改成功'
  309. ];
  310. }
  311. return [
  312. 'error' => 1,
  313. 'msg' => '服务器内部错误'
  314. ];
  315. } else {
  316. return [
  317. 'error' => 1,
  318. 'msg' => '原密码错误'
  319. ];
  320. }
  321. }
  322. return [
  323. 'error' => 1,
  324. 'msg' => '用户不存在'
  325. ];
  326. }
  327. /**
  328. * 实名认证
  329. *
  330. * @param array $data
  331. *
  332. * @return array
  333. */
  334. public function authRealname($data = []) {
  335. if (empty($data['truename']) || empty($data['idcard'])) {
  336. return ['error' => 1, 'msg' => '姓名/身份证为必填信息'];
  337. }
  338. $_data = [
  339. 'id' => $data['id'],
  340. 'real_name' => $data['truename'],
  341. 'id_card' => $data['idcard'],
  342. ];
  343. $_res = (new MemberModel())->update($_data);
  344. if (false === $_res) {
  345. return ['error' => 1, 'msg' => '服务器内部出错'];
  346. }
  347. return ['error' => 0, 'msg' => '实名认证成功'];
  348. }
  349. /**
  350. * 修改资料
  351. *
  352. * @param array $data
  353. *
  354. * @return array
  355. */
  356. public function editInfo($data = []) {
  357. if (empty($data['nickname'])) {
  358. return ['error' => 1, 'msg' => '昵称不能为空'];
  359. }
  360. $_data = [
  361. 'id' => $data['id'],
  362. 'nickname' => $data['nickname'],
  363. ];
  364. $_res = Db::name("member")->update($_data);
  365. if (false === $_res) {
  366. return ['error' => 1, 'msg' => '服务器内部出错'];
  367. }
  368. return ['error' => 0, 'msg' => '修改成功'];
  369. }
  370. /**
  371. * 验证手机验证码是否正确
  372. *
  373. * @param $mobile
  374. * @param $mobileCode
  375. *
  376. * @return array
  377. */
  378. public function checkMobileCode($mobile, $mobileCode) {
  379. if ($mobile != Session::get('mobile', 'sms')) {
  380. return array('error' => '1', 'msg' => '请先发送短信');
  381. }
  382. // 判断验证码是否在有效期内
  383. if (Session::get('expire_time', 'sms') < time()) {
  384. return array('error' => '1', 'msg' => '验证码已经过期');
  385. }
  386. if (Session::get('smscode', 'sms') != $mobileCode) {
  387. return array('error' => '1', 'msg' => '验证码不正确');
  388. }
  389. return array('error' => '0', 'msg' => '验证通过');
  390. }
  391. /**
  392. * 验证邮箱验证码是否正确
  393. *
  394. * @param $email
  395. * @param $mobileCode
  396. *
  397. * @return array
  398. */
  399. public function checkEmailCode($email, $mobileCode) {
  400. if ($email != Session::get('email', 'user_email')) {
  401. return array('error' => '1', 'msg' => '请输入接收验证码的邮箱');
  402. }
  403. // 判断验证码是否在有效期内
  404. if (Session::get('expire_time', 'user_email') < time()) {
  405. return array('error' => '1', 'msg' => '验证码已经过期');
  406. }
  407. if (Session::get('email_code', 'user_email') != $mobileCode) {
  408. return array('error' => '1', 'msg' => '验证码不正确');
  409. }
  410. return array('error' => '0', 'msg' => '验证通过');
  411. }
  412. /**
  413. * 用户名是否存在
  414. *
  415. * @param $username
  416. *
  417. * @return array
  418. */
  419. public function usernameIsExists($username) {
  420. $_map['username'] = $username;
  421. $_memebr_info = Db::name('member')
  422. ->where($_map)
  423. ->find();
  424. if (empty($_memebr_info)) {
  425. return ['error' => 1, 'msg' => '用户不存在'];
  426. }
  427. $_is_mobile = 0;
  428. $_is_email = 0;
  429. if (!empty($_memebr_info['reg_mobile'])) {
  430. $_is_mobile = 1;
  431. }
  432. if (!empty($_memebr_info['reg_email'])) {
  433. $_is_email = 1;
  434. }
  435. return [
  436. 'error' => 0,
  437. 'msg' => '用户名存在',
  438. 'data' => [
  439. 'is_mobile' => $_is_mobile,
  440. 'is_email' => $_is_email
  441. ]
  442. ];
  443. }
  444. /**
  445. * 发送验证码
  446. *
  447. * @param string $username
  448. * @param string $mobile
  449. * @param string $email
  450. *
  451. */
  452. public function sendCode($username = '', $mobile = '', $email = '') {
  453. if (empty($username) || (empty($mobile) && empty($email))) {
  454. return ['code' => 400, 'msg' => '请输入找回方式'];
  455. }
  456. $_map['username'] = $username;
  457. $_memebr_info = Db::name('member')
  458. ->where($_map)
  459. ->find();
  460. if (!empty($mobile) && $_memebr_info['reg_mobile'] == $mobile) {
  461. $_sms_controller = new \huolib\sms\Sms();
  462. $_rdata = $_sms_controller->send($mobile, 3);
  463. } elseif (!empty($email) && $_memebr_info['reg_email'] == $email) {
  464. $_sms_controller = new \huo\controller\email\Email();
  465. $_rdata = $_sms_controller->send($email, $email);
  466. } else {
  467. $_rdata['code'] = 404;
  468. $_rdata['msg'] = '输入正确的绑定密保方式';
  469. }
  470. return $_rdata;
  471. }
  472. /**
  473. * 校验验证码
  474. *
  475. * @param string $mobile
  476. * @param string $email
  477. * @param string $code
  478. *
  479. * @return array
  480. */
  481. public function checkCode($mobile = '', $email = '', $code = '') {
  482. if ((empty($mobile) && empty($email)) || empty($code)) {
  483. return ['error' => 1, 'msg' => '请提交完整的参数'];
  484. }
  485. if (!empty($mobile)) {
  486. $_sms_rs = (new Sms())->check($mobile, $code, 4);
  487. if ($_sms_rs['code'] != MemberStatus::NO_ERROR) {
  488. $_rdata = [
  489. 'error' => '1',
  490. 'msg' => $_sms_rs['msg']
  491. ];
  492. }else{
  493. $_rdata = array('error' => '0', 'msg' => '验证通过');
  494. }
  495. // $_rdata = $this->checkMobileCode($mobile, $code);
  496. } else {
  497. $_rdata = $this->checkEmailCode($email, $code);
  498. }
  499. return $_rdata;
  500. }
  501. /**
  502. * 修改密码
  503. *
  504. * @param string $mobile
  505. * @param string $email
  506. * @param string $password
  507. * @param string $code
  508. *
  509. * @return array
  510. */
  511. public function setPassword($mobile = '', $email = '', $password = '', $code = '') {
  512. if ((empty($mobile) && empty($email)) || empty($password)) {
  513. return ['error' => 1, 'msg' => '请提交完整的参数'];
  514. }
  515. if (!empty($mobile)) {
  516. $_sms_rs = (new Sms())->check($mobile, $code, 1);
  517. if ($_sms_rs['code'] != MemberStatus::NO_ERROR) {
  518. $_r = [
  519. 'error' => '1',
  520. 'msg' => $_sms_rs['msg']
  521. ];
  522. }else{
  523. $_r = [
  524. 'error' => 0,
  525. 'msg' => $_sms_rs['msg']
  526. ];
  527. }
  528. // $_r = $this->checkMobileCode($mobile, $code);
  529. $_map['reg_mobile'] = $mobile;
  530. } else {
  531. $_r = $this->checkEmailCode($email, $code);
  532. $_map['reg_email'] = $email;
  533. }
  534. if ($_r['error'] > 0) {
  535. return $_r;
  536. }
  537. $_member_info = Db::name('member')->where($_map)->find();
  538. if (empty($_member_info)) {
  539. return ['error' => 1, 'msg' => '用户不存在'];
  540. }
  541. $_data['password'] = cmf_password($password);
  542. $_data['update_time'] = time();
  543. if ($_data['password'] == $_member_info['password']) {
  544. return ['error' => 1, 'msg' => '新密码不能与旧密码相同'];
  545. }
  546. $_res = Db::name('member')->where($_map)->update($_data);
  547. if (!$_res) {
  548. return ['error' => 1, 'msg' => '内部错误'];
  549. }
  550. //清空session
  551. if (!empty($mobile)) {
  552. Session::set('mobile', null, 'sms');
  553. Session::set('smstype', null, 'sms');
  554. Session::set('smscode', null, 'sms');
  555. Session::set('expire_time', null, 'sms');
  556. } else {
  557. Session::set('email', null, 'user_email');
  558. Session::set('email_code', null, 'user_email');
  559. Session::set('type', null, 'user_email');
  560. Session::set('email_time', null, 'user_email');
  561. }
  562. return ['error' => 0, 'msg' => '修改成功'];
  563. }
  564. /**
  565. * 修改手机号
  566. *
  567. * @param $mobile
  568. * @param $code
  569. *
  570. * @return array
  571. */
  572. public function editMobile($mobile, $code) {
  573. if (empty($mobile) || empty($code)) {
  574. return ['error' => 1, 'msg' => '手机/验证码为必填项'];
  575. }
  576. // $_r = $this->checkMobileCode($mobile, $code);
  577. $_sms_rs = (new Sms())->check($mobile, $code, 1);
  578. if ($_sms_rs['code'] != MemberStatus::NO_ERROR) {
  579. return [
  580. 'error' => '1',
  581. 'msg' => $_sms_rs['msg']
  582. ];
  583. }
  584. $_is_reg = Db::name('member')->where(['reg_mobile' => $mobile])->count();
  585. if ($_is_reg > 0) {
  586. return ['error' => 1, 'msg' => '该手机已绑定其他账号'];
  587. }
  588. $_map['id'] = $this->mem_id;
  589. $_data['reg_mobile'] = $mobile;
  590. $_data['update_time'] = time();
  591. // $_res = Db::name('member')->where($_map)->update($_data);
  592. $_res = MemberModel::update($_data, $_map, true);
  593. if (!$_res) {
  594. return ['error' => 1, 'msg' => '不能与原手机一致'];
  595. }
  596. return ['error' => 0, 'msg' => '修改成功'];
  597. }
  598. }