common.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578
  1. <?php
  2. // 应用公共文件
  3. /**
  4. * p格式友好输出
  5. * @param $data
  6. */
  7. function p($data){
  8. echo "<pre>";
  9. print_r($data);
  10. echo "</pre>";
  11. }
  12. /**
  13. * 检测用户是否登录
  14. * @param $key 加密key
  15. * @param $db 用户数据库
  16. * @param $model 用户模型
  17. * @return int
  18. */
  19. function is_login($key,$db,$model) {
  20. //先检测cookie
  21. $cookie_verify=cookie('user_auth_sign');;
  22. $cookie=cookie('user_auth');
  23. if(!empty($cookie_verify) &&!empty($cookie)){//存在
  24. $map['id']=$cookie;
  25. $user = $db->field('id,user_password,user_name')->where($map)->find();
  26. $user_id=$user['id'];
  27. $user_pw=$user['user_password'];
  28. $data=$user['user_name'].$user_id.$user_pw;
  29. $user_verify=think_encrypt($data,$key);
  30. // $_SESSION['user']=$user['user_name'];//编辑器判断是否登录使用
  31. if($cookie_verify == $user_verify){
  32. if(!cookie('user_base')){
  33. $model->set_userbase_cookie($user['id']);
  34. }
  35. return $user['id'];
  36. }
  37. }
  38. $user_auth = session ( 'user_auth' );
  39. // $_SESSION['user']=$user['user_name'];//编辑器判断是否登录使用
  40. if (empty ( $user_auth )) {
  41. return 0;
  42. } else {
  43. if(session ( 'user_auth_sign' ) == data_auth_sign ( $user_auth )){
  44. if(!cookie('user_base')){
  45. $model->set_userbase_cookie($user_auth['id']);
  46. }
  47. return $user_auth ['id'];
  48. }else{
  49. return 0;
  50. }
  51. }
  52. }
  53. /**
  54. * 后台密码加密
  55. * @param $password
  56. * @param $key
  57. * @return string
  58. */
  59. function password($password,$key){
  60. return '' === $password ? '' : md5(sha1($password) . $key);
  61. }
  62. /**
  63. * 数据签名认证
  64. *
  65. * @param array $data
  66. * 被认证的数据
  67. * @return string 签名
  68. */
  69. function data_auth_sign($data) {
  70. // 数据类型检测
  71. if (! is_array ( $data )) {
  72. $data = ( array ) $data;
  73. }
  74. ksort ( $data ); // 排序
  75. $code = http_build_query ( $data ); // url编码并生成query字符串
  76. $sign = sha1 ( $code ); // 生成签名
  77. return $sign;
  78. }
  79. /**
  80. * 系统加密方法
  81. * @param string $data 要加密的字符串
  82. * @param string $key 加密密钥
  83. * @param int $expire 过期时间 (单位:秒)
  84. * @return string
  85. */
  86. function think_encrypt($data, $key, $expire = 0) {
  87. $key = md5($key);
  88. $data = base64_encode($data);
  89. $x = 0;
  90. $len = strlen($data);
  91. $l = strlen($key);
  92. $char = '';
  93. for ($i = 0; $i < $len; $i++) {
  94. if ($x == $l) $x=0;
  95. $char .= substr($key, $x, 1);
  96. $x++;
  97. }
  98. $str = sprintf('%010d', $expire ? $expire + time() : 0);
  99. for ($i = 0; $i < $len; $i++) {
  100. $str .= chr(ord(substr($data,$i,1)) + (ord(substr($char,$i,1)))%256);
  101. }
  102. return str_replace('=', '', base64_encode($str));
  103. }
  104. /**
  105. * 系统解密方法
  106. * @param string $data 要解密的字符串 (必须是think_encrypt方法加密的字符串)
  107. * @param string $key 加密密钥
  108. * @return string
  109. */
  110. function think_decrypt($data, $key){
  111. $key = md5($key);
  112. $x = 0;
  113. $data = base64_decode($data);
  114. $expire = substr($data, 0, 10);
  115. $data = substr($data, 10);
  116. if($expire > 0 && $expire < time()) {
  117. return '';
  118. }
  119. $len = strlen($data);
  120. $l = strlen($key);
  121. $char = $str = '';
  122. for ($i = 0; $i < $len; $i++) {
  123. if ($x == $l) $x = 0;
  124. $char .= substr($key, $x, 1);
  125. $x++;
  126. }
  127. for ($i = 0; $i < $len; $i++) {
  128. if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
  129. $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
  130. }else{
  131. $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
  132. }
  133. }
  134. return base64_decode($str);
  135. }
  136. /**
  137. * 获取拼接好的导航数据
  138. * @param string $module 所属模块
  139. * @return array
  140. */
  141. function li($module){
  142. $model=model('common/Li');
  143. $data=$model->get_li($module);
  144. $result=[];
  145. foreach($data as $k=>$v){
  146. if($v['li_up']==0){
  147. $v['li_two']=[];
  148. $result[]=$v;
  149. unset($data[$k]);
  150. }
  151. }
  152. foreach($result as $key=>$val){
  153. foreach($data as $k=>$v){
  154. if($val['id']==$v['li_up']){
  155. $result[$key]['li_two'][]=$v;
  156. }
  157. }
  158. }
  159. return $result;
  160. }
  161. /**
  162. * 获取单个标题名
  163. * @param $id
  164. * @return mixed
  165. */
  166. function get_li_title($id){
  167. $model=model('common/Li');
  168. $data=$model->field('li_title')->where(['id'=>$id])->find();
  169. return $data['li_title'];
  170. }
  171. function get_li_title_array(){
  172. $model=model('common/Li');
  173. $data=$model->field('id,li_title')->select();
  174. $result=[];
  175. foreach($data as $k=>$v){
  176. $result[$v['id']]=$v['li_title'];
  177. }
  178. $result[0]='其他';
  179. return $result;
  180. }
  181. function now_time(){
  182. return $_SERVER['REQUEST_TIME'];
  183. }
  184. /**
  185. * 对象转数组
  186. * @param array $data
  187. * @return array
  188. */
  189. function toArray($data=[]){
  190. $result=[];
  191. foreach ($data as $k=>$v){
  192. $result[$k]=$v->toArray();
  193. }
  194. return $result;
  195. }
  196. /**
  197. * 检测验证码
  198. * @param $verify 验证码
  199. * @param $mobile 手机号码
  200. * @param $type 类型 1注册 2忘记密码
  201. * @param $expired_time 失效时间 秒
  202. */
  203. function verify($verify,$mobile,$type,$expired_time){
  204. $model=model('common/sms');
  205. $data=$model->where(['mobile'=>$mobile])->find();
  206. if(!empty($data)){
  207. $data=$data->toArray();
  208. if($type == 1){
  209. $code=$data['reg_code'];
  210. $time=$data['reg_time'];
  211. }else{
  212. $code=$data['pw_code'];
  213. $time=$data['pw_time'];
  214. }
  215. if($verify != $code){
  216. json_send([],40025,0);
  217. }
  218. if((now_time()-$time)>= $expired_time){
  219. json_send([],40024,0);
  220. }
  221. }else{
  222. json_send([],40024,0);
  223. }
  224. }
  225. /**
  226. * 清除验证码
  227. * @param $mobile
  228. * @param $type
  229. */
  230. function clear_verify($mobile,$type){
  231. $model=model('common/sms');
  232. if($type == 1){
  233. $data['reg_code']=0;
  234. $data['reg_time']=0;
  235. }else{
  236. $data['pw_code']=0;
  237. $data['pw_time']=0;
  238. }
  239. $model->save($data,['mobile'=>$mobile]);
  240. }
  241. /**
  242. * 二维数组键名重命名
  243. * @param array $data 二维数组 原始数据
  244. * @param array $array 一维数组 key为需要替换的名称 val为替换之后的名称
  245. * @return array
  246. */
  247. function rename_arrays($data=[],$array=[]){
  248. foreach ($data as $k=>$v){
  249. foreach ($v as $kk=>$vv){
  250. foreach ($array as $key=>$value){
  251. if($kk == $key){
  252. $data[$k][$value]=$vv;
  253. unset($data[$k][$kk]);
  254. }
  255. }
  256. }
  257. // foreach ($array as $key=>$value){
  258. // if($v[$key]){
  259. // $data[$k][$value]=$v[$key];
  260. // unset($data[$k][$key]);
  261. // }
  262. // }
  263. }
  264. return $data;
  265. }
  266. /**
  267. * 一维数组键名重命名
  268. * @param array $data 一维数组 原始数据
  269. * @param array $array 一维数组 键名为需要替换的名称 键值为替换之后的名称
  270. * @return array
  271. */
  272. function rename_array($data=[],$array=[]){
  273. foreach ($data as $k=>$v){
  274. foreach ($array as $key=>$value){
  275. if($k == $key){
  276. $data[$value]=$v;
  277. unset($data[$k]);
  278. }
  279. }
  280. }
  281. return $data;
  282. }
  283. /**
  284. * @param $url [请求的URL地址]
  285. * @param bool $params [请求的参数]
  286. * @param int $ispost [是否采用POST形式]
  287. * @return bool|mixed
  288. */
  289. function juhecurl($url,$params=false,$ispost=0){
  290. $httpInfo = array();
  291. $ch = curl_init();
  292. curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
  293. curl_setopt( $ch, CURLOPT_USERAGENT , 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22' );
  294. curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 30 );
  295. curl_setopt( $ch, CURLOPT_TIMEOUT , 30);
  296. curl_setopt( $ch, CURLOPT_RETURNTRANSFER , true );
  297. if( $ispost )
  298. {
  299. curl_setopt( $ch , CURLOPT_POST , true );
  300. curl_setopt( $ch , CURLOPT_POSTFIELDS , $params );
  301. curl_setopt( $ch , CURLOPT_URL , $url );
  302. }
  303. else
  304. {
  305. if($params){
  306. curl_setopt( $ch , CURLOPT_URL , $url.'?'.$params );
  307. }else{
  308. curl_setopt( $ch , CURLOPT_URL , $url);
  309. }
  310. }
  311. $response = curl_exec( $ch );
  312. if ($response === FALSE) {
  313. //echo "cURL Error: " . curl_error($ch);
  314. return false;
  315. }
  316. $httpCode = curl_getinfo( $ch , CURLINFO_HTTP_CODE );
  317. $httpInfo = array_merge( $httpInfo , curl_getinfo( $ch ) );
  318. curl_close( $ch );
  319. return $response;
  320. }
  321. /**
  322. * 返回随机颜色
  323. * @return mixed
  324. */
  325. function color(){
  326. $color=[
  327. 'bg-maroon',
  328. 'bg-purple',
  329. 'bg-navy',
  330. 'bg-orange',
  331. 'bg-olive',
  332. 'bg-aqua',
  333. 'bg-green',
  334. 'bg-yellow',
  335. 'bg-red',
  336. 'btn-info',
  337. 'btn-primary',
  338. ];
  339. return $color[array_rand($color)];
  340. }
  341. /**
  342. * 获取项目模块
  343. * @param $project_id
  344. * @return array|bool
  345. */
  346. function project_module($project_id){
  347. $model=model('common/ProjectModule');
  348. $data=$model->where(['project_id'=>$project_id])->order('id desc')->select();
  349. if($data){
  350. return toArray($data);
  351. }else{
  352. return false;
  353. }
  354. }
  355. /**
  356. * 获取项目分类
  357. * @param $project_module_id
  358. * @return array|bool
  359. */
  360. function project_cate($project_module_id){
  361. $model=model('common/ProjectCate');
  362. $data=$model->where(['project_module_id'=>$project_module_id])->select();
  363. if($data){
  364. return toArray($data);
  365. }else{
  366. return false;
  367. }
  368. }
  369. /**
  370. * 获取API列表
  371. * @param $project_cate_id
  372. * @return array|bool
  373. */
  374. function project_api($project_cate_id){
  375. $model=model('common/ProjectApi');
  376. $data=$model->field('id,api_name')->where(['project_cate_id'=>$project_cate_id])->select();
  377. if($data){
  378. return toArray($data);
  379. }else{
  380. return [];
  381. }
  382. }
  383. /**
  384. * 获取api详情
  385. * @param $id
  386. * @return array|bool
  387. */
  388. function api_wiki($id){
  389. $model=model('common/ProjectApi');
  390. $join=[
  391. ['project_url pu','pu.id = a.project_url_id','left'],
  392. ];
  393. $data=$model
  394. ->field('a.*,pu.url_domain')
  395. ->alias('a')
  396. ->join($join)
  397. ->where(['a.id'=>$id])
  398. ->find();
  399. if($data){
  400. return $data->toArray();
  401. }else{
  402. return [];
  403. }
  404. }
  405. /**
  406. * 项目域名表
  407. * @param $project_id
  408. * @return array
  409. */
  410. function project_url($project_id){
  411. $model=model('common/ProjectUrl');
  412. $data=$model->where(['project_id'=>$project_id])->select();
  413. if($data){
  414. return toArray($data);
  415. }else{
  416. return [];
  417. }
  418. }
  419. /**
  420. * 请求类型
  421. * @return array
  422. */
  423. function request_data(){
  424. $model=model('common/RequestType');
  425. $data=$model->select();
  426. if($data){
  427. return toArray($data);
  428. }else{
  429. return [];
  430. }
  431. }
  432. function request_data_id($request_id){
  433. $data=request_data();
  434. $return='未知';
  435. foreach ($data as $k=>$v){
  436. if($v['id']==$request_id){
  437. $return=$v['type_name'];
  438. break;
  439. }
  440. }
  441. return $return;
  442. }
  443. /**
  444. * 数据类型
  445. * @return array
  446. */
  447. function data_type(){
  448. $model=model('common/DateType');
  449. $data=$model->select();
  450. if($data){
  451. return toArray($data);
  452. }else{
  453. return [];
  454. }
  455. }
  456. function data_type_id($type_id){
  457. $data=data_type();
  458. $return='未知';
  459. foreach ($data as $k=>$v){
  460. if($v['id']==$type_id){
  461. $return=$v['type_name'];
  462. break;
  463. }
  464. }
  465. return $return;
  466. }
  467. /**
  468. * 返回指定格式json
  469. * @param array $data 返回数据
  470. * @param int $code 返回码
  471. * @param int $status 状态 默认1=成功 0=失败
  472. * @param string $token
  473. * @param mixed $backup 备注
  474. * @return string
  475. */
  476. function json_send($data=[],$code=1,$status=1,$token='',$backup=''){
  477. $arr=[
  478. 'header' => [
  479. 'status' => $status,//状态
  480. 'info' => code_val($code,$backup),//操作信息
  481. 'code' => $code,
  482. 'token' => $token,
  483. 'server_time' => now_time(),//服务器时间
  484. ],
  485. 'body' => [
  486. 'data' => $data,//具体数据
  487. 'backup'=> $backup,//备注
  488. ],
  489. ];
  490. header("Content-type: text/json; charset=utf-8");
  491. header("Content-type: application/json; charset=utf-8");
  492. echo json_encode($arr,JSON_UNESCAPED_UNICODE);
  493. exit;
  494. }
  495. /**
  496. * @param $k
  497. * @param string $error
  498. * @return mixed|string
  499. */
  500. function code_val($k,$error=''){
  501. if(is_array($k)){//登陆自动验证失败时返回的是数组
  502. return $k[0];//返回失败错误信息
  503. }else{
  504. $return = [
  505. '-1' => '系统繁忙,请重试!',
  506. '1' => '请求成功!',
  507. '40000' => '请求失败!',
  508. '40001' => '系统繁忙,请重试!',
  509. '40002' => '登陆失败,用户不存在!',
  510. '40003' => '登陆失败,密码错误!',
  511. '40004' => '登陆失败,未知状态!',
  512. '40005' => '登陆失败,用户被禁用!',
  513. '40006' => '登陆失败,账号已被删除!',
  514. '40007' => '登陆失败,账号已停用!',
  515. '40008' => '验证失败,请重新登陆!',
  516. '40009' => '手机号码必须!',
  517. '40010' => '密码必须!',
  518. '40011' => '手机已注册!',
  519. '40012' => '密码过短!',
  520. '40013' => '非法空间!',
  521. '40014' => '短信发送失败!'.$error,
  522. '40015' => '短信已经发送,请注意查看手机!',
  523. '40016' => '手机号码必须!',
  524. '40017' => '密码必须',
  525. '40018' => '确认密码必须!',
  526. '40019' => '确认密码不一致',
  527. '40020' => '验证码必须',
  528. '40021' => '手机格式不正确',
  529. '40022' => '密码请大于6位',
  530. '40023' => '注册失败',
  531. '40024' => '验证码失效,请重新获取',
  532. '40025' => '验证码错误',
  533. '40026' => '手机尚未注册',
  534. '40027' => '无此用户',
  535. '40028' => '无此项目',
  536. '40029' => '一天只能点赞一次哦',
  537. '40030' => '点赞失败',
  538. ];
  539. if(empty($return[$k])){
  540. return '未知错误!';
  541. }else{
  542. return $return[$k];
  543. }
  544. }
  545. }