作者归档:admin

thinkphp6文件上传 Filesystem Request

创建配置文件在 data/config/filesystem.php

return [
    'default' => 'local',
    'disks'   => [
        'local'  => [
            'type' => 'local',
            'root' => app()->getRuntimePath() . 'storage',
        ],
        'public' => [
            'type' => 'local',
            'root' => app()->getRootPath() . 'public/storage',
            'url'  => '/storage',
        ],
    ],
];

该处 在创建public磁盘:在更目录的public目录下创建storage文件夹用于存储

前端HTML

 <form method="post" action="{:url('portal/gz/post_info_post')}" enctype="multipart/form-data">

控制器中


use think\facade\Request;
use think\facade\Filesystem;

$file = request()->file('path');
        if (!$file) {
            return json(['code' => 0, 'msg' => '未上传文件']);
        }
#判断是否上传
 $savename = Filesystem::disk('public')->putFile('gz', $file);

#其中返回的信息 $savename

#"gz/20250725/c4219efc6dd44ef8e439b85ed03d667c.png"
#即public下的 storage下 

针对名字字符串,两个字的名字中间加两个空格 三个字的不变

function insertSpaces($str) {
		$result = '';
		$length = mb_strlen($str, 'UTF-8');
		$i = 0;
		$k=0;
		while ($i < $length) {
			// 获取当前字符
			$char = mb_substr($str, $i, 1, 'UTF-8');
			if($i+1<$length){
				$char_next = mb_substr($str, $i+1, 1, 'UTF-8');
			}else{
				$char_next =" ";
			}
			if($char!=" "){
				$k++;
			}
			if($char!=" "&&$char_next==" "){
				// var_dump($k);
				if($k==2){
					$result=$result."  ".$char;
				}else{
					$result=$result.$char;
				}
				$k=0;
			}else{
				$result=$result.$char;
			}
			$i++;
		}
	
		return $result;
	}

结合Qwen2.5-VL 自动化扫描文件分析

东芝扫描仪 设置扫描发生文件的SMB位置,每日早上将多页的A4文档PDF扫描到该位置

主进程对该PDF转化为JPG(暂不考虑多页情况)并将每个JPG使用Qwen2.5-vl进行识别,生成JSON对其保持,按照每个文件级对应的JSON文件保存到数据库和文件存储服务器中。

主进程对全部扫描后的JSON文件,使用QWEN3-30b-a3b进行统计分析,生成固定的结果。

使用OLLAMA API实现

需安装OPENAI库 pathlib库

import base64
from pathlib import Path
from openai import OpenAI

client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")

def describe_image(image_path: str, question: str = "请用文字描述这张图片") -> str:
    path = Path(image_path)
    if not path.exists():
        raise FileNotFoundError(image_path)

    with path.open("rb") as f:
        b64_img = base64.b64encode(f.read()).decode()

    response = client.chat.completions.create(
        model="qwen2.5vl:3b",
        messages=[
            {
                "role": "user",
                "content": [
                    {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{b64_img}"}},
                    {"type": "text", "text": question},
                ],
            }
        ],
        max_tokens=1024,
    )
    return response.choices[0].message.content

# 测试
if __name__ == "__main__":
    print(describe_image("./123.jpg","请总结上面图片信息,请找出其中的:申请部门、合同编号、合同金额、合同名称、对方单位、申请公章名称,并将上面信息分别给予下面的键名:sqbm、htbh、htje、htmc、dfdw、sqgzmc,并将其以json的格式输出。"))


describe_image("图片地址","提示词")
//每次调用都是独立的,不会和上次调用重合起来,只要调整提示词的内容,即可完成对不同OCR的识别格式。

返回信息: 需要吧“`json 和 “` 删掉

```json
{
  "yz": 0,
  "ht": 0,
  "type": 0,
  "sqbm": "",
  "htbh": "",
  "htje": "",
  "htmc": "",
  "dfdw": "",
  "sqgzmc": ""
}
```

模型关联 编写方法,查询时可以调用方法。 with查询 循环

hasOne (本模型有一个外部模型,其外键
belongsTo(本模型中键属于外部模型的外键

一对一、一对多、多对多

关于软删除,默认关联是保留,不用额外操作,但是join的话需要把delete_time 的null判断加入。

一对一 hasOne (本模型有一个外部模型,其外键与本模型主键关联)belongsTo(本模型中键属于外部模型的外键,与外部模型的主键关联)

在user模型中需要关联模型的其中加入一个profile方法。其中Profile为已经存在的模型文件


public function profile(){
    return $this->hasOne(Profile::class);
}
#缩写了外键 profile中的user_id
$this->hasOne(Profile::class,"user_id","id");

表示User模型的id主键与profile模型中的外键user_id关联

public function profile()
    {
    	return $this->hasOne(Profile::class);
    }

下面是belongs 在profile模型 本模型中有个user_id 属于外部模型user的主键id关联

    public function user()
    {
        // 定义反向关联
        return $this->belongsTo(User::class, 'user_id');
    }

一对多 hasMany(本模型有多个外部模型) belongsTo (多个属于一个 所以还是用belongsTo)

return $this->hasMany(Book::class)->order('pub_time');
//上面是省略参数,
//尾部的order可以实现排序
return $this->hasMany(Book::class, 'user_id', 'id')->order('pub_time');
目前的User模型本省的主键,与book模型的user_id实现多个关联

namespace app\model;

use think\Model;

class User extends Model
{
	public function book()
    {
    	return $this->hasMany(Book::class)->order('pub_time');
    }
}

多对多 belongsToMany 有4个参数 【引入模型参数】【 本模型参数】

至少3张表

  • user 用户表 模型
  • role权限表 模型
  • user_role用户权限表(中间表不需要建立模型)
public function roles(){
    return $this->belongsToMany(Role::class, 'user_role', 'role_id', 'user_id');
}

public function users(){
    return $this->belongsToMany(User::class, 'user_role', 'user_id', 'role_id');
    }

方法 :本模型为user的情况下

1.为外表模型

2.关联表(不用模型)

3.关联表中,外表模型的外键 role_id

4.关联表中 ,本表(当前模型)的关联的外键user_id

5.id 本模型的主键 user 可以省略

6.id 关联模型的主键 role 可以省略

》》》with 关联查询《《《 关联模型再关联

$m=$b->with([“a.c”])->select()

$b模型中a是关联,a与c关联 ,
访问$m 循环 $a 循环 $c 前端使用多个volist去取出数据

多对多 中间表 pivot: $m[‘pivot’][‘xxx’];//中间表数据

ORDER 排序

一对多

return $this->hasMany(LeaseModel::class,"lease_id",'id')->order("po_id");
//按照关联表(LeaseModel) 的po_id排序

多对多

    public function propertyone(){
        return $this->belongsToMany(PropertyOneModel::class,'lease','po_id','lease_id')->order("propertyone.id");
    }

//propertyone的id排序
->order("id")
//中间表 lease的id 排序