【快速上手系列】使用七牛云+webuploader实现对象云存储(OSS)

news2025/7/26 19:19:12

【快速上手系列】使用七牛云+webuploader实现对象云存储(OSS)

步骤

一、七牛云配置

1、新建存储空间

进入七牛云,注册登录,进入控制台,选择对象存储 Kodo

选择空间管理——新建空间(免费30天)

请添加图片描述

写好了之后点击确定

请添加图片描述

2、获取 AccessKey、SecretKey

点击右上角的账户,点击密钥管理

请添加图片描述

可以看到自己的ak和sk,保存下来(一对即可)

请添加图片描述

除此之外,还需要保存一下自己的空间名和域名(注意域名有过期时间)

域名如图:

请添加图片描述

二、使用webuploader组件

1、下载

在webuploader官网下载组件:http://fex.baidu.com/webuploader/

直接下载最新版本即可

请添加图片描述

2、使用:两种方式

项目结构:将下载的webuploader组件按下图放入(还有jquery)

请添加图片描述

分为前后端不分离和前后端分离两种方式,一会会分别细说两种方式

接下来先进行后端测试

首先写入index.html代码(路径都改好)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>webuploader上传</title>
	<script type="text/javascript" src="js/jquery-3.6.0.js" charset="UTF-8"></script>
	<!--引入WebUploader文件上传的CSS-->
	<link rel="stylesheet" type="text/css" href="css/webuploader.css" media="screen" />	
	<!--引入WebUploader文件上传的JS-->
	<script type="text/javascript" src="js/webuploader.js"></script>
	
	</head>
	<body>
		<!--用来存放文件信息-->
		<div class="uploader-demo">
		    <!--存放图片的预览图-->
		    <div id="imgs" style="border: 1px solid black;width: 460px;height: 150px;margin-bottom: 10px;padding: 10px;overflow:scroll;
					 white-space: nowrap;">
		       <!-- <img src="xxx" style="width: 100px;height: 130px;margin-right: 10px"/>-->
		    </div>
		    <div class="btns">
		    	<input type="hidden" id="imgs_path" name="gimage"/>
		        <div id="filePicker">选择图片</div>
		        <button id="ctlBtn" class="mybutton" onclick="upload_imgs()">开始上传</button>
				<marquee id="msrcoll" width="235px" direction="right" style="display:none">
					图片正在上传,请稍作等待...
				</marquee>
			</div>

		</div>

	</body>

<!-- js代码 -->
<script type="text/javascript">
    var uploader;
    $(function(){
        //初始化Web Uploader,每上传一个文件都会创建一个uploader对象,同时选择多个文件时,则会创建多个uploader对象。
        uploader = WebUploader.create({
            // 选完文件后,是否自动上传。
            auto: false,     //true时,选择文件后自动上传。
            // swf文件路径
            swf: 'js/Uploader.swf',
            // 文件接收服务端。
            server: '/这里是访问你后端controller层的路径',
            // 选择文件的按钮。可选。
            pick: '#filePicker',
            // 只允许选择图片文件。
            accept: {
                title: 'Images',
                extensions: 'gif,jpg,jpeg,bmp,png',
                mimeTypes: 'image/*'
            }
        });
        
        //给webuploader绑定事件    fileQueued 当文件被加入队列后触发。  file参数表示当前文件对象
        uploader.on('fileQueued',function (file) {
            //生成图片的缩略图   ret表示缩略图的路径
            //makeThumb( file, callback, width, height ) 
            uploader.makeThumb(file,function (error, ret ) {
                if (error){
                    alert(file.name+"缩略图生成失败!");
                } else{
                    //将缩略图放入div容器中
                    var img="<img src=\""+ret+"\" style=\"width: 100px;height: 130px;margin-right: 10px\"/>";
                    $("#imgs").append(img);
                }
            }, 100, 130)
        });
        
         //给webuploader绑定上传成功事件
        uploader.on("uploadSuccess",function (file,response) {
            var value= $("#imgs_path").val();
            if(value.length>0){
                value+="|";
            }
            value+=response.uploadPath;
            $("#imgs_path").val(value);
			if (response.status == 1 && value.length>0) {
				alert("上传成功")
				$("#msrcoll").css("display","none");
			} else {
				alert("上传失败")
				$("#msrcoll").css("display","none");
			}
        });
    })

    //上传图片
    function upload_imgs() {
        if (uploader){
            uploader.upload();
			$("#msrcoll").css("display","block");
        }
    }
</script>

</html>

这页面整好了之后长这样

请添加图片描述

后端代码
进行后端测试

后端项目所需maven依赖:

pom.xml

<!--七牛云-->
<!-- https://mvnrepository.com/artifact/com.qiniu/qiniu-java-sdk -->
<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniu-java-sdk</artifactId>
    <version>7.11.0</version>
</dependency>

<!--七牛云的上传工具类-->
<!--OKHTTP-->
<!--        <dependency>-->
<!--            <groupId>com.squareup.okhttp3</groupId>-->
<!--            <artifactId>okhttp</artifactId>-->
<!--            <version>3.6.0</version>-->
<!--        </dependency>-->

<!--上传-->
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.11.0</version>
</dependency>

<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>happy-dns-java</artifactId>
    <version>0.1.6</version>
    <scope>test</scope>
</dependency>

<!--解析json-->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
    <scope>compile</scope>
</dependency>

<!--springboot-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>


<!--如果只是测试,不连数据库下面的不用导-->
<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<!--mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.0</version>
</dependency>
<!--mysql驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

项目结构(前后端分离的没有webapp)

请添加图片描述

七牛云工具类QiniuCloudUtil.java

tips:把上面保存的四个参数放到相应的XXXXXXXXXX上即可

package com.example.util;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.storage.model.FileInfo;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;


/**
 * 七牛云上传文件工具类
 * 官方
 */
public class QiniuCloudUtil {

    // 设置需要操作的账号的AK和SK					(AK和SK均在七牛云中获得,以下会说明)
    private static final String ACCESS_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    private static final String SECRET_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

    // 要上传的空间								(刚刚新建空间的名称)
    private static final String bucketname = "XXXXXXXXXXXXXXXXXXXXXX";

    // 密钥
    private static final Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);

    //地区分布实例化
    private static final Configuration cfg = new Configuration(Region.huadongZheJiang2());

    //新建空间时,七牛云分配出的域名 (自己可在万网购买域名解析后,绑定到加速域名)
    private static final String DOMAIN = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

    public static String getUpToken() {
        //如果希望只能上传指定key的文件,并且不允许修改,那么可以将下面的 insertOnly 属性值设为 1。
        return auth.uploadToken(bucketname, null, 3600, new StringMap().put("insertOnly", 1));
    }

    /**
     * 上传文件使用
     *
     * @return
     */
    public static UploadManager init() {
        //构造一个带指定 Region 对象的配置类

        cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
        UploadManager uploadManager = new UploadManager(cfg);
        return uploadManager;
    }

    /**
     * 本地上传
     */
    public static void addLocalImage() {


        //如果是Windows情况下,格式是 D:\\qiniu\\test.png
        String localFilePath = "E:\\imgs\\logo1.jpg";
        //默认不指定key的情况下,以文件内容的hash值作为文件名
        String key = null;

        Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
        String upToken = auth.uploadToken(bucketname);

        try {
            UploadManager uploadManager = init();
            Response response = uploadManager.put(localFilePath, key, upToken);
            //解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            System.out.println(putRet.key);
            System.out.println(putRet.hash);
        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println(r.toString());
            try {
                System.err.println(r.bodyString());
            } catch (QiniuException ex2) {
                //ignore
            }
        }

    }

    /**
     * 通过字节数组传播
     */
    public static DefaultPutRet addByBytesImage(byte[] bytes) {

        DefaultPutRet putRet = null;
        try {
//            byte[] uploadBytes = "hello qiniu cloud".getBytes("utf-8");
            Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
            String upToken = auth.uploadToken(bucketname);

            //默认不指定key的情况下,以文件内容的hash值作为文件名
            String key = null;
            UploadManager uploadManager = init();
            try {
                Response response = uploadManager.put(bytes, key, upToken);
                //解析上传成功的结果
                putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
                return putRet;

            } catch (QiniuException ex) {
                Response r = ex.response;
                System.err.println(r.toString());
                try {
                    System.err.println(r.bodyString());
                } catch (QiniuException ex2) {
                    //ignore
                }
            }
        } catch (Exception e) {
            //ignore
        }
        return putRet;
    }


    /**
     * @param key 图片的文件名
     * @Explain 删除空间中的图片
     */
    public static void delete(String key) {
        BucketManager bucketManager = new BucketManager(auth, cfg);
        try {
            bucketManager.delete(bucketname, key);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 查找指定文件信息
     *
     * @param key
     * @return
     */
    public static FileInfo getFile(String key) {
        BucketManager bucketManager = new BucketManager(auth, cfg);
        FileInfo fileInfo = null;
        try {
            fileInfo = bucketManager.stat(bucketname, key);

        } catch (QiniuException ex) {
            System.err.println(ex.response.toString());
        }
        return fileInfo;
    }

    /**
     * 查找所有文件信息
     *
     * @param
     * @return
     */
    public static BucketManager.FileListIterator getAllFile() {
        //文件名前缀
        String prefix = "";
        //每次迭代的长度限制,最大1000,推荐值 1000
        int limit = 1000;
        //指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串
        String delimiter = "";
        BucketManager bucketManager = new BucketManager(auth, cfg);
        //列举空间文件列表
        BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucketname, prefix, limit, delimiter);
        return fileListIterator;
    }

    /**
     * 下载
     * fileName 七牛云上存储文件生成的文件名
     * @throws IOException
     */
    public static List<String> download(String fileName[]) throws IOException {
        List<String> list=new ArrayList<>();
        for (int i = 0; i < fileName.length; i++) {
            String encodedFileName = URLEncoder.encode(fileName[i], "utf-8").replace("+", "%20");
            String finalUrl = String.format("%s/%s", DOMAIN, encodedFileName);
            list.add(finalUrl);
        }
        return list;
    }

}

测试类Test01.java(写好四个参数加图片路径即可)

package com.example.Test;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;

public class Test01 {

    public static void main(String[] args) {
        //构造一个带指定Region对象的配置类
        Configuration cfg = new Configuration(Region.huadongZheJiang2());
        cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
        //...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        //...生成上传凭证,然后准备上传
        String accessKey = "XXXXXXXXXXXXXXXXXXXXX";
        String secretKey = "XXXXXXXXXXXXXXXXXXXXXXXXX";
        //空间名称
        String bucket = "XXXXX";
//如果是Windows情况下,格式是 D:\\qiniu\\test.png
        String localFilePath = "e:\\11.jpg";
//默认不指定key的情况下,以文件内容的hash值作为文件名
        String key = null;
        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);


        try {
            Response response = uploadManager.put(localFilePath, key, upToken);
            //解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            System.out.println(putRet.key);
            System.out.println(putRet.hash);
        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println(r.toString());
            try {
                System.err.println(r.bodyString());
            } catch (QiniuException ex2) {
                //ignore
            }
        }

    }

}

运行,可以看到控制台返回key和hash值(也就是在七牛云中看见上传的文件名),像这样

请添加图片描述

然后回到七牛云,查看自己创建的空间文件,可以看到文件被上传进来了

请添加图片描述

这样就成功了

使用webuploader上传文件

Controller层

WebController.java类

package com.example.Controller;


import com.example.util.QiniuCloudUtil;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.storage.model.FileInfo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

@RestController
public class WebController {

//    @Autowired
//    private QiNiuService qiNiuService;

    /**
     * 上传图片的方法
     * @param files
     * @return
     * @throws IOException
     */
    @PostMapping("/addResource")
    public Map<String, Object> test(@RequestParam(name = "file", required = true) MultipartFile[] files) throws IOException {
        Map<String, Object> map = new HashMap<>();
        byte b[] = new byte[1024];
        for (MultipartFile file : files) {
            byte[] bytes = file.getBytes();
            DefaultPutRet putRet = QiniuCloudUtil.addByBytesImage(bytes);
            if (putRet != null) {

//                //向数据库中添加信息
//                QiNiu qn = new QingNiu();
                  String key = putRet.key;
                  String hash = putRet.hash;
//                qn.setId(key);
//                qn.setCodeid(hash);
//                qiNiuService.save(qn);

                System.out.println("key:" + key);
                System.out.println("hash:" + hash);

            } else {
                System.out.println("上传失败");
                map.put("status",0);
                return map;

            }

        }
        System.out.println("上传成功");
        map.put("status",1);
        return map;
    }

    @PostMapping ("/delResource")
    public void delect(){
        QiniuCloudUtil.delete("xxxxxxxxxxxxxxxxxxxx");
    }


    @GetMapping("/getResource")
    public void getFile(){
        FileInfo file = QiniuCloudUtil.getFile("xxxxxxxxxxxxxxxxxxxxx");
        System.out.println(file.hash);
        System.out.println(file.fsize);
        System.out.println(file.mimeType);
        System.out.println(file.putTime);
    }

    @GetMapping("/getAllResource")
    public void getAllFile(){
        BucketManager.FileListIterator fileListIterator = QiniuCloudUtil.getAllFile();
        while (fileListIterator.hasNext()) {

            //处理获取的file list结果
            FileInfo[] items = fileListIterator.next();
            for (FileInfo item : items) {
                System.out.println("=========================");
                System.out.println(item.key);
                System.out.println(item.hash);
                System.out.println(item.fsize);
                System.out.println(item.mimeType);
                System.out.println(item.putTime);
                System.out.println(item.endUser);
            }
        }
    }

}

这里有一个上传图片的方法

将前端js改成controller访问的路径

用tomcat启动项目

打开前端页面

前后端不分离

前后端都使用idea写,新建一个springboot项目,在webapp设置结构如图(和上面没差)

请添加图片描述

输入本项目的index.html路径访问浏览器,直接进行使用即可

效果:

请添加图片描述

回到七牛云查看文件可以发现文件都上传成功了

请添加图片描述

前后端分离

使用HBuilder写前端,新建一个web项目,将下载的webuploader组件按下图放入(还有jquery)

请添加图片描述

这个与前后端分离不同的区别在于不是一个端口上的进程,存在跨域问题,所以需要解决跨域问题

需要在后端写一个拦截器

拦截器类Filter.java

package com.example.util;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(filterName = "requestFilter", urlPatterns = {"/*"})
public class Filter implements javax.servlet.Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        // 此处 setHeader、addHeader 方法都可用。但 addHeader时写多个会报错:“...,but only one is allowed”
        response.setHeader("Access-Control-Allow-Origin", "*");
        //response.addHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
        // 解决预请求(发送2次请求),此问题也可在 nginx 中作相似设置解决。
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Cache-Control,Pragma,Content-Type,Token, Content-Type");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        String method = request.getMethod();
        if (method.equalsIgnoreCase("OPTIONS")) {
            servletResponse.getOutputStream().write("Success".getBytes("utf-8"));
        } else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }

    @Override
    public void destroy() {

    }
}

然后在springboot启动类中加入注解

//添加过滤器
@ServletComponentScan

这样就可以正常使用了

在HBuilder中打开index.html,然后直接进行使用,结果和上面的是一样的

上传信息到数据库的话可以自己写

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]java毕业设计企业人力资源管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【Bio】基础生物学 - 基因 gene

文章目录1. DNA 脱氧核糖核酸、RNA 核糖核酸1.1 核苷酸1.2 脱氧核糖核酸1.3 核糖核酸2. 基因2.1 基因组2.2 染色体2.3 基因与脱氧核苷酸的牵连2.4 基因与DNA的牵连2.5 基因与染色体的牵连Ref1. DNA 脱氧核糖核酸、RNA 核糖核酸 1.1 核苷酸 核苷酸 (Nucleotide)\blue{\text{核苷…

如何使用家庭网络运行Aleo Prover

目前ALEO三测第二阶段太卷了&#xff0c;虽然现阶段没有激-励&#xff0c;但是仍然有不少人卷进去&#xff0c;导致现在8核的云服务器一天才只能跑出三四个scores&#xff0c;可见大家的热情还是非常高的&#xff0c;但是这对于之前购买云服务器的用户来说&#xff0c;就比较难…

全网营销如何落地?全网营销的途径有哪些?

随着移动互联网的遍及&#xff0c;如今企业的经营发展越来越离不开全网营销。有些小伙伴可能对全网营销的具体操作方法有些不解&#xff0c;这里小马识途营销顾问系统解读下全网营销。 一、 什么是全网营销&#xff1f; 全网营销是全网整合营销的简称&#xff0c;即从产品规划、…

同花顺_代码解析_技术指标_D

本文通过对同花顺中现成代码进行解析&#xff0c;用以了解同花顺相关策略设计的思想 目录 DBCD DDI DMAFS DMI DMI_QL DPO DBCD 异同离差乖离率 公式描述&#xff1a; 先计算乖离率BIAS&#xff0c;然后计算不同日的乖离率之间的离差&#xff0c; 最后对离差进行指数移…

ArcGIS pro求点线最短距离Near

ArcGIS pro求点线最短距离Near 如果是ArcGIS经典版&#xff0c;可以从以下路径找到&#xff1a; ArcGIS pro就更简单了&#xff0c;在Analysis面板&#xff1a; 打开之后来介绍一下各参数意义&#xff1a; 按照ArcGIS帮助&#xff0c;该工具可求点、线、面之间的最短距离。 其…

React-Mobx(入门)

目录 1. Mobx介绍 优势 社区评价 ​编辑 2.配置开发环境 3.基础使用 1&#xff09;初始化mobx 2&#xff09;React使用store 4.计算属性&#xff08;衍生状态&#xff09; 5.异步数据处理 6. 模块化 1&#xff09;定义task模块 2&#xff09;定义counterStore 3&am…

配置错误的smb共享

介绍 Windows 是当今最流行的操作系统&#xff0c;不仅由个人用户使用&#xff0c;而且在大公司中也广泛使用。由于其操作简单性以及使用图形界面&#xff0c;如今&#xff0c;大量实体的公司网络充满了运行Windows操作系统的主机和服务器。无论这些机器针对的是最终用户、我们…

XSS-labs靶场实战(一)——第1-3关

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是XSS-labs靶场实战。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权设备…

Linux安全--iptables详解

目录 1、iptables介绍 2、iptables四表五链详解 3、iptables基本语法 4、实际操作 4.1 增加规则 4.2 删除规则 4.3 修改规则 5、命令语法总结 6、基本匹配条件 7、iptables进阶用法 7.1 iprange扩展模块 7.2 string扩展模块 8、iptables进行端口转发 1、iptables介绍 …

【Python】面向Sqli-Labs Less15的布尔盲注二分法脚本

前言 其实写这个python脚本是为了完成我某节课的某个实验 代码里有一堆一堆的for循环&#xff0c;导致程序整个运行下来起码需要一个小时&#xff0c;而且还是基于二分法的qwq。本来想说去学一学python的多线程提升一下效率&#xff0c;但我发现我这代码一环扣一环&#xff0c…

基于PHP+MySQL的在线学习网站系统

随着我国教育体制的改革,我国大学生的数量越来越多。相对应的对我国的教育质量也提出了新的要求。如果仅仅是在课堂上学习那些有限的知识已经不能够再满足大学生对知识的渴望了。为了能够让大学生学习到更多的内容需要一个在线学习系统来辅助大学生进行学习。 PHP在线学习网站系…

点阵 LED 显示设计实验

一、实验目的&#xff1a; 1.了解LED点阵的基本结构。 2.学习LED点阵扫描显示程序的设计方法。 二、实验内容与要求&#xff1a; 编写程序&#xff0c;控制点阵向上卷动显示“原来如此是这样呀”。 实验系统中的1616 LED点阵由四块88LED点阵组成&#xff0c;如图1所示&…

[附源码]SSM计算机毕业设计作业自动评阅系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【多标签文本分类】《融合注意力与CorNet的多标签文本分类》

阅读摘要&#xff1a;   本文主要提出标签与文本注意力文本注意力、CorNet增强标签预测概率两个创新点&#xff0c;提升了实验精度。 参考文献&#xff1a;   [1] 融合注意力与CorNet的多标签文本分类 参考论文信息 论文名称&#xff1a;《融合注意力与CorNet的多标签文本分…

2.10 80%的小红书新手博主都会忽略的问题:排版【玩赚小红书】

其实&#xff0c;不管在哪一个平台发布作品&#xff0c;都需要注重排版。 因为舒服的排版&#xff0c;不仅能让读者视觉舒服&#xff0c;而且也是你重新检查作品逻辑是不是清晰的过程。 比如&#xff0c;你看下面这张对比图&#xff0c;从读者角度来看&#xff0c;你更喜欢排…

人类小脑内在组织背后的基因图谱

摘要 人类小脑的功能多样性在很大程度上被认为更多地来自于其广泛的联系&#xff0c;而不是局限于其部分不变的结构。然而&#xff0c;小脑内在组织中连接的确定是否以及如何与微尺度基因表达相互作用仍不清楚。在这里&#xff0c;我们通过研究同时连接小脑功能异质性及其驱动因…

【快速上手系列】使用idea调百度AI接口实现人脸识别功能

【快速上手系列】使用idea调百度AI接口实现人脸识别功能 一、人脸检测 步骤 1、百度AI开放平台 登录后点击控制台 点击公有云服务——应用列表——点击创建应用 填写一下信息然后创建 然后回到概览——领取免费资源&#xff08;如果账号没领取过的话&#xff09; 可以自选&…

[Java] [Spring boot] Mybatis generator 生成Mapper.xml无效的问题

报错&#xff1a;org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 百度出来的解决方案&#xff1a; 1&#xff1a;Mapper.xml中的namespace不对应和mapper接口不对应 2&#xff1a;Mapper.xml中的方法(即id)和mapper接口中的方法名字不同或…

使用 nexus 作为 npm 私服

背景: 之前公司内部是使用的 verdaccio 作为私有前端 npm 仓库的工具的, 由于最近安装包时总是遇到问题, 发包 和 安装都比较慢, 不太确定具体是什么问题 几经解决还是没能够解决掉, 索性换一个工具试试, 公司后端的 maven 库私服是使用的 nexus, 找资料时发现 nexus 也是可…