function.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. <?php
  2. require_once APP_PATH . 'Common/Common/developer.php'; //加载开发者二次开发公共函数库
  3. /**
  4. * 处理插件钩子
  5. * @param string $hook 钩子名称
  6. * @param mixed $params 传入参数
  7. * @return void
  8. *
  9. */
  10. function hook($hook, $params = array())
  11. {
  12. $result = \Think\Hook::listen($hook, $params);
  13. }
  14. /**
  15. * 获取插件类的类名
  16. * @param strng $name 插件名
  17. *
  18. */
  19. function get_addon_class($name)
  20. {
  21. $class = "Addons\\{$name}\\{$name}Addon";
  22. return $class;
  23. }
  24. /**
  25. * 插件显示内容里生成访问插件的url
  26. * @param string $url url
  27. * @param array $param 参数
  28. *
  29. */
  30. function addons_url($url, $param = array())
  31. {
  32. return D('Admin/Addon')->getAddonUrl($url, $param);
  33. }
  34. /**
  35. * 兼容Nginx
  36. * @return array
  37. *
  38. */
  39. if (!function_exists('getallheaders')) {
  40. function getallheaders()
  41. {
  42. foreach ($_SERVER as $name => $value) {
  43. if (substr($name, 0, 5) == 'HTTP_') {
  44. $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
  45. }
  46. }
  47. return $headers;
  48. }
  49. }
  50. /**
  51. * POST数据提前处理
  52. * @return array
  53. *
  54. */
  55. function format_data($data = null)
  56. {
  57. //解析数据类似复选框类型的数组型值
  58. if (!$data) {
  59. $data = $_POST;
  60. }
  61. $data_object = new \Util\Date;
  62. foreach ($data as $key => $val) {
  63. if (!is_array($val)) {
  64. $val = trim($val);
  65. if ($data_object->checkDatetime($val)) {
  66. $data[$key] = strtotime($val);
  67. } else if ($data_object->checkDatetime($val, 'Y-m-d H:i')) {
  68. $data[$key] = strtotime($val);
  69. } else if ($data_object->checkDatetime($val, 'Y-m-d')) {
  70. $data[$key] = strtotime($val);
  71. } else {
  72. $data[$key] = $val;
  73. }
  74. } else {
  75. $data[$key] = implode(',', $val);
  76. }
  77. }
  78. return $data;
  79. }
  80. /**
  81. * 获取所有数据并转换成一维数组
  82. *
  83. */
  84. function select_list_as_tree($model, $map = null, $extra = null, $key = 'id')
  85. {
  86. //获取列表
  87. /**
  88. * @author Gentle
  89. * @tro 添加Product查询判断条件
  90. * @time 2017年9月11日09:35:58
  91. */
  92. $model_object = D($model);
  93. if ($model == 'Product') {
  94. $list = $model_object->where('id>0')->order('id asc')->select();
  95. foreach ($list as $val) {
  96. $result[$val[$key]] = $val['id'] . ':' . $val['name'];
  97. }
  98. return $result;
  99. }
  100. if ($model == 'Box_type') {
  101. $list = $model_object->where('id>0')->order('id asc')->select();
  102. foreach ($list as $val) {
  103. $result[$val[$key]] = $val['id'] . ':' . $val['name'];
  104. }
  105. return $result;
  106. }
  107. $con['status'] = array('eq', 1);
  108. if ($map) {
  109. $con = array_merge($con, $map);
  110. }
  111. // $model_object = D($model);
  112. if (in_array('sort', $model_object->getDbFields())) {
  113. $list = $model_object->where($con)->order('sort asc, id asc')->select();
  114. } else {
  115. $list = $model_object->where($con)->order('id asc')->select();
  116. }
  117. //转换成树状列表(非严格模式)
  118. $tree = new \Util\Tree();
  119. $list = $tree->array2tree($list, 'title', 'id', 'pid', 0, false);
  120. if ($extra) {
  121. $result[0] = $extra;
  122. }
  123. //转换成一维数组
  124. foreach ($list as $val) {
  125. $result[$val[$key]] = $val['title_show'];
  126. }
  127. return $result;
  128. }
  129. /**
  130. * 解析文档内容
  131. * @param string $str 待解析内容
  132. * @return string
  133. *
  134. */
  135. function parse_content($str)
  136. {
  137. // 将img标签的src改为lazy-src用户前台图片lazyload加载
  138. if (C('STATIC_DOMAIN')) {
  139. $tmp = preg_replace('/<img.*?src="(.*?Uploads.*?)"(.*?)>/i', "<img class='lazy lazy-fadein img-responsive' style='display:inline-block;' data-src='" . C('STATIC_DOMAIN') . "$1'>", $str);
  140. $tmp = preg_replace('/<img.*?src="(\/.*?)"(.*?)>/i', "<img class='img-responsive' style='display:inline-block;' src='" . C('STATIC_DOMAIN') . "$1'>", $tmp);
  141. } else {
  142. $domain = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'];
  143. $tmp = preg_replace('/<img.*?src="(.*?Uploads.*?)"(.*?)>/i', "<img class='lazy lazy-fadein img-responsive' style='display:inline-block;' data-src='" . $domain . "$1'>", $str);
  144. $tmp = preg_replace('/<img.*?src="(\/.*?)"(.*?)>/i', "<img class='img-responsive' style='display:inline-block;' src='" . $domain . "$1'>", $tmp);
  145. }
  146. return $tmp;
  147. }
  148. /**
  149. * 字符串截取(中文按2个字符数计算),支持中文和其他编码
  150. * @static
  151. * @access public
  152. * @param str $str 需要转换的字符串
  153. * @param str $start 开始位置
  154. * @param str $length 截取长度
  155. * @param str $charset 编码格式
  156. * @param str $suffix 截断显示字符
  157. * @return str
  158. */
  159. function cut_str($str, $start, $length, $charset = 'utf-8', $suffix = true)
  160. {
  161. return \Util\Str::cutStr(
  162. $str, $start, $length, $charset, $suffix
  163. );
  164. }
  165. /**
  166. * 过滤标签,输出纯文本
  167. * @param string $str 文本内容
  168. * @return string 处理后内容
  169. *
  170. */
  171. function html2text($str)
  172. {
  173. return \Util\Str::html2text($str);
  174. }
  175. /**
  176. * 友好的时间显示
  177. * @param int $sTime 待显示的时间
  178. * @param string $type 类型. normal | mohu | full | ymd | other
  179. * @param string $alt 已失效
  180. * @return string
  181. *
  182. */
  183. function friendly_date($sTime, $type = 'mohu', $alt = 'false')
  184. {
  185. $date = new \Util\Date((int)$sTime);
  186. return $date->friendlyDate($type, $alt);
  187. }
  188. /**
  189. * 用于生成插入datetime类型字段用的字符串
  190. * @param string $str 支持偏移字符串
  191. */
  192. function datetime($str = 'now')
  193. {
  194. return @date("Y-m-d H:i:s", strtotime($str));
  195. }
  196. /**
  197. * 时间戳格式化
  198. * @param int $time
  199. * @return string 完整的时间显示
  200. *
  201. */
  202. function time_format($time = null, $format = 'Y-m-d H:i')
  203. {
  204. $time = $time === null ? time() : intval($time);
  205. return date($format, $time);
  206. }
  207. /**
  208. * 系统非常规MD5加密方法
  209. * @param string $str 要加密的字符串
  210. * @return string
  211. *
  212. */
  213. function user_md5($str, $auth_key)
  214. {
  215. if (!$auth_key) {
  216. $auth_key = C('AUTH_KEY') ?: 'OpenCMF';
  217. }
  218. return '' === $str ? '' : md5(sha1($str) . $auth_key);
  219. }
  220. /**
  221. * 检测用户是否登录
  222. * @return integer 0-未登录,大于0-当前登录用户ID
  223. *
  224. */
  225. function is_login()
  226. {
  227. return D('Admin/User')->is_login();
  228. }
  229. /**
  230. * 检测用户是否VIP
  231. * @return integer VIP等级
  232. *
  233. */
  234. function is_vip($uid)
  235. {
  236. if (D('Admin/Module')->where('name="Vip" and status="1"')->count()) {
  237. $uid = $uid ? $uid : is_login();
  238. return D('Vip/Index')->isVip($uid);
  239. }
  240. return false;
  241. }
  242. /**
  243. * 获取上传文件路径
  244. * @param int $id 文件ID
  245. * @return string
  246. *
  247. */
  248. function get_cover($id = null, $type = null)
  249. {
  250. return D('Admin/Upload')->getCover($id, $type);
  251. }
  252. /**
  253. * 自动生成URL,支持在后台生成前台链接
  254. * @param string $url URL表达式,格式:'[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...'
  255. * @param string|array $vars 传入的参数,支持数组和字符串
  256. * @param string|boolean $suffix 伪静态后缀,默认为true表示获取配置值
  257. * @param boolean $domain 是否显示域名
  258. * @return string
  259. *
  260. */
  261. function oc_url($url = '', $vars = '', $suffix = true, $domain = true)
  262. {
  263. $url = U($url, $vars, $suffix, $domain);
  264. if (MODULE_MARK === 'Admin') {
  265. $url_model = D('Admin/Config')->where(array('name' => 'URL_MODEL'))->getField('value');
  266. switch ($url_model) {
  267. case '1':
  268. $result = strtr($url, array('admin.php?s=' => 'index.php'));
  269. break;
  270. case '2':
  271. $result = strtr($url, array('admin.php?s=/' => ''));
  272. break;
  273. case '3':
  274. $result = strtr($url, array('admin.php' => 'index.php'));
  275. break;
  276. default:
  277. $result = strtr($url, array('admin.php' => 'index.php'));
  278. break;
  279. }
  280. return $result;
  281. } else {
  282. return $url;
  283. }
  284. }
  285. /**
  286. * 检测是否使用手机访问
  287. * @access public
  288. * @return bool
  289. */
  290. function is_wap()
  291. {
  292. if (isset($_SERVER['HTTP_VIA']) && stristr($_SERVER['HTTP_VIA'], "wap")) {
  293. return true;
  294. } elseif (isset($_SERVER['HTTP_ACCEPT']) && strpos(strtoupper($_SERVER['HTTP_ACCEPT']), "VND.WAP.WML")) {
  295. return true;
  296. } elseif (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) {
  297. return true;
  298. } elseif (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/(blackberry|configuration\/cldc|hp |hp-|htc |htc_|htc-|iemobile|kindle|midp|mmp|motorola|mobile|nokia|opera mini|opera |Googlebot-Mobile|YahooSeeker\/M1A1-R2D2|android|iphone|ipod|mobi|palm|palmos|pocket|portalmmm|ppc;|smartphone|sonyericsson|sqh|spv|symbian|treo|up.browser|up.link|vodafone|windows ce|xda |xda_)/i', $_SERVER['HTTP_USER_AGENT'])) {
  299. return true;
  300. } else {
  301. return false;
  302. }
  303. }
  304. /**
  305. * 是否微信访问
  306. * @return bool
  307. *
  308. */
  309. function is_weixin()
  310. {
  311. if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {
  312. return true;
  313. } else {
  314. return false;
  315. }
  316. }
  317. /**
  318. * author xtj
  319. * intro 压缩方法
  320. * param
  321. * return array obj json bool string resource
  322. */
  323. function downZip($batch_name, $printer_id)
  324. {
  325. $data = explode('_', $batch_name);
  326. $filename = $data[0] . '_' . $data[1];
  327. if (M('task')->where(array('name' => $filename, 'printer_id' => $printer_id))->find()) {
  328. $path = './Data/Code_Add_list/' . $filename . '/admin/' . $batch_name.'/1';
  329. if (!file_exists($path)) return false;//批次号不存在
  330. $zip = new \Util\Zip();
  331. M('task')->where(array('name' => $filename, 'id' => $data[2]))->setField('status', 1);
  332. $zip->ZipAndDownload($path, $batch_name);
  333. }
  334. }
  335. /**
  336. * author xtj
  337. * intro  消息提示方法
  338. * param $param 参数数组
  339. * return json
  340. */
  341. function alert($param = array())
  342. {
  343. if (!empty($param)) {
  344. foreach ($param as $k => $v) {
  345. $data[$k] = $v;
  346. }
  347. }
  348. header('Content-Type:application/json; charset=utf-8');
  349. exit(json_encode($data));
  350. }
  351. function i_array_column($input, $columnKey, $indexKey = null)
  352. {
  353. if (!function_exists('array_column')) {
  354. $columnKeyIsNumber = (is_numeric($columnKey)) ? true : false;
  355. $indexKeyIsNull = (is_null($indexKey)) ? true : false;
  356. $indexKeyIsNumber = (is_numeric($indexKey)) ? true : false;
  357. $result = array();
  358. foreach ((array)$input as $key => $row) {
  359. if ($columnKeyIsNumber) {
  360. $tmp = array_slice($row, $columnKey, 1);
  361. $tmp = (is_array($tmp) && !empty($tmp)) ? current($tmp) : null;
  362. } else {
  363. $tmp = isset($row[$columnKey]) ? $row[$columnKey] : null;
  364. }
  365. if (!$indexKeyIsNull) {
  366. if ($indexKeyIsNumber) {
  367. $key = array_slice($row, $indexKey, 1);
  368. $key = (is_array($key) && !empty($key)) ? current($key) : null;
  369. $key = is_null($key) ? 0 : $key;
  370. } else {
  371. $key = isset($row[$indexKey]) ? $row[$indexKey] : 0;
  372. }
  373. }
  374. $result[$key] = $tmp;
  375. }
  376. return $result;
  377. } else {
  378. return array_column($input, $columnKey, $indexKey);
  379. }
  380. }
  381. /**
  382. * author xtj
  383. * intro 是否有下载的权限
  384. * param
  385. * return bool
  386. */
  387. function is_downzip($uid)
  388. {
  389. if (M('admin_access')->where(array('uid' => $uid))->getField('group') == 2) {
  390. return true;
  391. } else {
  392. return false;
  393. }
  394. }
  395. /**
  396. * author xtj
  397. * intro 获取用户组
  398. * param
  399. * return int
  400. */
  401. function getUserGroup($uid)
  402. {
  403. return M('admin_access')->where(array('uid' => $uid))->getField('group');
  404. }
  405. /**
  406. * author xtj
  407. * intro 获取当前登录用户uid
  408. * param
  409. * return int
  410. */
  411. function get_current_admin_id()
  412. {
  413. return session('user_auth.uid');
  414. }
  415. /**
  416. * author xtj
  417. * intro 获取当前登录用户名
  418. * param
  419. * return int
  420. */
  421. function get_current_admin_name(){
  422. return session('user_auth.username');
  423. }
  424. /**
  425. * author jade
  426. * intro 获取当前登录用户名
  427. * param
  428. * return int
  429. */
  430. function w_log($path,$content){
  431. file_put_contents($path, $content.PHP_EOL,FILE_APPEND);
  432. return true;
  433. }
  434. /*
  435. * 获取后缀
  436. */
  437. function get_extension($file)
  438. {
  439. return pathinfo($file, PATHINFO_EXTENSION);
  440. }
  441. /*
  442. * 获取分表表名
  443. */
  444. function getSubTable($tableName, $code = null,$PREFIX=0)
  445. {
  446. // 每张表中放50个集团的数据
  447. $lastWord=strtolower(substr($code, -1));
  448. return $PREFIX==0?C('DB_PREFIX').$tableName .'_'.$lastWord:$tableName .'_'.$lastWord;
  449. }
  450. function getSubTable1($tableName, $code = null,$PREFIX=0)
  451. {
  452. // 每张表中放50个集团的数据;
  453. $lastWord=strtolower(substr($code, -1));
  454. return $tableName .'_'.$lastWord;
  455. }
  456. function getpage($count, $pagesize = 10) {
  457. $p = new Think\Page($count, $pagesize);
  458. $p->setConfig('header', '<li class="rows">共<b>%TOTAL_ROW%</b>条记录&nbsp;第<b>%NOW_PAGE%</b>页/共<b>%TOTAL_PAGE%</b>页</li>');
  459. $p->setConfig('prev', '上一页');
  460. $p->setConfig('next', '下一页');
  461. $p->setConfig('last', '末页');
  462. $p->setConfig('first', '首页');
  463. $p->setConfig('theme', '%FIRST%%UP_PAGE%%LINK_PAGE%%DOWN_PAGE%%END%%HEADER%');
  464. $p->lastSuffix = false;//最后一页不显示为总页数
  465. return $p;
  466. }
  467. function repeat($rand){
  468. $return = M('activate_list')->field('id')->where('active_batch = '.$rand)->limit(1)->select();
  469. if(!empty($return)){
  470. $rand = rand(10000,999999);
  471. repeat($rand);
  472. }
  473. return $rand;
  474. }
  475. /**
  476. * 获取远程URL的HTTP状态
  477. * @Author xtj
  478. * @param string $url 远程URL
  479. * @param string $data ture[返回HTTP状态数组] | false[返回状态数值]
  480. */
  481. function getStatusCode($url){
  482. $ch = curl_init($url);
  483. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  484. curl_exec($ch);
  485. return curl_getinfo($ch, CURLINFO_HTTP_CODE); // 200
  486. curl_close($ch);
  487. }
  488. /*
  489. uri专用的url解密
  490. */
  491. function urlsafe_b64decode($string) {
  492. $data = str_replace(array('-','_'),array('+','/'),$string);
  493. $mod4 = strlen($data) % 4;
  494. if ($mod4) {
  495. $data .= substr('====', $mod4);
  496. }
  497. return base64_decode($data);
  498. }
  499. function intTochar($num=0,$len){
  500. //规定的不足的时候自动补足零
  501. $code=(string)$num;
  502. $buwei='';
  503. if(strlen($code)<$len){
  504. for($i=strlen($code);$i<$len;$i++){
  505. $buwei.='0';
  506. }
  507. }
  508. return $buwei.$code;
  509. }
  510. //二维码数组生产
  511. function CodeData($sign,$fixed_code,$small_num,$print_date,$flow,$weight,$large_sign,$reservation){
  512. $code=$sign;//4 位固定标志位
  513. $code.=$fixed_code; // 固定字符串
  514. $code.=$small_num;//3位 小件数量
  515. $code.=$print_date;//6 位 日期
  516. $code.=$flow;//6位打印流水号
  517. $code.=$weight;//6位辅料重量
  518. $code.=$large_sign;//大小件标示位
  519. $code.=$reservation;//20 位 预留号
  520. //大码数据信息
  521. $data=[
  522. 'code'=>str_replace(" ","",$code),
  523. 'code_cp1'=>$print_date.$flow,
  524. 'code_cp2'=>$weight.$reservation,//20位补充
  525. 'print_date'=>time(),
  526. 'p_nums'=>0,
  527. ];
  528. return $data;
  529. }
  530. //托盘编号处理函数
  531. function GetTuopan($userid,$product_id){
  532. $codition['userid']=$userid;
  533. $codition['product_id']=$product_id;
  534. $l_flow=M('reset_flow')->field('l_flow,bach_num')->where($codition)->find();
  535. return $l_flow;
  536. }
  537. ?>