You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

348 lines
13 KiB

7 years ago
7 years ago
  1. <?php
  2. /**
  3. * Class Member
  4. * ---------------------------------------------------------
  5. * 회원 관련 라이브러리
  6. *
  7. */
  8. class Member {
  9. protected $CI;
  10. protected $member_info;
  11. function __construct()
  12. {
  13. $this->CI =& get_instance();
  14. }
  15. /***********************************************************
  16. * 현재 로그인 여부를 확인하고,
  17. * 로그인중이라면 회원고유 PK를 얻어온다.
  18. ***********************************************************/
  19. function is_login()
  20. {
  21. if ($this->CI->session->userdata('ss_mem_idx')) {
  22. return $this->CI->session->userdata('ss_mem_idx');
  23. } else {
  24. return FALSE;
  25. }
  26. }
  27. /***********************************************************
  28. * 현재 접속중인 회원의 레벨을 확인한다.
  29. ***********************************************************/
  30. function level()
  31. {
  32. if( ! $this->is_login() ) return 0;
  33. return (int) $this->info('auth');
  34. }
  35. /***********************************************************
  36. * 해당 회원이 슈퍼관리자 권한이 있는지 확인한다
  37. ***********************************************************/
  38. function is_super($mem_idx="")
  39. {
  40. // 지정된 mem_idx가 없으면 기본적으로 로그인된 idx를 가져옴
  41. if( ! $mem_idx ) $mem_idx = $this->is_login();
  42. // 현재 로그인중이 아니라면 return
  43. if( ! $mem_idx ) return FALSE;
  44. $member = $this->info();
  45. if( isset($member['auth']['SUPER']) && $member['auth']['SUPER'] ) {
  46. return TRUE;
  47. }
  48. }
  49. /***********************************************************
  50. * 현재 로그인 중인 사용자의 정보를 얻어온다.
  51. ***********************************************************/
  52. function info($column="")
  53. {
  54. $prefix = "mem_";
  55. if(! $mem_idx = $this->is_login() ) return NULL;
  56. if( ! $this->member_info )
  57. {
  58. $this->member_info = $this->get_member($mem_idx, "mem_idx");
  59. }
  60. if( $column )
  61. {
  62. return $this->member_info[$prefix.$column];
  63. }
  64. else {
  65. return $this->member_info;
  66. }
  67. }
  68. /***********************************************************
  69. * 해당 회원이 해당 게시판 관리자 권한이 있는지 확인한다
  70. ***********************************************************/
  71. function is_board_admin($brd_key, $mem_idx="")
  72. {
  73. // 지정된 mem_idx가 없으면 기본적으로 로그인된 idx를 가져옴
  74. if( ! $mem_idx ) $mem_idx = $this->is_login();
  75. // 현재 로그인중이 아니라면 return
  76. if( ! $mem_idx ) return FALSE;
  77. $member = $this->get_member( $mem_idx, "mem_idx" );
  78. // 슈퍼 관리자라면
  79. if( isset($member['auth']['SUPER']) && $member['auth']['SUPER'] ) {
  80. return TRUE;
  81. }
  82. // 게시판 슈퍼 관리자라면
  83. else if ( isset($member['auth']['BOARD']['SUPER']) && $member['auth']['BOARD']['SUPER'])
  84. {
  85. return TRUE;
  86. }
  87. // 해당 게시판의 관리자라면
  88. else if ( isset($member['auth']['BOARD'][$brd_key]) && $member['auth']['BOARD'][$brd_key])
  89. {
  90. return TRUE;
  91. }
  92. else {
  93. return FALSE;
  94. }
  95. }
  96. /***********************************************************
  97. * 특정 ID의 사용자 정보를 획득한다.
  98. ***********************************************************/
  99. function get_member($mem_userid="", $mem_column="mem_userid")
  100. {
  101. if(empty($mem_userid)) return NULL;
  102. $result = $this->CI->db
  103. ->from("member")
  104. ->where($mem_column, $mem_userid)
  105. ->limit(1)
  106. ->get();
  107. $member = $result->row_array();
  108. // 권한정보를 가져온다
  109. $result = $this->CI->db
  110. ->from('member_auth')
  111. ->where("mem_idx", $member['mem_idx'])
  112. ->get();
  113. $ath_list = $result->result_array();
  114. foreach($ath_list as $ath)
  115. {
  116. $member['auth'][$ath['ath_type']] = $ath['ath_key'] ? $ath['ath_key'] : TRUE;
  117. }
  118. // 소셜로그인 정보를 가져온다.
  119. $result = $this->CI->db
  120. ->from('member_social')
  121. ->where('mem_idx', $member['mem_idx'])
  122. ->get();
  123. $social_list = $result->result_array();
  124. foreach($social_list as $social)
  125. {
  126. $member['social'][$social['soc_provider']] = $social;
  127. }
  128. return $member;
  129. }
  130. /***********************************************************
  131. * 회원 등록/수정을 담당한다.
  132. ***********************************************************/
  133. function info_process($param)
  134. {
  135. // 등록인지 수정인지 여부가 정의되지 않았다면 false;
  136. if( ! isset($param) OR ($param['mode'] != 'INSERT' && $param['mode'] != 'MODIFY' )) return FALSE;
  137. // 모드를 정의하고 기존 변수는 unset
  138. $is_insert = ($param['mode'] == 'INSERT');
  139. unset($param['mode']);
  140. // 이메일 아이디 사용이라면, email값을 아이디로 사용한다.
  141. if( USE_EMAIL_ID ) {
  142. if( $is_insert ) {
  143. $param['mem_email'] = $param['mem_userid'];
  144. }
  145. }
  146. // 이메일 인증을 사용하지 않으면 인증여부를 기본 Y로 설정한다.
  147. if( ! USE_EMAIL_VERFY )
  148. {
  149. $param['mem_verfy_email'] = 'Y';
  150. }
  151. // 신규 등록모드라면 필요 데이타를 추가한다.
  152. if( $is_insert )
  153. {
  154. $param['mem_regtime'] = date('Y-m-d H:i:s');
  155. $param['mem_regip'] = ip2long($this->CI->input->ip_address());
  156. $param['mem_logtime'] = date('Y-m-d H:i:s');
  157. $param['mem_logip'] = ip2long($this->CI->input->ip_address());
  158. $param['mem_point'] = 0;
  159. if(! $this->CI->db->insert('member', $param)) return FALSE;
  160. // 포인트 사용 및 가입시 포인트값이 있다면?
  161. if( $this->CI->site->config('point_use') == 'Y' && (int)$this->CI->site->config('point_member_register') > 0 )
  162. {
  163. $member_info = $this->get_member($param['mem_userid']);
  164. $this->add_point($member_info['mem_idx'], $this->CI->site->config('point_member_register'), FALSE, "JOIN", point_type("JOIN"), 0);
  165. }
  166. return TRUE;
  167. }
  168. // 수정모드라면
  169. else
  170. {
  171. // mem_idx가 정의되어 있지 않으면 리턴
  172. if( ! isset($param['mem_idx']) ) return FALSE;
  173. // 비밀번호 변경이 체크되있지 않다면 비밀번호를 없앤다.
  174. if( element('mem_password_change', $param, FALSE) !== TRUE )
  175. {
  176. unset($param['mem_password']);
  177. }
  178. else
  179. {
  180. $param['mem_password'] = get_password_hash($param['mem_password']);
  181. unset($param['mem_password_change']);
  182. }
  183. $this->CI->db->where('mem_idx', $param['mem_idx']);
  184. return $this->CI->db->update('member', $param);
  185. }
  186. }
  187. /***********************************************************
  188. * 로그인 처리를 진행한다.
  189. ***********************************************************/
  190. function login_process($member_info, $login_keep=FALSE, $login_keep_update=FALSE)
  191. {
  192. if( empty($member_info) ) return FALSE;
  193. // 로그인 세션 저장
  194. $this->CI->session->set_userdata('ss_mem_idx', $member_info['mem_idx']);
  195. // DB에 로그 기록 작성
  196. $log_data['mem_idx'] = $member_info['mem_idx'];
  197. $log_data['mlg_ip'] = ip2long( $this->CI->input->ip_address() );
  198. $log_data['mlg_regtime'] = date('Y-m-d H:i:s');
  199. $log_data['mlg_browser'] = $this->CI->agent->browser();
  200. $log_data['mlg_version'] = $this->CI->agent->version();
  201. $log_data['mlg_platform'] = $this->CI->agent->platform();
  202. $log_data['mlg_is_mobile'] = $this->CI->agent->is_mobile() ? 'Y' : 'N';
  203. $log_data['mlg_mobile'] = $this->CI->agent->mobile();
  204. $this->CI->db->insert('member_log', $log_data);
  205. // 최종로그인 시간 업데이트
  206. $this->CI->db
  207. ->where('mem_idx', $member_info['mem_idx'])
  208. ->set('mem_logtime', date('Y-m-d H:i:s'))
  209. ->set('mem_logip', ip2long( $this->CI->input->ip_address() ))
  210. ->set('mem_logcount', 'mem_logcount+1', FALSE)
  211. ->update("member");
  212. // 로그인시 포인트 부여
  213. if( $this->CI->site->config('point_use') == 'Y' && $this->CI->site->config('point_member_login') > 0 )
  214. {
  215. $this->add_point($member_info['mem_idx'], $this->CI->site->config('point_member_login'), TRUE, "TODAY_LOGIN", point_type("TODAY_LOGIN"), 0);
  216. }
  217. // 자동로그인 설정시 자동로그인 처리
  218. if( $login_keep )
  219. {
  220. // 자동로그인 날짜 갱신이라면?
  221. if($login_keep_update)
  222. {
  223. $this->CI->db
  224. ->where('aul_key', get_password_hash( $member_info['mem_userid'] ))
  225. ->where('aul_ip', ip2long( $this->CI->input->ip_address() ))
  226. ->set('aul_regtime', date('Y-m-d H:i:s'))
  227. ->update("member_autologin");
  228. }
  229. // 자동로그인 신규 추가라면?
  230. else
  231. {
  232. // 자동 로그인 DB 입력
  233. $aul_data['mem_idx'] = $member_info['mem_idx'];
  234. $aul_data['aul_key'] = get_password_hash( $member_info['mem_userid'] );
  235. $aul_data['aul_ip'] = ip2long( $this->CI->input->ip_address() );
  236. $aul_data['aul_regtime']= date('Y-m-d H:i:s');
  237. $this->CI->db->insert("member_autologin", $aul_data);
  238. }
  239. // 쿠키 생성 (한달만료)
  240. set_cookie(COOKIE_AUTOLOGIN, get_password_hash( $member_info['mem_userid'] ), 60*60*24*30);
  241. }
  242. }
  243. public function remove_autologin($mem_idx="")
  244. {
  245. return false;
  246. }
  247. /**********************************************************
  248. * 포인트 추가 실제 처리
  249. *********************************************************/
  250. public function add_point($mem_idx, $point, $point_on_day=FALSE, $target_type="", $description="",$target_idx="")
  251. {
  252. // 포인트 기능 미사용일경우 리턴
  253. if($this->CI->site->config('point_use') != 'Y') return FALSE;
  254. $target_type = strtoupper($target_type);
  255. $target_array = point_type(FALSE);
  256. // 회원 IDX가 잘못된경우 리턴
  257. if( (int) $mem_idx <= 0 ) return FALSE;
  258. // 포인트가 0 일경우 리턴
  259. if( (int) $point == 0 ) return FALSE;
  260. // 포인트 종류가 다를경우 리턴
  261. if( !in_array($target_type, $target_array) ) return FALSE;
  262. // 하루에 한번 입력하는경우 오늘 입력된 데이타가 있는지 확인한다.
  263. if( $point_on_day && (int) $point > 0 )
  264. {
  265. $this->CI->db->select("COUNT(*) AS `cnt`");
  266. $this->CI->db->where("mem_idx", $mem_idx);
  267. $this->CI->db->where("target_type", $target_type);
  268. $this->CI->db->where("mpo_value >", "0");
  269. $this->CI->db->where("mpo_regtime >=", date('Y-m-d 00:00:00'));
  270. $this->CI->db->where("mpo_regtime <=", date('Y-m-d 23:59:59'));
  271. $temp = $this->CI->db->get("member_point");
  272. $count = (int) $temp->row(0)->cnt;
  273. if( $count > 0 )
  274. {
  275. return FALSE;
  276. }
  277. }
  278. // 입력할 데이타 정리
  279. $this->CI->db->set('mem_idx', $mem_idx);
  280. $this->CI->db->set('mpo_value', $point);
  281. $this->CI->db->set('mpo_description', $description);
  282. $this->CI->db->set('target_type', $target_type);
  283. $this->CI->db->set('target_idx', $target_idx);
  284. $this->CI->db->set('mpo_regtime', date('Y-m-d H:i:s') );
  285. $this->CI->db->insert('member_point');
  286. // 회원 DB에 반영
  287. $point=(int)$this->CI->db->select('SUM(mpo_value) AS sumval')->where('mem_idx', $this->CI->member->is_login())->get('member_point')->row(0)->sumval;
  288. $this->CI->db->set('mem_point', $point);
  289. $this->CI->db->where('mem_idx', $mem_idx);
  290. $this->CI->db->update('member');
  291. return TRUE;
  292. }
  293. /**
  294. * 소셜 로그인 정보를 가져온다.
  295. * @param $provider
  296. * @param $id
  297. */
  298. function get_social($provider, $id)
  299. {
  300. return $this->CI->db->where('soc_provider', $provider)->where('soc_id', $id)->get('member_social')->row_array();
  301. }
  302. }