2024年6月

核心概念

  • 主键索引/二级索引
  • 聚簇索引/非聚簇索引
  • 回表/索引覆盖
  • 索引下推
  • 联合索引/最左联合匹配
  • 前缀索引
  • explain

一、[索引定义]

1.索引定义

在数据之外,数据库系统还维护着
满足特定查找算法的数据结构
,这些数据结构以
某种方式引用(指向)数据
,这样就可以在这些数据结构上实现高级查找算法。
这种数据结构,就是索引。

2.索引的数据结构

  • B树 / B+树 (mysql的innodb引擎默认选择B+树作为索引的数据结构)
  • HASH表
  • 有序数组

3.选用B+树而不选用B树作为索引

  • B树的数据结构:record记录存放在树的节点中

img

  • B+树的数据结构: record记录只存放在树的叶子节点中

img

  • 假设一条数据大小1KB,索引大小16B,数据库采用磁盘数据页存储,磁盘页默认大小是16K。同样三次IO:
    1. B树能获取16*16*16=4096条数据
    2. B+树能够获取1000*1000*1000=10亿条数据

二、[索引类型]

1.主键索引和二级索引

  • 主键索引
    :索引的叶子节点是数据行

  • 二级索引
    :索引的叶子节点是KEY字段加主键索引,因此,通过二级索引询首先查到是主键值,然后InnoDB再根据查到的主键值通过主键索引找到相应的数据块。

  • innodb的主索引文件上 直接存放该行数据,称为聚簇索引,次索引指向对主键的引用

  • myisam中, 主索引和次索引,都指向物理行(磁盘位置).

image-20240624223031827

2.聚簇索引和非聚簇索引

  • 聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致。一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引(理由:数据一旦存储,顺序只能有一种)上图可以看出innodb的一级索引和二级索引均是聚簇索引
  • 相较于聚簇索引的叶子点击是数据记录,非聚簇索引的叶子节点是指向数据记录的指针。非聚簇索引与聚簇索引最大的不同就是数据记录的顺序跟索引是不一致的,因此在数据

3.聚簇索引优劣

  • 优势: 根据主键查询条目比较少时,不用回行(数据就在主键节点下)

  • 劣势: 如果碰到不规则数据插入时,造成频繁的页分裂。

三、[索引概念引申]

1.回表

回表的概念涉及到主键索引和非主键索引的查询区别

  • 如果语句是
    select * from T where ID=500

    即主键查询,则只需要搜索 ID 这棵树。
  • 如果语句是
    select * from T where k=5
    ,即非主键索引查询,则需要
    先搜索 k 索引树,得到 ID 的值为 500,再到 ID 索引树搜索一次。
  • 从非主键索引回到主键索引的过程称为回表。

基于非主键索引的查询需要多扫描一棵索引树。
因此,我们在应用中应该尽量使用主键查询。而从存储空间的角度讲,因为非主键索引树的叶结点存放的是主键的值,那么,应该
考虑让主键的字段尽量短,这样非主键索引的叶子结点就越小,非主键索引占用的空间也就越小。
一般情况下,建议创建一个自增主键,这样非主键索引占用的空间最小。

2.索引覆盖

  • 如果where子句中的一个条件是非主键索引,那么查询的时候,
    先通过非主键索引定位到主键索引(主键位于非主键索引搜索树的叶子节点)
    ;然后通过主键索引定位到查询的内容。在这个过程中,回到主键索引树的过程,称为回表。
  • 但是当我们的
    查询内容是主键值,那么可以直接提供查询结果,不需要回表
    。也就是说,
    在这个查询里,非主键索引 已经 “覆盖了” 我们的查询需求,故称为覆盖索引。
  • 覆盖索引就是从辅助索引中就能直接得到查询结果,而不需要回表到一级索引中进行再次查询
    ,所以可以减少搜索次数(不需要从辅助索引树回表到聚簇索引树),或者说减少 IO 操作(通过辅助索引树可以一次性从磁盘载入更多节点),从而提升性能。

3.联合索引

联合索引是指对表上的多个列进行索引。

场景一:

联合索引 (a, b) 是
根据 a, b 进行排序(先根据 a 排序,如果 a 相同则根据 b 排序)
。因此,下列语句可以直接使用联合索引得到结果(事实上,也就是用到了最左前缀原则)

  • select … from xxx where a=xxx;
  • select … from xxx where a=xxx order by b;

而下列语句则不能使用联合查询:

  • select … from xxx where b=xxx;

场景二:

对于联合索引 (a, b, c),下列语句同样可以直接通过联合索引得到结果:

  • select … from xxx where a=xxx order by b;
  • select … from xxx where a=xxx and b=xxx order by c;

而下列语句则不行,需要执行一次 filesort 排序操作。

  • select … from xxx where a=xxx order by c;

总结:

以联合索引(a,b,c)为例,建立这样的索引相当于建立了索引a、ab、abc三个索引。
一个索引顶三个索引当然是好事,毕竟每多一个索引,都会增加写操作的开销和磁盘空间的开销。

4.最左匹配原则

  • 从上面联合索引的例子,可以体会到最左前缀原则。
  • 不只是索引的全部定义,只要满足最左前缀,就可以利用索引来加速检索。这个最左前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符。
    利用索引的 “最左前缀” 原则来定位记录,避免重复定义索引。
  • 因此,基于最左前缀原则,我们在定义联合索引的时候,考虑如何安排索引内的字段顺序就至关重要了!评估的标准就是索引的复用能力,比如,
    当已经有了 (a,b) 字段的索引,一般就不需要再单独在 a 上建立索引了。

5.索引下推

MySQL 5.6 引入了索引下推优化,
可以在索引遍历过程中,对索引中包含的字段先做判断,过滤掉不符合条件的记录,减少回表字数。

  • 建表
 CREATE TABLE `test` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
   `age` int(11) NOT NULL DEFAULT '0',
   `name` varchar(255) CHARACTER SET utf8 NOT NULL DEFAULT '',
   PRIMARY KEY (`id`),
   KEY `idx_name_age` (`name`,`age`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  • SELECT * from user where name like '陈%'
    最左匹配原则,命中idx_name_age索引

  • SELECT * from user where name like '陈%' and age=20


    • 5.6版本之前,先根据name索引(此时是忽略
      age=20
      这个条件的),匹配2条记录,然后找到对应的2个id。回表之后,在根据age=20进行过滤
    • 5.6版本之后,会加入索引下推,在根据name匹配到2条数据之后,此时不会忽略
      age=20
      条件,在回表之前就会根据age进行过滤。此即索引下推,可以减少回表的数据量,增加查询性能

6.前缀索引


索引是很长的字符序列时,这个索引将会很占内存,而且会很慢
,这时候就会用到前缀索引了。通常可以索引开始的几个字符,而不是全部值,以节约空间并得到好的性能。所谓的
前缀索引就是使用索引的前面几个字母作为索引
,但是要降低索引的重复率,索引我们还必须要判断前缀索引的重复率。

  • 先计算当前字符串字段的唯一性占比:
    select 1.0*count(distinct name)/count(*) from test
  • 在计算不同前缀的唯一性占比:
    • select 1.0*count(distinct left(name,1))/count(*) from test
      取name字符串第一个作为前缀索引的占比
    • select 1.0*count(distinct left(name,2))/count(*) from test
      取name字符串前两个作为前缀索引的占比
    • ...

  • left(str, n)
    的n不在显著增加时,此时可以选取n作为前缀索引的截取数
  • 创建索引
    alter table test add key(name(n));

四、[查看索引]

当我们添加索引之后,如何去查看索引呢?又或者执行语句的时候执行的特别慢,我们如何去排查呢?

explain 通常用于查看索引是否生效。

当我们获得慢查询的日志之后,查看日志,观察那些语句执行是慢查询,在该语句之前加上 explain 再次执行,
explain 会在查询上设置一个标志,当执行查询时,这个标志会使其返回关于在执行计划中每一步的信息,而不是执行该语句。
它会返回一行或多行信息,显示出执行该计划中的每一部分和执行次序.

explain 执行语句
返回的重要字段

  • type:显示是搜索方式
    (全表扫描或者索引扫描)
  • key:使用的索引字段,未使用则是 null

explain的
type字段

  • ALL: 全表扫描
  • index: 索引全扫描
  • range: 索引范围扫描
  • ref: 使用非唯一索引扫描
  • eq_ref: 使用唯一索引扫描


更多惊喜

我还将定期分享:

  • 最新互联网资讯
    :让你时刻掌握行业动态。

  • AI前沿新闻
    :紧跟技术潮流,不断提升自我。

  • 技术分享与职业发展
    :助你在职业生涯中走得更远、更稳。

  • 程序员生活趣事
    :让你在忙碌的工作之余找到共鸣与乐趣。

关注回复【1024】惊喜等你来拿!

点击查看惊喜

敬请关注【程序员世杰】

点击关注程序员世杰

在ArchSummit全球架构师峰会2024上,华为云aPaaS平台首席架构师马会彬受邀出席,和技术爱好者分享AI原生应用引擎的架构与实践。

AI大模型与AI重塑软件的大趋势下,软件会发生哪些本质的变化?如果“所有软件都值得用AI重做一遍”,那么该如何重做?华为云aPaaS平台首席架构师马会彬从AI重塑软件的本质变化、AI原生的概念与内涵解剖,分享华为云AI原生应用引擎的架构设计和实践思考。

华为云aPaaS平台首席架构师马会彬在ArchSummit现场分享

AI重塑软件产业:变化与趋势

大模型正在推动历史性的技术革命,企业想要成为AI科技浪潮的赢家,需要回答是否要训练自己的行业大模型、如何寻找或打造自己的ChatGPT时刻、如何从既有的企业IT架构和组织能力上支撑落地这三个问题。

大模型的四大技术驱动力,使得AI重塑软件成为可见的未来

驱动力1:万物皆可Embedding,泛化万物的通用机器智能表示

Embedding解决了文字、图片、声音、视频转化为一个可计算的token的问题,使得纯文本NLP快速演进到多模态大模型,对整个大模型和AI技术浪潮产生根本性的影响。

驱动力2:Transformer架构催生Scaling Law,统一了模型架构

过去经典模型没有通用性能力,解决的都是个性化问题,Transformer架构目前被证明是最有效的大模型架构,模型参数规模、数据规模、训练计算量的规模都会显著提升大模型的智力能力,它的演进是有确定性方向的。

驱动力3:从智能摩尔定律到场景摩尔定律,大模型成为通用生产力引擎

算力的演进,模型智力能力和模型场景泛化能力的演进,都符合摩尔定律,甚至在一定程度上,演进的速度超过了摩尔定律;就模型而言,解决的问题和适用的场景,随着时间就会自然获得,不需要在编程或者算法设计上做太多的处理。

驱动力4:LLM OS抽象了通用AI计算架构,使AI原生应用成为可能

LLM OS是以大模型为核心处理单元所构造的一种理论计算架构,业界基于此做了通用实现,证明了它有解决通用问题的能力。

AI重塑软件、赋能行业智能化

业务视角的变化

大模型带来3大颠覆性技术创新,即创造能力、推理能力、自然交互能力,对整个软件行业产生重大影响,主要体现在两大维度:(1)AI赋能人,在一定程度上模拟人、超越人,比如具身智能和AI Agent分别在物理世界、数字世界辅助人、替代人;(2)AI重塑存量软件及工具,显著提升人的效率及体验。

技术视角的变化

软件架构之变:传统程序或软件1.0是构成式架构,是精心设计的、确定性的,而AI原生软件或软件2.0是以大模型为底座的生成式架构。

软件工程之变:传统程序的软件工程是以人为本的协同式开发,强调开发流程、工具、人之间的协同配合,而以大模型为底座的软件开发过程,是以数据为本的生成式开发,对协同的要求没有那么高。

软件体验之变:传统软件是通过键盘鼠标或触摸式交互,到了AI原生时代则变成了时空自然交互,不止是简单对话,AI能理解人所处的时间和空间,这是一个非常大的改变。

软件商业之变:传统上是软件即服务,是把软件功能以服务的形式去交付,现在是服务即软件,不仅提供功能,而且直接提供操作软件完成业务的“服务”。

基于这4个变化,会出现3种形态:第一种,这4个变化都采纳或遵从了的,就是新的AI原生应用(AI native);第二种,程序或应用保持不变,但改变了软件跟用户交互的方式;第三种,程序或应用保持不变,但改变了软件开发的工程和工具体系,后两类可以认为是AI重塑的传统软件(AI enabled)。

AI原生架构及AI原生应用新范式

大模型催生新的AI原生应用新范式

  • 新架构:从构成式架构到生成式架构的变化;
  • 新体验:从键鼠与触摸到自然交互的变化;
  • 新工程:从以人为本的协作开发到以数据为本的生成式开发的变化;
  • 新商业:从软件即服务到服务即软件的变化。

基于这4点,AI原生应用新范式包括两层意思:第一是AI First新思想,想做以大模型为基座的软件或应用,首要是转变思维模式;第二是AI Native新实践,是架构和工程方法的问题。只有将这两者综合在一起,才能真正实现以大模型为驱动力的新应用和新软件产业的落地。

AI原生架构之变:从经典编程架构,进入生成式架构模式

传统软件强调算法、逻辑、数据,有确定的输入和确定的输出,大量的工作需要提前设计和开发,生成式的软件架构跟之前有根本的区别。模型是单独开发的,功能或场景的开发,即提示词输入,不是在大模型开发过程中确定的,而是在任务的场景上下文里确定的。整个工作方式完全发生变化,意味着整个软件开发过程中的角色、方式发生了变化。因为开发阶段只是确定了模型或软件框架,在业务过程中有实时的软件功能或者结果的生成。

AI原生工程之变:从以人为本的协同开发,到以数据为本的生成式开发

以人为本的协同开发,无论是瀑布模式还是敏捷模式,都可以归纳为是以人为本的,特别强调项目管理和软件工程,迁移到大模型驱动的以数据为本的生成式开发,产生了几个根本性的变化:

  • 全流程数字化:意味着设计和需求都可以用文本、语音、视频方式记录,通过大模型去理解、生成,之前软件开发的需求在传递过程中总有丢失,现在可能不会了,软件研发全面进入数字化时代。
  • AIGC:生成软件(software)的各种ware,代码、测试脚本、文档都是生成式的。
  • 极致的持续交付:过程中对人的依赖性极大地降低了,交付周期极致缩短,真正实现持续交付。
  • 人机交互智能:人机交互过程即开发过程。
  • 以数据和模型为本:研发人员服务于大模型和大数据平台。

AI原生体验之变: 从点击、触摸交互模式到新的自然交互模式

一个应用或一个软件可以分为两层,底层是记录系统,没有变化,上层是交互系统,交互方式因大模型发生很大变化,体现在三个方面:

  • 自然空间交互:基于语音、姿态、眼神,甚至脑电波等更自然的交互形式,人的Prompt输入速度远远跟不上大模型token生成的速度,未来可能基于脑机接口来作为输入。另外,不同于传统的桌面、App入口,转为场景式的智能时空入口,没有一个确定的入口方式,功能请求随时可以被触发。
  • 系统嵌套触达:未来应用之间的边界会进一步消除,不再彼此孤立,而是可嵌套的系统级触达,所有的传统应用软件最终可能退化成背后的一个个业务工具。
  • 全个性化体验:之前软件交付面临定制化问题,现在以大模型为驱动,一定是以用户、以任务为中心,本身就是个性化的,业务结果是实时生成的,在这种情况下,需要一种新的跨系统、跨平台的分布式自然人身份系统,不再可能用之前传统的账号模式。

AI原生商业之变: 从“软件即服务”到“服务即软件”的新商业模式

  1. 当前产业界在软件、服务和雇员费用上的开支,软件占比还较低,以大模型为驱动的Agent在一定程度上能辅助人或者代替人,产业空间非常大。
  2. 以大模型为驱动的Agent跟人的成本对比,目前统计是1:80,未来比例可能会进一步放大。
  3. 人的知识、技能、经验如果被压缩进大模型,再以大模型为基础提供给业务场景,可以完美实现经验、技能的0成本复制。

AI原生应用的架构演进与成熟度等级演进

将AI自主能力等级和AI成熟度等级作为两个象限去看,大概会经历5个阶段:应用+AI特性(初级阶段)、应用+Copilot(任务阶段)、应用+Agent(助手阶段)、Agent+应用(代理阶段,Agent为主、应用为辅)、超级智能体ASI(共生阶段,人、AI驱动的机器人、agent协同工作),目前每个阶段都有在尝试,但应用的场景和范围都还有一定的限制。

华为云AI原生应用引擎的架构实践

华为基于内部实践以及跟客户、生态伙伴的合作打磨了一款AI原生应用引擎产品,旨在帮助企业从应用视角选好、用好、管好大模型,赋能AI原生应用创新,主要包含Agent编排中心、知识中心、模型中心、AI可信治理和AI资产库5大模块,解决6个业务问题。

  1. 如何选择合适的大模型,目前模型种类繁多,哪些场景、哪些任务适用哪种模型?如何考虑BCM、考虑可演进性?
  2. 如何提升大模型在业务场景中的能力和效果?因为模型是通用的,场景又是个性化的,两者如何去匹配?
  3. 如何给模型和AI应用提供高质量数据?因为它不是一次性的,如何不断提升模型和应用的效果?
  4. 如何建立AI安全机制,确保安全可信治理?比如大模型驱动的具身智能在物理世界可能会有环境和人身安全方面的问题。
  5. 如何降低运营成本?技术投资必然要考虑成本和收益之间的均衡。
  6. 如何快速创新,让更多的人参与到场景中快速创新?

AI原生应用落地企业生产场景要解决的关键挑战

  • 安全性:数据安全、模型交互安全、应用安全;
  • 专业性、协作性:如何让大模型能够理解并解决复杂的业务问题;
  • 责任性:AI辅助人或者代替人,责任怎么界定,它是否能承担这个责任。

具体来说,主要有从5个方面来应对和解决:

1、企业词表:每个企业都有自己的术语表,要加载企业专业术语,让大模型准确理解,消除歧义,提升准确率。

2、领域知识库:所有大模型落地一定要外挂知识库,因为模型的训练是有周期的,但是外部的实时数据和实时的知识更新很快,所以需要让模型跟知识库结合,保证知识的动态更新,解决知识的及时性及有效性。

3、场景范式:模型是通用的,业务场景是多变的,如何用通用的架构解决个性化或多变的场景问题?为此,华为云参照人解决问题的思考方式,构建了7大Agent场景范式(会话交互、内容理解、感知接收、中枢决策、知识查询、设计生成、数据分析),从而简化Agent开发。

4、模型网关:基于大模型的应用开发一定需要模型网关,有以下方面的原因:(1)市面上的模型很多,对企业来说,包括自建的模型、外购的第三方模型,什么业务应该路由给哪一个模型,需要考虑业务路由问题。(2)各模型在提示词输入输出的格式上有一些差异,需要一个统一的接口进行切换。(3)大模型是个IT系统,也会出现故障甚至宕机,基于网关制定Failover机制,可以提升大模型的应用可用性。(4)模型生成的结果,真实效果或准确性如何,要有个控制点来建立可观测性,来持续度量推理性能、成本及跟踪反馈的问题。

除了4个功能性的需求之外,还需要从企业CIO视角去做模型治理,因为模型是一个关键的IT基础设施,如何引入、升级版本、退出,都要有管理规范和流程。

5、知识飞轮:如何持续提升模型能力,如何从企业现有应用和业务系统中提取高质量数据、把数据回流给记忆和模型,需要建立知识、模型、数据回流的迭代机制,持续提升智能效果。

华为云AI原生应用引擎的案例实践

场景案例1:基于AI Agent的智能化招聘

HR Agent协助HR进行招聘,在一定程度上是自然人与Agent协同的一种新的工作模式。岗位描述、投放渠道推荐、岗位发布、候选人搜索和推荐、候选人沟通、预约面试与答疑、组织面试、记录生成、结果匹配和评估、录用通知等过程,都以Agent为主完成或独立完成,涉及到多轮面试、结果确认、录用决策、入职培训等业务决策则需要人工参与。

场景案例2:基于AI Agent的智能化、自动化客服

把大模型应用到客服场景,目前基本上是两种方式:第一种是在一些具体的环节,通过模型来解决业务问题,辅助生成结果,第二种是模型、Agent、人协同工作,当前客服、保险代理、保险理赔等环节都在用这种方式。现在RAG的默认准确度,大概在50%,如果要提升到很高的等级,做到生产可以投产,至少要达到80%~90%以上,除了Prompt和垂域知识之外,还需要通过数据飞轮,业务产生高质量数据来对模型微调,提升高质量数据产生的过程,再通过建立数据回流机制,进一步提升效果。

华为内部实践:从RPA到AI Agent,在业务流程全面应用数智员工

华为All Intelligence实践从2019年就开始了,内部的零售、公共沟通、合同、工程、客服,员工各领域,有很多不同的岗位和角色,在这些流程中全面应用AI和大模型技术来赋能提升效率和改善体验,华为内部称之为知识和经验的一次革命!之前所有的知识和经验都是通过流程规范和业务文档去传承,现在可以压缩到模型里面,以模型驱动的AI应用的方式,直接进入到业务流程里面去交付。

点击关注,第一时间了解华为云新鲜技术~

前言

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。今天我们就使用纯前对按表格控件带大家了解,如何在Spring Boot框架下实现Excel服务端导入导出。

1.IDEA创建SpringBoot项目

1.1 Spring Initializr

想要在IDEA下快速搭建一个SpringBoot项目,可以使用Spring Initializr工具作为脚手架。

进入IDEA后,在左侧菜单中可以找到Plugins,点击后,在上方的搜索框中输入Spring Initializr。

之后点击右上角的绿色Install按钮进行安装。

安装完毕后,在New Project 的时候就会多一个Spring Initializr的选项。

1.2 SpringBoot 项目的创建

Project SDK:根据实际应用情况选择用于配置项目所依赖的Java SDK。

Choose Spring Initializr Server:选择一个Spring Initializr服务器,一般来说都选择默认的。

GroupId:一般分为多个段,第一段为域,第二段为公司名称。例如:org.apache,com.grapecity。

ArtifactId:是项目的唯一标识符,在实际开发中一般对应项目的名称,就是项目根目录的名称。

Group Id,Artfact Id是保证项目唯一性的标识,一般来说如果项目打包上传至maven这样的包管理仓库中。在搜索你的项目时,Group Id,Artfact Id是必要的条件。

Version:版本号,默认0.0.1-SNAPSHOT。SNAPSHOT代表不稳定的版本,与之相对的有RELEASE。

Project type:工程的类型,maven工程还是gradle工程。

Language:语言(Java,Kotlin,Groovy)。

Packaging:Jar包还是War包。

Java version:语法版本,与Project SDK不同,Project SDK是实际用到的JDK。Java version指的是语法版本。一般来说语言特性不能比SDK高。比如SDK版本是11,语法选择8。那么实际项目中只能使用java 8的语法。反之SDK版本是8,语法选11就有问题了。一般情况下都会与SDK保持一致。

Project name:项目名称

Project description:项目描述

Package name:包名

第三部分根据项目的实际需求去配置。

第四部分:

设置项目名称与路径。

2.前端配置

考虑到导入导出功能需要对Excel具有较高的还原度,这里使用了SpreadJS组件,通过SpreadJS组件的ExcelIO功能,进行Excel的导入与导出。SpreadJS是一款纯前端的组件,与后端完全解耦,可以完美的整合到SpringBoot工程中。

2.1 前端页面创建

在static目录下建立index.html文件,用来绘制前端页面。如果用了thymeleaf也可以将文件建立在templates目录中。

2.1 SpreadJS组件引入和初始化

在header中引入SpreadJS相关的css与js引用。

创建SpreadJS对应的DOM对象。

在JS中初始化SpreadJS和导入导出Excel相关的ExcelIO对象。

通过按钮点击进行服务端导入与导出。

导入导出事件处理,在事件中发送请求与服务端进行连接。

导入原理:

将服务端的文件以文件流的形式传输至前端,前端通过ExcelIO将结果导入结果呈现值SpreadJS中,所以导入的传递的参数是一个文件路径。注意该路径是文件在服务端或者工程中的一个路径。

导出原理:

通过SpreadJS ExcelIO的功能将内容导出成Excel的blob流。之后将blob流传至服务器端,在服务器端进行保存Excel文件的操作。

3.后端配置

创建后端controller,可按照自身项目的包的层级分类进行创建。

构建服务端的导入导出方法和相关逻辑。

服务器端导入:

由于前端传入的是一个文件的路径,所以参数这里我们需要一个字符串类型的参数去接收。

另外,我们会将流传到前端,所以会将流写到response中,所以参数中还需要response对象,方法本身不需要返回,返回空即可。原理是通过inputStream读取文件后,将其写入response的outputStream中。

导出到服务器:

由于前端传入传入的是保存文件的名称以及文件blob文件流。服务器端需要两个参数,String用来接收文件名称,MultipartFile对象用来接收blob文件流。后端接受到文件流之后通过transferTo方法在指定目录下根军传来的fileName转存成新的文件。

4.测试运行

将工程跑起来之后进入主页面,显示如下:

点击服务端导入按钮,从服务器端下载指定的Excel文件并打开。

对该文件进行操作修改并点击服务端导出的按钮。

之后我们去服务器端的导出路径下查看,发下文件存在,用Excel打开文件后发现,修改后的内容健在并且其他内容显示均无问题。

到这里我们就实现了Spring Boot框架下实现Excel服务端导入导出,如果您想了解更多信息,欢迎
点击这里
查看。

拓展阅读

React + Springboot + Quartz,从0实现Excel报表自动化

电子表格也能做购物车?简单三步就能实现

使用纯前端类Excel表格控件SpreadJS构建企业现金流量表

MoneyPrinterPlus可以使用大模型自动生成短视频,其中的语音合成和语音识别部分需要借助于一些第三发云厂商的语音服务。

很多小伙伴可能不知道应该如何配置,这里给大家提供一个详细的腾讯云语音服务的配置教程。

项目已开源,代码地址:
https://github.com/ddean2009/MoneyPrinterPlus

腾讯云的具体配置

MoneyPrinterPlus在生成视频过程中需要进行一些语音合成和语音识别工作。

为了保证最后生成视频的质量,所以我们会用到一些云厂商提供的语音合成和语音识别服务。

这里腾讯云为例,来讲解如何进行腾讯云语音的配置。

获取腾讯云的access ID和Secret Key

首先我们到腾讯云的官网上去注册一个账号,在最上面的搜索框, 我们输入访问密钥,在下面的控制台入口,点击访问密钥,即可进入腾讯云的访问密钥控制台。

image-20240625092440010

在API密钥管理部分,点击右边的新建密钥,即可生成APPID,SecretID和SecretKey这三个值。

image-20240625092559083

大家把这三个数据保存下来。我们后面在MoneyPrinterPlus中会用到这三个值。

开通智能语音服务

同样的,我们在最上面的搜索框中输入语音合成,点击下方的控制台入口--》语音合成按钮,进入到语音合成界面。

image-20240625092812098

进入语音合成界面之后,我们找到左边的语音合成资源包,点击领取免费资源包,这样可以领取免费的语音合成资源。

image-20240625093019426

如果你的资源包用完了,没关系, 我们点击左下角的语音合成设置,开通后付费服务即可。

image-20240625093133476

同样的,对于语音识别功能,我们同样可以领取免费的语音识别资源包。

如果资源包不够用的话,可以在语音识别设置中开通后付费服务。

image-20240625093246850

这样,我们在腾讯云的语音合成和语音识别服务就开通好了。

在MoneyPrinterPlus中配置

启动我们的项目,在web页面点击最左边的基础配置,找到右边的配置音频库信息,选择Tencent。

填入我们之前保存的Access Key ID ,Access Key Secret和App Key。

回车后,这样我们的配置就保存了。

image-20240625093454529

其他的配置

资源库

资源库指的是我们从哪里获取视频或者图片信息,这里目前提供了两个资源提供方,分别是pexels和pixabay。

大家任意选择一个即可。

以pexels为例,我们登入pexels官网
https://www.pexels.com/zh-cn/
,注册一个账号。

在图片和视频API里面,可以查看自己的api密钥。

image-20240616211609578

查看自己的API密钥:

image-20240616211719443

把这个API密钥记下来,拷贝到MoneyPrinterPlus的配置即可。

![image-20240620170029227](/Users/wayne/Library/Application Support/typora-user-images/image-20240620170029227.png)

大模型配置

目前支持Moonshot,openAI,Azure openAI,Baidu Qianfan, Baichuan,Tongyi Qwen, DeepSeek这些。

国内要用的话推荐Moonshot(最近发现moonshot不太稳定,大家可以考虑Baichuan或者DeepSeek)。

同样的到Moonshot开发者平台上注册一个key:
https://platform.moonshot.cn/
填入对应的配置即可。

image-20240616212642905

AI短视频生成

有了基础配置之后,就可以点击左边的AI视频进入AI视频生成页面。

  1. LLM视频文案生成

在视频主题区输入你需要生成的视频主题,然后点击生成视频文案。

程序会自动使用大模型生成对应的视频文案和视频文案关键字:

image-20240616220713534

如果你对视频文案或者关键字不满意,可以手动进行修改。

  1. 视频配音区

在视频配音区可以选择配音语言和对应的配音语言,目前支持100+配音语言。

还可以选择不同的配音语速,以支持不同使用场景。

image-20240616220840076

如果你对配音不太确定,可以点击试听声音试听对应的配音语音。

  1. 背景音乐

背景音乐放在项目下的bgmusic目录下面,你可以自行添加背景音乐文件到该文件夹下面。

image-20240616221041774

可以选择是否开启背景音乐,和默认的背景音乐音量。

  1. 视频配置区

视频配置区可以选择视频布局:竖屏,横屏或者方形。

可以选择视频帧率,视频的尺寸。

还可以选择每个视频片段的最小长度和最大长度。

最最重要的,还可以开启视频转场特效。目前支持30+视频转场特效。

image-20240616221116997

  1. 字幕配置

如果你需要字幕,那么可以点击开启字幕选项,可以设置字幕字体,字幕字体的大小和字幕颜色等。

如果你不知道怎么设置,选择默认即可。

image-20240616221242812

  1. 最后的视频生成

最后点击生成视频按钮即可生成视频。

页面会有相应的进度提醒。

image-20240616221712173

最后生成的视频会展示在页面最下面,大家可以自行播放。

点我查看更多精彩内容:www.flydean.com