UserModel.class.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <?php
  2. namespace Admin\Model;
  3. use Common\Model\ModelModel;
  4. /**
  5. * 用户模型
  6. *
  7. */
  8. class UserModel extends ModelModel
  9. {
  10. /**
  11. * 数据库表名
  12. *
  13. */
  14. protected $tableName = 'admin_user';
  15. /**
  16. * 自动验证规则
  17. *
  18. */
  19. protected $_validate = array(
  20. //验证供应商编码
  21. array('printer_code', 'require', '供应商编码不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
  22. array('printer_code', '11', '供应商编码为11位', self::MUST_VALIDATE, 'length', self::MODEL_BOTH),
  23. array('printer_code', '', '供应商编码已存在', self::MUST_VALIDATE, 'unique', self::MODEL_BOTH),
  24. //验证邮政编码
  25. array('postcode', 'require', '邮编不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
  26. //array('postcode', '', '邮编已经存在', self::MUST_VALIDATE, 'unique', self::MODEL_BOTH),
  27. array('postcode', '6', '邮编长度为六位', self::MUST_VALIDATE, 'length', self::MODEL_BOTH),
  28. //验证供应商地址
  29. array('company_address', 'require', '供应商地址不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
  30. //验证用户名
  31. array('username', 'require', '用户名不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
  32. array('username', '3,32', '用户名长度为1-32个字符', self::MUST_VALIDATE, 'length', self::MODEL_BOTH),
  33. array('username', '', '用户名被占用', self::MUST_VALIDATE, 'unique', self::MODEL_BOTH),
  34. array('username', '/^(?!_)(?!\d)(?!.*?_$)[\w]+$/', '用户名只可含有数字、字母、下划线且不以下划线开头结尾,不以数字开头!', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
  35. //验证密码
  36. array('password', 'require', '密码不能为空', self::EXISTS_VALIDATE, 'regex', self::MODEL_UPDATE),
  37. array('password', '6,30', '密码长度为6-30位', self::EXISTS_VALIDATE, 'length', self::MODEL_UPDATE),
  38. array('password', '/(?!^(\d+|[a-zA-Z]+|[~!@#$%^&*()_+{}:"<>?\-=[\];\',.\/]+)$)^[\w~!@#$%^&*()_+{}:"<>?\-=[\];\',.\/]+$/', '密码至少由数字、字符、特殊字符三种中的两种组成', self::EXISTS_VALIDATE, 'regex', self::MODEL_UPDATE),
  39. array('repassword', 'password', '两次输入的密码不一致', self::EXISTS_VALIDATE, 'confirm', self::MODEL_UPDATE),
  40. //验证邮箱
  41. array('email', 'email', '邮箱格式不正确', self::EXISTS_VALIDATE, 'regex', self::MODEL_BOTH),
  42. array('email', '1,32', '邮箱长度为1-32个字符', self::EXISTS_VALIDATE, 'length', self::MODEL_BOTH),
  43. array('email', '', '邮箱被占用', self::EXISTS_VALIDATE, 'unique', self::MODEL_BOTH),
  44. //验证手机号码
  45. array('mobile', '/^1\d{10}$/', '手机号码格式不正确', self::EXISTS_VALIDATE, 'regex', self::MODEL_BOTH),
  46. array('mobile', '', '手机号被占用', self::EXISTS_VALIDATE, 'unique', self::MODEL_BOTH),
  47. // 验证注册来源
  48. array('reg_type', 'require', '注册来源不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_INSERT),
  49. );
  50. /**
  51. * 自动完成规则
  52. *
  53. */
  54. protected $_auto = array(
  55. array('score', '0', self::MODEL_INSERT),
  56. array('money', '0', self::MODEL_INSERT),
  57. array('reg_ip', 'get_client_ip', self::MODEL_INSERT, 'function', 1),
  58. array('password', 'user_md5', self::MODEL_BOTH, 'function'),
  59. array('create_time', 'time', self::MODEL_INSERT, 'function'),
  60. array('update_time', 'time', self::MODEL_BOTH, 'function'),
  61. array('status', '1', self::MODEL_INSERT),
  62. );
  63. /**
  64. * 查找后置操作
  65. *
  66. */
  67. protected function _after_find(&$result, $options)
  68. {
  69. $result['avatar_url'] = get_cover($result['avatar'], 'avatar');
  70. $result['label'] = $result['nickname'] . '(' . $result['id'];
  71. if ($result['email']) {
  72. $result['label'] = $result['label'] . '-' . $result['email'];
  73. }
  74. $result['label'] = $result['label'] . ')';
  75. }
  76. /**
  77. * 查找后置操作
  78. *
  79. */
  80. protected function _after_select(&$result, $options)
  81. {
  82. foreach ($result as &$record) {
  83. $this->_after_find($record, $options);
  84. }
  85. }
  86. /**
  87. * 根据用户ID获取用户信息
  88. * @param integer $id 用户ID
  89. * @param string $field
  90. * @return array 用户信息
  91. *
  92. */
  93. public function getUserInfo($id = null, $field = null)
  94. {
  95. if (!$id) {
  96. return false;
  97. }
  98. if (D('Admin/Module')->where('name="User" and status="1"')->count()) {
  99. $user_info = D('User/User')->detail($id);
  100. } else {
  101. $user_info = $this->find($id);
  102. }
  103. unset($user_info['password']);
  104. if (!$field) {
  105. return $user_info;
  106. }
  107. if ($user_info[$field]) {
  108. return $user_info[$field];
  109. } else {
  110. return false;
  111. }
  112. }
  113. /**
  114. * 用户登录
  115. *
  116. */
  117. public function login($username, $password, $map = null)
  118. {
  119. //去除前后空格
  120. $username = trim($username);
  121. //匹配登录方式
  122. if (preg_match("/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/", $username)) {
  123. $map['email'] = array('eq', $username); // 邮箱登陆
  124. } elseif (preg_match("/^1\d{10}$/", $username)) {
  125. $map['mobile'] = array('eq', $username); // 手机号登陆
  126. } else {
  127. $map['username'] = array('eq', $username); // 用户名登陆
  128. }
  129. $map['status'] = array('eq', 1);
  130. $user_info = $this->where($map)->find(); //查找用户
  131. if (!$user_info) {
  132. $this->error = '用户不存在或被禁用!';
  133. } else {
  134. if (user_md5($password) !== $user_info['password']) {
  135. $this->error = '密码错误!';
  136. } else {
  137. return $user_info;
  138. }
  139. }
  140. return false;
  141. }
  142. /**
  143. * 设置登录状态
  144. *
  145. */
  146. public function auto_login($user)
  147. {
  148. // 记录登录SESSION和COOKIES
  149. $auth = array(
  150. 'uid' => $user['id'],
  151. 'username' => $user['username'],
  152. 'nickname' => $user['nickname'],
  153. 'avatar' => $user['avatar'],
  154. 'printer_code'=>$user['printer_code'],
  155. 'mobile' =>$user['mobile'],
  156. 'postcode'=>$user['postcode'],
  157. 'company_address'=>$user['company_address'],
  158. 'addtype'=>$user['addtype'],
  159. 'last_tnum'=>$user['last_tnum'],
  160. );
  161. session('user_auth', $auth);
  162. session('user_auth_sign', $this->data_auth_sign($auth));
  163. return $this->is_login();
  164. }
  165. /**
  166. * 数据签名认证
  167. * @param array $data 被认证的数据
  168. * @return string 签名
  169. *
  170. */
  171. public function data_auth_sign($data)
  172. {
  173. // 数据类型检测
  174. if (!is_array($data)) {
  175. $data = (array) $data;
  176. }
  177. ksort($data); //排序
  178. $code = http_build_query($data); // url编码并生成query字符串
  179. $sign = sha1($code); // 生成签名
  180. return $sign;
  181. }
  182. /**
  183. * 检测用户是否登录
  184. * @return integer 0-未登录,大于0-当前登录用户ID
  185. *
  186. */
  187. public function is_login()
  188. {
  189. $user = session('user_auth');
  190. if (empty($user)) {
  191. return 0;
  192. } else {
  193. if (session('user_auth_sign') == $this->data_auth_sign($user)) {
  194. return $user['uid'];
  195. } else {
  196. return 0;
  197. }
  198. }
  199. }
  200. }