2025erp系统开源免费进销存系统搭建教程/功能介绍/上线即可运营软件平台源码

系统介绍

基于ThinkPHP与LayUI构建的全方位进销存解决方案

本系统集成了采购、销售、零售、多仓库管理、财务管理等核心功能模块,旨在为企业提供一站式进销存管理体验。借助详尽的报表分析和灵活的设置选项,企业可实现精细化管理,提升运营效率。


技术框架

  • 后端:采用ThinkPHP框架,确保系统稳定可靠、易于扩展。
  • 前端:运用LayUI前端框架,打造美观、易用的用户界面。

功能概览

采购管理
  • 支持采购订单、采购入库单等操作,实现采购流程的全程跟踪与管理。
销售管理
  • 包括销货单、销货退货单等功能,助力企业提升销售效率和客户满意度。
零售管理
  • 支持零售单、零售退货单、服务单、积分兑换单等多种零售场景,满足企业多样化需求。
仓库管理
  • 提供库存查询、库存盘点、库存预警等功能,确保库存数据的准确性和及时性。
财务管理
  • 涵盖收款单、付款单、其他收入单、其他支出单等财务操作,实现财务精细化管理。
报表分析
  • 提供详尽的数据报表和单据核销功能,为企业决策提供有力支持。
系统设置
  • 包括基础资料、辅助资料、高级设置等选项,助力企业轻松完成系统配置和个性化定制。

开源版下载与联系方式

下载地址
点可云ERP-V6.0开源进销存系统icon-default.png?t=O83Ahttps://gitee.com/yimiaoOpen/nodcloud


功能概览与截图点可云-专注于行业软件开发与综合服务 – 一秒云软件中心化繁为简,引领高效新纪元!点可云公司及一秒开源团队感谢您的支持,开源地址在下方 文字不多,但可能对您的业务有帮助,辛苦您花费几分钟阅读一下!如果多我们有什么建议和反馈  可以联系下面的客服微信。购买等…icon-default.png?t=O83Ahttps://2024.okmg.cn/277.html


安装教程

  1. 下载代码
    • 点击GIT开源社区里的右侧发行版,下载所需版本(任选一种压缩方式)。

  2. 配置站点
    • 打开宝塔面板,点击添加站点。

    • 配置站点信息,输入域名,勾选创建MySQL,选择PHP版本5.6-7.3。

    • 确定后,进入刚创建的站点目录。

  3. 上传并解压代码
    • 上传下载好的代码压缩包。

       

    • 解压后,将代码从nodcloud-6.0.6目录剪切到根目录。

       

  4. 检查与配置
    • 确保代码在根目录。

    • 检查下方检测项目,确保均为绿色(如有红色项,按要求修改)。

       

    • 伪静态勾选thinkphp,避免登录无反应问题。

       伪静态勾选 thinkphp,否则会出现点击登录没有反应的问题

      至此安装完成,请尽情的使用吧!!!

至此,安装完成!请尽情使用!


附带部分代码参考

<?php
//通用函数库
//获取系统版本号
function get_ver(){
    return file_get_contents($_SERVER['DOCUMENT_ROOT'].DS.'application'.DS.'index'.DS.'ver');
}
//获取文件夹大小  
function get_dir_size($dir){
    static $sizeResult = 0;
    $handle = opendir($dir);
    while (false!==($FolderOrFile = readdir($handle)))  {   
        if($FolderOrFile != "." && $FolderOrFile != "..")   {   
            if(is_dir("$dir/$FolderOrFile")){   
                $sizeResult += get_dir_size("$dir/$FolderOrFile");   
            }else{   
                $sizeResult += filesize("$dir/$FolderOrFile");   
            }  
        }      
    }  
    closedir($handle);  
    return round(($sizeResult/1048576),2);
}
//二维数组返回指定键名集合
function array_field($arr,$key){
    $data=array();
    foreach ($arr as $arr_vo) {
        $arr=array();
        foreach ($key as $key_vo) {
            if(isset($arr_vo[$key_vo])){
                $arr[$key_vo]=$arr_vo[$key_vo];
            }
        }
        $data[]=$arr;
    }
    return $data;
}
//递归获取指定ID树状数组结构
function find_tree_arr($mode,$arr){
    static $tree=array();
    foreach ($arr as $vo) {
        $sub=db($mode)->where(['pid'=>$vo])->select()->toarray();
        array_push($tree,$vo);
        if(!empty($sub)){
            $more=find_tree_arr($mode,array_column($sub,'id'));
        }
    }
    return $tree;
}
//获取文件目录列表,该方法返回数组
function getDir($dir){
    $dirArray[]=NULL;
    if (false!=($handle=opendir($dir))){
        $i=0;
        while(false!==($file = readdir($handle))){
            //去掉.|..|以及带.xxx后缀的文件
            if($file!="."&&$file!=".."&&!strpos($file,".")){
                $dirArray[$i]=$file;
                $i++;
            }
        }
        closedir ($handle);//关闭句柄
    }
    return $dirArray;
}
//数组指定条件搜索
//$data数据内容,$arr搜索条件['key|key1'=>['in|eq','val']]
//in是包含,eq是等于
function searchdata($data,$arr){
    $info=[];
    if(is_array($data) && is_array($arr)){
        foreach ($data as $data_vo){
            $nod=true;//初始化状态
            foreach ($arr as $key=>$arr_vo){
                //判断多键值
                $val='nod_initial';
                foreach (explode('|',$key) as $key_vo) {
                    $val=$val==='nod_initial'?$data_vo[$key_vo]:$val[$key_vo];
                }
                //val取值成功
                if($val!=='nod_initial'){
                    if($arr_vo[0]=='in'){
                        //包含判断
                        strstr($val, $arr_vo[1])||($nod=false);
                    }else if($arr_vo[0]=='eq'){
                        //相等判断
                        $val==$arr_vo[1]||($nod=false);
                    }
                }
            }
            $nod&&(array_push($info,$data_vo));//加入数据
        }
    }
    return $info;
}
//多表多条件find查询
//$arr [['table'=>'plug','where'=>['only'=>1]]]]
function more_table_find($arr){
    $resule=false;//默认未找到
    foreach ($arr as $vo) {
        $find=db($vo['table'])->where($vo['where'])->find();
        if(!empty($find)){
            $resule=true;//找到数据
            break;
        }
    }
    return $resule;
}
//删除目录  
function removedir($dirName){
    if(!is_dir($dirName)){
        return false;
    }
    $handle=@opendir($dirName);
    while(($file=@readdir($handle))!==false){
        if($file!='.'&&$file != '..'){
            $dir=$dirName.DS.$file;
            is_dir($dir)?removedir($dir):@unlink($dir);
        }
    }
    closedir($handle);
    return rmdir($dirName);
}
//生成插件秘钥
function get_plug_key($time){
    $key=config('api_key');//私有秘钥
    return md5($time.'|'.$key);
}
//HTML代码压缩
function compress_html($string) {
    $string = str_replace("\r\n", '', $string);
    $string = str_replace("\n", '', $string);
    $string = str_replace("\t", '', $string);
    $pattern = ["/> *([^ ]*) *</","/[\s]+/","/<!--[^!]*-->/","/\" /","/ \"/","'/\*[^*]*\*/'"];
    $replace = [">\\1<"," ","","\"","\"",""];
    return preg_replace($pattern, $replace, $string);
}
//CSS代码压缩
function compress_css($string) {
    $string = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $string);
    $string = str_replace(["", "\r", "\n", "\t", '  ', '    ', '    '], '', $string);
    return $string;
}
//构造SQL-返回设置项的指定处理方式
//$info原始数据内容,$set设置项,$model数据表,$full是否允许为空(默认不允许)
//md5:MD5加密|like:包含查询|full_like:不为空包含查询|in:包含查询(传入数组)
//full_dec_1:不为空内容减1|stime和etime:时间区间查询|full_eq:不为空等于数据
//full_name_py_link:不为空扩展包含查询|full_division_in:不为空分割集合查询
//full_goodsclass_tree_sub:不为空商品分类集合查询//continue:不处理跳过
function get_sql($info,$set=[],$model,$full=true){
    $sql=[];//预设返回数据
    $field=db($model)->getTableFields();//读取数据表字段信息
    array_push($field,'start_time','end_time');//加入时间字段
    //循环数据
    foreach ($info as $info_key=>$info_vo) {
        //判断数据字段是否存在
        if(!in_array($info_key,$field)){
            continue;
        }
        //判断字段是否需要单独处理
        if(isset($set[$info_key])){
            //需要处理,判断类型
            if($set[$info_key]=='md5'){
                //md5加密
                $sql[$info_key]=md5($info_vo);
            }elseif($set[$info_key]=='like'){
                //包含查询
                $sql[$info_key]=['like','%'.$info_vo.'%'];
            }elseif($set[$info_key]=='full_like'){
                //不为空包含查询
                empty($info_vo)||($sql[$info_key]=['like','%'.$info_vo.'%']);
            }elseif($set[$info_key]=='in'){
                //包含查询
                $sql[$info_key]=['in',$info_vo];
            }elseif($set[$info_key]=='full_dec_1'){
                //不为空内容减1
                empty($info_vo)||($sql[$info_key]=$info_vo-1);
            }elseif($set[$info_key]=='stime' || $set[$info_key]=='etime'){
                //时间查询
                if(!isset($sql['time'])){
                    $time_key='time';//时间字段KEY
                    $start_time=$info[array_search("stime",$set)];//取出开始时间KEY并读取数值
                    $end_time=$info[array_search("etime",$set)];//取出结束时间KEY并读取数值
                    $egt=['egt',strtotime($start_time)];//大于等于
                    $elt=['elt',strtotime($end_time)+86399];//小于等于(加当天)
                    if(!empty($start_time) && empty($end_time)){
                        //开始时间不为空,结束时间为空
                        $sql[$time_key]=$egt;
                    }elseif(!empty($end_time) && empty($start_time)){
                        //结束时间不为空,开始时间为空.
                        $sql[$time_key]=$elt;
                    }elseif(!empty($end_time) && !empty($start_time)){
                        //开始时间不为空,结束时间不为空
                        $sql[$time_key]=[$egt,$elt];
                    }
                }
            }elseif($set[$info_key]=='full_eq'){
                //不为空等于数据
                empty($info_vo)||($sql[$info_key]=$info_vo);
            }elseif($set[$info_key]=='full_name_py_link'){
                //不为空扩展包含查询
                empty($info_vo)||($sql['name|py']=['like','%'.$info_vo.'%']);
            }elseif($set[$info_key]=='full_division_in'){
                //不为空分割集合查询
                empty($info_vo)||($sql[$info_key]=['in',explode(",",$info_vo)]);
            }elseif($set[$info_key]=='full_goodsclass_tree_sub'){
                //不为空分割集合查询
                empty($info_vo)||($sql[$info_key]=['in',tree_sub('goodsclass',$info_vo)]);
            }elseif($set[$info_key]=='continue'){
                //不处理跳过
                continue;
            }
        }else{
            //无需单独处理
            //判断是否允许空值
            if($full){
                if(is_array($info_vo)||!preg_match('/^\s*$/',$info_vo)){
                    $sql[$info_key]=$info_vo;
                }
            }else{
                $sql[$info_key]=$info_vo;
            }
        }
    }
    return $sql;
}
//同步SQL字段
//$exclude:需要排除的字段
function syn_sql($info,$model,$exclude=[]){
    $sql=[];
    //读取数据表字段信息
    if(empty(Session('syn_sql_'.$model))){
        $field=db($model)->getTableFields();
        Session('syn_sql_'.$model,$field);
    }else{
        $field=Session('syn_sql_'.$model);
    }
    foreach ($info as $key=>$vo) {
        //判断数据字段是否存在
        if(in_array($key,$field) && !in_array($key,$exclude)){
            //排除ID等于0的
            if($key=='id' && empty($vo)){
                continue;
            }else{
                $sql[$key]=$vo;
            }
        }else{
            continue;
        }
    }
    return $sql;
}
//判断字段存在并不为空
function isset_full($arr,$key){
    if(isset($arr[$key])&&!empty($arr[$key])){
        return true;
    }else{
        return false;
    }
}
//计算多维数组最多数组数量
function CalArrMaxCount($arr){
    static $nums = 0;
    //对多维数组进行循环
    foreach ($arr as $vo) {
        if(is_array($vo)){
            $count=count($vo);
            //判断是否多维数组
            if ($count==count($vo,1)) {
                $count > $nums&&($nums=$count);
            }else{
                CalArrMaxCount($vo);
            }
        }
    }
    return $nums;
}
//删除超时文件|危险功能-慎用
//$path='skin/upload/xlsx/'del_time_file
function  del_time_file($path,$time=30){
	$filesnames=scandir($path);//获取文件目录
	$now=time();//当前时间
	foreach ($filesnames as $key=>$name){
		//排除掉..
		if ($key>1){
			$nod=$path.$name;//文件路径
			if ($now-filectime($nod)>$time){
				unlink($nod);
			}
		}
	}
}
//优化小数位
function opt_decimal($val){
    $val=bcsub($val,0,config('decimal'));//统一小数位
    $arr=explode('.',$val);
    if(count($arr)>1){
        if($arr[1]=='00'){
            $val=$arr[0];
        }else{
            $nod=str_split($arr[1]);
            foreach (array_reverse($nod,true) as $key=>$vo) {
                if($vo=='0'){
                    unset($nod[$key]);
                }else{
                    break;
                }
            }
            $val=$arr[0].'.'.implode('',$nod);
        }
    }
    return $val;
}
//计算二维数组字段总和
//$tab_data,['total','actual','money']
function get_sums($arr,$keys){
    $resule=[];
    foreach ($keys as $key) {
        $list = array_column($arr, $key);
        $resule[$key]=array_sum($list);
    }
   return $resule;
}
//导出EXCEL
function export_excel($file_name,$data,$down=true){
    vendor("Execl.PHPExcel");
    $PHPExcel=new PHPExcel();//实例化
    $cellname=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ'];//列标识
    $shell=$PHPExcel->getActiveSheet (0);//当前工作簿
	$shell->setTitle ('NODCLOUD.COM');//工作簿名称
    $shell->getDefaultColumnDimension()->setWidth(13);//设置默认行宽
    $shell->getDefaultRowDimension()->setRowHeight(16);//设置默认行高
    $shell->getDefaultStyle()->getFont()->setName('宋体');//设置默认字体
    $shell->getPageMargins ()->setTop (0.2);//设置上边距
	$shell->getPageMargins ()->setBottom (0.2);//设置下边距
	$shell->getPageMargins ()->setLeft (0.2);//设置左边距
	$shell->getPageMargins ()->setRight (0.2);//设置右边距
    //循环加入数据
    $rownums=1;//初始化行数
    $max_cell=CalArrMaxCount($data);//获取多维数组最多数组数量
    //循环增加数据
    foreach ($data as $data_vo) {
        //判断数据类型
        if($data_vo['type']=='title'){
            //标题行
            $cellnums=0;//初始化列数
            $shell->mergeCells ($cellname[$cellnums].$rownums.':'.$cellname[$max_cell-1].$rownums);//合并单元格
            $shell->setCellValue ($cellname[$cellnums].$rownums,$data_vo['info'])->getStyle ($cellname[$cellnums].$rownums)->applyFromArray ([
                'font'=>['bold'=>true,'size'=>12],
                'alignment'=>['horizontal'=>PHPExcel_Style_Alignment::HORIZONTAL_CENTER]
            ]);//设置内容|居中|粗体|12号
            $shell->getRowDimension($rownums)->setRowHeight(28);//设置行高
            $rownums++;//自增行数
        }elseif($data_vo['type']=='node'){
            //节点行
            $cellnums=0;//初始化列数
            //设置背景色
            $shell->getStyle($cellname[$cellnums].$rownums.':'.$cellname[$max_cell-1].$rownums)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('e7e6e6');;//设置背景颜色;
            foreach ($data_vo['info'] as $data_info) {
                $shell->setCellValue ($cellname[$cellnums].$rownums,$data_info);
                $cellnums++;//自增列数
            }
            $shell->getRowDimension($rownums)->setRowHeight(16);//设置行高
            $rownums++;//自增行数
        }elseif($data_vo['type']=='table'){
            //表格数据
            $key_arr=[];
            //循环增加表头
            $cellnums=0;//初始化列数
            foreach ($data_vo['info']['cell'] as $cell_key=>$cell_vo) {
                $shell->setCellValue ($cellname[$cellnums].$rownums,$cell_vo)->getStyle ($cellname[$cellnums].$rownums)->applyFromArray ([
                    'font'=>['bold'=>true],
                    'alignment'=>['horizontal'=>PHPExcel_Style_Alignment::HORIZONTAL_CENTER]
                ]);//设置内容|居中|粗体;
                array_push($key_arr,$cell_key);//加入键值
                $cellnums++;//自增列数
            }
            $shell->getRowDimension($rownums)->setRowHeight(16);//设置标题行高
            $rownums++;//自增行数
            //循环增加表格数据头
            foreach ($data_vo['info']['data'] as $data_vo) {
                $cellnums=0;//初始化列数
                $RowHeight=16;//是否存在扩展信息
                foreach ($key_arr as $key_vo) {
                    if(is_array($data_vo[$key_vo])){
                        //扩展信息
                        if($data_vo[$key_vo]['type']=='img'){
                            //图像
                            $drawing=new PHPExcel_Worksheet_Drawing();
                            $drawing->setPath ($data_vo[$key_vo]['info']);//设置图像路径
                            $drawing->setOffsetX (3);//设置X偏移距离
							$drawing->setOffsetY (3);//设置Y偏移距离
							$drawing->setWidth (98);//设置图像宽度
							$drawing->setCoordinates ($cellname[$cellnums].$rownums)->setWorksheet ($shell);//设置内容
							$imginfo=getimagesize($data_vo[$key_vo]['info']);//读取图像信息
							$NodHeight=$imginfo[1]/($imginfo[0]/86);//计算行高|按照宽度缩放比例缩放
							$NodHeight>16&&($RowHeight=$NodHeight);//最小高度16
                        }
                    }else{
                        //文本信息
                        $shell->setCellValueExplicit($cellname[$cellnums].$rownums,$data_vo[$key_vo],PHPExcel_Cell_DataType::TYPE_STRING);//设置内容并指定文本格式
                    }
                    $cellnums++;//自增列数
                }
                $shell->getRowDimension($rownums)->setRowHeight($RowHeight);//设置数据行高
                $rownums++;//自增行数
            }
        }
	}
	//设置边框
	$shell->getStyle ('A1:'.$cellname[$max_cell-1].($rownums-1))->applyFromArray ([
        'borders'=>['allborders'=>['style'=>PHPExcel_Style_Border::BORDER_THIN]],
        'alignment'=>['vertical'=>PHPExcel_Style_Alignment::VERTICAL_CENTER]
    ]);
	//输出文件
	ob_get_contents()&&(ob_end_clean());//清除缓冲区,避免乱码
    $writer=PHPExcel_IOFactory::createWriter ($PHPExcel,'Excel2007');
    //判断文件操作
    if($down==true){
        //直接下载
        header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$file_name.'.xlsx"');
        header("Content-Disposition:attachment;filename=$file_name.xlsx");//attachment新窗口打印inline本窗口打印
        $writer->save ('php://output');
        exit;
    }else{
        //保存文件
        $file_path=ROOT_PATH.'skin/file/xlsx/'.$file_name.'.xlsx';
    	$writer->save ($file_path);
	    return $file_path;//返回文件路径
    }
}
//获取xlsx文件数据
function  get_xlsx($file){
	vendor("Execl.PHPExcel");
	$reader=PHPExcel_IOFactory::createReader ('Excel2007')->setReadDataOnly (true)->load ($file);//简易方式加载xlsx文件
	$resule=$reader->getSheet (0)->toArray (null,false,false,true);//获取首个工作簿信息并转为数组
	//过滤空白行
	foreach ($resule as $key=>$vo) {
	    if(count(array_unique($vo))==1){
	        unset($resule[$key]);
	    }
	}
	array_walk_recursive($resule,function(&$nod){$nod===null?($nod=''):$nod=htmlentities($nod);});//NULL转空白字符|拦截XSS
	return $resule;
}
//获取通用正则
function get_regex($nod){
    $regex=[
        'empty'=>"/^\s*$/g",//空判断
        'tel'=>"/^1\d{10}$/",//手机号判断
        'phone'=>"/^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$/",//座机号判断
        'tax'=>"/^[A-Z0-9]{15}$|^[A-Z0-9]{17}$|^[A-Z0-9]{18}$|^[A-Z0-9]{20}$/",//税号判断
        'number'=>"/^[0-9]*$/",//数字组合判断
        'plus'=>"/^\d+(\.\d{1,2})?$/",//含0正数判断最多2位小数
        'email'=>"/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/",//邮箱判断
        'time'=>"/^(19|20)\d{2}-(0?\d|1[012])-(0?\d|[12]\d|3[01])$/",//时间正则
        "numerical"=>"/^(\-)?\d+(\.\d{1,2})?$/",//正负数值2位小数
    ];
    return $regex[$nod];
}
//汉字转拼音
//$type[head:首字母|all:全拼音]
function zh2py($text,$type='head'){
    $nod=new \org\zh2py();
    $resule=$nod::encode($text,$type);
    return strtolower($resule);//返回结果转小写
    
}
//生成条形码
//$type[true:直接输出|false:保存文件]
function  txm($text,$type=true){
	$file_name=time().'_'.mt_rand();
	//当前时间戳加随机数
	$file_path=$_SERVER['DOCUMENT_ROOT'].'/skin/images/code/'.$file_name.'.png';
	$root=$_SERVER['DOCUMENT_ROOT'];
	require_once($root.'/vendor/Barcode/BCGFontFile.php');
	require_once($root.'/vendor/Barcode/BCGColor.php');
	require_once($root.'/vendor/Barcode/BCGDrawing.php');
	// 条形码的编码格式
	require_once($root.'/vendor/Barcode/BCGcode128.barcode.php');
	// 加载字体大小
	$font=new \BCGFontFile ($_SERVER['DOCUMENT_ROOT'].'/vendor/Barcode/Arial.ttf',18);
	//颜色条形码
	$color_black=new \BCGColor (0,0,0);
	$color_white=new \BCGColor (255,255,255);
	$drawException=null;
	try {
		$code=new \BCGcode128 ();
		$code->setScale (2);
		$code->setThickness (30);
		// 条形码的厚度
		$code->setForegroundColor ($color_black);
		// 条形码颜色
		$code->setBackgroundColor ($color_white);
		// 空白间隙颜色
		$code->setFont ($font);
		// 
		$code->parse ($text);
		// 条形码需要的数据内容
	}
	catch (Exception $exception){
		$drawException=$exception;
	}
	//根据以上条件绘制条形码
	$drawing=new \BCGDrawing ('',$color_white);
	if ($drawException){
		$drawing->drawException ($drawException);
	}else {
		$drawing->setBarcode ($code);
		$drawing->draw ();
	}
	// 生成PNG格式的图片
	if ($type){
		$drawing->finish (\BCGDrawing::IMG_FORMAT_PNG ,$file_path,$type);
		exit;
	}else {
		$drawing->finish (\BCGDrawing::IMG_FORMAT_PNG ,$file_path,$type);
		return $file_path;
	}
}
//生成二维码
//$type[true:直接输出|false:返回文件地址]
function ewm ($text,$type=true){
	$file_name=time().'_'.mt_rand();
	//当前时间戳加随机数
	vendor ("phpqrcode.phpqrcode");
	$size='6';
	$level='H';
	$padding=2;
	$nod=$_SERVER['DOCUMENT_ROOT'].'/skin/images/code/'.$file_name.'.png';
	$re=QRcode::png ($text,$nod,$level,$size,$padding);
	if ($type){
		ob_end_clean();
		//清除缓冲区,避免乱码
		header('Content-Type:image/png');
		imagepng(imagecreatefromstring(file_get_contents($nod)));
		exit ;
	}else {
		return $nod;
	}
}
//递归查询数据表树结构归属数据
function tree_sub ($model,$id){
    static $resule=[];
    $db=db($model);
	$info=$db->where(['pid'=>$id])->column ('id');
	foreach ($info as $vo) {
	    $sub=$db->where(['pid'=>$vo])->column ('id');
	    if(empty($sub)){
	        array_push($resule,$vo);
	    }else{
	        tree_sub($model,$vo);
	    }
	}
	array_push($resule,$id);
	return $resule;
}
//多维数组重组指定字段一维数组
function arraychange($arr,$key){
	return array_unique(array_column($arr,$key));
}
//查询数组指定字段合并赋值
//$type merge 组合 intersect 交集 
function sql_assign(&$sql,$field,$data,$type='merge'){
    if(isset($sql[$field])){
        if($type=='merge'){
            $arr=array_merge($sql[$field][1],$data);
        }elseif($type=='intersect'){
            $arr=array_intersect($sql[$field][1],$data);
        }
        $data=array_unique($arr);
    }
    $sql[$field]=['in',$data];
}
//合并单个二维数组
function arr_merge($arr){
    $resule=[];
    foreach ($arr as $vo) {
        $resule=array_merge($resule,$vo);
    }
    return array_unique($resule);
}
//压缩文件为ZIP并下载
function file_to_zip($zip_name,$file_arr,$down=true){
    del_time_file('skin/file/zip/');
    empty($file_arr)&&(die('[ 文件数据为空 ]'));//空数据检验
    $path="skin/file/zip/".$zip_name.".zip";
    $zip=new ZipArchive();
    if ($zip->open($path,ZIPARCHIVE::CREATE)!==TRUE) {
        exit('创建压缩文件失败!');
    }
    foreach ($file_arr as $file_vo) {
        $zip->addFile($file_vo,basename($file_vo));
    }
    $zip->close();
    if($down){
        header("Cache-Control: max-age=0");
        header("Content-Description: File Transfer");
        header('Content-disposition: attachment; filename='.basename($path)); //文件名
        header("Content-Type: application/zip"); //zip格式的
        header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
        header('Content-Length: '.filesize($path)); //告诉浏览器,文件大小
        @readfile($path);//输出文件;
        exit;
    }else{
        return true;
    }
}
//二维数组删除KEY指定条件数组
function arrs_key_del(&$arr,$condition){
    foreach ($arr as $key=>$vo) {
        //匹配数据
        if(isset($vo[$condition[0]]) && $vo[$condition[0]]==$condition[1]){
            unset($arr[$key]);
        }
    }
}
//GET POST提交
function http($url,$param,$action="GET"){
	$ch=curl_init();
	$config=array(CURLOPT_RETURNTRANSFER=>true,CURLOPT_URL=>$url);	
	if($action=="POST"){
		$config[CURLOPT_POST]=true;		
	}
	$config[CURLOPT_POSTFIELDS]=http_build_query($param);
	curl_setopt_array($ch,$config);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
	$result=curl_exec($ch);	
	curl_close($ch);
	return $result;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/940284.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024技能大赛Vue流程复现

1. 关于版本的控制 vue/cli 5.0.8vscode 最新下载版本 2. 创建vuecli项目 若没有安装vuecli则可以先安装 npm install -g vue/cli # 默认下载最新版本。vue --version vue -V # 查看版本&#xff0c;两个选一 使用vuecli来创建一个新的vue项目&#xff0c;vs code打开…

Qwen2.5-7B-Instruct FastApi部署与调用

Qwen2.5-7B-Instruct FastApi 部署调用 环境准备 本文基础环境如下&#xff1a; ---------------- ubuntu 22.04 python 3.12 cuda 12.1 pytorch 2.3.0 ----------------本文默认学习者已安装好以上 Pytorch(cuda) 环境&#xff0c;如未安装请自行安装。 首先 pip 换源加速下…

【Vue3学习】ref,reactive,toRef,toRefs的功能与用法区别

在 Vue 3 的组合式 API&#xff08;Composition API&#xff09;中&#xff0c;ref、reactive、toRef 和 toRefs 是四个非常重要的工具函数&#xff0c;用于创建和管理响应式数据。 一、ref 用ref()包裹数据,返回的响应式引用对象&#xff0c;包含一个 .value 属性&#xff0…

【面试 - 遇到的问题】Vue 里 router-view 使用 key + 关闭页面后重新打开页面-获取的数据赋值到旧组件问题(钩子执行顺序)

目录 【1】问题描述【2】问题排查前 - 页面渲染、tag 页签渲染 逻辑梳理页面渲染【借用别人的描述】<router-view :key"key" />1. 不设置key 属性2. 设置 key 属性值为 $route.path/page/1 > /page/2/page?id1 > /page?id2, 3. 设置 key 属性值为 $rou…

电商商品详情API接口(item get)数据分析上货

电商商品详情API接口&#xff08;item get&#xff09;在数据分析与商品上货方面发挥着重要作用。以下是对这两个方面的详细探讨&#xff1a; 一、数据分析 数据源获取&#xff1a; 商品详情API接口提供了丰富的数据源&#xff0c;包括商品的标题、价格、库存、描述、图片、用…

【计算机网络】期末考试预习复习|中

作业讲解 转发器、网桥、路由器和网关(4-6) 作为中间设备&#xff0c;转发器、网桥、路由器和网关有何区别&#xff1f; (1) 物理层使用的中间设备叫做转发器(repeater)。 (2) 数据链路层使用的中间设备叫做网桥或桥接器(bridge)。 (3) 网络层使用的中间设备叫做路…

大数据与AI:从分析到预测的跃迁

引言&#xff1a;数据时代的新纪元 从每天的社交分享到企业的运营决策&#xff0c;数据早已成为现代社会不可或缺的资源。我们正置身于一个数据爆炸的时代&#xff0c;数以亿计的信息流实时生成&#xff0c;为人类带来了前所未有的洞察能力。然而&#xff0c;数据的价值并不仅限…

CSDN数据大屏可视化【开源】

项目简介 本次基于版本3 开源 版本3开源地址&#xff1a;https://github.com/nangongchengfeng/CsdnBlogBoard.git 版本1开源地址&#xff1a;https://github.com/nangongchengfeng/CSDash.git 这是一个基于 Python 的 CSDN 博客数据可视化看板项目&#xff0c;通过爬虫采…

产品品牌战略升级!原WorkPlus正式改名为BeeWorks,版本重要更新

尊敬的各位合作伙伴、用户朋友&#xff1a; 感谢大家一直来对恒拓高科的大力支持&#xff01; 为了配合公司战略业务的实施和后续品牌规划的发展&#xff0c;自2024年12月18日起&#xff0c;恒拓高科旗下安全专属的移动数字化平台“WorkPlus”正式更名为“BeeWorks”&#xf…

jvm栈帧中的动态链接

“-Xss”这一名称并没有一个特定的“为什么”来解释其命名&#xff0c;它更多是JVM&#xff08;Java虚拟机&#xff09;配置参数中的一个约定俗成的标识。在JVM中&#xff0c;有多个配置参数用于调整和优化Java应用程序的性能&#xff0c;这些参数通常以一个短横线“-”开头&am…

R语言混合模型回归GBTM群组轨迹模型绘图可视化研究

全文链接&#xff1a;https://tecdat.cn/?p38581 在回归分析的广袤领域中&#xff0c;面对具有多条未知函数线的复杂数据时&#xff0c;传统方法常常捉襟见肘。混合模型作为一种强有力的分析手段应运而生&#xff0c;其在处理此类复杂情境时展现出独特的优势与潜力&#xff08…

基于 HC_SR04的超声波测距数码管显示(智能小车超声波避障部分)

超声波测距模块HC-SR04 1、产品特色 ①典型工作用电压&#xff1a;5V ②超小静态工作电流&#xff1a;小于 5mA ③感应角度(R3 电阻越大,增益越高,探测角度越大)&#xff1a; R3 电阻为 392,不大于 15 度 R3 电阻为 472, 不大于 30 度 ④探测距离(R3 电阻可调节增益,即调节探测…

Unity 使用字符串更改Text指定文字颜色、大小、换行、透明

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、使用字符串改变文字属性的方法&#xff08;一&#xff09;修改颜色&#xff08;二&#xff09;修改大小&#xff08;三&#xff09;换行&#xff08;四&…

JS CSS HTML 的代码如何快速封装

我们为什么要封装代码&#xff0c;是因为封装后的代码&#xff0c;会显得非常美观&#xff0c;减少代码的复用&#xff0c;方便我们更好的去维护代码&#xff0c;不用一个一个页面的去找去改&#xff0c;直接封装好的代码里面去改就可以了 目录 1.html代码封装 2.CSS代码封装…

《Vue3实战教程》5:响应式基础

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 响应式基础​ API 参考 本页和后面很多页面中都分别包含了选项式 API 和组合式 API 的示例代码。现在你选择的是 组合式 API。你可以使用左侧侧边栏顶部的“API 风格偏好”开关在 API 风格之间切换。 声明响应式状态…

黑马Java面试教程_P8_并发编程

系列博客目录 文章目录 系列博客目录前言1.线程的基础知识1.1 线程和进程的区别&#xff1f;难2频3面试文稿 1.2 并行和并发有什么区别&#xff1f; 难1频1面试文稿 1.3 创建线程的四种方式 难2频4面试文稿 1.4 runnable 和 callable 有什么区别 难2频3面试文稿 1.5 线程的 run…

谷歌浏览器的扩展市场使用指南

谷歌浏览器的扩展市场为用户提供了丰富多样的功能扩展&#xff0c;可以大幅提升浏览体验。本文将为你详细介绍如何使用谷歌浏览器的扩展市场&#xff0c;包括安装、管理和一些推荐的无障碍工具、图标重置方法和便捷操作技巧。&#xff08;本文由https://chrome.py010.cn/的作者…

线程知识总结(一)

1、概述 1.1 进程与线程 进程是程序运行时&#xff0c;操作系统进行资源分配的最小单位&#xff0c;包括 CPU、内存空间、磁盘 IO 等。从另一个角度讲&#xff0c;进程是程序在设备&#xff08;计算机、手机等&#xff09;上的一次执行活动&#xff0c;或者说是正在运行中的程…

【优选算法】Prefix-Kage:前缀和的算法影(上)

文章目录 1.概念解析2.代码实现2.1【模版】前缀和&#xff08;一维&#xff09;2.1.1 原理2.1.2 代码实现 2.2【模版】前缀和&#xff08;二维&#xff09;2.2.1 原理2.2.2 代码实现 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 本篇是优选算…

CVE-2024-32709 WordPress —— Recall 插件存在 SQL 注入漏洞

漏洞描述 WordPress 是一款免费开源的内容管理系统,适用于各类网站,包括个人博客、电子商务系统、企业网站。其插件 WP-Recall 的 account 存在 SQL 注入漏洞,攻击者可以通过该漏洞获取数据库敏感信息。 WP-Recall 版本 <= 16.26.5 漏洞复现 搭建环境、安装插件、完成…