实习日志7

1.试试pdf发票识别

1.1.添加文件类型判断

//判断文件类型
if (getFileType(imgCodeCell.getValue()) === "jpg"||getFileType(imgCodeCell.getValue()) === "png"
    ||getFileType(imgCodeCell.getValue()) === "jpeg"||getFileType(imgCodeCell.getValue()) === "bmp") {
    url = "customapi/fapiaoapi/vatinvoicebyimg";
    var data = {
        //传入请求地址
        token: access_token, imageUrl: imageBase64Cell.getValue()
    };
} else if (getFileType(imgCodeCell.getValue()) === "pdf") {
    url = "customapi/fapiaoapi/vatinvoicebypdf";
    var data = {
        //传入请求地址
        token: access_token, url: imageBase64Cell.getValue()
    };
} else {
    url = "customapi/fapiaoapi/vatinvoicebyurl"
    var data = {
        //传入请求地址
        token: access_token, url: imageUrlCell.getValue()
    };
}

//直接发送百度AI识别请求
InvoiceIdentificationPost(url,data);

1.2.pdf文件上传报错

需要xhr来处理pdf上传

if (getFileType(imgArray[index]) === "pdf") {
            console.log("识别到pdf文件");
            image = new Image();
            var xhr = new XMLHttpRequest();
            xhr.open("GET", img, true);
            xhr.responseType = "blob"; // 设置响应类型为二进制数据

            xhr.onload = function () {
                console.log("PDF加载完成");
                // var blob = xhr.response;
                var base64 = getBase64Image(image);
                var name = getImgName(imgArray[index]);
                var code = imgArray[index];
                Forguncy.getTableData("image", {"code": code}, function (data) {
                    alert("重复上传文件:" + name);
                }, function (errorMessage) {
                    console.log("添加文件成功" + name);
                    Forguncy.modifyTablesData({
                        image: {
                            addRows: [{
                                name: name, code: imgArray[index], base64: base64, url: imageUrl, is_identify: "未识别"
                            }],
                        }
                    });
                })
                // image.src = URL.createObjectURL(blob);
            }
            xhr.send();
        }

1.3.base64编码错误 

更改pdf的base64编码

改的有点捞,有优化空间,感觉发送的请求太多了,可能会出问题

//imgs=ffc31308-ec72-4268-a977-16f4c366a75f_whitepig.png|3e8582d5-7e4b-4544-8e51-446ba8f70905_blackpig.png
//img[1]=ffc31308-ec72-4268-a977-16f4c366a75f_whitepig.png
//img[2]=3e8582d5-7e4b-4544-8e51-446ba8f70905_blackpig.png
//....
const imgs = Forguncy.Page.getCell("img").getValue();
const imgArray = imgs.split("|");

var page = Forguncy.Page;

//遍历imgArray
for (let i = 0; i < imgArray.length; i++) {
    (function (index) {
        var img = `http://${window.location.host}/Forguncy/FileDownloadUpload/Download?file=` + imgArray[index];
        var imageUrl = `http://${window.location.host}/Forguncy/Upload/` + imgArray[index];
        console.log("第" + index + "轮次的文件:" + img);
        //加载image信息
        // 判断文件类型

        if (getFileType(imgArray[index]) === "jpg" || getFileType(imgArray[index]) === "png" || getFileType(imgArray[index]) === "jpeg" || getFileType(imgArray[index]) === "bmp") {
            console.log("识别到图像文件");
            var image = new Image();
            image.src = img;
            // 加载图像、PDF信息
            image.onload = function () {
                console.log("PDF加载完成");
                var base64 = getBase64Image(image);
                var name = getImgName(imgArray[index]);
                var code = imgArray[index];
                console.log("onload3");
                Forguncy.getTableData("image", {"code": code}, function (data) {
                    alert("重复上传文件:" + name);
                }, function (errorMessage) {
                    console.log("添加图片成功" + name);
                    Forguncy.modifyTablesData({
                        image: {
                            addRows: [{
                                name: name, code: imgArray[index], base64: base64, url: imageUrl, is_identify: "未识别"
                            }],
                        }
                    });
                });
            }
        } else if (getFileType(imgArray[index]) === "pdf") {
            console.log("识别到pdf文件");
            var xhr = new XMLHttpRequest();
            xhr.open("GET", img, true);
            xhr.responseType = "blob"; // 设置响应类型为二进制数据

            xhr.onload = function () {
                console.log("PDF加载完成");
                console.log(imageUrl);
                fetch(imageUrl)
                    .then(response => response.blob())
                    .then(blob => {
                        return new Promise((resolve, reject) => {
                            const reader = new FileReader();
                            reader.onloadend = () => resolve(reader.result.split(',')[1]);
                            reader.onerror = reject;
                            reader.readAsDataURL(blob);
                        });
                    })
                    .then(base64 => {
                        console.log(base64);
                        base64 = "data:application/pdf;base64," + base64;
                        //getPdfBase64返回base64
                        console.log("base64:" + base64);
                        var name = getImgName(imgArray[index]);
                        var code = imgArray[index];
                        Forguncy.getTableData("image", {"code": code}, function (data) {
                            alert("重复上传文件:" + name);
                        }, function (errorMessage) {
                            console.log("添加文件成功" + name);
                            Forguncy.modifyTablesData({
                                image: {
                                    addRows: [{
                                        name: name,
                                        code: imgArray[index],
                                        base64: base64,
                                        url: imageUrl,
                                        is_identify: "未识别"
                                    }],
                                }
                            });
                        })

                    })
                    .catch(error => {
                        console.error(error);
                        //getPdfBase64返回base64
                    });
            }
            xhr.send();
        } else {
            alert("识别到无效文件");
        }
    })(i);
}


function getBase64Image(img) {
    var canvas = document.createElement("canvas");
    canvas.width = img.width;
    canvas.height = img.height;
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0, img.width, img.height);
    var ext = img.src.substring(img.src.lastIndexOf(".") + 1).toLowerCase();
    var dataURL = canvas.toDataURL("image/" + ext);
    return dataURL;
}


function getImgName(input) {
    var match = input.match(/_([^]*)/);
    var result = match && match[1];
    return result || null;
}

function getFileType(inputString) {
    let dotIndex = inputString.lastIndexOf('.');  // 找到最后一个句点的索引
    if (dotIndex !== -1) {
        // 获取句点后的子字符串
        return inputString.slice(dotIndex + 1);
    } else {
        return "文件名不合法";
    }
}

2.清空文件列表

2.1.js代码,活字格好像有点毛病,有时候js代码不生效

Forguncy.modifyTablesData({
    image: {
        editRows: [
            {
                primaryKey:
                    {
                        is_identify: "未识别"
                    },
                values: {
                    is_identify: "past_未识别"
                }
            },
            {
                primaryKey:
                    {
                        is_identify: "已识别"
                    },
                values: {
                    is_identify: "past_已识别"
                }
            },
            {
                primaryKey:
                    {
                        is_identify: "已验真"
                    },
                values: {
                    is_identify: "past_已验真"
                }
            },
            {
                primaryKey:
                    {
                        is_identify: "重复识别"
                    },
                values: {
                    is_identify: "past_重复识别"
                }
            },
        ]
    },
});

2.2.用活字格的图形化操作

嘎嘎好用

3.打印机

3.1.入门看了一下别人的博客

RFID入门学习(三次更改)_rfid知识学习-CSDN博客

3.2.下了个软件

3.3.软件连接数据库

3.3.1.mysql8报错1449:The user specified as a definer (mysql.infoschema@localhost) does not exist

mysql版本太高了

出现这个原因是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password。

解决问题方法有两种,一种是升级navicat驱动(博主用的是navicat是19年装的了,其他软件同理),另一种是把mysql用户登录密码加密规则还原成mysql_native_password。

此处介绍第二种,修改加密规则:

1、登录Mysql:

mysql -u root -p

2、修改账户密码加密规则并更新用户密码:

//修改加密规则(可以直接复制)

ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;

//更新一下用户的密码(可以直接复制)

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

3、刷新权限并重置密码

//刷新权限(可以直接复制)

FLUSH PRIVILEGES;

4、重置密码

//此处请自定义密码,红色的root就是博主自定义的密码

alter user 'root'@'localhost' identified by 'root';

此处将密码改为root

5、重新打开软件,再次连接数据库即可
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/wang1qqqq/article/details/115034433

3.3.2.mysql8报错1449:The user specified as a definer (mysql.infoschema@localhost) does not exist

 

改用Navicat连接时报错 

 

 还是不行,但是我在知乎找到了一篇好文章

问题起因:

在修改了MySQL8.0.23的用户表mysql.user中的root用户口令后(authentication_string 字段值),退出mysql再进入后,使用 show databases/show tables,就出现一下错误:

mysql> show databases;

ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist

mysql> use mysql

Database changed

mysql> show tables;

ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist

解决办法:

总体办法就是给 mysql.infoschema 用户添加权限。

MySQL8.0 之后,不支持使用 grant 时隐式地创建用户,必须先创建用户,再授权。代码如下:

mysql> create user 'mysql.infoschema'@'%' identified by '密码';

Query OK, 0 rows affected (0.01 sec)

mysql> grant all privileges on *.* to 'mysql.infoschema'@'%';

Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.01 sec)


在使用show databases/ show tables,就正常了。

mysql> show databases;

3.4.版本兼容问题

设置了半天显示版本不兼容

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

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

相关文章

Python爬虫解析库安装

解析库的安装 抓取网页代码之后&#xff0c;下一步就是从网页中提取信息。提取信息的方式有多种多样&#xff0c;可以使用正则来提取&#xff0c;但是写起来相对比较烦琐。这里还有许多强大的解析库&#xff0c;如 lxml、Beautiful Soup、pyquery 等。此外&#xff0c;还提供了…

R语言(数据导入,清洗,可视化,特征工程,建模)

记录一下痛失的超级轻松的数据分析实习&#xff08;线上&#xff09;&#xff0c;hr问我有没有相关经历&#xff0c;我说我会用jupyter book进行数据导入&#xff0c;清洗&#xff0c;可视化&#xff0c;特征工程&#xff0c;建模&#xff0c;python学和用的比较多&#xff0c;…

Vue学习之使用开发工具创建项目、gitcode管理项目

Vue学习之使用开发工具创建项目、gitcode管理项目 翻阅与学习了vue的开发工具&#xff0c;通过对比最终采用HBuilderX作为开发工具&#xff0c;以下章节对HBuilder安装与基础使用介绍 1. HBuilder 下载 从HbuildX官网&#xff08;http://www.dcloud.io/hbuilderx.html&#…

HarmonyOS模拟器启动失败,电脑蓝屏解决办法

1、在Tool->Device Manager管理界面中&#xff0c;通过Wipe User Data清理模拟器用户数据&#xff0c;然后重启模拟器&#xff1b;如果该方法无效&#xff0c;需要Delete删除已创建的Local Emulater。 2、在Tool->SDK Manager管理界面的PlatForm选项卡中&#xff0c;取消…

Redis面试(三)

1.Redis报内存不足怎么处理 Redis内存不足的集中处理方式&#xff1a; 修改配置文件redis.cof的maxmemory参数&#xff0c;增加Redis的可用内存通过命令修改set maxmemory动态设置内存上限修改内存淘汰策略&#xff0c;及时释放内存使用Redis集群&#xff0c;及时进行扩容 2…

【MySQL】双写、重做日志对宕机时脏页数据落盘的作用的疑问及浅析

众所周知&#xff0c;双写机制、重做日志文件是mysql的InnoDB引擎的几个重要特性之二。其中两者的作用都是什么&#xff0c;很多文章都有分析&#xff0c;如&#xff0c;双写机制&#xff08;Double Write&#xff09;是mysql在crash后恢复的机制&#xff0c;而重做日志文件&am…

Java 集合 05 综合练习-返回多个数据

代码&#xff1a; import java.util.ArrayList; import java.util.Arrays;public class practice{public static void main(String[] args) {ArrayList<Phone> list new ArrayList<>();Phone p1 new Phone("小米",1000);Phone p2 new Phone("苹…

51单片机通过级联74HC595实现倒计时秒表Protues仿真设计

一、设计背景 近年来随着科技的飞速发展&#xff0c;单片机的应用正在不断的走向深入。本文阐述了51单片机通过级联74HC595实现倒计时秒表设计&#xff0c;倒计时精度达0.05s&#xff0c;解决了传统的由于倒计时精度不够造成的误差和不公平性&#xff0c;是各种体育竞赛的必备设…

数据结构.栈

一、栈的定义 二、初始化 #include<iostream> using namespace std; const int N 10; typedef struct {int data[N];int top; }SqStack; void InitSqStack(SqStack &S)//初始化 {S.top -1; } 三、进栈 void Push(SqStack& S, int x)//入栈 {S.data[S.top] x; …

深入了解Matplotlib中的子图创建方法

深入了解Matplotlib中的子图创建方法 一 add_axes( **kwargs):1.1 函数介绍1.2 示例一 创建第一张子图1.2 示例二 polar参数的运用1.3 示例三 创建多张子图 二 add_subplot(*args, **kwargs):2.1 函数介绍2.2 示例一 三 两种方法的区别3.1 参数形式3.2 布局灵活性3.3 适用场景3…

机器学习:多项式回归(Python)

多元线性回归闭式解&#xff1a; closed_form_sol.py import numpy as np import matplotlib.pyplot as pltclass LRClosedFormSol:def __init__(self, fit_interceptTrue, normalizeTrue):""":param fit_intercept: 是否训练bias:param normalize: 是否标准化…

verdaccio搭建npm私服

一、安装verdaccio 注&#xff1a;加上–unsafe-perm的原因是防止报grywarn权限的错 npm install -g verdaccio --unsafe-perm 二、启动verdaccio verdaccio 三、配置文件 找到config.yml一般情况下都在用户下的这个文件夹下面 注&#xff1a;首次启动后才会生成 C:\Users\h…

/etc/profile错误,命令失效

source /etc/profile后所有命令失效 执行 export PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 修改后 执行:wq! 执行:w !sudo tee %

怎么控制Element的数据树形表格展开所有行;递归操作,打造万能数据表格折叠。

HTML <el-button type"success" size"small" click"expandStatusFun"> <span v-show"expandStatusfalse"><i class"el-icon-folder-opened"></i>展开全部</span><span v-show"expan…

鸿蒙原生应用开发已全面启动,你还在等什么?

2019年&#xff0c;鸿蒙系统首次公开亮相&#xff0c;你们说&#xff0c;等等看&#xff0c;还不成熟&#xff1b; 2021年&#xff0c;鸿蒙系统首次在手机端升级&#xff0c;你们说&#xff0c;等等看&#xff0c;还不完善&#xff1b; 2024年&#xff0c;鸿飞计划发布&#…

STM32以太网接口在TCP/IP通信中的应用案例

在STM32的以太网通信中&#xff0c;TCP/IP协议广泛应用于各种领域&#xff0c;如远程监控、物联网、工业控制等。下面以一个STM32基于TCP/IP协议的以太网通信的应用案例为例进行介绍。 ✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进 ❤欢迎关注…

C#颜色拾取器

1&#xff0c;目的&#xff1a; 获取屏幕上任意位置像素的色值。 2&#xff0c;知识点: 热键的注册与注销。 /// <summary>/// 热键注册/// </summary>/// <param name"hWnd">要定义热键的窗口的句柄 </param>/// <param name"id…

如何使用Python Flask搭建一个web页面并实现远程访问

文章目录 前言1. 安装部署Flask并制作SayHello问答界面2. 安装Cpolar内网穿透3. 配置Flask的问答界面公网访问地址4. 公网远程访问Flask的问答界面 前言 Flask是一个Python编写的Web微框架&#xff0c;让我们可以使用Python语言快速实现一个网站或Web服务&#xff0c;本期教程…

C++多线程1(复习向笔记)

创建线程以及相关函数 当用thread类创建线程对象绑定函数后&#xff0c;该线程在主线程执行时就已经自动开始执行了,join起到阻塞主线程的作用 #include <iostream> #include <thread> #include <string> using namespace std; //测试函数 void printStrin…

Java强训day10(选择题编程题)

选择题 public class Test01 {public static void main(String[] args) {try{int i 100 / 0;System.out.print(i);}catch(Exception e){System.out.print(1);throw new RuntimeException();}finally{System.out.print(2);}System.out.print(3);} }编程题 题目1 import jav…