springBoot+ureport报表引擎

UReport是一款基于单元格迭代模型的纯Java中式报表引擎。它架构于Spring之上,因此与企业应用具有良好的集成能力。UReport提供了基于Eclipse插件与基于网页的两种报表模版设计方式,采用类Excel报表模版设计风格,简单、易上手,可在不编程的情况下完成绝大多数报表模版的设计工作。

UReport的主要作用体现在以下几个方面:

  1. 报表设计:UReport支持简单、复杂报表的设计,能够很好地嵌合实际业务需求。无论是通过纯SQL还是配置的方式,都可以实现针对不同人员的报表管理。
  2. 数据实时处理:UReport能够根据实时数据自动调整参数,以达到最佳效果。这种自动调整参数的能力使得模型能够快速响应并精确预测,同时减少人工参与的次数,提升模型的投入产出比。
  3. 参数优化:UReport是一种强大的参数优化技术,它能够帮助用户改进模型参数,最大化模型性能,并减少人工参与,提高模型的运行效率。通过UReport的帮助,用户可以更快地实现模型的优化,提升性能,加快产品开发进度,从而节省大量时间和金钱。

首先看一下整体目录:

最终显示结果:

一:需要引入相关依赖pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.crwl</groupId>
    <artifactId>ureport</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring-cloud.version>2.1.1.RELEASE</spring-cloud.version>
        <flowable.version>6.5.0</flowable.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <version>2.0.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.0.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.0.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <version>1.16.20</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.6.10</version>
        </dependency>
        <dependency>
            <groupId>com.jfinal</groupId>
            <artifactId>activerecord</artifactId>
            <version>4.8</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.6</version>
        </dependency>
        <dependency>
            <groupId>com.bstek.ureport</groupId>
            <artifactId>ureport2-console</artifactId>
            <version>2.2.9</version>
        </dependency>

        <dependency>
            <groupId>com.bstek.ureport</groupId>
            <artifactId>ureport2-core</artifactId>
            <version>2.2.9</version>
        </dependency>

    </dependencies>
</project>

二:配置resources:

1.  application.yaml

server:
  port: 9090
  servlet:
    context-path: /pro
spring:
  http:
    encoding:
      force: true
      enabled: true
      charset: UTF-8
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/j2eedb?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false&allowMultiQueries=true&nullNamePatternMatchesAll=true
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
  resources:
    static-locations: classpath:/,classpath:/static/

2.  config目录下config.properties:

#ureport.fileStoreDir=D:/myfile/ureportfiles
ureport.disableFileProvider=true
ureport.fileToDbStoreDir=D:/ureportDbfiles
ureport.disableFileDbProvider=false
ureport.contextPath=/pro

3.  config目录下context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <import resource="classpath:ureport-console-context.xml" />
    <bean id="propertyConfigurer" parent="ureport.props">
        <property name="locations">
            <list>
                <value>classpath:config/config.properties</value>
            </list>
        </property>
    </bean>
    <bean id="ureport.fielToDataBaseProvider" class="com.report.provider.FileToDatabaserProvider">
        <property name="fileStoreDir" value="${ureport.fileToDbStoreDir}"></property>
        <property name="disabled" value="${ureport.disableFileDbProvider}"></property>
    </bean>
</beans>

三:配置数据源DataSourceConfig.java

package com.report.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.report.model._MappingKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {
    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }

    /**
     * 设置数据源代理
     */
    @Bean
    public TransactionAwareDataSourceProxy transactionAwareDataSourceProxy() {
        TransactionAwareDataSourceProxy transactionAwareDataSourceProxy = new TransactionAwareDataSourceProxy();
        transactionAwareDataSourceProxy.setTargetDataSource(druidDataSource());
        return transactionAwareDataSourceProxy;
    }

    /**
     * 设置ActiveRecord
     */
    @Bean
    public ActiveRecordPlugin activeRecordPlugin() {
        ActiveRecordPlugin arp = new ActiveRecordPlugin(transactionAwareDataSourceProxy());
        arp.setDialect(new MysqlDialect());
        arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));//忽略大小写
        arp.setShowSql(true);
        arp.getEngine().setToClassPathSourceFactory();
        //arp.addSqlTemplate("sql/all.sql");
        _MappingKit.mapping(arp);
        arp.start();
        System.out.println("调用Jfinal ActiveRecordPlugin 成功");
        return arp;
    }
}

四:配置返回结果类Result.java:

package com.report.dto;
import com.report.enums.ResultEnum;
import java.io.Serializable;

public class Result implements Serializable {
    /**
     *
     */
    private static final long serialVersionUID = 3337439376898084639L;
    /**
     * 处理状态
     */
    private Integer code;
    /**
     * 处理信息
     */
    private String msg;
    private String serverID;
    /**
     * 返回值
     */
    private Object data;
    private int total;
    private Object rows;
    /**
     * 成功,传入data(使用最多)
     *
     * @param data
     * @return
     */
    public static Result success(Object data) {
        return Result.success(data,"请求成功!");
    }
    /**
     * 成功,传入data(使用最多)
     * @param msg
     * @return
     */
    public static Result success(String msg) {
        Result result = new Result();
        result.setCode(ResultEnum.SUCCESS.getCode());
        result.setMsg(msg);
        return result;
    }
    /**
     * 成功,传入rows和total
     * @param rows
     * @param total
     * @return
     */
    public static Result success(Object rows,int total) {
        Result result = new Result();
        result.setCode(ResultEnum.SUCCESS.getCode());
        result.setMsg("请求成功!");
        result.setRows(rows);
        result.setTotal(total);
        return result;
    }

    /**
     * 成功,传入data 和 msg
     * @param data
     * @param msg
     * @return
     */
    public static Result success(Object data, String msg) {
        Result result = new Result();
        result.setCode(ResultEnum.SUCCESS.getCode());
        result.setMsg(msg);
        result.setData(data);
        return result;
    }
    /**
     * 失败
     * @return
     */
    public static Result error() {
        return Result.error("请求失败!");
    }
    /**
     * 失败 传入 msg
     * @param msg
     * @return
     */
    public static Result error(String msg) {
        return  Result.error(msg,ResultEnum.FAILURE);
    }

    public static Result error(String msg ,ResultEnum resultEnum){
        Result result = new Result();
        result.setCode(resultEnum.getCode());
        result.setMsg(msg);
        return result;
    }
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
        if(null != this.data && this.data.getClass().getName().equals("com.crwl.commonserver.dto.CurrUser")){
            this.data = null;
        }
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public String getServerID() {
        return serverID;
    }
    public void setServerID(String serverID) {
        this.serverID = serverID;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public Object getRows() {
        return rows;
    }

    public void setRows(Object rows) {
        this.rows = rows;
    }
    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", serverID='" + serverID + '\'' +
                ", data=" + data +
                ", total=" + total +
                ", rows=" + rows +
                '}';
    }
}

五:返回枚举类ResultEnum.java:

package com.report.enums;
/**
 * 返回状态
 */
public enum ResultEnum {
    /**
     * 200 OK     //客户端请求成功
     * 400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
     * 401 Unauthorized //请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
     * 403 Forbidden  //服务器收到请求,但是拒绝提供服务
     * 404 Not Found  //请求资源不存在,eg:输入了错误的 URL
     * 500 Internal Server Error //服务器发生不可预期的错误
     * 503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
     */
    SUCCESS(200, "操作成功"),ERROR(500,"操作失败"), FAILURE(404, "请求的网页不存在"),INVALID(503,"服务不可用"),LOGINOVERTIME(1000,"登录超时");
    private ResultEnum(Integer code, String data) {
        this.code = code;
        this.data = data;
    }
    private Integer code;
    private String data;
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public String getData() {
        return data;
    }
    public void setData(String data) {
        this.data = data;
    }
}

六:BaseReport.java

package com.report.model.base;

import com.jfinal.plugin.activerecord.IBean;
import com.jfinal.plugin.activerecord.Model;

import java.util.Date;

@SuppressWarnings({"serial", "unchecked"})
public abstract class BaseReport<M extends BaseReport<M>> extends Model<M> implements IBean {
    public M setId(Integer id) {
        set("id", id);
        return (M)this;
    }
    public Integer getId() {
        return getInt("id");
    }
    public M setRptCode(String rptCode) {
        set("rpt_code", rptCode);
        return (M)this;
    }
    public String getRptCode() {
        return getStr("rpt_code");
    }
    public M setRptName(String rptName) {
        set("rpt_name", rptName);
        return (M)this;
    }
    public String getRptName() {
        return getStr("rpt_name");
    }
    public M setRptType(Integer rptType) {
        set("rpt_type", rptType);
        return (M)this;
    }
    public Integer getRptType() {
        return getInt("rpt_type");
    }
    public M setUreportName(String ureportName) {
        set("ureport_name", ureportName);
        return (M)this;
    }
    public String getUreportName() {
        return getStr("ureport_name");
    }
    public M setRptUrl(String rptUrl) {
        set("rpt_url", rptUrl);
        return (M)this;
    }
    public String getRptUrl() {
        return getStr("rpt_url");
    }
    public M setRemark(String remark) {
        set("remark", remark);
        return (M)this;
    }
    public String getRemark() {
        return getStr("remark");
    }
    public M setSort(Integer sort) {
        set("sort", sort);
        return (M)this;
    }
    public Integer getSort() {
        return getInt("sort");
    }
    public M setStatus(Integer status) {
        set("status", status);
        return (M)this;
    }
    public Integer getStatus() {
        return getInt("status");
    }
    public M setCreateUser(String createUser) {
        set("create_user", createUser);
        return (M)this;
    }
    public String getCreateUser() {
        return getStr("create_user");
    }
    public M setCreateDate(Date createDate) {
        set("create_date", createDate);
        return (M)this;
    }
    public Date getCreateDate() {
        return getDate("create_date");
    }
    public M setUpdateUser(String updateUser) {
        set("update_user", updateUser);
        return (M)this;
    }
    public String getUpdateUser() {
        return getStr("update_user");
    }
    public M setUpdateDate(Date updateDate) {
        set("update_date", updateDate);
        return (M)this;
    }
    public Date getUpdateDate() {
        return getDate("update_date");
    }
}

七:_MappingKit.java

package com.report.model;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
public class _MappingKit {
    public static void mapping(ActiveRecordPlugin arp) {
        arp.addMapping("ur_report", "id", Report.class);
    }
}

八:Report.java

package com.report.model;

import com.report.model.base.BaseReport;
/**
 * Generated by JFinal.
 */
@SuppressWarnings("serial")
public class Report extends BaseReport<Report> {
    public static final Report dao = new Report().dao();
}

九:DsProvider.java

package com.report.provider;

import com.bstek.ureport.definition.datasource.BuildinDatasource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

//提供ureport 内置数据源连接
@Component("dsScoreSys")
public class DsProvider implements BuildinDatasource {
    @Autowired
    private DataSource dataSource;

    @Override
    public String name() {
        return "内置数据源";
    }
    @Override
    public Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }
}

十: FileToDatabaserProvider.java

package com.report.provider;

import com.bstek.ureport.exception.ReportException;
import com.bstek.ureport.provider.report.ReportFile;
import com.bstek.ureport.provider.report.ReportProvider;
import com.report.model.Report;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;

import java.io.*;
import java.util.*;

public class FileToDatabaserProvider implements ReportProvider {
    private String prefix="fileToDb:";
    private String fileStoreDir;
    private String disabled;

    @Override
    public InputStream loadReport(String file) {
        if(StringUtils.isNotEmpty(file)){
            String[] arr = file.split("@");
            Report report = null;
            if(null != arr && arr.length==2){
                report = Report.dao.findById(Integer.parseInt(arr[1]));
                file = report.getUreportName();
            }else{
                report = Report.dao.findFirst(" select * from ur_report t where t.ureport_name=?", file);
            }
            if(null != report) {
                if (file.startsWith(prefix)) {
                    file = file.substring(prefix.length(), file.length());
                }
                String fullPath = fileStoreDir + "/" + file;
                try {
                    return new FileInputStream(fullPath);
                } catch (FileNotFoundException e) {
                    throw new ReportException(e);
                }
            }else{
                throw new ReportException("报表文件不存在");
            }
        }else{
            throw new ReportException("报表文件不存在");
        }
    }

    @Override
    public void deleteReport(String file) {
        Report report = Report.dao.findFirst(" select * from ur_report t where t.ureport_name=?",file);
        if(null != report){
            if(file.startsWith(prefix)){
                file=file.substring(prefix.length(),file.length());
            }
            String fullPath=fileStoreDir+"/"+file;
            File f=new File(fullPath);
            if(f.exists()){
                f.delete();
            }
            report.delete();
        }
    }
    @Override
    public List<ReportFile> getReportFiles() {
        List<Report> reportList = Report.dao.find("select * from ur_report t where t.rpt_type=2 ");
        File file=new File(fileStoreDir);
        List<ReportFile> list=new ArrayList<>();
//        if(reportList != null) {
//            for(Report reportStore:reportList) {
//                ReportFile reportFile = new ReportFile(reportStore.getRptName(),reportStore.getCreateDate());
//                list.add(reportFile);
//            }
//        }
//        return list;
        for(File f:file.listFiles()){
            Calendar calendar=Calendar.getInstance();
            calendar.setTimeInMillis(f.lastModified());
            Report report = null;
            for(int i=0; i<reportList.size();i++){
                Report r = reportList.get(i);
                String reportName = r.getUreportName();
                if(StringUtils.isNotEmpty(reportName)){
                    reportName = reportName.substring(prefix.length(), reportName.length());
                    if(f.getName().equals(reportName)){
                        report = r;
                    }
                }
            }
            if(null != report){
                list.add(new ReportFile(f.getName(),calendar.getTime()));
//                list.add(new ReportFile(report.getId(),f.getName(),calendar.getTime()));
            }
        }
        Collections.sort(list, new Comparator<ReportFile>(){
            @Override
            public int compare(ReportFile f1, ReportFile f2) {
                return f2.getUpdateDate().compareTo(f1.getUpdateDate());
            }
        });
        return list;
    }

    @Override
    public void saveReport(String file, String content) {
        try {
            if(StringUtils.isNotEmpty(file)) {
                String[] arr = file.split("@");
                Report report = null;
                if(null != arr && arr.length==2){
                    report = Report.dao.findById(Integer.parseInt(arr[0]));
                    file = arr[1];
                }else{
                    report = Report.dao.findFirst(" select * from ur_report t where t.ureport_name=?", file);
                    if (report == null) {
                        report = new Report();
                    }
                }
                report.setUreportName(file);
                report.setRptUrl("ureport/preview?_u=" + file);
                if (file.startsWith(prefix)) {
                    file = file.substring(prefix.length(), file.length());
                }
                String fullPath = fileStoreDir + "/" + file;
                FileOutputStream outStream = null;
                try {
                    outStream = new FileOutputStream(new File(fullPath));
                    IOUtils.write(content, outStream, "utf-8");
                } catch (Exception ex) {
                    throw new ReportException(ex);
                } finally {
                    if (outStream != null) {
                        try {
                            outStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
                report.setUpdateDate(new Date());
                if (null != report.getId()) {
                    report.update();
                } else {
                    report.setCreateDate(new Date());
                    report.setRptType(2);
                    report.save();
                }
            }else{
                throw new ReportException("报表文件不存在");
            }
        } catch (Exception e) {
            throw new ReportException(e);
        }

    }
    @Override
    public String getName() {
        return "数据库文件系统";
    }
    @Override
    public boolean disabled() {
        return false;
    }
    @Override
    public String getPrefix() {
        return prefix;
    }
    public void setFileStoreDir(String fileStoreDir) {
        this.fileStoreDir = fileStoreDir;
    }
    public void setDisabled(String disabled) {
        this.disabled = disabled;
    }
}

十一:ReportServiceImpl.java

package com.report.service.impl;

import com.report.model.Report;
import com.report.service.ReportService;
import com.jfinal.plugin.activerecord.Page;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

@Service
public class ReportServiceImpl implements ReportService {
    private final String table = "ur_report";

    @Override
    public Page<Report> getPageList(Integer currentPage, Integer pageSize, String rptName, String rptType) {
        StringBuilder sql = new StringBuilder();
        sql.append(" from "+ table + " t where 1=1 ");
        if(StringUtils.isNotEmpty(rptName)){
            sql.append(" and instr(t.rpt_name,'"+rptName +"')>0 ");
        }
        if(StringUtils.isNotEmpty(rptType)){
            sql.append(" and t.rpt_type="+rptType);
        }
        sql.append(" order by t.sort desc ");
        Page<Report> pageList = Report.dao.paginate(currentPage,pageSize,"select t.* ",sql.toString());
        return pageList;
    }
}

十二:ReportService.java

package com.report.service;
import com.report.model.Report;
import com.jfinal.plugin.activerecord.Page;

public interface ReportService {
    /***
     * 获取表格数据
     * @param currentPage
     * @param pageSize
     * @param rptName
     * @param rptType
     * @return
     */
    Page<Report> getPageList(Integer currentPage, Integer pageSize, String rptName, String rptType);
}

十三:主类UreportApplication.java

package com.report;

import com.bstek.ureport.console.UReportServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * 入口类
 */
@SpringBootApplication()
@EnableTransactionManagement
@ImportResource("classpath:config/context.xml")
@ComponentScan(basePackages = {"com.report.*"})
public class UreportApplication {
    public static void main(String[] args) {
        SpringApplication.run(UreportApplication.class, args);
    }
    //ureport报表
    @Bean
    public ServletRegistrationBean buildUReprtServlet(){
        return new ServletRegistrationBean(new UReportServlet(),"/ureport/*");
    }
}

最后贴上表设计:

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

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

相关文章

Nginx配置静态代理/静态资源映射时root与alias的区别,带前缀映射用alias

场景 Nginx搭建静态资源映射实现远程访问服务器上的图片资源&#xff1a; Nginx搭建静态资源映射实现远程访问服务器上的图片资源_nginx 当作图片资源访问 博客-CSDN博客 以上在配置静态资源映射时使用的如下配置 location / {root D:/pic_old/;try_files $uri $uri/ /ind…

游戏开发笔记:游戏海外版本时区问题(解释时区问题,分解为js写法和lua写法来分析记录,整理出对应语言的相关函数方法。)

对于海外游戏而言,与时间相关的功能,都不能忽略时区的计算。根据 ‘ 服务端资源是有限的,客户端资源是无穷无尽的 ’的定义来说,基本上时区包括时间的计算都是由客户端来进行计算,今天内容也是围绕客户端来展开。 时区算法常见的时间描述时区需要计算的点在lua语言中的写…

//简单函数_素数距离问题

任务描述 现在给出你一些数&#xff0c;要求你写出一个程序&#xff0c;输出这些整数相邻最近的素数&#xff0c;并输出其相距长度。如果左右有等距离长度素数&#xff0c;则输出左侧的值及相应距离。 如果输入的整数本身就是素数&#xff0c;则输出该素数本身&#xff0c;距离…

谷歌Google广告推广开户和投放攻略?

随着出海市场增加&#xff0c;越来越多的中国企业选择借助谷歌Google广告这一全球最大的在线广告平台&#xff0c;拓展海外市场&#xff0c;提升品牌知名度和产品销量。在这个过程中&#xff0c;选择一家专业且富有实战经验的服务商至关重要&#xff0c;而云衔科技正是这样一位…

看奈飞三体魔改 赏国产《三体》预告片AI重制版

看奈飞三体魔改 赏国产《三体》预告片AI重制版 In the vast expanse of the universe, secrets await to be uncovered. 宇宙无垠&#xff0c;秘密待揭。 A signal from the depths of space leads to an encounter with an alien civilization - the Trisolarans. 深空信号引…

nvic优先级溢出

nvic的抢占优先级大于当前的配置群组所要求的最大上限&#xff0c;则真正优先级为数值的溢出部分&#xff1b;如果溢出部分为0则循环为最大数据&#xff1a; 如上图所示&#xff1a;中断分组为2&#xff1a; 因此优先级因为0--3 TICK_INT_PRIORITY等于0xf即为15&#xff1b;与3…

何时需要指定泛型:Scala编程指南

这里写目录标题 何时需要指定泛型&#xff1a;Scala编程指南为什么使用泛型类型安全 何时需要指定泛型结论 何时需要指定泛型&#xff1a;Scala编程指南 在Scala编程中&#xff0c;泛型是一种强大的特性&#xff0c;它允许开发者编写灵活且类型安全的代码。然而&#xff0c;正…

kubectl 启用shell自动补全功能

官网手册参考&#xff1a;https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/ 系统&#xff1a;centos7 补全脚本依赖于工具 bash-completion&#xff0c; 所以要先安装它&#xff08;可以用命令 type _init_completion 检查 bash-completion 是否已安装&a…

聚合支付备案新增机构名单公布,14家机构成功备案

孟凡富 3月27日&#xff0c;中国支付清算协会公布了最新一批收单外包服务机构备案机构结果&#xff0c;总备案机构为27000家&#xff0c;新增备案机构为648家&#xff0c;其中&#xff0c;新增聚合支付技术服务备案机构包括北京鑫杰华誉、深圳中峻、多点(深圳)数字科技、扬州泽…

基于MATLAB的模糊神经网络预测水质评价

%% 学习目标&#xff1a;模糊神经网络预测水质评价 %% 更多matlab精彩专题课程和案例&#xff0c;可以搜索微信公众号&#xff1a;电击小子程高兴的MATLAB小屋 %% 清空环境变量 clc clear%% 参数初始化 xite0.001; alfa0.05;%% 网络节点 I6; %输入节点数 M12; %隐含节点数…

深度学习编译工具链中的核心——图优化。

图优化 图优化的概念&#xff1a; 深度神经网络模型可以看做由多个算子连接而成的有向无环图&#xff0c;图中每个算子代表一类操作&#xff08;如乘法、卷积&#xff09;&#xff0c;连接各个算子的边表示数据流动。在部署深度神经网络的过程中&#xff0c;为了适应硬件平台…

2024年4月份 风车IM即时通讯系统APP源码 版完整苹果安卓教程

关于风车IM&#xff0c;你在互联网上能随便下载到了基本都是残缺品&#xff0c; 经过我们不懈努力最终提供性价比最高&#xff0c;最完美的版本&#xff0c; 懂货的朋友可以直接下载该版本使用&#xff0c;经过严格测试&#xff0c;该版本基本完美无缺。 下载地址&#xff1a;…

unity学习(73)——服务器异常--无法处理 123类型的数据包

服务器发送回的数据包&#xff0c;客户端根本读不出来&#xff0c;type都读不出来&#xff0c;拖了三天&#xff0c;把客户端翻了个底朝天&#xff0c;发现客户端一点问题都没有&#xff01; 所有的问题不是unity的模型问题&#xff0c;就是socket网络通信中断&#xff01; 1…

2024全国水科技大会【高峰对话】北京排水集团(附部分报告题目)

北京排水集团坚持“服务社会、造福百姓、企业利益与公众利益高度一致”的宗旨&#xff0c;充分认知自身在地区经济发展中的社会责任&#xff0c;以满足政府与公众对公用事业企业服务的需求为首要任务&#xff0c;通过“现代化的队伍、现代化的手段、现代化的设备和现代化的管理…

由浅到深认识Java语言(31):阶段性练习

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

腾讯云服务器多少钱一年?最新价格整理轻量和CVM报价

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

leetcode热题100.寻找两个正序数组中的中位数

Problem: 4. 寻找两个正序数组的中位数 文章目录 题目思路复杂度Code 题目 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; …

探索网络分析:图论算法介绍及其如何用于地理空间分析

网络分析简介 出售真空吸尘器的挨家挨户的推销员列出了一个潜在客户,分布在邻近他的几个城市中。他想离开家,参观每个潜在客户,然后返回家园。他可以采取的最短、最有效的路线是什么? 这种情况被称为旅行推销员问题,它可能是优化中研究最深入的问题(旅行推销员问题,2023…

java特殊文件——properties属性文件概述

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!! properties properties是一个Map集合&#xff08;键值对合集&#xff09;&#xff0c;但是一般不当作合集。而是用来代表属性文件&#xff0c;通过Properties读写属性文件里的内容 Properties调用方…

【spring】@Component注解学习

Component介绍 Component 是 Spring 框架中的一个注解&#xff0c;用于将一个类标记为 Spring 上下文中的一个组件。当一个类被标记为 Component 时&#xff0c;Spring 容器会在启动时自动扫描并实例化这个类&#xff0c;并将其注册到 Spring 上下文中。 Component 注解可以用…