common.php 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322
  1. <?php
  2. use think\facade\App;
  3. /**
  4. * @title :
  5. * @desc :
  6. * @Author : Rock
  7. * @Date : 2023-05-12 10:14:33
  8. */
  9. use think\facade\Db;
  10. use think\facade\Event;
  11. use app\common\model\base\config\Systemconfig;
  12. define('STATUS_NAME','code');
  13. define('MSG_NAME','msg');
  14. define('THINK_VERSION', '6.0.3');
  15. define('THINK_START_TIME', microtime(true));
  16. define('THINK_START_MEM', memory_get_usage());
  17. define('EXT', '.php');
  18. define('DS', DIRECTORY_SEPARATOR);
  19. defined('THINK_PATH') or define('THINK_PATH', App::getThinkPath());
  20. define('LIB_PATH', THINK_PATH . 'library' . DS);
  21. define('CORE_PATH', LIB_PATH . 'think' . DS);
  22. define('TRAIT_PATH', LIB_PATH . 'traits' . DS);
  23. defined('APP_PATH') or define('APP_PATH', App::getAppPath());
  24. defined('ROOT_PATH') or define('ROOT_PATH', App::getRootPath());
  25. defined('EXTEND_PATH') or define('EXTEND_PATH', ROOT_PATH . 'extend' . DS);
  26. defined('VENDOR_PATH') or define('VENDOR_PATH', ROOT_PATH . 'vendor' . DS);
  27. defined('RUNTIME_PATH') or define('RUNTIME_PATH', App::getRuntimePath());
  28. defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log' . DS);
  29. defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH . 'cache' . DS);
  30. defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH . 'temp' . DS);
  31. defined('CONF_PATH') or define('CONF_PATH', APP_PATH); // 配置文件目录
  32. defined('CONF_EXT') or define('CONF_EXT', EXT); // 配置文件后缀
  33. defined('ENV_PREFIX') or define('ENV_PREFIX', 'PHP_'); // 环境变量的配置前缀
  34. defined('WEBURL') or define('WEBURL',!empty($_SERVER['REQUEST_SCHEME'])?$_SERVER['REQUEST_SCHEME']."://".$_SERVER['HTTP_HOST']:"https://".$_SERVER['HTTP_HOST']);
  35. if(!function_exists('Result')){
  36. /**
  37. * @title: 数组形式返回状态
  38. * @desc: 描述
  39. * @param {*} $code
  40. * @param {*} $msg
  41. * @param {*} $data
  42. * @param {*} $extend
  43. * @return {*}
  44. * @author: Rock
  45. * @method: POST
  46. * @Date: 2023-05-12 15:46:49
  47. */
  48. function Result($code,$msg,$data=null,$extend=[]){
  49. return [STATUS_NAME=>$code,MSG_NAME=>$msg,'data'=>$data,'extend'=>$extend];
  50. }
  51. }
  52. if(!function_exists('res')){
  53. /**
  54. * @title: json格式返回结果
  55. * @desc: 描述
  56. * @param {*} $code
  57. * @param {*} $msg
  58. * @param {*} $data
  59. * @param {*} $extend
  60. * @return {*}
  61. * @author: Rock
  62. * @method: POST
  63. * @Date: 2023-05-12 15:48:22
  64. */
  65. function res($code,$msg,$data=[],$extend=[]){
  66. return json([STATUS_NAME=>$code,MSG_NAME=>$msg,'data'=>$data,'extend'=>$extend]);
  67. }
  68. }
  69. if(!function_exists('pageRes')){
  70. /**
  71. * @title: json格式返回分页结果
  72. * @desc: 描述
  73. * @param {*} $code
  74. * @param {*} $msg
  75. * @param {*} $totalcount
  76. * @param {*} $data
  77. * @param {*} $extend
  78. * @return {*}
  79. * @author: Rock
  80. * @method: POST
  81. * @Date: 2023-05-12 15:49:28
  82. */
  83. function pageRes($code,$msg,$totalcount=0,$data=[],$extend=[]){
  84. return json([STATUS_NAME=>$code,MSG_NAME=>$msg,'totalCount'=>$totalcount,'data'=>$data,'extend'=>$extend]);
  85. }
  86. }
  87. if(!function_exists('encrypt')){
  88. /**
  89. * @title: 通用密码加密
  90. * @desc: 描述
  91. * @param {*} $safecode
  92. * @param {*} $password
  93. * @return {*}
  94. * @author: Rock
  95. * @method: POST
  96. * @Date: 2023-05-12 15:52:35
  97. */
  98. function encrypt($safecode,$password){
  99. return base64_encode(md5(md5($safecode).md5($password)));
  100. }
  101. }
  102. if(!function_exists('CheckEncrypt')){
  103. /**
  104. * @title: 通用密码校验
  105. * @desc: 描述
  106. * @param {*} $safecode
  107. * @param {*} $password
  108. * @param {*} $ciphertext
  109. * @return {*}
  110. * @author: Rock
  111. * @method: POST
  112. * @Date: 2023-05-12 15:53:17
  113. */
  114. function CheckEncrypt($safecode,$password,$ciphertext){
  115. $check_ciphertext=base64_encode(md5(md5($safecode).md5($password)));
  116. if($check_ciphertext==$ciphertext){
  117. return true;
  118. }else{
  119. return false;
  120. }
  121. }
  122. }
  123. if(!function_exists('HiddenMobile')){
  124. /**
  125. * @title: 隐藏手机号部分数字
  126. * @desc: 描述
  127. * @param {*} $mobile
  128. * @return {*}
  129. * @author: Rock
  130. * @method: POST
  131. * @Date: 2023-05-12 16:00:19
  132. */
  133. function HiddenMobile($mobile){
  134. return substr_replace($mobile,'*****',3,4);
  135. }
  136. }
  137. if(!function_exists('HiddenIdcard')){
  138. /**
  139. * @title: 隐藏身份证部分字符
  140. * @desc: 描述
  141. * @param {*} $Idcard
  142. * @return {*}
  143. * @author: Rock
  144. * @method: POST
  145. * @Date: 2023-05-12 16:01:04
  146. */
  147. function HiddenIdcard($Idcard){
  148. return substr_replace($Idcard,'************',4,12);
  149. }
  150. }
  151. if(!function_exists('str_prefix')){
  152. /**
  153. * @title: 在字符串前生成指定数量的字符
  154. * @desc: 若规定生成后字符串的长度,可使用PHP函数str_pad
  155. * @param {string} {str} {} {待补齐的字符串}
  156. * @param {int} {n} {} {补齐的数量}
  157. * @param {string} {char} {} {补齐的字符}
  158. * @return {*}
  159. * @author: Rock
  160. * @method: POST
  161. * @Date: 2023-05-12 16:02:37
  162. */
  163. function str_prefix($str, $n=1, $char=" "){
  164. for ($x=0;$x<$n;$x++){$str = $char.$str;}
  165. return $str;
  166. }
  167. }
  168. if(!function_exists('str_suffix')){
  169. /**
  170. * @title: 在字符串后生成指定数量的字符
  171. * @desc: 若规定生成后字符串的长度,可使用PHP函数str_pad
  172. * @param {string} {str} {} {待补齐的字符串}
  173. * @param {int} {n} {} {补齐的数量}
  174. * @param {string} {char} {} {补齐的字符}
  175. * @return {*}
  176. * @author: Rock
  177. * @method: POST
  178. * @Date: 2023-05-12 16:04:06
  179. */
  180. function str_suffix($str, $n=1, $char=" "){
  181. for ($x=0;$x<$n;$x++){$str = $str.$char;}
  182. return $str;
  183. }
  184. }
  185. if(!function_exists('ClearHtml')){
  186. /**
  187. * @title: 清除字符串中的html标记
  188. * @desc: 描述
  189. * @param {*} $str
  190. * @return {*}
  191. * @author: Rock
  192. * @method: POST
  193. * @Date: 2023-05-12 16:07:23
  194. */
  195. function ClearHtml($str) {
  196. $str = strip_tags($str);
  197. $str = trim($str);//首先去掉头尾空格
  198. $str = preg_replace('/\s(?=\s)/', '', $str);//接着去掉两个空格以上的
  199. $str = preg_replace('/[\n\r\t]/', ' ', $str);//最后将非空格替换为一个空格
  200. return $str;
  201. }
  202. }
  203. if(!function_exists('GetRandStr')){
  204. /**
  205. * @title: 获取指定长度的随机字符串(包含英文大小写及数字)
  206. * @desc: 描述
  207. * @param {*} $length
  208. * @return {*}
  209. * @author: Rock
  210. * @method: POST
  211. * @Date: 2023-05-12 17:05:34
  212. */
  213. function GetRandStr($length = 6) {
  214. $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  215. $random_str = '';
  216. for ($i = 0; $i < $length; $i++) {
  217. $random_str .= $chars[mt_rand(0, strlen($chars) - 1)];
  218. }
  219. return $random_str;
  220. }
  221. }
  222. if(!function_exists('GetRandStrNotNum')){
  223. /**
  224. * @title: 获取指定长度的随机字符串(包含英文大小写)
  225. * @desc: 描述
  226. * @param {*} $length
  227. * @return {*}
  228. * @author: Rock
  229. * @method: POST
  230. * @Date: 2023-05-12 17:06:39
  231. */
  232. function GetRandStrNotNum($length = 6) {
  233. $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  234. $random_str = '';
  235. for ($i = 0; $i < $length; $i++) {
  236. $random_str .= $chars[mt_rand(0, strlen($chars) - 1)];
  237. }
  238. return $random_str;
  239. }
  240. }
  241. if(!function_exists('s')){
  242. /**
  243. * @title: 格式化输出变量
  244. * @desc: 描述
  245. * @param {*} $val
  246. * @return {*}
  247. * @author: Rock
  248. * @method: POST
  249. * @Date: 2023-05-12 17:09:06
  250. */
  251. function s($val){
  252. echo "<pre>";
  253. if(is_array($val)){
  254. print_r($val);
  255. }elseif(is_object($val)){
  256. var_dump($val);
  257. }else{
  258. echo $val;
  259. }
  260. echo "</pre>";
  261. }
  262. }
  263. if(!function_exists('IsUTF8')){
  264. /**
  265. * @title: 检测字符串是不是UTF-8的字符集
  266. * @desc: 描述
  267. * @param {*} $string
  268. * @return {*}
  269. * @author: Rock
  270. * @method: POST
  271. * @Date: 2023-05-12 17:10:26
  272. */
  273. function IsUTF8($string) {
  274. return preg_match('%^(?:
  275. [\x09\x0A\x0D\x20-\x7E] # ASCII
  276. | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
  277. | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
  278. | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
  279. | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
  280. | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
  281. | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
  282. | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
  283. )*$%xs', $string);
  284. }
  285. }
  286. if(!function_exists('NumToChina')){
  287. /**
  288. * @title: 阿拉伯数字转大写中文
  289. * @desc: 描述
  290. * @param {string} {num} {} {待转换的数字}
  291. * @param {boolean} {type} {true} {是否大写中文}
  292. * @param {boolean} {mode} {true} {是否去除前面的0}
  293. * @return {*}
  294. * @author: Rock
  295. * @method: POST
  296. * @Date: 2023-05-12 17:11:13
  297. */
  298. function NumToChina($num,$type=true, $mode = true) {
  299. if($type){
  300. $char = array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');
  301. $dw = array('','拾','佰','仟','','万','亿','兆');
  302. $dec = '點';
  303. }else{
  304. $char = array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
  305. $dw = array('', '十', '百', '千', '', '万', '亿', '兆');
  306. $dec = '点';
  307. }
  308. $retval = '';
  309. if ($mode) {
  310. preg_match_all('/^0*(\d*)\.?(\d*)/', $num, $ar);
  311. } else {
  312. preg_match_all('/(\d*)\.?(\d*)/', $num, $ar);
  313. }
  314. if ($ar[2][0] != '') {
  315. $retval = $dec . NumToChina($ar[2][0],$type, false);//如果有小数,先递归处理小数
  316. }
  317. if ($ar[1][0] != '') {
  318. $str = strrev($ar[1][0]);
  319. for ($i = 0; $i < strlen($str); $i++) {
  320. $out[$i] = $char[$str[$i]];
  321. if ($mode) {
  322. $out[$i] .= $str[$i] != '0' ? $dw[$i % 4] : '';
  323. if (@$str[$i] + @$str[$i - 1] == 0) {
  324. $out[$i] = '';
  325. }
  326. if ($i % 4 == 0) {
  327. $out[$i] .= $dw[4 + floor($i / 4)];
  328. }
  329. }
  330. }
  331. $retval = join('', array_reverse($out)) . $retval;
  332. }
  333. return $retval;
  334. }
  335. }
  336. if(!function_exists('moneyToChina')){
  337. /**
  338. * @title: 数字金额转大写
  339. * @desc: 描述
  340. * @param {*} $money
  341. * @return {*}
  342. * @author: Rock
  343. * @method: POST
  344. * @Date: 2023-05-13 10:33:07
  345. */
  346. function moneyToChina($money)
  347. {
  348. $txt = NumToChina($money);
  349. $result = '';
  350. $txtAry = explode('點',$txt);
  351. //整数部分
  352. $partA = $txtAry[0];
  353. $partALen = mb_strlen($partA,'utf8');
  354. for($i=0;$i<$partALen;$i++){
  355. $k = mb_substr($partA,$i,1);
  356. $w = mb_substr($partA,$i+1,1);
  357. if($k!='零' || !in_array($w,['拾','佰','仟','万','亿','兆',''])){
  358. $result.=$k;
  359. }
  360. }
  361. $result .= '圆';
  362. //小数部分
  363. $partB = $txtAry[1]??'';
  364. $partBLen = mb_strlen($partB,'utf8');
  365. if($partB==str_repeat('零',$partBLen)){
  366. $partB = '';
  367. }
  368. if(empty($partB)){
  369. $result.='整';
  370. return $result;
  371. }
  372. for($i=0;$i<3;$i++){
  373. $k = mb_substr($partB,$i,1);
  374. $w = mb_substr($partB,$i+1,1);
  375. if($k=='零' && $w=='零'){
  376. $result.='零';
  377. $i++;
  378. }elseif($k!='零' && $k!=''){
  379. if(0==$i){
  380. $result.=$k.'角';
  381. }elseif(1==$i){
  382. $result.=$k.'分';
  383. }elseif(2==$i){
  384. $result.=$k.'厘';
  385. }
  386. }elseif($w!='零' && $w!=''){
  387. $result.=$k;
  388. }
  389. }
  390. return $result;
  391. }
  392. }
  393. if(!function_exists('WLog')){
  394. /**
  395. * @title: 快速写日志
  396. * @desc: 文件存储日志
  397. * @param {*} $LogFileName
  398. * @param {*} $info
  399. * @return {*}
  400. * @author: Rock
  401. * @method: POST
  402. * @Date: 2023-05-13 10:34:59
  403. */
  404. function WLog($LogFileName, $info = "") {
  405. $TimeName = date("Y-m-d");
  406. $LogFilePath = RUNTIME_PATH . 'developer_log' .DS . $LogFileName .DS. $TimeName . ".log";
  407. if(!is_dir(dirname($LogFilePath))){
  408. mkdir(dirname($LogFilePath),0777,true);
  409. }
  410. if(!is_string($info)){
  411. $info = json_encode($info,JSON_UNESCAPED_UNICODE);
  412. }
  413. $Countent = "[" . date('Y-m-d H:i:s') . "]-INFO:" . $info . "\r\n";
  414. return file_put_contents($LogFilePath, $Countent, FILE_APPEND);
  415. }
  416. }
  417. if(!function_exists('slog') && class_exists('\app\common\model\base\Systemlog')){
  418. /**
  419. * @title: 系统日志
  420. * @desc: 数据表存储日志
  421. * @param {*} $result
  422. * @param {*} $remark
  423. * @return {*}
  424. * @author: Rock
  425. * @method: POST
  426. * @Date: 2023-05-13 10:36:18
  427. */
  428. function slog($result = 1,$remark=""){
  429. return \app\common\model\base\Systemlog::log($result,$remark);
  430. }
  431. }
  432. if(!function_exists('ClearNullArray')){
  433. /**
  434. * @title: 删除数组中的空字符串元素
  435. * @desc: 注意区别系统函数array_filter
  436. * @param {*} $arr
  437. * @return {*}
  438. * @author: Rock
  439. * @method: POST
  440. * @Date: 2023-05-13 10:42:53
  441. */
  442. function ClearNullArray($arr) {
  443. $l = array();
  444. foreach ($arr as $k => $v) {
  445. if ($v !== "") {
  446. if (is_array($v)) {
  447. $l[$k] = ClearNullArray($v);
  448. } else {
  449. $l[$k] = $v;
  450. }
  451. }
  452. }
  453. return $l;
  454. }
  455. }
  456. if(!function_exists('GetIP')){
  457. /**
  458. * @title: 获取当前请求的IP地址
  459. * @desc: 描述
  460. * @return {*}
  461. * @author: Rock
  462. * @method: POST
  463. * @Date: 2023-05-13 10:44:20
  464. */
  465. function GetIP() {
  466. static $ip = NULL;
  467. if ($ip !== NULL)
  468. return $ip;
  469. if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  470. $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
  471. $pos = array_search('unknown', $arr);
  472. if (false !== $pos)
  473. unset($arr[$pos]);
  474. $ip = trim($arr[0]);
  475. } else if (isset($_SERVER['HTTP_CLIENT_IP'])) {
  476. $ip = $_SERVER['HTTP_CLIENT_IP'];
  477. } else if (isset($_SERVER['REMOTE_ADDR'])) {
  478. $ip = $_SERVER['REMOTE_ADDR'];
  479. }
  480. //IP地址合法验证
  481. $ip = (false !== ip2long($ip)) ? $ip : '0.0.0.0';
  482. return $ip;
  483. }
  484. }
  485. if(!function_exists('GetRealSize')){
  486. /**
  487. * @title: 数据转换直观大小
  488. * @desc: 描述
  489. * @param {*} $size
  490. * @return {*}
  491. * @author: Rock
  492. * @method: POST
  493. * @Date: 2023-05-13 10:49:25
  494. */
  495. function GetRealSize($size){
  496. $kb = 1024; // Kilobyte
  497. $mb = 1024 * $kb; // Megabyte
  498. $gb = 1024 * $mb; // Gigabyte
  499. $tb = 1024 * $gb; // Terabyte
  500. $res = "";
  501. switch(true){
  502. case $size < $kb:
  503. $res = $size.'B';break;
  504. case $size < $mb:
  505. $res = round($size/$kb,2).'KB';break;
  506. case $size < $gb:
  507. $res = round($size/$mb,2).'MB';break;
  508. case $size < $tb:
  509. $res = round($size/$gb,2).'GB';break;
  510. default:
  511. $res = round($size/$tb,2).'TB';break;
  512. }
  513. return $res;
  514. }
  515. }
  516. if(!function_exists('GetSizeToBit')){
  517. /**
  518. * @title: 讲数据大小转换为直接大小
  519. * @desc: 描述
  520. * @param {*} $filesize
  521. * @return {*}
  522. * @author: Rock
  523. * @method: POST
  524. * @Date: 2023-05-13 11:13:16
  525. */
  526. function GetSizeToBit($filesize){
  527. $filesize=strtolower($filesize);
  528. $int_val=intval($filesize);
  529. if(strpos($filesize,'kb')!==false){
  530. return $int_val*1024;
  531. }elseif(strpos($filesize,'mb')!==false){
  532. return $int_val*1024*1024;
  533. }elseif(strpos($filesize,'gb')!==false){
  534. return $int_val*1024*1024*1024;
  535. }elseif(strpos($filesize,'tb')!==false){
  536. return $int_val*1024*1024*1024*1024;
  537. }elseif(strpos($filesize,'k')!==false){
  538. return $int_val*1024;
  539. }elseif(strpos($filesize,'m')!==false){
  540. return $int_val*1024*1024;
  541. }elseif(strpos($filesize,'g')!==false){
  542. return $int_val*1024*1024*1024;
  543. }elseif(strpos($filesize,'t')!==false){
  544. return $int_val*1024*1024*1024*1024;
  545. }else{
  546. return $int_val;
  547. }
  548. }
  549. }
  550. if(!function_exists('GetDirSize')){
  551. /**
  552. * @title: 获取文件夹大小
  553. * @desc: 描述
  554. * @param {*} $dir
  555. * @return {*}
  556. * @author: Rock
  557. * @method: POST
  558. * @Date: 2023-05-13 11:31:03
  559. */
  560. function GetDirSize($dir) {
  561. $handle = opendir($dir);
  562. $fsize = '';
  563. while (($fname = readdir($handle)) !== false) {
  564. if ($fname != '.' && $fname != '..') {
  565. if (is_dir("$dir/$fname"))
  566. $fsize += GetDirSize("$dir/$fname");
  567. else
  568. $fsize += filesize("$dir/$fname");
  569. }
  570. }
  571. closedir($handle);
  572. if (empty($fsize))
  573. $fsize = 0;
  574. return $fsize;
  575. }
  576. }
  577. if(!function_exists('AuthCode')){
  578. /**
  579. * @title: 文本加密或解密
  580. * @desc: 描述
  581. * @param {string} {string} {} {需要加密或解密的文本}
  582. * @param {string} {operation} {} {操作,DECODE=解密,其他的为加密}
  583. * @param {string} {key} {} {用于加密或解密的秘钥}
  584. * @param {int} {expiry} {} {密文有效期}
  585. * @return {*}
  586. * @author: Rock
  587. * @method: POST
  588. * @Date: 2023-05-16 14:46:05
  589. */
  590. function AuthCode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
  591. // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
  592. // 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。
  593. // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方
  594. // 当此值为 0 时,则不产生随机密钥
  595. $ckey_length = 4;// 密匙
  596. $key = md5($key ? $key : "");// 密匙a会参与加解密
  597. $keya = md5(substr($key, 0, 16));// 密匙b会用来做数据完整性验证
  598. $keyb = md5(substr($key, 16, 16));// 密匙c用于变化生成的密文
  599. $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';// 参与运算的密匙
  600. $cryptkey = $keya . md5($keya . $keyc);
  601. $key_length = strlen($cryptkey);
  602. // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性
  603. // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
  604. $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
  605. $string_length = strlen($string);
  606. $result = '';
  607. $box = range(0, 255);
  608. $rndkey = array();
  609. // 产生密匙簿
  610. for ($i = 0; $i <= 255; $i++) {
  611. $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  612. }
  613. // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上并不会增加密文的强度
  614. for ($j = $i = 0; $i < 256; $i++) {
  615. //$j是三个数相加与256取余
  616. $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  617. $tmp = $box[$i];
  618. $box[$i] = $box[$j];
  619. $box[$j] = $tmp;
  620. }
  621. // 核心加解密部分
  622. for ($a = $j = $i = 0; $i < $string_length; $i++) {
  623. //在上面基础上再加1 然后和256取余
  624. $a = ($a + 1) % 256;
  625. $j = ($j + $box[$a]) % 256;//$j加$box[$a]的值 再和256取余
  626. $tmp = $box[$a];
  627. $box[$a] = $box[$j];
  628. $box[$j] = $tmp;
  629. // 从密匙簿得出密匙进行异或,再转成字符,加密和解决时($box[($box[$a] + $box[$j]) % 256])的值是不变的。
  630. $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  631. }
  632. if ($operation == 'DECODE') {
  633. // 验证数据有效性,请看未加密明文的格式
  634. if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
  635. return substr($result, 26);
  636. } else {
  637. return '';
  638. }
  639. } else {
  640. // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
  641. // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
  642. return $keyc . str_replace('=', '', base64_encode($result));
  643. }
  644. }
  645. }
  646. if(!function_exists('Auto_Charset')){
  647. /**
  648. * @title: 文本的字符集转换
  649. * @desc: 描述
  650. * @param {string} {fContents} {} {待转换的文本}
  651. * @param {string} {from} {} {文本的原字符集}
  652. * @param {string} {to} {} {转换后的字符集}
  653. * @return {*}
  654. * @author: Rock
  655. * @method: POST
  656. * @Date: 2023-05-16 14:51:15
  657. */
  658. function Auto_Charset($fContents, $from = 'gbk', $to = 'utf-8') {
  659. $from = strtoupper($from) == 'UTF8' ? 'utf-8' : $from;
  660. $to = strtoupper($to) == 'UTF8' ? 'utf-8' : $to;
  661. if (strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents))) {
  662. // 如果编码相同或者非字符串标量则不转换
  663. return $fContents;
  664. }
  665. if (is_string($fContents)) {
  666. if (function_exists('mb_convert_encoding')) {
  667. return mb_convert_encoding($fContents, $to, $from);
  668. } elseif (function_exists('iconv')) {
  669. return iconv($from, $to, $fContents);
  670. } else {
  671. return $fContents;
  672. }
  673. } elseif (is_array($fContents)) {
  674. foreach ($fContents as $key => $val) {
  675. $_key = Auto_Charset($key, $from, $to);
  676. $fContents[$_key] = Auto_Charset($val, $from, $to);
  677. if ($key != $_key)
  678. unset($fContents[$key]);
  679. }
  680. return $fContents;
  681. } else {
  682. return $fContents;
  683. }
  684. }
  685. }
  686. if(!function_exists('DelFile')){
  687. /**
  688. * @title: 删除非空目录
  689. * @desc: 描述
  690. * @param {string} {dir} {} {目录路径}
  691. * @param {boolean} {del_root} {true} {是否删除根目录}
  692. * @return {*}
  693. * @author: Rock
  694. * @method: POST
  695. * @Date: 2023-05-16 14:55:53
  696. */
  697. function DelFile($dir,$del_root=true) {
  698. if ($handle = opendir("$dir")) {
  699. while (false !== ($item = readdir($handle))) {
  700. if ($item != "." && $item != "..") {
  701. if (is_dir($dir.DS.$item)) {
  702. DelFile($dir.DS.$item);
  703. } else {
  704. unlink($dir.DS.$item);
  705. }
  706. }
  707. }
  708. closedir($handle);
  709. if($del_root){
  710. rmdir($dir);
  711. }
  712. }
  713. }
  714. }
  715. if(!function_exists('ScandirAll')){
  716. /**
  717. * @title: 扫描整个目录下的文件,将扫描结果以数组形式返回
  718. * @desc: 描述
  719. * @param {string} {path} {} {待扫描的目录}
  720. * @param {array} {exclude} {} {忽略的文件数组}
  721. * @return {*}
  722. * @author: Rock
  723. * @method: POST
  724. * @Date: 2023-05-16 15:06:08
  725. */
  726. function ScandirAll(string $path,array $exclude=['.gitignore']) {
  727. if(!file_exists($path)) {
  728. return [];
  729. }
  730. $files = scandir($path);
  731. $fileItem = [];
  732. foreach($files as $v) {
  733. $newPath = $path .DS . $v;
  734. if(is_dir($newPath) && $v != '.' && $v != '..') {
  735. $fileItem = array_merge($fileItem, ScandirAll($newPath));
  736. }else if(is_file($newPath)&& $v!=$exclude){
  737. $fileItem[] = $newPath;
  738. }
  739. }
  740. return $fileItem;
  741. }
  742. }
  743. if(!function_exists('getYmdHis')){
  744. /**
  745. * @title: 将秒转换为天时分秒
  746. * @desc: 描述
  747. * @param {*} $second
  748. * @return {*}
  749. * @author: Rock
  750. * @method: POST
  751. * @Date: 2022-10-14 15:27:37
  752. */
  753. function getYmdHis($second=0,$format="dHis")
  754. {
  755. $d = 0;
  756. $H = 0;
  757. $i = 0;
  758. $s = 0;
  759. if(false!==strpos($format,'d')){
  760. $d = ($second - $second % 86400) / 86400;//天
  761. $second = $second % 86400;
  762. }
  763. if(false!==strpos($format,'H')){
  764. $H = ($second - $second % 3600) / 3600;//小时
  765. $second = $second % 3600;
  766. }
  767. if(false!==strpos($format,'i')){
  768. $i = ($second - $second % 60) / 60;//分钟
  769. }
  770. if(false!==strpos($format,'s')){
  771. $s = $second % 60;// 秒
  772. }
  773. $str = '';
  774. if(!empty($d)){
  775. $str .= $d.'天';
  776. }
  777. if(!empty($H)){
  778. $str .= $H.'小时';
  779. }
  780. if(!empty($i)){
  781. $str .= $i.'分钟';
  782. }
  783. if(!empty($s)){
  784. $str .= $s.'秒';
  785. }
  786. return $str;
  787. }
  788. }
  789. /**
  790. * 复制文件夹
  791. * @param $source
  792. * @param $dest
  793. */
  794. function CopyDir($source, $dest)
  795. {
  796. if (!file_exists($dest)) mkdir($dest);
  797. $handle = opendir($source);
  798. while (($item = readdir($handle)) !== false) {
  799. if ($item == '.' || $item == '..') continue;
  800. $_source = $source . DS . $item;
  801. $_dest = $dest .DS . $item;
  802. if (is_file($_source)) copy($_source, $_dest);
  803. if (is_dir($_source)) CopyDir($_source, $_dest);
  804. }
  805. closedir($handle);
  806. }
  807. //获得文件扩展名
  808. function Get_FileExt($file){
  809. return strtolower(pathinfo($file, PATHINFO_EXTENSION));
  810. }
  811. //获得URL中的文件名
  812. function Get_FileName($file_path,$is_Ext=true){
  813. $Array=pathinfo($file_path);
  814. if($is_Ext==true){
  815. return $Array['basename'];
  816. }else{
  817. return $Array['filename'];
  818. }
  819. }
  820. //判断是否是通过手机访问
  821. function IsMobileAccess() {
  822. if (isset($_SERVER['HTTP_X_WAP_PROFILE']))//如果有HTTP_X_WAP_PROFILE则一定是移动设备
  823. return TRUE;
  824. //如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
  825. if (isset($_SERVER['HTTP_VIA'])) {
  826. //找不到为flase,否则为true
  827. return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
  828. }
  829. //判断手机发送的客户端标志,兼容性有待提高
  830. if (isset($_SERVER['HTTP_USER_AGENT'])) {
  831. $clientkeywords = array('nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu', 'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini', 'operamobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile');
  832. //从HTTP_USER_AGENT中查找手机浏览器的关键字
  833. if (preg_match('/(' . implode('|', $clientkeywords) . ')/i', strtolower($_SERVER['HTTP_USER_AGENT']))) {
  834. return TRUE;
  835. }
  836. }
  837. //协议法,因为有可能不准确,放到最后判断
  838. if (isset($_SERVER['HTTP_ACCEPT'])) {
  839. //如果只支持wml并且不支持html那一定是移动设备
  840. //如果支持wml和html但是wml在html之前则是移动设备
  841. if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
  842. return TRUE;
  843. }
  844. }
  845. return FALSE;
  846. }
  847. // 判断是否通过小程序访问
  848. function IsWxApplet(){
  849. return isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'],'MicroMessenger')!==false;
  850. }
  851. //radio、checkbox、list字段原数据解析
  852. function UnFieldData($data){
  853. $list=array_filter(explode("\n",$data));
  854. $array=array();
  855. foreach($list as $row){
  856. $fd=explode(':',$row);
  857. $array[trim($fd[1])]=trim($fd[0]);
  858. }
  859. return $array;
  860. }
  861. //截取指定长度的字符串 utf-8专用 汉字和大写字母长度算1,其它字符长度算0.5 $str 原字符串 $len 截取长度 $etc 省略字符... 截取后的字符串
  862. function ReStrLen($str, $len = 10, $etc = '...') {
  863. $restr = '';
  864. $i = 0;
  865. $n = 0.0;
  866. $strlen = strlen($str);//字符串的字节数
  867. while (($n < $len) and ($i < $strlen)) {
  868. $temp_str = substr($str, $i, 1);
  869. $ascnum = ord($temp_str); //得到字符串中第$i位字符的ASCII码
  870. //如果ASCII位高与252
  871. if ($ascnum >= 252) {
  872. $restr = $restr . substr($str, $i, 6);//根据UTF-8编码规范,将6个连续的字符计为单个字符
  873. $i = $i + 6;//实际Byte计为6
  874. $n++;//字串长度计1
  875. } else if ($ascnum >= 248) {
  876. $restr = $restr . substr($str, $i, 5);
  877. $i = $i + 5;
  878. $n++;
  879. } else if ($ascnum >= 240) {
  880. $restr = $restr . substr($str, $i, 4);
  881. $i = $i + 4;
  882. $n++;
  883. } else if ($ascnum >= 224) {
  884. $restr = $restr . substr($str, $i, 3);
  885. $i = $i + 3;
  886. $n++;
  887. } else if ($ascnum >= 192) {
  888. $restr = $restr . substr($str, $i, 2);
  889. $i = $i + 2;
  890. $n++;
  891. }
  892. //如果是大写字母 I除外
  893. else if ($ascnum >= 65 and $ascnum <= 90 and $ascnum != 73) {
  894. $restr = $restr . substr($str, $i, 1);
  895. $i = $i + 1;//实际的Byte数仍计1个
  896. $n++;//但考虑整体美观,大写字母计成一个高位字符
  897. }
  898. //%,&,@,m,w 字符按1个字符宽
  899. else if (!(array_search($ascnum, array(37, 38, 64, 109, 119)) === FALSE)) {
  900. $restr = $restr . substr($str, $i, 1);
  901. $i = $i + 1;//实际的Byte数仍计1个
  902. $n++;//但考虑整体美观,这些字条计成一个高位字符
  903. }
  904. //其他情况下,包括小写字母和半角标点符号
  905. else {
  906. $restr = $restr . substr($str, $i, 1);
  907. $i = $i + 1;//实际的Byte数计1个
  908. $n = $n + 0.5;//其余的小写字母和半角标点等与半个高位字符宽
  909. }
  910. }
  911. //超过长度时在尾处加上省略号
  912. if ($i < $strlen) {
  913. $restr = $restr . $etc;
  914. }
  915. return $restr;
  916. }
  917. //快速跳转
  918. function J($url, $msg = "") {
  919. if ($msg <> "") {
  920. $str = "<script language='javascript'>alert('" . $msg . "');document.location = '" . $url . "'</script>";
  921. } else {
  922. $str = "<script language='javascript'>document.location = '" . $url . "'</script>";
  923. }
  924. echo $str;
  925. exit();
  926. }
  927. //延时跳转
  928. function JTime($url,$time=3){
  929. echo '<meta http-equiv="refresh" content="'.$time.';url='.$url.'">';
  930. exit();
  931. }
  932. //显示信息快速条跳转
  933. function ShowMsg($msg = '', $gourl = '-1') {
  934. if ($gourl == '-1'){
  935. echo '<script>alert("' . $msg . '");history.go(-1);</script>';
  936. }else if ($gourl == '0'){
  937. echo '<script>alert("' . $msg . '");location.reload();</script>';
  938. }else{
  939. echo '<script>alert("' . $msg . '");location.href="' . $gourl . '";</script>';
  940. }
  941. exit();
  942. }
  943. //生成一个订单号
  944. function CreateOrderID(){
  945. $date=date('ymd');
  946. $order_pool_head = RUNTIME_PATH.'order';
  947. $order_pool=$order_pool_head.DS.$date.'.cache';//订单池
  948. if(file_exists($order_pool)){
  949. $list=unserialize(file_get_contents($order_pool));
  950. if(count($list)>=1){
  951. $oid=array_pop($list);
  952. file_put_contents($order_pool,serialize($list));
  953. }else{
  954. $oid=CreateOrderPool();
  955. }
  956. }else{
  957. if(!file_exists($order_pool_head)){
  958. mkdir($order_pool_head);
  959. }
  960. $fp = @fopen($order_pool, "w");
  961. fclose($fp);
  962. $oid=CreateOrderPool();
  963. }
  964. return $oid;
  965. }
  966. //创建一个订单池,并返回一个
  967. function CreateOrderPool($num=10000){
  968. $date=date('ymdHi');
  969. $date_file=date('ymd');
  970. //订单池
  971. $order_pool=RUNTIME_PATH.'order'.DS.$date_file.'.cache';
  972. $list=array();
  973. for($i=1;$i<=$num;$i++){
  974. $list[]=$date.mt_rand(10000,99999);
  975. }
  976. $list=array_unique($list);
  977. $p=array_pop($list);
  978. file_put_contents($order_pool,serialize($list));
  979. unset($list);
  980. return $p;
  981. }
  982. //清除地址信息中非正常的字符串
  983. function address_clear($str){
  984. return str_replace(array("市辖区","市辖县","省直辖行政单位"),"",$str);
  985. }
  986. function Get_Server_Base_Info(){
  987. $l[4]['name']='HTTP_HOST';
  988. $l[4]['title']='主机地址';
  989. $l[4]['value']=$_SERVER['HTTP_HOST'];
  990. $l[6]['name']='SERVER_NAME';
  991. $l[6]['title']='网站绑定域名';
  992. $l[6]['value']=$_SERVER['SERVER_NAME'];
  993. $l[7]['name']='SERVER_PORT';
  994. $l[7]['title']='网站绑定端口';
  995. $l[7]['value']=$_SERVER['SERVER_PORT'];
  996. $l[8]['name']='SERVER_SOFTWARE';
  997. $l[8]['title']='服务器软件';
  998. $l[8]['value']=$_SERVER['SERVER_SOFTWARE'];
  999. $l[9]['name']='SERVER_PROTOCOL';
  1000. $l[9]['title']='服务器协议';
  1001. $l[9]['value']=$_SERVER['SERVER_PROTOCOL'];
  1002. $l[9]['name']='PHP_VERSION';
  1003. $l[9]['title']='PHP 版本';
  1004. $l[9]['value']=PHP_VERSION;
  1005. return $l;
  1006. }
  1007. function Get_PHP_Base_Info(){
  1008. $l[1]['name']='asp_tags';
  1009. $l[1]['title']='ASP标签';
  1010. $l[1]['value']=(ini_get('asp_tags')==1?'支持':'不支持');
  1011. $l[2]['name']='max_execution_time';
  1012. $l[2]['title']='最大执行时间';
  1013. $l[2]['value']=ini_get('max_execution_time').'秒';
  1014. $l[3]['name']='max_input_time';
  1015. $l[3]['title']='最大输入时间';
  1016. $l[3]['value']=ini_get('max_input_time').'秒';
  1017. $l[4]['name']='memory_limit';
  1018. $l[4]['title']='内存使用上限';
  1019. $l[4]['value']=ini_get('memory_limit');
  1020. $l[5]['name']='display_errors';
  1021. $l[5]['title']='是否显示错误';
  1022. $l[5]['value']=(ini_get('display_errors')==1?'显示':'不显示');
  1023. $l[6]['name']='post_max_size';
  1024. $l[6]['title']='POST提交数据大小限止';
  1025. $l[6]['value']=ini_get('post_max_size');
  1026. $l[7]['name']='upload_max_filesize';
  1027. $l[7]['title']='文件上传大小限止';
  1028. $l[7]['value']=ini_get('upload_max_filesize');
  1029. $l[8]['name']='max_file_uploads';
  1030. $l[8]['title']='文件上传数量限止';
  1031. $l[8]['value']=ini_get('max_file_uploads');
  1032. $l[9]['name']='date.timezone';
  1033. $l[9]['title']='系统时间时区';
  1034. $l[9]['value']=ini_get('date.timezone');
  1035. return $l;
  1036. }
  1037. function Get_PHP_Ext_list(){
  1038. $ext_list=get_loaded_extensions();
  1039. foreach($ext_list as $k=>$v){
  1040. $ext_list[$k]=strtolower($v);
  1041. }
  1042. $name_list=array(
  1043. 'Core'=>'PHP核心',
  1044. 'bcmath'=>'高精度数学运算',
  1045. 'calendar'=>'日历',
  1046. 'ctype'=>'字符串体测函数',
  1047. 'date'=>'日期时间函数',
  1048. 'filter'=>'过滤器',
  1049. 'ereg'=>'字符串比对解析',
  1050. 'ftp'=>'FTP协议',
  1051. 'hash'=>'HASH算法',
  1052. 'iconv'=>'字符集转换',
  1053. 'json'=>'JSON数据支持',
  1054. 'mcrypt'=>'Mcrypt加密算法',
  1055. 'SPL'=>'PHP标准库',
  1056. 'odbc'=>'开放数据库连接',
  1057. 'pcre'=>'PCRE正则',
  1058. 'Reflection'=>'反射',
  1059. 'session'=>'会话',
  1060. 'standard'=>'PHP标准',
  1061. 'mysqlnd'=>'MySQL Native 驱动',
  1062. 'tokenizer'=>'解析器',
  1063. 'zip'=>'ZIP解压',
  1064. 'zlib'=>'zlib解压',
  1065. 'libxml '=>'XML解析',
  1066. 'dom '=>'DOM 解析器',
  1067. 'PDO '=>'PDO支持',
  1068. 'bz2 '=>'bz2解压',
  1069. 'SimpleXML '=>'简单XML解析',
  1070. 'openssl '=>'安全套接字',
  1071. 'gd '=>'GD库',
  1072. 'mbstring '=>'多字节字符串支持',
  1073. 'exif '=>'EXIF信息',
  1074. 'mysql '=>'MYSQL驱动',
  1075. 'mysqli '=>'MYSQLi驱动',
  1076. 'pdo_mysql'=>'PDO MYSQL驱动',
  1077. 'PDO_ODBC'=>'PDO_ODBC驱动',
  1078. 'PDO_ODBC'=>'PDO_ODBC驱动',
  1079. 'pdo_sqlite'=>'PDO SQLite 驱动',
  1080. 'sqlite3'=>'SQLite3驱动',
  1081. 'sockets'=>'Sockets套接字',
  1082. 'gmagick'=>'Gmagick图像处理库',
  1083. 'mhash'=>'MHash离散算法'
  1084. );
  1085. foreach($name_list as $k=>$v){
  1086. $setlist[strtolower($k)]=$v;
  1087. }
  1088. $ls=array();
  1089. $i=1;
  1090. foreach($name_list as $k=>$v){
  1091. if(in_array($k,$ext_list)){
  1092. $ls[$i]['name']=$k;
  1093. $ls[$i]['title']=$v;
  1094. $ls[$i]['value']="支持";
  1095. $i++;
  1096. }
  1097. }
  1098. return $ls;
  1099. }
  1100. //配置文件管理-获取
  1101. function Get_Config($file, $name) {
  1102. $file=RUNTIME_PATH.'config'.DS.$file;
  1103. if (file_exists($file)) {
  1104. $list = unserialize(file_get_contents($file));
  1105. if (isset($list[$name])) {
  1106. return $list[$name];
  1107. } else {
  1108. return false;
  1109. }
  1110. } else {
  1111. return false;
  1112. }
  1113. }
  1114. //配置文件管理-设置
  1115. function Set_Config($file, $name, $value) {
  1116. $file=RUNTIME_PATH.'config'.DS.$file;
  1117. if (!file_exists($file)) {
  1118. file_put_contents($file, serialize(array()));
  1119. }
  1120. $list = unserialize(file_get_contents($file));
  1121. $new_arr = array($name => $value);
  1122. $new = array_merge($list, $new_arr);
  1123. if (file_put_contents($file, serialize($new))) {
  1124. return true;
  1125. } else {
  1126. return false;
  1127. }
  1128. }
  1129. //xml转换成数组
  1130. function XmlToArray( $xml ){
  1131. return (array)simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
  1132. }
  1133. //数组转换成Xml
  1134. function ToXml($arr){
  1135. $xml = "<xml>";
  1136. foreach ($arr as $key=>$val){
  1137. if (is_numeric($val)){
  1138. $xml.="<".$key.">".$val."</".$key.">";
  1139. }else{
  1140. $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
  1141. }
  1142. }
  1143. $xml.="</xml>";
  1144. return $xml;
  1145. }
  1146. //搜索并清理附件(图片)文件 1:单路径 2:多路径 3:编辑器
  1147. function ClearDocumentImages($content,$type=1){
  1148. if($type==1){
  1149. $file=PathDS(ROOT_PATH.$content);
  1150. @unlink($file);
  1151. return true;
  1152. }else if($type==2){
  1153. $List=unserialize($content);
  1154. }else if($type==3){
  1155. $preg="# src=\"(.*)\"#iUs";
  1156. preg_match_all($preg, $content,$arr);
  1157. $List=$arr[1];
  1158. }else{
  1159. return false;
  1160. }
  1161. foreach($List as $v){
  1162. if(strpos($v,'http') !==0){
  1163. @unlink(PathDS(ROOT_PATH.$v));
  1164. }
  1165. }
  1166. return true;
  1167. }
  1168. //本地写入路径 斜线自动根据win、linux平台转换 (主要用于本地文件读写操作)
  1169. function PathDS($str){
  1170. $str=str_replace("\\",DS,$str);
  1171. return str_replace("/",DS,$str);
  1172. }
  1173. //资源路径 斜线自动转换 (主要用于相路径)
  1174. function PathDS2($str){
  1175. return str_replace("\\","/",$str);
  1176. }
  1177. //判断是否是微信浏览器
  1178. function IsWeixin() {
  1179. if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {
  1180. return true;
  1181. }else{
  1182. return false;
  1183. }
  1184. }
  1185. //获得当前页面的全路径
  1186. function GetCurrentUrl(){
  1187. $current_url='http://';
  1188. if(isset($_SERVER['HTTPS'])&&$_SERVER['HTTPS']=='on'){
  1189. $current_url='https://';
  1190. }
  1191. // if($_SERVER['SERVER_PORT']!='80'){
  1192. // $current_url.=$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['REQUEST_URI'];
  1193. // }else{
  1194. $current_url.=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
  1195. // }
  1196. return $current_url;
  1197. }
  1198. //CURL异步将远程链接上的内容(图片或内容)写到本地
  1199. function PutFileFromUrlContent($url, $savefile) {
  1200. set_time_limit ( 0 );// 设置运行时间为无限制
  1201. $url = trim ( $url );
  1202. $curl = curl_init ();
  1203. curl_setopt ( $curl, CURLOPT_URL, $url );// 设置你需要抓取的URL
  1204. curl_setopt ( $curl, CURLOPT_HEADER, 0 ); // 设置header
  1205. curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 );// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
  1206. $file = curl_exec ( $curl );// 运行cURL,请求网页
  1207. curl_close ( $curl );// 关闭URL请求
  1208. $write = @fopen ( $savefile, "w" ); // 将文件写入获得的数据
  1209. if ($write == false) {
  1210. return false;
  1211. }
  1212. if (fwrite ( $write, $file ) == false) {
  1213. return false;
  1214. }
  1215. if (fclose ( $write ) == false) {
  1216. return false;
  1217. }
  1218. }
  1219. //CURL POST提交数据
  1220. function Post_Curl($data, $url, $second = 30){
  1221. try{
  1222. $data = is_string($data)?$data:http_build_query($data);
  1223. $ch = curl_init();
  1224. curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置超时
  1225. curl_setopt($ch,CURLOPT_URL, $url);
  1226. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
  1227. curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);//严格校验
  1228. // curl_setopt($ch, CURLOPT_HEADER, array('Expect:'));//设置header
  1229. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//要求结果为字符串且输出到屏幕上
  1230. curl_setopt($ch, CURLOPT_POST, TRUE);//post提交方式
  1231. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  1232. $data = curl_exec($ch);//运行curl
  1233. //返回结果
  1234. if($data){
  1235. curl_close($ch);
  1236. return $data;
  1237. } else {
  1238. $error = curl_errno($ch);
  1239. curl_close($ch);
  1240. WLog('Post_Curl_Error',"CURL出错,错误码:$error"."URL:$url");
  1241. }
  1242. }catch(Exception $e){
  1243. WLog('Post_Curl_Error',"CURL出错:".$e->getFile().'第'.$e->getLine().'行:'.$e->getMessage());
  1244. }
  1245. }
  1246. if(!function_exists('Post_Json_Curl')){
  1247. function Post_Json_Curl($jsonStr,$url,$second = 30){
  1248. try{
  1249. $jsonStr = is_string($jsonStr)?$jsonStr:json_encode($jsonStr);
  1250. $ch = curl_init();
  1251. curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置超时
  1252. curl_setopt($ch,CURLOPT_URL, $url);
  1253. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
  1254. curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);//严格校验
  1255. curl_setopt($ch, CURLOPT_HEADER, FALSE);//设置header
  1256. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//要求结果为字符串且输出到屏幕上
  1257. curl_setopt($ch, CURLOPT_POST, TRUE);//post提交方式
  1258. curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr);
  1259. curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  1260. 'Content-Type: application/json; charset=utf-8',
  1261. 'Content-Length: ' . strlen($jsonStr)
  1262. )
  1263. );
  1264. $data = curl_exec($ch);//运行curl
  1265. //返回结果
  1266. if($data){
  1267. // $RES = curl_getinfo($ch,CURLINFO_HTTP_BODY);
  1268. curl_close($ch);
  1269. return $data;
  1270. } else {
  1271. $error = curl_errno($ch);
  1272. curl_close($ch);
  1273. WLog('Post_Json_Curl_Error',"CURL出错,错误码:$error"."URL:$url");
  1274. }
  1275. }catch(Exception $e){
  1276. WLog('Post_Json_Curl_Error',"CURL出错:".$e->getFile().'第'.$e->getLine().'行:'.$e->getMessage());
  1277. }
  1278. }
  1279. }
  1280. //CURL JSON POST提交数据
  1281. function Post_Json($data, $url,$header=[]){
  1282. $options = array(
  1283. 'http' => array_merge(array(
  1284. 'method' => 'POST',
  1285. 'header' => 'Content-type:application/json; charset=utf-8',
  1286. //header 需要设置为 JSON
  1287. 'content' => $data,
  1288. 'timeout' => 60
  1289. //超时时间
  1290. ),$header)
  1291. );
  1292. $context = stream_context_create( $options );
  1293. $result = file_get_contents($url, false, $context );
  1294. return $result;
  1295. }
  1296. /**
  1297. * 根据经纬度和半径计算出范围
  1298. * @param string $lat 纬度
  1299. * @param String $lng 经度
  1300. * @param float $radius 半径
  1301. * @return Array 范围数组
  1302. */
  1303. function CalcScope($lat, $lng, $radius) {
  1304. $degree = (24901*1609)/360.0;
  1305. $dpmLat = 1/$degree;
  1306. $radiusLat = $dpmLat*$radius;
  1307. $minLat = $lat - $radiusLat; // 最小纬度
  1308. $maxLat = $lat + $radiusLat; // 最大纬度
  1309. $mpdLng = $degree*cos($lat * (pi()/180));
  1310. $dpmLng = 1 / $mpdLng;
  1311. $radiusLng = $dpmLng*$radius;
  1312. $minLng = $lng - $radiusLng; // 最小经度
  1313. $maxLng = $lng + $radiusLng; // 最大经度
  1314. /** 返回范围数组 */
  1315. $scope = array(
  1316. 'minLat' => $minLat,
  1317. 'maxLat' => $maxLat,
  1318. 'minLng' => $minLng,
  1319. 'maxLng' => $maxLng
  1320. );
  1321. return $scope;
  1322. }
  1323. /**
  1324. * 验证区域范围(计算一个点是否在一个多边形范围内)
  1325. * @param array $coordArray 区域
  1326. * @param array $point 验证点
  1327. * @return bool
  1328. */
  1329. function isPointInPolygon($coordArray, $point)
  1330. {
  1331. if(!is_array($coordArray)||!is_array($point)) return false;
  1332. $maxY = $maxX = 0;
  1333. $minY = $minX = 9999;
  1334. foreach ($coordArray as $item){
  1335. if($item['lng']>$maxX) $maxX = $item['lng'];
  1336. if($item['lng'] < $minX) $minX = $item['lng'];
  1337. if($item['lat']>$maxY) $maxY = $item['lat'];
  1338. if($item['lat'] < $minY) $minY = $item['lat'];
  1339. $vertx[] = $item['lng'];
  1340. $verty[] = $item['lat'];
  1341. }
  1342. if ($point['lng'] < $minX || $point['lng'] > $maxX || $point['lat'] < $minY || $point['lat'] > $maxY) {
  1343. return false;
  1344. }
  1345. $c = false;
  1346. $nvert=count($coordArray);
  1347. $testx=$point['lng'];
  1348. $testy=$point['lat'];
  1349. for ($i = 0, $j = $nvert-1; $i < $nvert; $j = $i++) {
  1350. if ( ( ($verty[$i]>$testy) != ($verty[$j]>$testy) )
  1351. && ($testx < ($vertx[$j]-$vertx[$i]) * ($testy-$verty[$i]) / ($verty[$j]-$verty[$i]) + $vertx[$i]) )
  1352. $c = !$c;
  1353. }
  1354. return $c;
  1355. }
  1356. /**
  1357. * 获取两个经纬度之间的距离
  1358. * @param string $lat1 纬一
  1359. * @param String $lng1 经一
  1360. * @param String $lat2 纬二
  1361. * @param String $lng2 经二
  1362. * @return float 返回两点之间的距离
  1363. */
  1364. function CalcDistance($lat1, $lng1, $lat2, $lng2) {
  1365. /** 转换数据类型为 double */
  1366. $lat1 = doubleval($lat1);
  1367. $lng1 = doubleval($lng1);
  1368. $lat2 = doubleval($lat2);
  1369. $lng2 = doubleval($lng2);
  1370. /** 以下算法是 Google 出来的,与大多数经纬度计算工具结果一致 */
  1371. $theta = $lng1 - $lng2;
  1372. $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
  1373. $dist = acos($dist);
  1374. $dist = rad2deg($dist);
  1375. $miles = $dist * 60 * 1.1515;
  1376. return ($miles * 1.609344);
  1377. }
  1378. //移除微信昵称中的emoji字符
  1379. function removeEmoji($nickname) {
  1380. $clean_text = $nickname;
  1381. // Match Emoticons
  1382. $regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u';
  1383. $clean_text = preg_replace($regexEmoticons, '', $clean_text);
  1384. // Match Miscellaneous Symbols and Pictographs
  1385. $regexSymbols = '/[\x{1F300}-\x{1F5FF}]/u';
  1386. $clean_text = preg_replace($regexSymbols, '', $clean_text);
  1387. // Match Transport And Map Symbols
  1388. $regexTransport = '/[\x{1F680}-\x{1F6FF}]/u';
  1389. $clean_text = preg_replace($regexTransport, '', $clean_text);
  1390. // Match Miscellaneous Symbols
  1391. $regexMisc = '/[\x{2600}-\x{26FF}]/u';
  1392. $clean_text = preg_replace($regexMisc, '', $clean_text);
  1393. // Match Dingbats
  1394. $regexDingbats = '/[\x{2700}-\x{27BF}]/u';
  1395. $clean_text = preg_replace($regexDingbats, '', $clean_text);
  1396. return $clean_text;
  1397. }
  1398. //计算周
  1399. function get_week($date){
  1400. //强制转换日期格式
  1401. $date_str=date('Y-m-d',strtotime($date));
  1402. //封装成数组
  1403. $arr=explode("-", $date_str);
  1404. //参数赋值-年
  1405. $year=$arr[0];
  1406. //月,输出2位整型,不够2位右对齐
  1407. $month=sprintf('%02d',$arr[1]);
  1408. //日,输出2位整型,不够2位右对齐
  1409. $day=sprintf('%02d',$arr[2]);
  1410. //时分秒默认赋值为0;
  1411. $hour = $minute = $second = 0;
  1412. //转换成时间戳
  1413. $strap = mktime($hour,$minute,$second,$month,$day,$year);
  1414. //获取数字型周几
  1415. $number_wk=date("w",$strap);
  1416. //自定义周数组
  1417. $weekArr=array("周日","周一","周二","周三","周四","周五","周六");
  1418. //获取数字对应的周
  1419. return $weekArr[$number_wk];
  1420. }
  1421. /**
  1422. * 求两个日期之间相差的天数
  1423. * (针对1970年1月1日之后,求之前可以采用泰勒公式)
  1424. * @param string $day1
  1425. * @param string $day2
  1426. * @return number
  1427. */
  1428. function diffBetweenTwoDays ($day1, $day2)
  1429. {
  1430. $second1 = strtotime($day1);
  1431. $second2 = strtotime($day2);
  1432. if ($second1 < $second2) {
  1433. $tmp = $second2;
  1434. $second2 = $second1;
  1435. $second1 = $tmp;
  1436. }
  1437. return ($second1 - $second2) / 86400;
  1438. }
  1439. //数组转换成字符串包括key
  1440. function array2string($array){
  1441. $string = [];
  1442. if($array && is_array($array)){
  1443. foreach ($array as $key=> $value){
  1444. $string[] = $key.':'.$value;
  1445. }
  1446. }
  1447. return implode(",",$string);
  1448. }
  1449. //获取输入流并把JSON转换成数组,主要用于小程序和APP数据传输接收
  1450. function get_input_stream(){
  1451. $postStr = file_get_contents("php://input");
  1452. return json_decode($postStr,true);
  1453. }
  1454. /**
  1455. * 判断当前的时分是否在指定的时间段内
  1456. * @param $start 开始时分 eg:10:30
  1457. * @param $end 结束时分 eg:15:30
  1458. * @author:mzc
  1459. * @date:2018/8/9 10:46
  1460. * @return: bool 1:在范围内,0:没在范围内
  1461. */
  1462. function checkIsBetweenTime($start,$end){
  1463. $date= date('H:i');
  1464. $curTime = strtotime($date);//当前时分
  1465. $assignTime1 = strtotime($start);//获得指定分钟时间戳,00:00
  1466. $assignTime2 = strtotime($end);//获得指定分钟时间戳,01:00
  1467. $result = 0;
  1468. if($curTime>$assignTime1&&$curTime<$assignTime2){
  1469. $result = 1;
  1470. }
  1471. return $result;
  1472. }
  1473. //php模块安装检测
  1474. function check_phpext($name){
  1475. $ext_list=get_loaded_extensions();
  1476. if(in_array($name,$ext_list)){
  1477. return true;
  1478. }else{
  1479. return false;
  1480. }
  1481. }
  1482. //检测系统数据库是否安装正常
  1483. function CheckDataBase(){
  1484. //连接数据库测试
  1485. //获得默认数据库配置
  1486. $config = config('database');
  1487. $mysql_conn=@mysqli_connect($config['hostname'],$config['username'],$config['password'],$config['database']);
  1488. if(!$mysql_conn){
  1489. J('/install','FastPHP数据库连接失败,请重新安装!');
  1490. }else{
  1491. return true;
  1492. }
  1493. }
  1494. //获得汉字的首字母-一般用于数组汉字排序
  1495. function GetFirstChar($str) {
  1496. if(empty($str)){
  1497. return '';
  1498. }
  1499. try{
  1500. $temp_str = substr($str, 0, 1);
  1501. if(ord($temp_str)>127){
  1502. $str = substr($str,0,3);
  1503. }else{
  1504. $str = $temp_str;
  1505. return $str;
  1506. $fchar = ord($str[0]);
  1507. if ($fchar >= ord("A") and $fchar <= ord("z")) return strtoupper(chr($fchar));
  1508. }
  1509. $s1 = iconv('UTF-8','gb2312//IGNORE',$str);
  1510. if(empty($s1)){
  1511. return null;
  1512. }
  1513. $s2 = iconv('gb2312','UTF-8',$s1);
  1514. if(empty($s2)){
  1515. return null;
  1516. }
  1517. }catch(\Exception $e){
  1518. halt($str);
  1519. }
  1520. $s = $s2 == $str ? $s1 : $str;
  1521. $asc = ord($s[0]) * 256 + ord($s[1])-65536;
  1522. if ($asc >= -20319 and $asc <= -20284)return "A";
  1523. if ($asc >= -20283 and $asc <= -19776)return "B";
  1524. if ($asc >= -19775 and $asc <= -19219)return "C";
  1525. if ($asc >= -19218 and $asc <= -18711)return "D";
  1526. if ($asc >= -18710 and $asc <= -18527)return "E";
  1527. if ($asc >= -18526 and $asc <= -18240)return "F";
  1528. if ($asc >= -18239 and $asc <= -17923)return "G";
  1529. if ($asc >= -17922 and $asc <= -17418)return "H";
  1530. if ($asc >= -17417 and $asc <= -16475)return "J";
  1531. if ($asc >= -16474 and $asc <= -16213)return "K";
  1532. if ($asc >= -16212 and $asc <= -15641)return "L";
  1533. if ($asc >= -15640 and $asc <= -15166)return "M";
  1534. if ($asc >= -15165 and $asc <= -14923)return "N";
  1535. if ($asc >= -14922 and $asc <= -14915)return "O";
  1536. if ($asc >= -14914 and $asc <= -14631)return "P";
  1537. if ($asc >= -14630 and $asc <= -14150)return "Q";
  1538. if ($asc >= -14149 and $asc <= -14091)return "R";
  1539. if ($asc >= -14090 and $asc <= -13319)return "S";
  1540. if ($asc >= -13318 and $asc <= -12839)return "T";
  1541. if ($asc >= -12838 and $asc <= -12557)return "W";
  1542. if ($asc >= -12556 and $asc <= -11848)return "X";
  1543. if ($asc >= -11847 and $asc <= -11056)return "Y";
  1544. if ($asc >= -11055 and $asc <= -10247)return "Z";
  1545. // 百家姓中的生僻字
  1546. $rare_arr = array(
  1547. -3652=>array('word'=>"窦",'first_char'=>'D','all_char'=>'DOU'),
  1548. -8503=>array('word'=>"奚",'first_char'=>'X','all_char'=>'XI'),
  1549. -9286=>array('word'=>"酆",'first_char'=>'F','all_char'=>'FENG'),
  1550. -7761=>array('word'=>"岑",'first_char'=>'C','all_char'=>'CEN'),
  1551. -5128=>array('word'=>"滕",'first_char'=>'T','all_char'=>'TENG'),
  1552. -9479=>array('word'=>"邬",'first_char'=>'W','all_char'=>'WU'),
  1553. -5456=>array('word'=>"臧",'first_char'=>'Z','all_char'=>'ZANG'),
  1554. -7223=>array('word'=>"闵",'first_char'=>'M','all_char'=>'MIN'),
  1555. -2877=>array('word'=>"裘",'first_char'=>'Q','all_char'=>'QIU'),
  1556. -6191=>array('word'=>"缪",'first_char'=>'M','all_char'=>'MIAO'),
  1557. -5414=>array('word'=>"贲",'first_char'=>'B','all_char'=>'BEN'),
  1558. -4102=>array('word'=>"嵇",'first_char'=>'J','all_char'=>'JI'),
  1559. -8969=>array('word'=>"荀",'first_char'=>'X','all_char'=>'XUN'),
  1560. -4938=>array('word'=>"於",'first_char'=>'Y','all_char'=>'YU'),
  1561. -9017=>array('word'=>"芮",'first_char'=>'R','all_char'=>'RUI'),
  1562. -2848=>array('word'=>"羿",'first_char'=>'Y','all_char'=>'YI'),
  1563. -9477=>array('word'=>"邴",'first_char'=>'B','all_char'=>'BING'),
  1564. -9485=>array('word'=>"隗",'first_char'=>'K','all_char'=>'WEI'),
  1565. -6731=>array('word'=>"宓",'first_char'=>'M','all_char'=>'MI'),
  1566. -9299=>array('word'=>"郗",'first_char'=>'X','all_char'=>'XI'),
  1567. -5905=>array('word'=>"栾",'first_char'=>'L','all_char'=>'LUAN'),
  1568. -4393=>array('word'=>"钭",'first_char'=>'T','all_char'=>'TOU'),
  1569. -9300=>array('word'=>"郜",'first_char'=>'G','all_char'=>'GAO'),
  1570. -8706=>array('word'=>"蔺",'first_char'=>'L','all_char'=>'LIN'),
  1571. -3613=>array('word'=>"胥",'first_char'=>'X','all_char'=>'XU'),
  1572. -8777=>array('word'=>"莘",'first_char'=>'S','all_char'=>'SHEN'),
  1573. -6708=>array('word'=>"逄",'first_char'=>'P','all_char'=>'PANG'),
  1574. -9302=>array('word'=>"郦",'first_char'=>'L','all_char'=>'LI'),
  1575. -5965=>array('word'=>"璩",'first_char'=>'Q','all_char'=>'QU'),
  1576. -6745=>array('word'=>"濮",'first_char'=>'P','all_char'=>'PU'),
  1577. -4888=>array('word'=>"扈",'first_char'=>'H','all_char'=>'HU'),
  1578. -9309=>array('word'=>"郏",'first_char'=>'J','all_char'=>'JIA'),
  1579. -5428=>array('word'=>"晏",'first_char'=>'Y','all_char'=>'YAN'),
  1580. -2849=>array('word'=>"暨",'first_char'=>'J','all_char'=>'JI'),
  1581. -7206=>array('word'=>"阙",'first_char'=>'Q','all_char'=>'QUE'),
  1582. -4945=>array('word'=>"殳",'first_char'=>'S','all_char'=>'SHU'),
  1583. -9753=>array('word'=>"夔",'first_char'=>'K','all_char'=>'KUI'),
  1584. -10041=>array('word'=>"厍",'first_char'=>'S','all_char'=>'SHE'),
  1585. -5429=>array('word'=>"晁",'first_char'=>'C','all_char'=>'CHAO'),
  1586. -2396=>array('word'=>"訾",'first_char'=>'Z','all_char'=>'ZI'),
  1587. -7205=>array('word'=>"阚",'first_char'=>'K','all_char'=>'KAN'),
  1588. -10049=>array('word'=>"乜",'first_char'=>'N','all_char'=>'NIE'),
  1589. -10015=>array('word'=>"蒯",'first_char'=>'K','all_char'=>'KUAI'),
  1590. -3133=>array('word'=>"竺",'first_char'=>'Z','all_char'=>'ZHU'),
  1591. -6698=>array('word'=>"逯",'first_char'=>'L','all_char'=>'LU'),
  1592. -9799=>array('word'=>"俟",'first_char'=>'Q','all_char'=>'QI'),
  1593. -6749=>array('word'=>"澹",'first_char'=>'T','all_char'=>'TAN'),
  1594. -7220=>array('word'=>"闾",'first_char'=>'L','all_char'=>'LV'),
  1595. -10047=>array('word'=>"亓",'first_char'=>'Q','all_char'=>'QI'),
  1596. -10005=>array('word'=>"仉",'first_char'=>'Z','all_char'=>'ZHANG'),
  1597. -3417=>array('word'=>"颛",'first_char'=>'Z','all_char'=>'ZHUAN'),
  1598. -6431=>array('word'=>"驷",'first_char'=>'S','all_char'=>'SI'),
  1599. -7226=>array('word'=>"闫",'first_char'=>'Y','all_char'=>'YAN'),
  1600. -9293=>array('word'=>"鄢",'first_char'=>'Y','all_char'=>'YAN'),
  1601. -6205=>array('word'=>"缑",'first_char'=>'G','all_char'=>'GOU'),
  1602. -9764=>array('word'=>"佘",'first_char'=>'S','all_char'=>'SHE'),
  1603. -9818=>array('word'=>"佴",'first_char'=>'N','all_char'=>'NAI'),
  1604. -9509=>array('word'=>"谯",'first_char'=>'Q','all_char'=>'QIAO'),
  1605. -3122=>array('word'=>"笪",'first_char'=>'D','all_char'=>'DA'),
  1606. -9823=>array('word'=>"佟",'first_char'=>'T','all_char'=>'TONG'),
  1607. );
  1608. if(array_key_exists($asc,$rare_arr) && $rare_arr[$asc]['first_char']){
  1609. return $rare_arr[$asc]['first_char'];
  1610. }
  1611. return null;
  1612. }
  1613. // 获取一段中文的首字母
  1614. function getStrFirstChar($str=""){
  1615. if(empty($str)){
  1616. return $str;
  1617. }else{
  1618. $result = "";
  1619. $i = 0;
  1620. while($i <strlen($str)){
  1621. $tmp_str = substr($str,$i,1);
  1622. $ascnum = Ord($tmp_str);
  1623. if($ascnum>=224){
  1624. $result .= GetFirstChar(substr($str,$i,3));
  1625. $i+=3;
  1626. }else{
  1627. $result .= $tmp_str;
  1628. $i+=1;
  1629. }
  1630. }
  1631. return $result;
  1632. }
  1633. }
  1634. if (!function_exists('collection')) {
  1635. /**
  1636. * 数组转换为数据集对象
  1637. * @param array $resultSet 数据集数组
  1638. * @return \think\model\Collection|\think\Collection
  1639. */
  1640. function collection($resultSet)
  1641. {
  1642. $item = current($resultSet);
  1643. if ($item instanceof Model) {
  1644. return \think\model\Collection::make($resultSet);
  1645. } else {
  1646. return \think\Collection::make($resultSet);
  1647. }
  1648. }
  1649. }
  1650. //img标签相对图片路径替换服务器绝对路径 type=1 单图片 2:多图片 3:编辑器
  1651. function ImageToServer($content,$server_url,$type=1){
  1652. if($type==1){
  1653. if(0===strpos($content,'http') || (0===strpos($content,'data:') && false!==strpos($content,'base64')))return $content;
  1654. if(trim($content)==""){
  1655. return '';
  1656. }else{
  1657. return PathDS2($server_url.$content);
  1658. }
  1659. }else if($type==2){
  1660. if($content==''){
  1661. return [];
  1662. }
  1663. $imgs=explode(",",$content);
  1664. $nlst=array();
  1665. foreach($imgs as $k=>$img){
  1666. if(trim($img)!="" && false===strpos($img,'http') && false === strpos($img,'data:') && false === strpos($img,'base64')){
  1667. $nlst[$k]=PathDS2($server_url.$img);
  1668. }
  1669. }
  1670. return !empty($nlst)?$nlst:$imgs;
  1671. }else{
  1672. preg_match_all('/(?<=img.src=").*?(?=")/',$content, $out, PREG_PATTERN_ORDER); //正则匹配img标签的src属性,返回二维数组
  1673. if (!empty($out)) {
  1674. foreach ($out as $v) {
  1675. foreach ($v as $j) {
  1676. if(false===strpos($j,'http') && false===strpos($j,'data:') && false === strpos($j,'base64')){
  1677. $url = $server_url.$j;
  1678. $content = str_replace($j, $url,$content); //替换相对路径为绝对路径
  1679. }
  1680. }
  1681. }
  1682. }
  1683. return $content;
  1684. }
  1685. }
  1686. function FieldConverList($data,$fields = [])
  1687. {
  1688. //设置系统默认处理规则
  1689. $default=array(
  1690. 'createtime'=>'time',
  1691. 'updatetime'=>'time',
  1692. 'deletetime'=>'time',
  1693. 'posttime'=>'time',
  1694. 'paytime'=>'time',
  1695. 'sendtime'=>'time',
  1696. 'arrivetime'=>'time',
  1697. 'receivetime'=>'time',
  1698. 'jointime'=>'time',
  1699. 'logintime'=>'time',
  1700. 'prevtime'=>'time',
  1701. 'picurl'=>'image',
  1702. 'picurl_pc'=>'image',
  1703. 'picurl_m'=>'image',
  1704. 'videourl'=>'image',
  1705. 'avatar'=>'image',
  1706. 'picarr'=>'images',
  1707. 'videoarr'=>'images',
  1708. 'content'=>'editor',
  1709. 'desc'=>'editor',
  1710. );
  1711. if(count($fields)>0){
  1712. $default = array_merge($default,$fields);
  1713. }
  1714. return FieldConver($data,$default);
  1715. }
  1716. //数据字段输出预处理方法
  1717. function FieldConver(&$data,$fields=[])
  1718. {
  1719. if(empty($data)){
  1720. return $data;
  1721. }
  1722. if(is_object($data))$data = $data->toArray();
  1723. if(is_string($data)){
  1724. ImageToServer($data,WEBURL,1);
  1725. }
  1726. foreach($data as $k=>&$v){
  1727. if(is_object($v)){
  1728. $v = $v->toArray();
  1729. }
  1730. if(!is_array($v)){
  1731. $type = $fields[$k]??$k;
  1732. switch($type){
  1733. case 'time':
  1734. if(is_int($v) && $v>10000){
  1735. $v = date('Y-m-d H:i:s',$v);
  1736. }elseif(empty($v)){
  1737. $v = "无";
  1738. }else{
  1739. $v;
  1740. }
  1741. break;
  1742. case 'date':
  1743. if(is_int($v) && $v>10000){
  1744. $v = date('Y-m-d',$v);
  1745. }elseif(empty($v)){
  1746. $v = "无";
  1747. }else{
  1748. $v;
  1749. }
  1750. break;
  1751. case 'image': $v=ImageToServer($v,WEBURL,1); break;
  1752. case 'images': $v=ImageToServer($v,WEBURL,2); break;
  1753. case 'editor': $v=ImageToServer($v,WEBURL,3); break;
  1754. case 'mobile_hidden': $v=HiddenMobile($v); break;
  1755. case 'json': $v=json_decode($v,true); break;
  1756. case 'set': $v=explode(',',$v); break;
  1757. }
  1758. }else{
  1759. FieldConver($v,$fields);
  1760. }
  1761. }
  1762. return $data;
  1763. }
  1764. /**
  1765. * @title 身份证格式验证
  1766. * @desc 说明
  1767. * @method GET/POST
  1768. * @param {*}
  1769. * @return {*}
  1770. * @author Rock
  1771. */
  1772. function testIdcard($idcard)
  1773. {
  1774. $vcity = [
  1775. 11 => '北京',
  1776. 12 => "天津",
  1777. 13 => "河北",
  1778. 14 => "山西",
  1779. 15 => "内蒙古",
  1780. 21 => "辽宁",
  1781. 22 => "吉林",
  1782. 23 => "黑龙江",
  1783. 31 => "上海",
  1784. 32 => "江苏",
  1785. 33 => "浙江",
  1786. 34 => "安徽",
  1787. 35 => "福建",
  1788. 36 => "江西",
  1789. 37 => "山东",
  1790. 41 => "河南",
  1791. 42 => "湖北",
  1792. 43 => "湖南",
  1793. 44 => "广东",
  1794. 45 => "广西",
  1795. 46 => "海南",
  1796. 50 => "重庆",
  1797. 51 => "四川",
  1798. 52 => "贵州",
  1799. 53 => "云南",
  1800. 54 => "西藏",
  1801. 61 => "陕西",
  1802. 62 => "甘肃",
  1803. 63 => "青海",
  1804. 64 => "宁夏",
  1805. 65 => "新疆",
  1806. 71 => "台湾",
  1807. 81 => "香港",
  1808. 82 => "澳门",
  1809. 91 => "国外"
  1810. ];
  1811. //判断是否为空
  1812. if(empty($idcard)){
  1813. return false;
  1814. }
  1815. //检查长度和类型
  1816. if(0==preg_match("/^([\d]{15}$)|([\d]{17}[xX\d]$)/",strtoupper($idcard))){
  1817. return false;
  1818. }
  1819. //校验省份
  1820. if(empty($vcity[substr($idcard,0,2)])){
  1821. return false;
  1822. }
  1823. $birthday = [];
  1824. //检查生日
  1825. if(15==strlen($idcard)){
  1826. $preg = "/^[\d]{6}([\d]{2})([\d]{2})([\d]{2})[\d]{3}$/";
  1827. preg_match($preg,$idcard,$birthday);
  1828. $birthday[1] = intval("19".$birthday[1]);
  1829. }elseif(18==strlen($idcard)){
  1830. $preg = "/^[\d]{6}([\d]{4})([\d]{2})([\d]{2})[\d]{3}([0-9]|X)$/";
  1831. preg_match($preg,$idcard,$birthday);
  1832. }else{
  1833. return false;
  1834. }
  1835. if($birthday[1]<=1900){
  1836. return false;
  1837. }
  1838. if(intval($birthday[2])<=0 || intval($birthday[2])>12){
  1839. return false;
  1840. }
  1841. if(intval($birthday[3])<=0 || intval($birthday[3])>31){
  1842. return false;
  1843. }
  1844. //检查校验位
  1845. if(!checkParity($idcard)){
  1846. return false;
  1847. }
  1848. return true;
  1849. }
  1850. /**
  1851. * @title 15位身份证号码转18位
  1852. * @desc 说明
  1853. * @param {*} $idcard
  1854. * @return {*}
  1855. * @author Rock
  1856. */
  1857. function idcard15to18($idcard)
  1858. {
  1859. if(15==strlen($idcard)){
  1860. $arrInt = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
  1861. $arrCh = ['1','0','X','9','8','7','6','5','4','3','2'];
  1862. $cardTemp = 0;
  1863. $idcard = substr($idcard,0,6).'19'.substr($idcard,6,strlen($idcard)-6);
  1864. $valnum = "";
  1865. for($i=0;$i<17;$i++){
  1866. $b = intval(substr($idcard,$i,1));
  1867. $w = $arrInt[$i];
  1868. $cardTemp += $b * $w;
  1869. }
  1870. $valnum = $arrCh[$cardTemp % 11];
  1871. $idcard.=$arrCh[$cardTemp % 11];
  1872. }
  1873. return $idcard;
  1874. }
  1875. /**
  1876. * @title 检测身份证校验位
  1877. * @desc 说明
  1878. * @param {*} $idcard
  1879. * @return {*}
  1880. * @author Rock
  1881. */
  1882. function checkParity($idcard)
  1883. {
  1884. $idcard = idcard15to18($idcard);
  1885. $len = strlen($idcard);
  1886. if(18==$len){
  1887. $arrInt = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
  1888. $arrCh = ['1','0','X','9','8','7','6','5','4','3','2'];
  1889. $cardTemp = 0;
  1890. $valnum = "";
  1891. for($i=0;$i<17;$i++){
  1892. $b = intval(substr($idcard,$i,1));
  1893. $w = $arrInt[$i];
  1894. $cardTemp += $b * $w;
  1895. }
  1896. $valnum = $arrCh[$cardTemp % 11];
  1897. return $valnum == substr($idcard,17,1);
  1898. }
  1899. return false;
  1900. }
  1901. /**
  1902. * @title: 从身份证号码解析性别
  1903. * @desc:
  1904. * @param {string} {idcard} {} {身份证号码}
  1905. * @return {int} {} {} {性别,1=男,2=女}
  1906. * @Author: Rock
  1907. * @Date: 2021-07-17 09:59:48
  1908. * @LastEditTime: Do not edit
  1909. */
  1910. function getSexByIdCard($idcard)
  1911. {
  1912. $position = strlen($idcard) == 15 ? -1 : -2;
  1913. $sexCode = substr($idcard,$position,1);
  1914. $sex = $sexCode % 2 ===1 ?1 : 2;
  1915. return $sex;//1=男,2=女
  1916. }
  1917. /**
  1918. * @title: 从身份证号解析生日
  1919. * @desc:
  1920. * @param {string} {idcard} {} {身份证号码}
  1921. * @return {string} {} {} {生日,格式Y-m-d}
  1922. * @Author: Rock
  1923. * @Date: 2022-01-04 09:41:16
  1924. * @LastEditTime: Do not edit
  1925. */
  1926. function getBirthdayByIdCard($idcard)
  1927. {
  1928. $birthday = strlen($idcard) == 15?'19'.substr($idcard,6,6):substr($idcard,6,8);
  1929. return date('Y-m-d',strtotime($birthday));
  1930. }
  1931. /**
  1932. * @title: 从身份证号解析年龄
  1933. * @desc:
  1934. * @param {string} {idcard} {} {身份证号码}
  1935. * @return {int} {} {} {年龄}
  1936. * @Author: Rock
  1937. * @Date: 2022-01-04 09:42:29
  1938. * @LastEditTime: Do not edit
  1939. */
  1940. function getAgeByIdCard($idcard)
  1941. {
  1942. $birthday = getBirthdayByIdCard($idcard);
  1943. $year = date('Y',strtotime($birthday));
  1944. $month = date('m',strtotime($birthday));
  1945. $day = date('d',strtotime($birthday));
  1946. $current_year = date('Y');
  1947. $current_month = date('m');
  1948. $current_day = date('d');
  1949. $age = $current_year - $year;
  1950. if($month > $current_month || $month == $current_month && $day > $current_day){
  1951. $age--;
  1952. }
  1953. return $age;
  1954. }
  1955. /**
  1956. * 数组转树
  1957. */
  1958. function array2tree($array,$pid='pid',$pk='id',$rootId = 0,$child='children')
  1959. {
  1960. $reArray = array_column($array,null,$pk);
  1961. $result = [];
  1962. foreach($array as $index=>$item){
  1963. if($item[$pid] == $rootId){
  1964. unset($array[$index]);
  1965. if(!empty($array)){
  1966. $childlist = array2tree($array,$pid,$pk,$item[$pk],$child);
  1967. if(!empty($childlist)){
  1968. $item[$child] = $childlist;
  1969. }
  1970. }
  1971. $result[] = $item;
  1972. }
  1973. }
  1974. return $result;
  1975. }
  1976. if(!function_exists('file2base64')){
  1977. /**
  1978. * @title: 文件转base64格式
  1979. * @desc: 将文件转换为base64数据
  1980. * @param {string} {file} {} {文件绝对路径}
  1981. * @return {*}
  1982. * @author: Rock
  1983. * @method: POST
  1984. * @Date: 2023-05-12 15:21:27
  1985. */
  1986. function file2base64($file)
  1987. {
  1988. if (!is_file($file)) {
  1989. return null;
  1990. }
  1991. $mimetype = "";
  1992. if (!empty($file)) {
  1993. $finfo = finfo_open(FILEINFO_MIME_TYPE);
  1994. $mimetype = finfo_file($finfo, $file);
  1995. finfo_close($finfo);
  1996. }
  1997. if ($fp = fopen($file, "rb", 0)) {
  1998. $gambar = fread($fp, filesize($file));
  1999. fclose($fp);
  2000. $base64 = base64_encode($gambar);
  2001. return "data:" . $mimetype . ";base64," . $base64;
  2002. } else {
  2003. return null;
  2004. }
  2005. }
  2006. }
  2007. /**
  2008. * 压缩文件下载
  2009. */
  2010. if(!function_exists('zip_down')){
  2011. function zip_down($fileArray=[],$filename=''){
  2012. if(false===strpos($filename,'.zip')){
  2013. $filename.='.zip';
  2014. }
  2015. $pathname = public_path().'zipdown'.DS.date('Ymd');
  2016. if(!is_dir($pathname)){
  2017. mkdir($pathname,0777,true);
  2018. }
  2019. $pathname=$pathname.DS.$filename;
  2020. if(file_exists($pathname)){
  2021. //文件已存在
  2022. return WEBURL.DS.'zipdown'.DS.date('Ymd').DS.$filename;
  2023. }
  2024. try{
  2025. //创建ZIP包
  2026. $zip=new \ZipArchive();
  2027. //参数1:zip保存路径,参数2:ZIPARCHIVE::CREATE没有即是创建  
  2028. if($zip->open($pathname,\ZIPARCHIVE::CREATE || \ZipArchive::OVERWRITE)){
  2029. foreach($fileArray as $val){
  2030. if(is_string($val)){
  2031. $zip->addFile($val,basename($val));
  2032. }elseif(is_array($val)){
  2033. $zip->addFile($val['fullpath'],$val['name']);
  2034. }
  2035. }
  2036. $zip->close();
  2037. return WEBURL.DS.'zipdown'.DS.date('Ymd').DS.$filename;
  2038. }else{
  2039. return false;
  2040. }
  2041. }catch(Exception $e){
  2042. abort(2,$e->getFile().'第'.$e->getLine().'行:'.$e->getMessage());
  2043. }
  2044. }
  2045. }
  2046. /**
  2047. * 获取系统配置
  2048. */
  2049. if(!function_exists('sysconfig')){
  2050. function sysconfig($key="") {
  2051. $where = [];
  2052. $where[] = ['status','=',1];
  2053. if(!empty($key)){
  2054. if(false!==strpos($key,'.')){
  2055. $arr = explode('.',$key);
  2056. $where[] = ['group_code','=',$arr[0]];
  2057. $where[] = ['key','=',$arr[1]];
  2058. }else{
  2059. $where[] = ['group_code','=',$key];
  2060. }
  2061. }
  2062. $list = Systemconfig::where($where)->select();
  2063. if(false!==strpos($key,'.') && $list->isEmpty()){
  2064. return null;
  2065. }
  2066. $list = FieldConverList($list,['content'=>'json']);
  2067. foreach($list as &$val){
  2068. if(in_array($val['type'],['selects','checkbox'])){
  2069. $val['value'] = explode(',',$val['value']);
  2070. }elseif(in_array($val['type'],['file','image'])){
  2071. $val['value'] = ImageToServer($val['value'],WEBURL,1);
  2072. }elseif(in_array($val['type'],['files','images'])){
  2073. $val['value'] = ImageToServer($val['value'],WEBURL,2);
  2074. }elseif($val['type']=='datetimerange'){
  2075. if(!empty($val['value'])){
  2076. $value = json_decode($val['value'],true);
  2077. $tmp = [$value['start'],$value['end']];
  2078. $val['value'] = $tmp;
  2079. }
  2080. }elseif($val['type']=='json'){
  2081. if(!empty($val['value'])){
  2082. $val['value'] = json_decode($val['value'],true);
  2083. }else{
  2084. $val['value'] = [];
  2085. if(!empty($val['content'])){
  2086. $tmp = [];
  2087. foreach($val['content'] as $content){
  2088. $tmp[$content['key']] = '';
  2089. }
  2090. $val['value'][] = $tmp;
  2091. }
  2092. }
  2093. }elseif($val['type']=='number'){
  2094. $val['value'] = 0 + intval($val['value']);
  2095. }
  2096. }
  2097. $result = array_column($list,'value','key');
  2098. return count($result)==1?end($result):$result;
  2099. }
  2100. }
  2101. /**
  2102. * 内部发送ws消息
  2103. */
  2104. if(!function_exists('wssend')){
  2105. function wssend($uids,$action,$data){
  2106. $weburl = "http://127.0.0.1:81/index.php/index/hello";
  2107. $param = [
  2108. 'uids' => $uids,
  2109. 'action' => $action,
  2110. 'data' => $data
  2111. ];
  2112. $res = Post_Curl($param,$weburl);
  2113. return json_decode($res,true);
  2114. }
  2115. }
  2116. /**
  2117. * 二维数组(Double_Dimensional_Array)指定字段排序
  2118. */
  2119. if(!function_exists('DDA_sort')){
  2120. function DDA_sort($array=[],$pk='',$sort_value='',$order='ASC'){
  2121. if($array==[]){
  2122. return [];
  2123. }
  2124. $trans = [];
  2125. foreach ($array as $v){
  2126. $trans[$v[$pk]] = $v[$sort_value];
  2127. }
  2128. if($order=='ASC'){
  2129. asort($trans);
  2130. }else{
  2131. arsort($trans);
  2132. }
  2133. $res = [];
  2134. foreach ($trans as $k=>$v){
  2135. foreach ($array as $jv){
  2136. if($k==$jv[$pk]){
  2137. $res[] = $jv;
  2138. }
  2139. }
  2140. }
  2141. return $res;
  2142. }
  2143. }
  2144. if(!function_exists('isCarLicense')){
  2145. function isCarLicense($license)
  2146. {
  2147. if (empty($license)) {
  2148. return false;
  2149. }
  2150. $license = trim(str_replace(['-',' ',' ',"/","\n","\r","(",")","(",")"],'',$license));
  2151. # 匹配民用车牌和使馆车牌
  2152. # 判断标准
  2153. # 1,第一位为汉字省份缩写
  2154. # 2,第二位为大写字母城市编码
  2155. # 3,后面是5位仅含字母和数字的组合
  2156. $regular = "/[京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新使]{1}[A-Z]{1}[0-9a-zA-Z]{4,7}$/u";
  2157. preg_match($regular, $license, $match);
  2158. if (isset($match[0])) {
  2159. return $match[0];
  2160. }
  2161. #匹配特种车牌(挂,警,学,领,港,澳,黄)
  2162. $regular = '/[京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新]{1}[A-Z]{1}[0-9a-zA-Z]{4,7}[挂警学领港澳黄]{1}$/u';
  2163. preg_match($regular, $license, $match);
  2164. if (isset($match[0])) {
  2165. return $match[0];
  2166. }
  2167. #匹配武警车牌
  2168. $regular = '/^WJ[京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新]?[0-9a-zA-Z]{4,7}$/ui';
  2169. preg_match($regular, $license, $match);
  2170. if (isset($match[0])) {
  2171. return $match[0];
  2172. }
  2173. #匹配军牌
  2174. $regular = "/[A-Z]{2}[0-9]{5}$/";
  2175. preg_match($regular, $license, $match);
  2176. if (isset($match[0])) {
  2177. return $match[0];
  2178. }
  2179. #匹配新能源车辆6位车牌
  2180. #小型新能源车
  2181. $regular = "/[京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新]{1}[A-Z]{1}[DF]{1}[0-9a-zA-Z]{4,7}$/u";
  2182. preg_match($regular, $license, $match);
  2183. if (isset($match[0])) {
  2184. return $match[0];
  2185. }
  2186. #大型新能源车
  2187. $regular = "/[京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云渝藏陕甘青宁新]{1}[A-Z]{1}[0-9a-zA-Z]{4,7}[DF]{1}$/u";
  2188. preg_match($regular, $license, $match);
  2189. if (isset($match[0])) {
  2190. return $match[0];
  2191. }
  2192. return false;
  2193. }
  2194. }
  2195. if(!function_exists('success')) {
  2196. /**
  2197. * @title:正确值输出
  2198. * @param array $data
  2199. * @param int $totalCount
  2200. * @param string $msg
  2201. * @param int $code
  2202. * @return mixed
  2203. */
  2204. function success($data = [], $totalCount = null, $msg = '获取成功', $code = 1)
  2205. {
  2206. $ret = ['code'=>$code, 'msg'=>$msg, 'data'=>$data];
  2207. if($totalCount !== null){
  2208. $ret['totalCount'] = $totalCount;
  2209. }
  2210. return json($ret);
  2211. }
  2212. }
  2213. if(!function_exists('message')) {
  2214. /**
  2215. * @title:消息输出
  2216. * @param string $msg
  2217. * @param int $code
  2218. * @return mixed
  2219. */
  2220. function message($msg = '保存成功', $code = 1)
  2221. {
  2222. return json(['code'=>$code, 'msg'=>$msg]);
  2223. }
  2224. }
  2225. if(!function_exists('error')) {
  2226. /**
  2227. * @title:错误值输出
  2228. * @param string $msg
  2229. * @param int $code
  2230. */
  2231. function error($msg = '操作失败', $code = 2)
  2232. {
  2233. json(['code'=>$code, 'msg'=>$msg])->send();
  2234. exit;
  2235. }
  2236. }
  2237. if(!function_exists('requestLock')) {
  2238. /**
  2239. * @title:简易访问锁
  2240. * @param $key {锁名}
  2241. * @param int $expire {延时}
  2242. * @return bool
  2243. */
  2244. function requestLock($key, $expire=null)
  2245. {
  2246. $redis = Cache::store('redis')->handler();
  2247. if($expire == null){
  2248. $redis->del($key);
  2249. return true;
  2250. }elseif($redis->setNx($key,1) == 1){
  2251. $redis->expire($key, $expire);
  2252. return true;
  2253. }else{
  2254. return false;
  2255. }
  2256. }
  2257. }