LoginController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <?php
  2. namespace app\controller;
  3. use app\business\LoginBusiness;
  4. use app\business\SmsBusiness;
  5. use app\business\StreamBusiness;
  6. use Illuminate\Support\Arr;
  7. use Respect\Validation\Validator;
  8. use support\Db;
  9. use support\Redis;
  10. use support\Request;
  11. use hg\apidoc\annotation as Apidoc;
  12. use Webman\Captcha\CaptchaBuilder;
  13. use Webman\Captcha\PhraseBuilder;
  14. #[Apidoc\Title("登陆注册")]
  15. #[Apidoc\Group("Login")]
  16. #[Apidoc\Sort(1)]
  17. class LoginController
  18. {
  19. #[Apidoc\Title("登录")]
  20. #[Apidoc\Url("api/login/login.html")]
  21. #[Apidoc\Method("POST")]
  22. #[Apidoc\Param("mobile", type: "int", require: true, desc: "账号/手机号", mock: 16500000000)]
  23. #[Apidoc\Param("app", type: "int", require: true, desc: "是否为APP", mock: '')]
  24. #[Apidoc\Param("password", type: "string", require: true, desc: "密码(6-16字母加数字)位密码", mock: 123456)]
  25. #[Apidoc\Param("code", type: "int", require: true, desc: "验证码")]
  26. #[Apidoc\Param("key", type: "string", require: true, desc: "验证码的key")]
  27. public function login(Request $request)
  28. {
  29. $param = $request->param_data;
  30. Db::beginTransaction();
  31. try {
  32. $param = Arr::only($param, ['mobile', 'password', 'app', 'code', 'key']);
  33. Validator::input($param, [
  34. 'mobile' => Validator::notEmpty()->intType()->setName('手机号'),
  35. 'password' => Validator::notEmpty()->stringType()->Length(6, 15)->alnum()->setName('密码'),
  36. // 'code' => Validator::notEmpty()->intType()->setName('验证码'),
  37. // 'key' => Validator::notEmpty()->stringType()->setName('验证码标识'),
  38. ]);
  39. /* if(empty(preg_match('/^1[3-9]\d{9}$/', $param['mobile']))){
  40. throw new \Exception('请输入正确的手机号');
  41. }*/
  42. // if (strtolower($param['code']) != Redis::get($param['key'])) {
  43. // throw new \Exception('验证码错误!');
  44. // }
  45. $param['last_ip'] = $request->getRealIp($safe_mode = true);
  46. $token = LoginBusiness::login($param);
  47. Redis::del($param['key']);
  48. } catch (\Throwable $exception) {
  49. Db::rollBack();
  50. return error($exception->getMessage());
  51. }
  52. Db::commit();
  53. return success([
  54. 'token' => $token
  55. ]);
  56. }
  57. #[Apidoc\Title("注册")]
  58. #[Apidoc\Url("api/login/register.html")]
  59. #[Apidoc\Method("POST")]
  60. // #[Apidoc\Header("token",type: "string",require: true,desc: "身份令牌Token",mock: "@token")]
  61. #[Apidoc\Param("mobile", type: "int", require: true, desc: "账号/手机号", mock: 15800000000)]
  62. #[Apidoc\Param("password", type: "string", require: true, desc: "密码(6-16字母加数字)位密码", mock: 123456)]
  63. #[Apidoc\Param("confirm_password", type: "string", require: true, desc: "确认密码(6-16字母加数字)位密码", mock: 123456)]
  64. #[Apidoc\Param("invitation_code", type: "int", require: true, desc: "邀请码", mock: 100001)]
  65. #[Apidoc\Param("code", type: "int", require: true, desc: "验证码")]
  66. #[Apidoc\Param("key", type: "string", require: true, desc: "验证码的key")]
  67. public function register(Request $request)
  68. {
  69. $param = $request->param_data;
  70. Db::beginTransaction();
  71. try {
  72. $param = Arr::only($param, ['mobile', 'password', 'confirm_password', 'invitation_code', 'code', 'key']);
  73. Validator::input($param, [
  74. 'mobile' => Validator::notEmpty()->intType()->setName('手机号'),
  75. 'password' => Validator::notEmpty()->stringType()->Length(6, 15)->alnum()->setName('密码'),
  76. 'confirm_password' => Validator::notEmpty()->stringType()->Length(6, 15)->alnum()->setName('确认密码'),
  77. 'invitation_code' => Validator::notEmpty()->intType()->setName('邀请码'),
  78. 'code' => Validator::notEmpty()->intType()->setName('验证码'),
  79. 'key' => Validator::notEmpty()->stringType()->setName('验证码标识'),
  80. ]);
  81. /* if(empty(preg_match('/^1[3-9]\d{9}$/', $param['mobile']))){
  82. throw new \Exception('请输入正确的手机号');
  83. }
  84. */
  85. if (strtolower($param['code']) != Redis::get($param['key'])) {
  86. throw new \Exception('验证码错误!');
  87. }
  88. Redis::del($param['key']);
  89. if ($param['password'] != $param['confirm_password']) {
  90. throw new \Exception('两次密码不一致!');
  91. }
  92. $param['last_ip'] = $request->getRealIp($safe_mode = true);
  93. $param['join_ip'] = $param['last_ip'];
  94. $token = LoginBusiness::register($param);
  95. } catch (\Throwable $exception) {
  96. Db::rollBack();
  97. return error($exception->getMessage());
  98. }
  99. Db::commit();
  100. return success([
  101. 'token' => $token
  102. ]);
  103. }
  104. // #[Apidoc\Title("注册领取")]
  105. // #[Apidoc\Url("api/login/register_receive.html")]
  106. // #[Apidoc\Method("POST")]
  107. // #[Apidoc\Header("token", type: "string", require: true, desc: "身份令牌Token", mock: "@token")]
  108. // public function register_receive(Request $request)
  109. // {
  110. // $param = $request->all();
  111. // Db::beginTransaction();
  112. // try {
  113. // $user = Db::table('wa_users')->where('id', $request->user_data['id'])->first();
  114. // $system = Db::table('wa_system')->first();
  115. // /** @var $has 查是否已经领取 */
  116. // $has = Db::table('wa_stream')
  117. // ->where('user_id', $request->user_data['id'])
  118. // ->where('type', streamType1)
  119. // ->where('mold', moldType5)
  120. // ->exists();
  121. // if (!empty($has)) {
  122. // throw new \Exception('已经领取该奖励了,不能重复领取!');
  123. // }
  124. //
  125. // /** 注册赠送 */
  126. // if (!empty($system) && !empty($user) && !empty($system->register_award)) {//注册赠送
  127. // StreamBusiness::addStream($request->user_data['id'], $system->register_award, streamType1, moldType5, moldTypefild5);
  128. // }
  129. // } catch (\Throwable $exception) {
  130. // Db::rollBack();
  131. // return error($exception->getMessage());
  132. // }
  133. // Db::commit();
  134. // return success([], '领取成功');
  135. // }
  136. #[Apidoc\Title("验证码")]
  137. #[Apidoc\Url("api/login/authccode.html")]
  138. #[Apidoc\Method("POST")]
  139. // #[Apidoc\Header("token",type: "string",require: true,desc: "身份令牌Token",mock: "@token")]
  140. #[Apidoc\Returned(name: "img", type: "blob", require: true, desc: '图形验证码', default: 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD//gA7')]
  141. #[Apidoc\Returned(name: "key", type: "string", require: true, desc: '验证码KEY', default: 'authccode172036979253337')]
  142. public function authccode()
  143. {
  144. $phraseBuilder = new PhraseBuilder(4, '123456789');
  145. $builder = new CaptchaBuilder(null, $phraseBuilder);
  146. // 生成验证码
  147. $builder->build(100, 29);
  148. $key = 'authccode' . time() . mt_rand(10000, 99999);
  149. Redis::setEx($key, 600, strtolower($builder->getPhrase()));
  150. $img_content = $builder->inline();
  151. return success(['img' => $img_content, 'key' => $key]);
  152. }
  153. #[Apidoc\Title("邀请规则")]
  154. #[Apidoc\Url("api/login/invite.html")]
  155. #[Apidoc\Method("POST")]
  156. #[Apidoc\Header("token", type: "string", require: true, desc: "身份令牌Token", mock: "@token")]
  157. #[Apidoc\Returned(name: "invite", type: "array", desc: '活动规则', default: '', children: [
  158. ['name' => "id", 'type' => 'int', 'require' => true, 'default' => 1, 'desc' => '规则ID'],
  159. ['name' => "num", 'type' => 'int', 'require' => true, 'default' => 1, 'desc' => '邀请人'],
  160. ['name' => "money", 'type' => 'int', 'require' => true, 'default' => 38, 'desc' => '农业补贴金'],
  161. ['name' => "complete", 'type' => 'int', 'require' => true, 'default' => 0, 'desc' => '完成人数'],
  162. ['name' => "has", 'type' => 'int', 'require' => true, 'default' => false, 'desc' => '是否领奖 true 已领奖 false 未领奖'],
  163. ])]
  164. #[Apidoc\Returned(name: "uuid", type: "string", require: true, desc: '邀请码', default: '10001')]
  165. #[Apidoc\Returned(name: "is_num", type: "string", require: true, desc: '累计邀请人数', default: '10001')]
  166. #[Apidoc\Returned(name: "invitation_award", type: "int", require: true, desc: '邀请奖励', default: 'trun')]
  167. public function invite(Request $request)
  168. {
  169. $invite = Db::table('wa_invite')->where('status', 1)
  170. ->select(['id', 'num', 'money', 'money_two', 'money_one'])
  171. ->orderBy('sort')->get()->toArray();
  172. foreach ($invite as $k => $v) {
  173. $invite[$k]->complete = $request->user_data['is_num'];
  174. $invite[$k]->has = Db::table('wa_stream')
  175. ->where('user_id', $request->user_data['id'])
  176. ->where('type', streamType3)
  177. ->where('source_id', $v->id)->exists();
  178. }
  179. $system = Db::table('wa_system')->first();
  180. return success([
  181. 'invite' => $invite,
  182. 'uuid' => $request->user_data['uuid'],
  183. 'is_num' => $request->user_data['is_num'],
  184. 'invitation_award' => $system->invitation_award,
  185. ]);
  186. }
  187. #[Apidoc\Title("邀请领奖")]
  188. #[Apidoc\Url("api/login/invite_receive.html")]
  189. #[Apidoc\Method("POST")]
  190. #[Apidoc\Header("token", type: "string", require: true, desc: "身份令牌Token", mock: "@token")]
  191. #[Apidoc\Param("id", type: "int", require: true, desc: '邀请规则ID', mock: 1)]
  192. public function invite_receive(Request $request)
  193. {
  194. $param = $request->param_data;
  195. Db::beginTransaction();
  196. try {
  197. $param = Arr::only($param, ['id']);
  198. Validator::input($param, [
  199. 'id' => Validator::notEmpty()->intType()->setName('标识'),
  200. ]);
  201. $inviteData = Db::table('wa_invite')->where('id', $param['id'])->first();
  202. if (empty($inviteData)) {
  203. throw new \Exception('非法操作');
  204. }
  205. if ($request->user_data['is_num'] < $inviteData->num) {
  206. throw new \Exception('未达到,邀请规则!');
  207. }
  208. $has = Db::table('wa_stream')
  209. ->where('user_id', $request->user_data['id'])
  210. ->where('type', streamType3)
  211. ->where('source_id', $param['id'])
  212. ->exists();
  213. if (!empty($has)) {
  214. throw new \Exception('已领取过奖励!');
  215. }
  216. if (!empty($inviteData->money)) {
  217. //农业补贴金
  218. StreamBusiness::addStream($request->user_data['id'], $inviteData->money, streamType3, moldType3, moldTypefild3, $inviteData->id);
  219. }
  220. if (!empty($inviteData->money_one)) {
  221. //中国粮仓支票
  222. StreamBusiness::addStream($request->user_data['id'], $inviteData->money_one, streamType3, moldType2, moldTypefild2, $inviteData->id);
  223. }
  224. } catch (\Throwable $exception) {
  225. Db::rollBack();
  226. return error($exception->getMessage());
  227. }
  228. Db::commit();
  229. return success([], '领取成功');
  230. }
  231. #[Apidoc\Title("判断当前用户是否存在是否实名")]
  232. #[Apidoc\Url("api/login/sign_in.html")]
  233. #[Apidoc\Method("POST")]
  234. #[Apidoc\Param("mobile", type: "int", require: true, desc: "账号/手机号", mock: 15800000000)]
  235. #[Apidoc\Returned(name: "is_sign_in", type: "int", require: true, desc: '是否实名 1=未实名,2=实名', default: '1')]
  236. public function signIn(Request $request)
  237. {
  238. $param = $request->param_data;
  239. Db::beginTransaction();
  240. try {
  241. $param = Arr::only($param, ['mobile']);
  242. Validator::input($param, [
  243. 'mobile' => Validator::notEmpty()->intType()->setName('手机号'),
  244. ]);
  245. $userlist = Db::table('wa_users')->where('mobile', $param['mobile'])->first();
  246. if (!$userlist) {
  247. throw new \Exception('请输入正确手机号!');
  248. }
  249. $is_sign_in = 1;
  250. if ($userlist->is_autonym == 1) {
  251. $is_sign_in = 2;
  252. }
  253. $data = ['is_sign_in' => $is_sign_in];
  254. } catch (\Throwable $exception) {
  255. Db::rollBack();
  256. return error($exception->getMessage());
  257. }
  258. Db::commit();
  259. return success($data, '请求成功');
  260. }
  261. #[Apidoc\Title("未登陆修改密码")]
  262. #[Apidoc\Url("api/login/passsave.html")]
  263. #[Apidoc\Method("POST")]
  264. #[Apidoc\Param("mobile", type: "int", require: true, desc: "手机号", mock: 15800000000)]
  265. #[Apidoc\Param("number", type: "string", require: true, desc: "身份证", mock: 1123)]
  266. #[Apidoc\Param("password", type: "int", require: true, desc: "密码", mock: 123456)]
  267. public function passsave(Request $request)
  268. {
  269. $param = $request->param_data;
  270. Db::beginTransaction();
  271. try {
  272. Validator::input($param, [
  273. 'mobile' => Validator::notEmpty()->intType()->setName('手机号'),
  274. 'password' => Validator::notEmpty()->setName('密码'),
  275. ]);
  276. $userlist = Db::table('wa_users')->where('mobile', $param['mobile'])->first();
  277. if (!$userlist) {
  278. throw new \Exception('请输入正确手机号!');
  279. }
  280. if ($userlist->is_autonym == 1) {
  281. if (empty($param['number'])) {
  282. throw new \Exception('请输入身份证号码!');
  283. }
  284. $identity = Db::table('wa_user_identity')->where('uid', $userlist->id)->where('number', $param['number'])->first();
  285. if (!$identity) {
  286. throw new \Exception('输入的身份证号码和实名信息不一致!');
  287. }
  288. }
  289. Db::table('wa_users')->where('id', $userlist->id)->update(['password' => md5($param['password'])]);
  290. } catch (\Throwable $exception) {
  291. Db::rollBack();
  292. return error($exception->getMessage());
  293. }
  294. Db::commit();
  295. return success([], '修改成功');
  296. }
  297. }