User.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. <?php
  2. namespace app\common\model;
  3. use think\Model;
  4. use think\Db;
  5. class User extends Model
  6. {
  7. //protected static $passport_table = 'members'; //整合论坛的话,就要写上论坛的数据表前缀
  8. // 设置当前模型对应的完整数据表名称memberdata
  9. protected $table = '__MEMBERDATA__';
  10. //主键不是ID,要单独指定
  11. public $pk = 'uid';
  12. // 自动写入时间戳
  13. protected $autoWriteTimestamp = false;
  14. public static function getByName($name = '')
  15. {
  16. $result = self::get(['username' => $name]);
  17. return is_object($result) ? $result->toArray() : $result;
  18. }
  19. public static function getById($id = '')
  20. {
  21. $result = self::get(['uid' => $id]);
  22. return is_object($result) ? $result->toArray() : $result;
  23. }
  24. //仅获取用户通行证的帐号密码信息
  25. public static function get_passport($value,$type='uid') {
  26. // if(config('webdb.passport_type')){
  27. // return Db::table(self::$passport_table)->where($type=='uid'?'uid':'username',$value)->find();
  28. // }else{
  29. // return Db::name(self::$passport_table)->where($type=='uid'?'uid':'username',$value)->find();
  30. // }
  31. $array = getArray(self::where($type=='uid'?'uid':'username',$value)->find());
  32. return $array;
  33. }
  34. /**
  35. * 仅获取用户详细信息
  36. * @param unknown $value
  37. * @param string $type
  38. * @return \app\common\model\User|NULL
  39. */
  40. public static function get_info($value,$type='uid'){
  41. if(is_array($value)){
  42. $map = $value;
  43. }elseif($type=='name'){
  44. $map['username'] = $value;
  45. }elseif(preg_match('/^[\w]+$/', $type)){
  46. $map[$type] = $value;
  47. }
  48. $result = self::get($map);
  49. return is_object($result) ? $result->toArray() : $result;
  50. }
  51. //获取用户所有信息
  52. public static function get_allInfo($value,$type='uid'){
  53. $array1 = self::get_passport($value,$type);
  54. if(!$array1){
  55. return ;
  56. }
  57. $array2 = self::get_info($value,$type);
  58. if(!empty($array2)){
  59. $array1 = array_merge($array1,$array2);
  60. }else{
  61. //论坛过来的用户,自动注册一个帐号
  62. $array = array(
  63. 'uid'=>$array1['uid'],
  64. 'username'=>$array1['username'],
  65. 'email'=>$array1['email'],
  66. 'yz'=>1,
  67. );
  68. self::register_data($array);
  69. //add_user($array1[uid],$webdb[regmoney],'注册得分');
  70. $array1['yz']=1;
  71. }
  72. return $array1;
  73. }
  74. //检查密码是否正确
  75. public static function check_password($username,$password,$ckmd5=false,$type='username'){
  76. $rs = self::get_passport($username,$type=='username'?'username':'uid');
  77. if(!$rs){
  78. return 0;
  79. }
  80. // if(defined("UC_CONNECT")){
  81. // if(md5(md5($password).$rs['salt'])==$rs['password']){
  82. // return $rs;
  83. // }
  84. // }else{
  85. if($ckmd5 && strlen($password)==32 && $password==$rs['password'] ){
  86. return $rs;
  87. }elseif(md5($password.$rs['password_rand'])==$rs['password']){
  88. return $rs;
  89. }
  90. // }
  91. return -1;
  92. }
  93. //检查用户名是否合法
  94. public static function check_username($username) {
  95. $guestexp = '\xA1\xA1|\xAC\xA3|^Guest|^\xD3\xCE\xBF\xCD|\xB9\x43\xAB\xC8';
  96. $len = strlen($username);
  97. if($len > 50 || $len < 3 || preg_match("/\s+|^c:\\con\\con|[%,\*\'\"\s\<\>\&]|$guestexp/is", $username)) {
  98. return FALSE;
  99. } else {
  100. return TRUE;
  101. }
  102. }
  103. //检查用户名是否存在
  104. public static function check_userexists($username) {
  105. return self::get_passport($username,'username');
  106. }
  107. //检查邮箱是否存在
  108. public static function check_emailexists($value) {
  109. // if(config('webdb.passport_type')){
  110. // $rs = Db::name(self::$passport_table)->where('email',$value)->find();
  111. // }else{
  112. // $rs = self::get(['email'=>$value]);
  113. // }
  114. $rs = self::get(['email'=>$value]);
  115. return $rs;
  116. }
  117. //用户注册
  118. public static function register_user($array){
  119. if(self::get_passport($array['username'],'username')){
  120. return '当前用户已经存在了';
  121. }
  122. if(config('webdb.forbidRegName')!=''){
  123. $detail = str_array(config('webdb.forbidRegName'));
  124. if(in_array($array['username'], $detail)){
  125. return '请换一个用户名,当前用户名不允许使用';
  126. }
  127. }
  128. if(!$array['username']){
  129. return '用户名不能为空';
  130. }elseif(!$array['email']){
  131. return '邮箱不能为空';
  132. }elseif(!$array['password']){
  133. return '密码不能为空';
  134. }elseif(strlen($array['username'])>40||strlen($array['username'])<3){
  135. return '用户名不能小于3个字节或大于40个字节';
  136. }elseif (strlen($array['password'])>30 || strlen($array['password'])<5){
  137. return '密码不能小于5个字符或大于30个字符';
  138. }elseif(!preg_match("/^[-a-zA-Z0-9_\.]+\@([0-9A-Za-z][0-9A-Za-z-]+\.)+[A-Za-z]{2,5}$/",$array['email'])){
  139. return '邮箱不符合规则';
  140. }elseif( config('webdb.emailOnly') && self::check_emailexists($array['email'])){
  141. return "当前邮箱“{$array['email']}”已被注册了,请更换一个邮箱!";
  142. }
  143. $S_key=array('|',' ','',"'",'"','/','*',',','~',';','<','>','$',"\\","\r","\t","\n","`","!","?","%","^");
  144. //后来增加
  145. $array['username'] = str_replace(array('|',' ','',"'",'"','/','*',',','~',';','<','>','$',"\\","\r","\t","\n","`","!","?","%","^"),'',$array['username']);
  146. foreach($S_key as $value){
  147. if (strpos($array['username'],$value)!==false){
  148. //write_file(ROOT_PATH."/cache/name.txt","$array[username]\r\n",'a');
  149. return "用户名中包含有禁止的符号“{$value}”";
  150. }
  151. if (strpos($array['password'],$value)!==false){
  152. return "密码中包含有禁止的符号“{$value}”";
  153. }
  154. }
  155. foreach($array AS $key=>$value){
  156. $array[$key] = filtrate($value);
  157. }
  158. hook_listen('user_add_begin',$array);
  159. // $array['uid'] = self::register_passport($array);
  160. // if(!is_numeric($array['uid'])){
  161. // return "主表创建用户失败";
  162. // }
  163. if(($array['uid'] = self::register_data($array))==false){
  164. return "创建用户失败";
  165. }
  166. hook_listen('user_add_end',$array);
  167. return $array['uid'];
  168. }
  169. //注册用户通行证,帐号与密码是必须信息
  170. public static function register_passport($array) {
  171. // if(preg_match("/^pwbbs/",config('webdb.passport_type'))){
  172. // $data = [
  173. // 'password'=>md5($array['password']),
  174. // 'username'=>$array['username'],
  175. // 'password'=>$array['password'],
  176. // 'email'=>$array['email'],
  177. // 'groupid'=>-1,
  178. // 'memberid'=>8,
  179. // 'regdate'=>time(),
  180. // 'yz'=>1,
  181. // 'lastvisit'=>time(),
  182. // 'onlineip'=>'',
  183. // ];
  184. // if( !$uid = Db::name(self::$passport_table)->insertGetId($data) ){
  185. // showerr( '论坛创建用户失败,主表无法写入!');
  186. // }
  187. // $data['uid'] = $uid;
  188. // if (!$result = Db::table(config('webdb.passport_pre'))->insert($data)) {
  189. // showerr( '论坛创建用户失败,副表无法写入!');
  190. // }
  191. // }elseif(defined("UC_CONNECT")){
  192. // $uid = uc_user_register($array['username'], $array['password'], $array['email']);
  193. // if($uid=='-1'){
  194. // showerr('用户名不合法');
  195. // }elseif($uid=='-2'){
  196. // showerr('包含不允许注册的词语');
  197. // }elseif($uid=='-3'){
  198. // showerr('用户名已经存在');
  199. // }elseif($uid=='-4'){
  200. // showerr('email 格式有误');
  201. // }elseif($uid=='-5'){
  202. // showerr('email 不允许注册');
  203. // }elseif($uid=='-6'){
  204. // showerr('该 email 已经被注册');
  205. // }
  206. // //if($uid&&eregi("^dzbbs7",$webdb['passport_type'])){ //DZ论坛相关用户表
  207. // //$this->db->query("INSERT INTO {$webdb[passport_pre]}memberfields SET uid='$uid'");
  208. // //$pwd=md5($array[password]);
  209. // //$this->db->query("INSERT INTO {$webdb[passport_pre]}members SET uid='$uid',username='$array[username]',password='$pwd',groupid=10,regip='$onlineip',regdate='$timestamp',email='$array[email]',newsletter='1',timeoffset='9999',editormode=2,customshow=26");
  210. // //}
  211. // }else{
  212. // $data = [
  213. // 'password'=>md5($array['password']),
  214. // 'username'=>$array['username'],
  215. // ];
  216. // if( !$uid = Db::name(self::$passport_table)->insertGetId($data) ){
  217. // showerr( '创建用户失败,主表无法写入!');
  218. // }
  219. // }
  220. // return $uid;
  221. }
  222. //注册用户详细信息
  223. public static function register_data($array){
  224. //if(!$array['uid']||!$array['username']){
  225. if($array['username']==''){
  226. return false;
  227. }
  228. $array['groupid'] || $array['groupid']=8;
  229. isset($array['yz']) || $array['yz']=1;
  230. $array['regdate'] = time();
  231. $array['lastvist'] = time();
  232. $array['regip'] = get_ip();
  233. $array['lastip'] = get_ip();
  234. //用户昵称
  235. $array['nickname'] = $array['username'];
  236. $array['password_rand'] = rands(rand(5,10));
  237. $array['password'] = md5 ($array['password'].$array['password_rand']);
  238. if($result = self::create($array)){
  239. return $result->uid;
  240. }
  241. return false;
  242. }
  243. //修改用户任意信息
  244. public static function edit_user($array) {
  245. cache('user_'.$array['uid'],null);
  246. hook_listen('user_edit_begin',$array);
  247. //self::edit_passport($array);
  248. if( config('webdb.emailOnly') && $array['email'] ){
  249. $r = self::check_emailexists($array['email']);
  250. if($r && $r['uid']!=$array['uid']){
  251. return "当前邮箱存在了,请更换一个!";
  252. }
  253. }
  254. if($array['password']){
  255. $array['password_rand'] = rands(rand(5,10));
  256. $array['password'] = md5($array['password'].$array['password_rand']);
  257. }
  258. if(self::update($array)){
  259. cache('user_'.$array['uid'],null);
  260. hook_listen('user_edit_end',$array);
  261. return true;
  262. }else{
  263. return false;
  264. }
  265. }
  266. //仅修改通行证邮箱与密码
  267. public static function edit_passport($array) {
  268. if( config('webdb.emailOnly') && $array['email'] ){
  269. $r = self::check_emailexists($array['email']);
  270. if($r && $r['uid']!=$array['uid']){
  271. showerr("当前邮箱存在了,请更换一个!");
  272. }
  273. }
  274. if($array['password']){
  275. $array['password_rand'] = rands(rand(5,10));
  276. $array['password'] = md5($array['password'].$array['password_rand']);
  277. }
  278. // if(preg_match("/^pwbbs/",config('webdb.passport_type'))){
  279. // if($array['password']){
  280. // $array['password'] = md5($array['password']);
  281. // }
  282. // if (Db::name(self::$passport_table)->update($array)) {
  283. // return true;
  284. // } else {
  285. // return false;
  286. // }
  287. // }elseif(defined("UC_CONNECT")){
  288. // $rs = uc_user_edit($array['username'] , '' , $array['password'] , $array['email'] , 1 );
  289. // return $rs;
  290. // }else{
  291. // if($array['password']){
  292. // $array['password'] = md5($array['password']);
  293. // if (Db::name(self::$passport_table)->update($array)) {
  294. // return true;
  295. // } else {
  296. // return false;
  297. // }
  298. // }
  299. // }
  300. if (self::update($array)) {
  301. return true;
  302. } else {
  303. return false;
  304. }
  305. }
  306. //删除会员
  307. public static function delete_user($uid) {
  308. hook_listen('user_delete_begin',$uid);
  309. // if(preg_match("/^pwbbs/",config('webdb.passport_type'))){
  310. // Db::name(self::$passport_table)->delete($uid);
  311. // Db::table(config('webdb.passport_pre').'memberdata')->delete($uid);
  312. // }elseif(defined("UC_CONNECT")){
  313. // //uc_user_delete($uid);
  314. // }else{
  315. // Db::name(self::$passport_table)->delete($uid);
  316. // }
  317. if(self::destroy($uid)){
  318. cache('user_'.$uid,null);
  319. hook_listen('user_delete_end',$uid);
  320. return true;
  321. }
  322. }
  323. //获取会员总数
  324. public static function total_num($sql = '') {
  325. $rs = Db::query('SELECT COUNT(*) AS NUM FROM '.config('database.prefix').'memberdata '.$sql);
  326. return $rs['NUM'];
  327. }
  328. //获取一批会员资料信息
  329. public static function get_list($start, $num, $sql) {
  330. return Db::query('SELECT * FROM '.config('database.prefix').'memberdata '." $sql LIMIT $start, $num");
  331. }
  332. //用户登录
  333. public static function login($username,$password,$cookietime=null,$not_pwd=false,$type='username'){
  334. if(!table_field('memberdata','password_rand')){ //升级数据库
  335. into_sql(APP_PATH.'common/upgrade/5.sql');
  336. }
  337. $array = [
  338. 'username'=>$username,
  339. 'password'=>$password,
  340. 'time'=>$cookietime,
  341. 'not_pwd'=>$not_pwd,
  342. 'type'=>$type,
  343. ];
  344. hook_listen('user_login_begin', $array);
  345. if($username==''){
  346. return 0;
  347. }
  348. if($not_pwd){ //不需要知道原始密码就能登录
  349. $rs = self::get_passport($username,$type=='username'?'username':'uid');
  350. }else{
  351. $rs = self::check_password($username,$password);
  352. if(!is_array($rs)){
  353. return $rs; //0为用户不存在,-1为密码不正确
  354. }
  355. $data = [
  356. 'uid'=>$rs['uid'],
  357. 'lastvist'=>time(),
  358. 'lastip'=>get_ip(),
  359. ];
  360. self::edit_user($data);
  361. }
  362. // if(preg_match("/^pwbbs/",config('webdb.passport_type'))){
  363. // if(!empty($db_ifsafecv)){
  364. // $_r = self::get_passport($username,$type=='username'?'name':'uid');
  365. // $safecv = $_r['safecv'];
  366. // }
  367. // //set_cookie(CookiePre().'_winduser',StrCode($rs['uid']."\t".PwdCode($rs['password'])."\t$safecv"),$cookietime);
  368. // //set_cookie('lastvisit','',0);
  369. // }else{
  370. set_cookie("passport","{$rs['uid']}\t$username\t".mymd5($rs['password'],'EN'),$cookietime);
  371. // }
  372. // if(defined("UC_CONNECT")){
  373. // global $uc_login_code;
  374. // //$uc_login_code=uc_user_synlogin($rs['uid']);
  375. // }
  376. $array = [
  377. 'uid'=>$rs['uid'],
  378. 'username'=>$username,
  379. 'password'=>$password,
  380. 'time'=>$cookietime,
  381. 'not_pwd'=>$not_pwd,
  382. 'type'=>$type,
  383. ];
  384. hook_listen('user_login_end', $array);
  385. return $rs['uid'];
  386. }
  387. //用户退出
  388. public static function quit($uid=0){
  389. // if( preg_match("/^pwbbs/",config('webdb.passport_type')) ){
  390. // //set_cookie(CookiePre().'_winduser','');
  391. // }else{
  392. set_cookie('passport','');
  393. // }
  394. cache('user_'.$uid,null);
  395. set_cookie('token_secret','');
  396. setcookie('adminID','',0,'/'); //同步后台退出
  397. if(defined('UC_CONNECT')){
  398. //global $uc_login_code;
  399. //$uc_login_code = uc_user_synlogout();
  400. }
  401. hook_listen('user_quit_end',$uid);
  402. }
  403. public static function get_token(){
  404. $token = input('token');
  405. if($token && cache($token)){ //APP或小程序
  406. list($uid,$username,$password) = explode("\t",cache($token));
  407. if($uid&&$username&&$password){
  408. return ['uid'=>$uid,'username'=>$username,'password'=>$password];
  409. }
  410. }
  411. list($uid,$username,$password) = explode("\t",get_cookie('passport'));
  412. if($uid&&$username&&$password){
  413. return ['uid'=>$uid,'username'=>$username,'password'=>$password];
  414. }
  415. }
  416. //用户登录状态的信息
  417. public static function login_info(){
  418. if(!$token=self::get_token()){
  419. return ;
  420. }
  421. $usr_info = cache('user_'.$token['uid']);
  422. if(empty($usr_info['password'])){
  423. $usr_info = self::get_allInfo(intval($token['uid']));
  424. cache('user_'.$usr_info['uid'],$usr_info,3600);
  425. }
  426. if( mymd5($usr_info['password'],'EN') != $token['password'] ){
  427. self::quit($usr_info['uid']);
  428. return ;
  429. }
  430. return $usr_info;
  431. }
  432. //检查微信openid是否存在
  433. public static function check_wxIdExists($openid) {
  434. return self::get(['weixin_api'=>$openid]);
  435. }
  436. //检查微信openid是否存在
  437. public static function check_qqIdExists($openid) {
  438. return self::get(['qq_api'=>$openid]);
  439. }
  440. //检查小程序openid是否存在
  441. public static function check_wxappIdExists($openid) {
  442. return self::get(['wxapp_api'=>$openid]);
  443. }
  444. /**
  445. * 会员标签调用数据
  446. * @param unknown $tagArray
  447. * @param number $page
  448. * @return string
  449. */
  450. public static function labelGet($tagArray , $page=0)
  451. {
  452. $map = [];
  453. $cfg = unserialize($tagArray['cfg']);
  454. $cfg['rows'] || $cfg['rows'] = 10;
  455. $cfg['order'] || $cfg['order'] = 'uid';
  456. $cfg['by'] || $cfg['by'] = 'desc';
  457. $page = intval($page);
  458. if ($page<1) {
  459. $page=1;
  460. }
  461. $min = ($page-1)*$cfg['rows'];
  462. if($cfg['where']){ //用户自定义的查询语句
  463. $_array = label_format_where($cfg['where']);
  464. if($_array){
  465. $map = array_merge($map,$_array);
  466. }
  467. }
  468. $whereor = [];
  469. if($cfg['whereor']){ //用户自定义的查询语句
  470. $_array = label_format_where($cfg['whereor']);
  471. if($_array){
  472. $whereor = $_array;
  473. }
  474. }
  475. // $array = User::where($map)->whereOr($whereor)->order($cfg['order'],$cfg['by'])->limit($min,$cfg['rows'])->column(true);
  476. // foreach ($array AS $key=>$rs){
  477. // $rs['title'] = $rs['username'];
  478. // $rs['full_lastvist'] = $rs['lastvist'];
  479. // $rs['lastvist'] = date('Y-m-d H:i',$rs['lastvist']);
  480. // $rs['full_regdate'] = $rs['regdate'];
  481. // $rs['regdate'] = date('Y-m-d H:i',$rs['regdate']);
  482. // $rs['icon'] = $rs['picurl'] = tempdir($rs['icon']);
  483. // $rs['url'] = get_url('user',['uid'=>$rs['uid']]);
  484. // $array[$key] = $rs;
  485. // }
  486. $array = self::where($map)->whereOr($whereor)->order($cfg['order'],$cfg['by'])->limit($min,$cfg['rows'])->paginate($cfg['rows'],false,['page'=>$page]);
  487. $array->each(function($rs,$key){
  488. $rs['title'] = $rs['username'];
  489. $rs['full_lastvist'] = $rs['lastvist'];
  490. $rs['lastvist'] = date('Y-m-d H:i',$rs['lastvist']);
  491. $rs['full_regdate'] = $rs['regdate'];
  492. $rs['regdate'] = date('Y-m-d H:i',$rs['regdate']);
  493. $rs['icon'] = $rs['picurl'] = tempdir($rs['icon']);
  494. $rs['url'] = get_url('user',['uid'=>$rs['uid']]);
  495. $rs['group_name'] = getGroupByid($rs['groupid']);
  496. return $rs;
  497. });
  498. return $array;
  499. }
  500. }