PageRenderTime 121ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/Application/User/Model/UcenterMemberModel.class.php

https://gitlab.com/xuebutayan/yshop
PHP | 267 lines | 147 code | 25 blank | 95 comment | 22 complexity | 6c1052430460efe6a89746feabc12f9e MD5 | raw file
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | OneThink [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
  8. // +----------------------------------------------------------------------
  9. namespace User\Model;
  10. use Think\Model;
  11. /**
  12. * 会员模型
  13. */
  14. class UcenterMemberModel extends Model{
  15. /**
  16. * 数据表前缀
  17. * @var string
  18. */
  19. protected $tablePrefix = UC_TABLE_PREFIX;
  20. /**
  21. * 数据库连接
  22. * @var string
  23. */
  24. protected $connection = UC_DB_DSN;
  25. /* 用户模型自动验证 */
  26. protected $_validate = array(
  27. /* 验证用户名 */
  28. array('username', '1,20', -1, self::EXISTS_VALIDATE, 'length'), //用户名长度不合法
  29. array('username', 'checkDenyMember', -2, self::EXISTS_VALIDATE, 'callback'), //用户名禁止注册
  30. array('username', '', -3, self::EXISTS_VALIDATE, 'unique'), //用户名被占用
  31. /* 验证密码 */
  32. array('password', '6,30', -4, self::EXISTS_VALIDATE, 'length'), //密码长度不合法
  33. /* 验证邮箱 */
  34. array('email', 'email', -5, self::EXISTS_VALIDATE), //邮箱格式不正确
  35. array('email', '1,32', -6, self::EXISTS_VALIDATE, 'length'), //邮箱长度不合法
  36. array('email', 'checkDenyEmail', -7, self::EXISTS_VALIDATE, 'callback'), //邮箱禁止注册
  37. array('email', '', -8, self::EXISTS_VALIDATE, 'unique'), //邮箱被占用
  38. /* 验证手机号码 */
  39. array('mobile', '/^1[34578]{1}\d{9}$/', -9, self::EXISTS_VALIDATE,'regex'), //手机格式不正确 TODO:
  40. array('mobile', 'checkDenyMobile', -10, self::EXISTS_VALIDATE, 'callback'), //手机禁止注册
  41. array('mobile', '', -11, self::EXISTS_VALIDATE, 'unique'), //手机号被占用
  42. );
  43. /* 用户模型自动完成 */
  44. protected $_auto = array(
  45. array('password', 'think_ucenter_md5', self::MODEL_BOTH, 'function', UC_AUTH_KEY),
  46. array('reg_time', NOW_TIME, self::MODEL_INSERT),
  47. array('reg_ip', 'get_client_ip', self::MODEL_INSERT, 'function', 1),
  48. array('face', NOW_TIME, self::MODEL_INSERT),
  49. array('update_time', NOW_TIME),
  50. array('status', 'getStatus', self::MODEL_BOTH, 'callback'),
  51. );
  52. /**
  53. * 检测用户名是不是被禁止注册
  54. * @param string $username 用户名
  55. * @return boolean ture - 未禁用,false - 禁止注册
  56. */
  57. protected function checkDenyMember($username){
  58. return true; //TODO: 暂不限制,下一个版本完善
  59. }
  60. /**
  61. * 检测邮箱是不是被禁止注册
  62. * @param string $email 邮箱
  63. * @return boolean ture - 未禁用,false - 禁止注册
  64. */
  65. protected function checkDenyEmail($email){
  66. return true; //TODO: 暂不限制,下一个版本完善
  67. }
  68. /**
  69. * 检测手机是不是被禁止注册
  70. * @param string $mobile 手机
  71. * @return boolean ture - 未禁用,false - 禁止注册
  72. */
  73. protected function checkDenyMobile($mobile){
  74. return true; //TODO: 暂不限制,下一个版本完善
  75. }
  76. /**
  77. * 根据配置指定用户状态
  78. * @return integer 用户状态
  79. */
  80. protected function getStatus(){
  81. return true; //TODO: 暂不限制,下一个版本完善
  82. }
  83. /**
  84. * 注册一个新用户
  85. * @param string $username 用户名
  86. * @param string $password 用户密码
  87. * @param string $email 用户邮箱
  88. * @param string $mobile 用户手机号码
  89. * @return integer 注册成功-用户信息,注册失败-错误编号
  90. */
  91. public function register($username, $password, $email, $mobile){
  92. $data = array(
  93. 'username' => $username,
  94. 'password' => $password,
  95. 'email' => $email,
  96. 'mobile' => $mobile,
  97. );
  98. //验证手机
  99. if(empty($data['mobile'])) unset($data['mobile']);
  100. /* 添加用户 */
  101. if($this->create($data)){
  102. $uid = $this->add();
  103. return $uid ? $uid : 0; //0-未知错误,大于0-注册成功
  104. } else {
  105. return $this->getError(); //错误详情见自动验证注释
  106. }
  107. }
  108. /**
  109. * 用户登录认证
  110. * @param string $username 用户名
  111. * @param string $password 用户密码
  112. * @param integer $type 用户名类型 (1-用户名,2-邮箱,3-手机,4-UID)
  113. * @return integer 登录成功-用户ID,登录失败-错误编号
  114. */
  115. public function login($username, $password, $type = 1){
  116. $map = array();
  117. switch ($type) {
  118. case 1:
  119. $map['username'] = $username;
  120. break;
  121. case 2:
  122. $map['email'] = $username;
  123. break;
  124. case 3:
  125. $map['mobile'] = $username;
  126. break;
  127. case 4:
  128. $map['id'] = $username;
  129. break;
  130. default:
  131. return 0; //参数错误
  132. }
  133. /* 获取用户数据 */
  134. $user = $this->where($map)->find();
  135. if(is_array($user) && $user['status']){
  136. /* 验证用户密码 */
  137. if(think_ucenter_md5($password, UC_AUTH_KEY) === $user['password']){
  138. $this->updateLogin($user['id']); //更新用户登录信息
  139. return $user['id']; //登录成功,返回用户ID
  140. } else {
  141. return -2; //密码错误
  142. }
  143. } else {
  144. return -1; //用户不存在或被禁用
  145. }
  146. }
  147. /**
  148. * 获取用户信息
  149. * @param string $uid 用户ID或用户名
  150. * @param boolean $is_username 是否使用用户名查询
  151. * @return array 用户信息
  152. */
  153. public function info($uid, $is_username = false){
  154. $map = array();
  155. if($is_username){ //通过用户名获取
  156. $map['username'] = $uid;
  157. } else {
  158. $map['id'] = $uid;
  159. }
  160. $user = $this->where($map)->field('id,username,email,mobile,status')->find();
  161. if(is_array($user) && $user['status'] == 1){
  162. return array($user['id'], $user['username'], $user['email'], $user['mobile']);
  163. } else {
  164. return -1; //用户不存在或被禁用
  165. }
  166. }
  167. /**
  168. * 检测用户信息
  169. * @param string $field 用户名
  170. * @param integer $type 用户名类型 1-用户名,2-用户邮箱,3-用户电话
  171. * @return integer 错误编号
  172. */
  173. public function checkField($field, $type = 1){
  174. $data = array();
  175. switch ($type) {
  176. case 1:
  177. $data['username'] = $field;
  178. break;
  179. case 2:
  180. $data['email'] = $field;
  181. break;
  182. case 3:
  183. $data['mobile'] = $field;
  184. break;
  185. default:
  186. return 0; //参数错误
  187. }
  188. return $this->create($data) ? 1 : $this->getError();
  189. }
  190. /**
  191. * 更新用户登录信息
  192. * @param integer $uid 用户ID
  193. */
  194. protected function updateLogin($uid){
  195. $data = array(
  196. 'id' => $uid,
  197. 'last_login_time' => NOW_TIME,
  198. 'last_login_ip' => get_client_ip(1),
  199. );
  200. $this->save($data);
  201. }
  202. /**
  203. * 更新用户信息
  204. * @param int $uid 用户id
  205. * @param string $password 密码,用来验证
  206. * @param array $data 修改的字段数组
  207. * @return true 修改成功,false 修改失败
  208. * @author huajie <banhuajie@163.com>
  209. */
  210. public function updateUserFields($uid, $password, $data){
  211. if(empty($uid) || empty($password) || empty($data)){
  212. $this->error = '参数错误!';
  213. return false;
  214. }
  215. //更新前检查用户密码
  216. if(!$this->verifyUser($uid, $password)){
  217. $this->error = '验证出错:密码不正确!';
  218. return false;
  219. }
  220. //更新用户信息
  221. $data = $this->create($data);
  222. if($data){
  223. $data['face'] = $this->where(array('id'=>$uid))->getField('face');
  224. return $this->where(array('id'=>$uid))->save($data);
  225. }
  226. return false;
  227. }
  228. /**
  229. * 验证用户密码
  230. * @param int $uid 用户id
  231. * @param string $password_in 密码
  232. * @return true 验证成功,false 验证失败
  233. * @author huajie <banhuajie@163.com>
  234. */
  235. protected function verifyUser($uid, $password_in){
  236. $password = $this->getFieldById($uid, 'password');
  237. if(think_ucenter_md5($password_in, UC_AUTH_KEY) === $password){
  238. return true;
  239. }
  240. return false;
  241. }
  242. }