标签 php 下的文章

likeadmin我发现是一个非常好用,并且能快速上手的整套后台程序。它使用了thinkphp6+vue的架构,而且还可以使用后台的代码生成工具,快速的创建后台管理表单,大大节省了时间。
在使用这个后台框架的时候,里面自带了一个“素材中心”。但是这个“素材中心”它限制了上传的类型,只能上传图片和视频两种类型。但是如果我们需要上传其它文件,并且也想通过这个“素材中心”来进行管理的话,我们就需要去改动代码了。
主要改动的PHP文件,涉及3个文件,分别是以下4个:

  1. config/project.php
  2. app/common/service/UploadService.php
  3. app/common/service/storage/engine/Server.php
  4. app/adminapi/controller/UploadController.php
    首先,我们先找到project.php文件,我们可以找到
'file_files' => [
    'xls', 'xlsx'
],

然后在后面加上

// 文件上传限制 (文件)
'file_files' => [
    'xls', 'xlsx'
],

然后找到第二个文件UploadService.php
我们可以找到最后的“视频上传”方法,然后在后面加上文件上传的方法

public static function files($cid, int $sourceId = 0, int $source = FileEnum::SOURCE_ADMIN, string $saveDir = 'uploads/files')
{
    try {
        $config = [
            'default' => ConfigService::get('storage', 'default', 'local'),
            'engine'  => ConfigService::get('storage') ?? ['local'=>[]],
        ];
        
        // // 2、执行文件上传
        $StorageDriver = new StorageDriver($config);
        $StorageDriver->setUploadFile('file');
        
        $fileName = $StorageDriver->getFileName();
        $fileInfo = $StorageDriver->getFileInfo();
        
        // 校验上传文件后缀
        if (!in_array(strtolower($fileInfo['ext']), config('project.file_files'))) {
            throw new Exception("文件不允许上传". $fileInfo['ext'] . "文件");
        }
        
        // 上传文件
        $saveDir = $saveDir . '/' .  date('Ymd');
        if (!$StorageDriver->upload($saveDir)) {
            throw new Exception($StorageDriver->getError());
        }

        // 3、处理文件名称
        if (strlen($fileInfo['name']) > 128) {
            $name = substr($fileInfo['name'], 0, 123);
            $nameEnd = substr($fileInfo['name'], strlen($fileInfo['name'])-5, strlen($fileInfo['name']));
            $fileInfo['name'] = $name . $nameEnd;
        }

        // 4、写入数据库中
        $file = File::create([
            'cid'         => $cid,
            'type'        => FileEnum::FILE_TYPE,
            'name'        => $fileInfo['name'],
            'uri'         => $saveDir . '/' . str_replace("\\","/", $fileName),
            'source'      => $source,
            'source_id'   => $sourceId,
            'create_time' => time(),
        ]);

        // 5、返回结果
        return [
            'id'   => $file['id'],
            'cid'  => $file['cid'],
            'type' => $file['type'],
            'name' => $file['name'],
            'uri'  => FileService::getFileUrl($file['uri']),
            'url'  => $file['uri']
        ];

    } catch (Exception $e) {
        throw new Exception($e->getMessage());
    }
}

添加好了以后,找到最后一个文件Server.php
在大约45行的样子,找到

 $limit = array_merge(config('project.file_image'), config('project.file_video'));

这行代码,然后修改成

$limit = array_merge(config('project.file_image'), config('project.file_video'), config('project.file_files'));

文件UploadController.php
在64行位置public function video()方法的后面,添加

/**
 * @notes 上传文件
 * @return Json
 * @author teaxia
 * @date 2024/01/11 0:15
 */
public function files()
{
    try {
        $cid = $this->request->post('cid', 0);
        $result = UploadService::files($cid);
        return $this->success('上传成功', $result);
    } catch (Exception $e) {
        return $this->fail($e->getMessage());
    }
}

至此,php部分修改完成。
前端部分呢,找到
src/views/material/index.vue文件
在tabsMap里面添加

{
    type: 'files',
    name: '文件'
}

src/components/material/index.vue文件
找到56行

<upload v-if="type == 'video'" class="mr-3" :data="{ cid: cateId }" :type="type" :show-progress="true"
    @change="refresh">
    <el-button type="primary">本地上传</el-button>
</upload>

在后面添加

<upload v-if="type == 'files'" class="mr-3" :data="{ cid: cateId }" :type="type" :show-progress="true"
    @change="refresh">
    <el-button type="primary">本地上传</el-button>
</upload>

找到276行左右

case 'video':
    return 20

在后面添加

case 'files':
    return 30

    // 上传图片
    $base64_url = $_POST['image']; //这里是获取图片的名称,当然也可以自己拼接
    // 图片的名称
    $name = $_POST['name'].date("His",time())."_".rand(1000,9999).'.jpg'; // 注意后面的.jpg,如果需要的话,自己进行一次判断
    //判断是否有逗号 如果有就截取后半部分
    if (strstr($base64_url,",")){
        $base64_url = explode(',',$base64_url);
        $base64_url = $base64_url[1];
    }
    // 解码图片
    $data = base64_decode($base64_url);
    //设置图片保存路径
    // 判断是什么图片
    $type = $_POST['type']==0?'original':'compose';
    $path = "./img/".$type."/".date("Ymd",time());
    //判断目录是否存在 不存在就创建
    if (!is_dir($path)){
        mkdir($path,0755,true); // windows跟linux的系统权限不太一样哦
    }
    //图片路径
    $imageSrc= $path."/". $name;
    //生成文件夹和图片
    $r = file_put_contents($imageSrc, $data);
    if (!$r) {
        $redata['success'] = 1;
        $this->ajaxReturn($redata);  // 图片生成失败,自己处理一下吧
    }else {
        $redata['success'] = 0;
        $redata['imgurl'] = $imageSrc;
        $this->ajaxReturn($redata); //图片生成成功 返回状态或者其他信息
    }

<?php

function yzm($w=100,$h=50,$t=3,$num) {

//$w=画布宽度,$h=画布高度 ,$t=验证码字符集

// 1、 准备画布

$img=imagecreatetruecolor($w,$h);

// 2、 为画布准备调色板

//$bgcolor=imagecolorallocate($img,rand(130,255),rand(130,255),rand(130,255));

/* $s=imagecolorallocate($img,rand(1,130),rand(1,130),rand(1,130));

$d=imagecolorallocate($img,rand(130,255),rand(130,255),rand(130,255)); */

// 3、 用函数画画

imagefilledrectangle($img,0,0,$w,$h,d($img));

//使用for循环输出100个像素点干扰元素

for($i=1;$i<=100;$i++){

imagesetpixel($img,rand(0,$w),rand(0,$h),s($img));

}

//使用for循环输出4个椭圆形干扰元素

for($i=1;$i<=4;$i++){

imageellipse($img,rand(0,$w),rand(0,$w),rand(0,$w),rand(0,$w),s($img));

}

//进行字符匹配

$str=''; //声明一个变量,给他一个空值

for($i=1;$i<=$num;$i++) {

if($t<3) {

$type=$t;

}else{

$type=rand(0,2);}

switch ($type) {

case 0:

//数字

$ascii=rand(48,57);

break;

case 1:

//大写字母

$ascii=rand(65,90);

break;

case 2:

//小写字母

$ascii=rand(97,122);

break;

}

$str.=chr($ascii);

//这里循环出来是一个数组,下面通过数组加下标的形式访问

}

//使用for循环出4个字母

for ($i=0;$i<$num;$i++) {

$x=$i*($w/$num)+10;

$y=rand(2,$h-15);

imagechar($img,7,$x,$y,$str[$i],s($img));

}

// 4、 告诉服务器你画的是什么玩意

header("content-type:image/jpg");

// 5、 输出到浏览器或者保存为文件

imagejpeg($img);

// 6、 销毁资源(画布和调色板)

imagedestory($img);

}

//随机输出背景颜色

function s($img) {

return imagecolorallocate($img,rand(1,130),rand(1,130),rand(1,130));

}

//随机输出验证码颜色

function d($img) {

return imagecolorallocate($img,rand(130,255),rand(130,255),rand(130,255));

}

yzm(125,30,3,4); //参数.宽度,高度,0=验证码全是数字 1=大写字母 2=小写字母 3以上是数字和字母混编,有多少个验证码

?>