member.model.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. <?php
  2. /**
  3. * 会员模型
  4. *
  5. *
  6. *
  7. *
  8. */
  9. defined('InShopNC') or exit('Access Invalid!');
  10. require_once (BASE_CORE_PATH . '/framework/libraries/validate.php');
  11. class memberModel extends Model
  12. {
  13. const mobile_login = 0;
  14. const anonymous_login = 1;
  15. const wxopen_login = 2;
  16. public function __construct() {
  17. parent::__construct('member');
  18. }
  19. public static function gen_openid_uid($openid,$type)
  20. {
  21. $key = 'openid_uid:' . $openid . ':' . $type;
  22. return $key;
  23. }
  24. public static function gen_token_uid($token)
  25. {
  26. $key = 'token_uid:' . $token;
  27. return $key;
  28. }
  29. public static function gen_uid_token($uid)
  30. {
  31. $key = 'uid_token:' . $uid;
  32. return $key;
  33. }
  34. /**
  35. * 会员详细信息(查库)
  36. * @param array $condition
  37. * @param string $field
  38. * @return array
  39. */
  40. public function getMemberInfo($condition, $field = '*', $master = false)
  41. {
  42. return $this->table('member')->field($field)->where($condition)->master($master)->find();
  43. }
  44. /**
  45. * 读取商品缓存
  46. * @param string $userid
  47. * @param string $type
  48. * @return array
  49. */
  50. public function getMemberID($openid,$type,$passwd = '')
  51. {
  52. if(empty($openid) || !in_array($type,array(0,1,2))) {
  53. return -1;
  54. }
  55. $key = $this->gen_openid_uid($openid, $type);
  56. $user = rcache($key, 'member');
  57. if (empty($user))
  58. {
  59. $conditions = array();
  60. $conditions['member_type'] = $type;
  61. if ($type == self::mobile_login) {
  62. $conditions['member_mobile'] = $openid;
  63. $conditions['member_passwd'] = md5($passwd);
  64. } elseif($type == self::anonymous_login) {
  65. $conditions['anonymous_id'] = $openid;
  66. } elseif ($type == self::wxopen_login) {
  67. $conditions['member_wxopenid'] = $openid;
  68. } else {
  69. return -1;
  70. }
  71. $user = $this->getMemberInfo($conditions,'member_id');
  72. if(empty($user)) {
  73. return -1;
  74. } else {
  75. wcache($key, $user, 'member');
  76. }
  77. }
  78. return $user['member_id'];
  79. }
  80. /**
  81. * 取得会员详细信息(优先查询缓存)
  82. * 如果未找到,则缓存所有字段
  83. * @param int $member_id
  84. * @param string $field 需要取得的缓存键值, 例如:'*','member_name,member_sex'
  85. * @return array
  86. */
  87. public function getMemberInfoByID($member_id, $fields = '*')
  88. {
  89. $member_info = rcache($member_id, 'member', $fields);
  90. if (empty($member_info)) {
  91. $member_info = $this->getMemberInfo(array('member_id'=>$member_id),'*',true);
  92. wcache($member_id, $member_info, 'member');
  93. }
  94. return $member_info;
  95. }
  96. /**
  97. * 会员列表
  98. * @param array $condition
  99. * @param string $field
  100. * @param number $page
  101. * @param string $order
  102. */
  103. public function getMemberList($condition = array(), $field = '*', $page = 0, $order = 'member_id desc', $limit = '')
  104. {
  105. return $this->table('member')->where($condition)->page($page)->order($order)->limit($limit)->select();
  106. }
  107. /**
  108. * 会员数量
  109. * @param array $condition
  110. * @return int
  111. */
  112. public function getMemberCount($condition) {
  113. return $this->table('member')->where($condition)->count();
  114. }
  115. /**
  116. * 编辑会员
  117. * @param array $condition
  118. * @param array $data
  119. */
  120. public function editMember($condition, $data)
  121. {
  122. $update = $this->table('member')->where($condition)->update($data);
  123. if ($update && $condition['member_id']) {
  124. dcache($condition['member_id'], 'member');
  125. }
  126. return $update;
  127. }
  128. /**
  129. * 登录时创建会话SESSION
  130. *
  131. * @param array $member_info 会员信息
  132. */
  133. public function createSession($member_info = array(),$reg = false)
  134. {
  135. if (empty($member_info) || !is_array($member_info)) return ;
  136. $_SESSION['is_login'] = '1';
  137. $_SESSION['member_id'] = $member_info['member_id'];
  138. $_SESSION['member_name']= $member_info['member_name'];
  139. $_SESSION['member_email']= $member_info['member_email'];
  140. $_SESSION['is_buy'] = isset($member_info['is_buy']) ? $member_info['is_buy'] : 1;
  141. $_SESSION['avatar'] = $member_info['member_avatar'];
  142. $seller_info = Model('seller')->getSellerInfo(array('member_id'=>$_SESSION['member_id']));
  143. $_SESSION['store_id'] = $seller_info['store_id'];
  144. if (trim($member_info['member_qqopenid'])){
  145. $_SESSION['openid'] = $member_info['member_qqopenid'];
  146. }
  147. if (trim($member_info['member_sinaopenid'])){
  148. $_SESSION['slast_key']['uid'] = $member_info['member_sinaopenid'];
  149. }
  150. if (!$reg) {
  151. //添加会员积分
  152. $this->addPoint($member_info);
  153. //添加会员经验值
  154. $this->addExppoint($member_info);
  155. }
  156. if(!empty($member_info['member_login_time']))
  157. {
  158. $update_info = array(
  159. 'member_login_num'=> ($member_info['member_login_num']+1),
  160. 'member_login_time'=> TIMESTAMP,
  161. 'member_old_login_time'=> $member_info['member_login_time'],
  162. 'member_login_ip'=> getIp(),
  163. 'member_old_login_ip'=> $member_info['member_login_ip']
  164. );
  165. $this->editMember(array('member_id'=>$member_info['member_id']),$update_info);
  166. }
  167. setNcCookie('cart_goods_num','',-3600);
  168. }
  169. /**
  170. * 获取会员信息
  171. * @param array $param 会员条件
  172. * @param string $field 显示字段
  173. * @return array 数组格式的返回结果
  174. */
  175. public function infoMember($param, $field='*')
  176. {
  177. if (empty($param)) return false;
  178. //得到条件语句
  179. $condition_str = $this->getCondition($param);
  180. $param = array();
  181. $param['table'] = 'member';
  182. $param['where'] = $condition_str;
  183. $param['field'] = $field;
  184. $param['limit'] = 1;
  185. $member_list = Db::select($param);
  186. $member_info = $member_list[0];
  187. if (intval($member_info['store_id']) > 0)
  188. {
  189. $param = array();
  190. $param['table'] = 'store';
  191. $param['field'] = 'store_id';
  192. $param['value'] = $member_info['store_id'];
  193. $field = 'store_id,store_name,grade_id';
  194. $store_info = Db::getRow($param,$field);
  195. if (!empty($store_info) && is_array($store_info)){
  196. $member_info['store_name'] = $store_info['store_name'];
  197. $member_info['grade_id'] = $store_info['grade_id'];
  198. }
  199. }
  200. return $member_info;
  201. }
  202. /**
  203. * 注册
  204. */
  205. public function register($register_info)
  206. {
  207. // 注册验证
  208. $obj_validate = new Validate();
  209. $obj_validate->validateparam = array(
  210. array("input"=>$register_info["username"], "require"=>"true", "message"=>'用户名不能为空'),
  211. array("input"=>$register_info["password"], "require"=>"true", "message"=>'密码不能为空'),
  212. array("input"=>$register_info["password_confirm"],"require"=>"true", "validator"=>"Compare","operator"=>"==","to"=>$register_info["password"],"message"=>'密码与确认密码不相同'),
  213. //array("input"=>$register_info["email"], "require"=>"true", "validator"=>"email", "message"=>'电子邮件格式不正确'),
  214. );
  215. $error = $obj_validate->validate();
  216. if ($error != ''){
  217. return array('error' => $error);
  218. }
  219. // 验证用户名是否重复
  220. $check_member_name = $this->getMemberInfo(array('member_name'=>$register_info['username']));
  221. if(is_array($check_member_name) and count($check_member_name) > 0) {
  222. return array('error' => '用户名已存在');
  223. }
  224. // 验证邮箱是否重复
  225. $check_member_email = $this->getMemberInfo(array('member_email'=>$register_info['email']));
  226. if(is_array($check_member_email) and count($check_member_email)>0) {
  227. return array('error' => '邮箱已存在');
  228. }
  229. // 会员添加
  230. $member_info = array();
  231. $member_info['member_name'] = $register_info['username'];
  232. $member_info['member_passwd'] = $register_info['password'];
  233. $member_info['member_email'] = $register_info['email'];
  234. //添加邀请人(推荐人)会员积分 by abc.com
  235. $member_info['inviter_id'] = $register_info['inviter_id'];
  236. $insert_id = $this->addMember($member_info);
  237. if($insert_id)
  238. {
  239. //添加会员积分
  240. if (C('points_isuse')) {
  241. Model('points')->savePointsLog('regist',array('pl_memberid'=>$insert_id,'pl_membername'=>$register_info['username']),false);
  242. //添加邀请人(推荐人)会员积分 by abc.com
  243. $inviter_name = Model('member')->table('member')->getfby_member_id($member_info['inviter_id'],'member_name');
  244. Model('points')->savePointsLog('inviter',array('pl_memberid'=>$register_info['inviter_id'],'pl_membername'=>$inviter_name,'invited'=>$member_info['member_name']));
  245. }
  246. // 添加默认相册
  247. $insert['ac_name'] = '买家秀';
  248. $insert['member_id'] = $insert_id;
  249. $insert['ac_des'] = '买家秀默认相册';
  250. $insert['ac_sort'] = 1;
  251. $insert['is_default'] = 1;
  252. $insert['upload_time'] = TIMESTAMP;
  253. $this->table('sns_albumclass')->insert($insert);
  254. $member_info['member_id'] = $insert_id;
  255. $member_info['is_buy'] = 1;
  256. return $member_info;
  257. } else {
  258. return array('error' => '注册失败');
  259. }
  260. }
  261. private function empty_model($param)
  262. {
  263. $member = array();
  264. $passwd = trim($param['member_passwd']);
  265. $member['member_passwd'] = empty($passwd) ? $passwd : md5($passwd);
  266. $member['member_time'] = TIMESTAMP;
  267. $member['member_login_time'] = TIMESTAMP;
  268. $member['member_old_login_time'] = TIMESTAMP;
  269. $member['member_login_ip'] = getIp();
  270. $member['member_old_login_ip'] = $member['member_login_ip'];
  271. return $member;
  272. }
  273. /**
  274. * 注册商城会员
  275. *
  276. * @param array $param 会员信息
  277. * @return array 数组格式的返回结果
  278. */
  279. public function addMember($param)
  280. {
  281. if(empty($param)) {
  282. return false;
  283. }
  284. try
  285. {
  286. $this->beginTransaction();
  287. $member_info = $this->empty_model($param);
  288. foreach ($param as $key => $value)
  289. {
  290. if($key == 'member_passwd') {
  291. $passwd = trim($param['member_passwd']);
  292. $member_info['member_passwd'] = empty($passwd) ? $passwd : md5($passwd);
  293. } elseif($key == 'member_time') {
  294. $member_info['member_time'] = TIMESTAMP;
  295. } elseif($key == 'member_login_time') {
  296. $member_info['member_login_time'] = TIMESTAMP;
  297. } elseif($key == 'member_login_ip') {
  298. $member_info['member_login_ip'] = getIp();
  299. } else {
  300. $member_info[$key] = $value;
  301. }
  302. }
  303. $insert_id = $this->table('member')->insert($member_info);
  304. if (!$insert_id) {
  305. throw new Exception();
  306. }
  307. $insert = $this->addMemberCommon(array('member_id'=>$insert_id));
  308. if (!$insert) {
  309. throw new Exception();
  310. }
  311. $this->commit();
  312. return $insert_id;
  313. } catch (Exception $e) {
  314. $this->rollback();
  315. return false;
  316. }
  317. }
  318. /**
  319. * 会员登录检查
  320. *
  321. */
  322. public function checkloginMember()
  323. {
  324. if($_SESSION['is_login'] == '1') {
  325. @header("Location: index.php");
  326. exit();
  327. }
  328. }
  329. /**
  330. * 检查会员是否允许举报商品
  331. *
  332. */
  333. public function isMemberAllowInform($member_id)
  334. {
  335. $condition = array();
  336. $condition['member_id'] = $member_id;
  337. $member_info = $this->getMemberInfo($condition,'inform_allow');
  338. if(intval($member_info['inform_allow']) === 1) {
  339. return true;
  340. }
  341. else {
  342. return false;
  343. }
  344. }
  345. /**
  346. * 取单条信息
  347. * @param unknown $condition
  348. * @param string $fields
  349. */
  350. public function getMemberCommonInfo($condition = array(), $fields = '*')
  351. {
  352. return $this->table('member_common')->where($condition)->field($fields)->find();
  353. }
  354. /**
  355. * 插入扩展表信息
  356. * @param unknown $data
  357. * @return Ambigous <mixed, boolean, number, unknown, resource>
  358. */
  359. public function addMemberCommon($data)
  360. {
  361. return $this->table('member_common')->insert($data);
  362. }
  363. /**
  364. * 编辑会员扩展表
  365. * @param unknown $data
  366. * @param unknown $condition
  367. * @return Ambigous <mixed, boolean, number, unknown, resource>
  368. */
  369. public function editMemberCommon($data,$condition)
  370. {
  371. return $this->table('member_common')->where($condition)->update($data);
  372. }
  373. /**
  374. * 添加会员积分
  375. * @param unknown $member_info
  376. */
  377. public function addPoint($member_info)
  378. {
  379. if (!C('points_isuse') || empty($member_info)) return;
  380. //一天内只有第一次登录赠送积分
  381. if(trim(@date('Y-m-d',$member_info['member_login_time'])) == trim(date('Y-m-d'))) return;
  382. //加入队列
  383. $queue_content = array();
  384. $queue_content['member_id'] = $member_info['member_id'];
  385. $queue_content['member_name'] = $member_info['member_name'];
  386. QueueClient::push('addPoint',$queue_content);
  387. }
  388. /**
  389. * 添加会员经验值
  390. * @param unknown $member_info
  391. */
  392. public function addExppoint($member_info)
  393. {
  394. if (empty($member_info)) return;
  395. //一天内只有第一次登录赠送经验值
  396. if(trim(@date('Y-m-d',$member_info['member_login_time'])) == trim(date('Y-m-d'))) return;
  397. //加入队列
  398. $queue_content = array();
  399. $queue_content['member_id'] = $member_info['member_id'];
  400. $queue_content['member_name'] = $member_info['member_name'];
  401. QueueClient::push('addExppoint',$queue_content);
  402. }
  403. /**
  404. * 取得会员安全级别
  405. * @param unknown $member_info
  406. */
  407. public function getMemberSecurityLevel($member_info = array())
  408. {
  409. $tmp_level = 0;
  410. if ($member_info['member_email_bind'] == '1') {
  411. $tmp_level += 1;
  412. }
  413. if ($member_info['member_mobile_bind'] == '1') {
  414. $tmp_level += 1;
  415. }
  416. if ($member_info['member_paypwd'] != '') {
  417. $tmp_level += 1;
  418. }
  419. return $tmp_level;
  420. }
  421. /**
  422. * 获得会员等级
  423. * @param bool $show_progress 是否计算其当前等级进度
  424. * @param int $exppoints 会员经验值
  425. * @param array $cur_level 会员当前等级
  426. */
  427. public function getMemberGradeArr($show_progress = false,$exppoints = 0,$cur_level = '')
  428. {
  429. $member_grade = C('member_grade')?unserialize(C('member_grade')):array();
  430. //处理会员等级进度
  431. if ($member_grade && $show_progress)
  432. {
  433. $is_max = false;
  434. if ($cur_level === ''){
  435. $cur_gradearr = $this->getOneMemberGrade($exppoints, false, $member_grade);
  436. $cur_level = $cur_gradearr['level'];
  437. }
  438. foreach ($member_grade as $k=>$v){
  439. if ($cur_level == $v['level']){
  440. $v['is_cur'] = true;
  441. }
  442. $member_grade[$k] = $v;
  443. }
  444. }
  445. return $member_grade;
  446. }
  447. /**
  448. * 将条件数组组合为SQL语句的条件部分
  449. *
  450. * @param array $conditon_array
  451. * @return string
  452. */
  453. private function getCondition($conditon_array)
  454. {
  455. $condition_sql = '';
  456. if($conditon_array['member_id'] != '') {
  457. $condition_sql .= " and member_id= '" .intval($conditon_array['member_id']). "'";
  458. }
  459. if($conditon_array['member_name'] != '') {
  460. $condition_sql .= " and member_name='".$conditon_array['member_name']."'";
  461. }
  462. if($conditon_array['member_passwd'] != '') {
  463. $condition_sql .= " and member_passwd='".$conditon_array['member_passwd']."'";
  464. }
  465. //是否允许举报
  466. if($conditon_array['inform_allow'] != '') {
  467. $condition_sql .= " and inform_allow='{$conditon_array['inform_allow']}'";
  468. }
  469. //是否允许购买
  470. if($conditon_array['is_buy'] != '') {
  471. $condition_sql .= " and is_buy='{$conditon_array['is_buy']}'";
  472. }
  473. //是否允许发言
  474. if($conditon_array['is_allowtalk'] != '') {
  475. $condition_sql .= " and is_allowtalk='{$conditon_array['is_allowtalk']}'";
  476. }
  477. //是否允许登录
  478. if($conditon_array['member_state'] != '') {
  479. $condition_sql .= " and member_state='{$conditon_array['member_state']}'";
  480. }
  481. if($conditon_array['friend_list'] != '') {
  482. $condition_sql .= " and member_name IN (".$conditon_array['friend_list'].")";
  483. }
  484. if($conditon_array['member_email'] != '') {
  485. $condition_sql .= " and member_email='".$conditon_array['member_email']."'";
  486. }
  487. if($conditon_array['no_member_id'] != '') {
  488. $condition_sql .= " and member_id != '".$conditon_array['no_member_id']."'";
  489. }
  490. if($conditon_array['like_member_name'] != '') {
  491. $condition_sql .= " and member_name like '%".$conditon_array['like_member_name']."%'";
  492. }
  493. if($conditon_array['like_member_email'] != '') {
  494. $condition_sql .= " and member_email like '%".$conditon_array['like_member_email']."%'";
  495. }
  496. if($conditon_array['like_member_truename'] != '') {
  497. $condition_sql .= " and member_truename like '%".$conditon_array['like_member_truename']."%'";
  498. }
  499. if($conditon_array['in_member_id'] != '') {
  500. $condition_sql .= " and member_id IN (".$conditon_array['in_member_id'].")";
  501. }
  502. if($conditon_array['in_member_name'] != '') {
  503. $condition_sql .= " and member_name IN (".$conditon_array['in_member_name'].")";
  504. }
  505. if($conditon_array['member_qqopenid'] != '') {
  506. $condition_sql .= " and member_qqopenid = '{$conditon_array['member_qqopenid']}'";
  507. }
  508. if($conditon_array['member_sinaopenid'] != '') {
  509. $condition_sql .= " and member_sinaopenid = '{$conditon_array['member_sinaopenid']}'";
  510. }
  511. return $condition_sql;
  512. }
  513. /**
  514. * 删除会员
  515. *
  516. * @param int $id 记录ID
  517. * @return array $rs_row 返回数组形式的查询结果
  518. */
  519. public function del($id){
  520. if (intval($id) > 0){
  521. $where = " member_id = '". intval($id) ."'";
  522. $result = Db::delete('member',$where);
  523. return $result;
  524. }else {
  525. return false;
  526. }
  527. }
  528. /**
  529. * 获得某一会员等级
  530. * @param int $exppoints
  531. * @param bool $show_progress 是否计算其当前等级进度
  532. * @param array $member_grade 会员等级
  533. */
  534. public function getOneMemberGrade($exppoints,$show_progress = false,$member_grade = array())
  535. {
  536. if (!$member_grade){
  537. $member_grade = C('member_grade')?unserialize(C('member_grade')):array();
  538. }
  539. if (empty($member_grade)){//如果会员等级设置为空
  540. $grade_arr['level'] = -1;
  541. $grade_arr['level_name'] = '暂无等级';
  542. return $grade_arr;
  543. }
  544. $exppoints = intval($exppoints);
  545. $grade_arr = array();
  546. if ($member_grade)
  547. {
  548. foreach ($member_grade as $k=>$v){
  549. if($exppoints >= $v['exppoints']){
  550. $grade_arr = $v;
  551. }
  552. }
  553. }
  554. //计算提升进度
  555. if ($show_progress == true)
  556. {
  557. if (intval($grade_arr['level']) >= (count($member_grade) - 1)) {//如果已达到顶级会员
  558. $grade_arr['downgrade'] = $grade_arr['level'] - 1;//下一级会员等级
  559. $grade_arr['downgrade_name'] = $member_grade[$grade_arr['downgrade']]['level_name'];
  560. $grade_arr['downgrade_exppoints'] = $member_grade[$grade_arr['downgrade']]['exppoints'];
  561. $grade_arr['upgrade'] = $grade_arr['level'];//上一级会员等级
  562. $grade_arr['upgrade_name'] = $member_grade[$grade_arr['upgrade']]['level_name'];
  563. $grade_arr['upgrade_exppoints'] = $member_grade[$grade_arr['upgrade']]['exppoints'];
  564. $grade_arr['less_exppoints'] = 0;
  565. $grade_arr['exppoints_rate'] = 100;
  566. } else {
  567. $grade_arr['downgrade'] = $grade_arr['level'];//下一级会员等级
  568. $grade_arr['downgrade_name'] = $member_grade[$grade_arr['downgrade']]['level_name'];
  569. $grade_arr['downgrade_exppoints'] = $member_grade[$grade_arr['downgrade']]['exppoints'];
  570. $grade_arr['upgrade'] = $member_grade[$grade_arr['level']+1]['level'];//上一级会员等级
  571. $grade_arr['upgrade_name'] = $member_grade[$grade_arr['upgrade']]['level_name'];
  572. $grade_arr['upgrade_exppoints'] = $member_grade[$grade_arr['upgrade']]['exppoints'];
  573. $grade_arr['less_exppoints'] = $grade_arr['upgrade_exppoints'] - $exppoints;
  574. $grade_arr['exppoints_rate'] = round(($exppoints - $member_grade[$grade_arr['level']]['exppoints'])/($grade_arr['upgrade_exppoints'] - $member_grade[$grade_arr['level']]['exppoints'])*100,2);
  575. }
  576. }
  577. return $grade_arr;
  578. }
  579. }