今日指数-day08实战完整代码

今日指数-day08

1. 个股最新分时行情数据

1.1 个股最新分时行情功能说明

1)个股最新分时行情功能原型

在这里插入图片描述

2)个股最新分时行情数据接口分析
功能描述:
	获取个股最新分时行情数据,主要包含:
	开盘价、前收盘价、最新价、最高价、最低价、成交金额和成交量、交易时间信息; 
服务路径:/api/quot/stock/screen/second/detail
服务方法:GET
请求参数:code //股票编码

响应数据格式:

R<StockRt>

{
    "code": 1,
    "data": {
        "tradeAmt": 58672751,//最新交易量
        "preClosePrice": 3.89,//前收盘价格
        "lowPrice": 3.89,//最低价
        "highPrice": 3.91,//最高价
        "openPrice": 3.9,//开盘价
        "tradeVol": 228625157,//交易金额
        "tradePrice": 3.9//当前价格
        "curDate": '2022-01-03 14:58'//当前日期
    }
}
2)注意事项
如果当前日期不在股票交易时间内,则查询最近的股票交易时间的数据回显

代码实现

1. 表现层
/**
     * 个股最新分时行情数据
     */
    @ApiOperation(value = "个股最新分时行情数据", notes = "个股最新分时行情数据", httpMethod = "GET")
    @GetMapping("/stock/screen/second/detail")
    public R<MarketDetialDomain> getMarketDetial(@RequestParam(name = "code" , required = true) String code){
        return service.getMarketDetial(code);
    }
2. 服务层
R<MarketDetialDomain> getMarketDetial(String code);
    @Override
    public R<MarketDetialDomain> getMarketDetial(String code) {
        // 获取最新时间
        DateTime curDate = DateTimeUtil.getLastDate4Stock(DateTime.now());
        // 制造mock数据
        curDate = DateTime.parse("2022-07-07 14:55:00", DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
        Date date = curDate.toDate();

        // 查询数据
        MarketDetialDomain msg = stockRtInfoMapper.getMarketDetial(date , code);

        // 封装数据
        return R.ok(msg);


    }
3. Dao层
    MarketDetialDomain getMarketDetial(@Param("date") Date date, @Param("code") String code);
<select id="getMarketDetial" resultType="com.jixu.stock.pojo.domain.MarketDetialDomain">
        select trade_amount as tradeAmt,
               pre_close_price as preClosePrice,
               min_price as lowPrice,
               max_price as highPrice,
               open_price as openPrice,
               trade_volume as tradeVol,
               cur_price as tradePrice,
               date_format(cur_time,'%Y%m%d%H%i') as curDate

        from stock_rt_info where stock_code = #{code}
                             and cur_time = #{date}
    </select>

2.个股实时交易流水查询

2.1 个股实时交易流水查询功能介绍

1)功能原型

在这里插入图片描述

2)功能接口说明
功能描述:个股交易流水行情数据查询--查询最新交易流水,按照交易时间降序取前10
服务路径:/quot/stock/screen/second
入参:code  股票编码
服务方法:GET

响应数据格式:

{
    "code": 1,
    "data": [
        {
            "date": "2022-01-03-14:58",//当前时间,精确到分
            "tradeAmt": 58672751,//交易量
            "tradeVol": 228625157,//交易金额
            "tradePrice": 3.9//交易价格
        }
    ]
}

代码实现

1. 表现层
    /**
     * 个股实时交易流水查询
     */
    @ApiOperation(value = "个股实时交易流水查询", notes = "个股实时交易流水查询", httpMethod = "GET")
    @GetMapping("/stock/screen/second")
    public R<List<Map<String,Object>>> getMarketBill(@RequestParam(name = "code" , required = true) String code){
        return service.getMarketBill(code);
2. 服务层
R<List<Map<String, Object>>> getMarketBill(@Param("code") String code);
    @Override
    public R<List<Map<String, Object>>> getMarketBill(String code) {
        // 获取最新时间
        DateTime curDate = DateTimeUtil.getLastDate4Stock(DateTime.now());
        // 创建一个格式化器来将 DateTime 转换为字符串
        DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
        String s = formatter.print(curDate);
        curDate = DateTime.parse(s, DateTimeFormat.forPattern("yyyy-MM-dd"));
        // 制造mock数据
        curDate = DateTime.parse("2022-07-07", DateTimeFormat.forPattern("yyyy-MM-dd"));

        Date date = curDate.toDate();

        List<Map<String, Object>> msg = stockRtInfoMapper.getMarketBill(code,date);

        return R.ok(msg);

    }
3. Dao层
List<Map<String, Object>> getMarketBill(@Param("code") String code , @Param("date") Date date);
    <select id="getMarketBill" resultType="java.util.Map">
        select date_format(cur_time, '%Y%m%d%H%i') as date,
       trade_amount                        as tradeAmt,
       trade_volume                        as tradeVol,
       cur_price                           as tradePrice
        from stock_rt_info
        where DATE(cur_time) = #{date}
          and stock_code = #{code}
        order by cur_time desc
            limit 20;
    </select>

3.拉取外盘数据功能实现

3.1功能分析

国外大盘数据采集与国内大盘数据几乎一致,目前通过sina接口无法获取国外大盘的交易量和交易金额数据,所以针对国外大盘数据,需要单独处理;

注意事项:

​ 国外大盘数据接口不提供交易量和交易金额的信息;

字段分析:

  var hq_str_b_FSSTI="富时新加坡海峡时报指数,3123.68,-2.96,-0.09";
			大盘code      大盘名称       大盘点数    涨跌值    涨幅

注意:因为外盘的开盘周期不固定的,所以我们就一天仅仅采集一次数据即可;

​ 或者针对不同的外盘,使用不同的采集计划!

采集外盘接口:http://hq.sinajs.cn/list=int_dji,int_nasdaq,int_hangseng,int_nikkei,b_FSSTI,其它详见第五天接口说明;

/**
     * 外盘数据采集
     */
    void getOutMarket();
    /**
     * 外盘数据采集
     */
    @Override
    public void getOutMarket() {
        String url = stockInfoConfig.getOutMarket() + String.join("," , stockInfoConfig.getOuter());
        ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
        int statusCodeValue = exchange.getStatusCodeValue();
        if (statusCodeValue != 200) {
            log.error("当前时间点{} , 数据采集失败 , 状态码{}", DateTime.now().toString("yyyy-MM-dd HH-mm-ss"), statusCodeValue);
            return;
        }
        String jsData = exchange.getBody();
        List<StockOuterMarketIndexInfo> list = parserStockInfoUtil.parser4StockOrMarketInfo(jsData, ParseType.OUTER);
        log.info("采集的当前大盘数据:{}", list);

        int num = stockOuterMarketIndexInfoMapper.insertOutMarketData(list);
        if (num > 0) {
            log.info("当前时间点{} , 数据插入成功", DateTime.now().toString("yyyy-MM-dd HH-mm-ss"));
            rabbitTemplate.convertAndSend("stockExchange","inner.market",new Date());
        } else {
            log.error("当前时间点{} , 数据插入失败", DateTime.now().toString("yyyy-MM-dd HH-mm-ss"));
        }


    }

mapper层

int insertOutMarketData(@Param("list") List<StockOuterMarketIndexInfo> list);
<insert id="insertOutMarketData">
        insert into stock_outer_market_index_info
        ( id,market_code,market_name
        ,cur_point,updown,rose
        ,cur_time)
        values
            <foreach collection="list" item="data" separator=",">
                (#{data.id,jdbcType=BIGINT},#{data.marketCode,jdbcType=CHAR},#{data.marketName,jdbcType=VARCHAR}
                ,#{data.curPoint,jdbcType=DECIMAL},#{data.updown,jdbcType=DECIMAL},#{data.rose,jdbcType=DECIMAL}
                ,#{data.curTime,jdbcType=TIMESTAMP})
            </foreach>
    </insert>

4.完善用户登录成功动态回显菜单栏功能

1)功能接口说明

功能描述:当前用户登录后,仅仅加载了用户表相关信息,接下来完成的功能是完善用户权限相关的信息;
服务路径:/api/login
请求方式:POST
注意事项:顶级权限(功能菜单项)的pid为0

在这里插入图片描述

对应表表结构:

sys_permissioin表:

在这里插入图片描述

接口响应数据格式:

{
    "code": 1,
    "data": {
        "id": "1237361915165020161",//用户ID
        "username": "admin",//用户名称
        "phone": "13888888888",//手机号
        "nickName": "itheima",//昵称
        "realName": "heima",//真实名称
        "sex": 1,//性别
        "status": 1,//状态
        "email": "875267425@qq.com",//邮件
        "menus": [//侧边栏权限树(不包含按钮权限)
            {
                "id": "1236916745927790564",//权限ID
                "title": "组织管理",//权限标题
                "icon": "el-icon-star-off",//权限图标(按钮权限无图片)
                "path": "/org",//请求地址
                "name": "org",//权限名称对应前端vue组件名称
                "children": [
                    {
                        "id": "1236916745927790578",
                        "title": "角色管理",
                        "icon": "el-icon-s-promotion",
                        "path": "/roles",
                        "name": "roles",
                        "children": [] // null 则前端展示失败
                    },
                    {
                        "id": "1236916745927790560",
                        "title": "菜单权限管理",
                        "icon": "el-icon-s-tools",
                        "path": "/menus",
                        "name": "menus",
                        "children": [] 
                    }
                ]
            },
            {
                "id": "1236916745927790569",
                "title": "账号管理",
                "icon": "el-icon-s-data",
                "path": "/user",
                "name": "user",
                "children": []
            }
        ],
      permissions: ["btn-user-delete",//按钮权限标识
                    "btn-log-delete",
                    "btn-user-add",
                    "btn-role-update",
                    "btn-permission-delete",]
    }
}

实现步骤:

1.根据用户名已经查询了用户信息,且做了用户信息合法性的判断;

2.如果 用户合法,则根据用户的id去数据库查询用户拥有的权限信息集合;

​ 根据用户id查询权限信息,数据要注意去重(distinct)

3.递归用户拥有的权限集合,组织出用户的目录-菜单树(不包含按钮权限)—》menus

3.获取按钮权限标识集合(获取权限集合中type=3的权限信息)—》permissions

提示:用户侧边栏信息先批量查询,然后再通过递归组装数据;

代码实现

1. 表现层
    @ApiOperation(value = "登录功能")
    // 该请求传入的参数为Json类型 , 我们需要将Json类型的数据反序列化为对象需要调用RequestBody
    @PostMapping("/login")
    public R<LoginRespVo> login(@RequestBody LoginReqVo loginReqVo){
        return UserService.login(loginReqVo);
    }
封装实体类
package com.jixu.stock.vo.resp;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * @author by itheima
 * @Date 2021/12/24
 * @Description 登录后响应前端的vo
 */
@ApiModel(description = "登录后响应前端的vo")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class LoginRespVo {
    /**
     * 在前端中long类型数据过长会导致数据失真 英雌我们在传递的过程中需要将数据转化为String类型
     */
    //用户ID
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;
    //用户名称
    private String username;
    //手机号
    private String phone;
    //昵称
    private String nickName;
    //真实名称
    private String realName;
    //性别
    private Integer sex;
    //状态
    private Integer status;
    //邮件
    private String email;
    //侧边栏权限树
    private List menus;
    //按钮权限标识
    private List permissions;

}
package com.jixu.stock.pojo.domain;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * @program: stock_parent
 * @description:
 * @author: jixu
 * @create: 2024-10-05 17:57
 **/

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserLoginMenusDomain {

    @JsonSerialize(using = ToStringSerializer.class)
    private Long  id;
    private String title;
    private String icon ;
    private String path;
    private String name;
    private List children;
}

2. 服务层

这个完善用户功能最大的难点是在于如何封装用户权限数据

  1. 从数据库中获取该用户的所有权限信息
  2. 将所有信息以Map的形式进行封装 用户id作为key
  3. 找到pid对应的id , 封装进另一个Map中 , 进行映射
public R<LoginRespVo> login(LoginReqVo loginReqVo);
 /**
     * 实现登录功能
     * @param loginReqVo
     * @return
     */
    @Override
    public R<LoginRespVo> login(LoginReqVo loginReqVo) {
        // 1. 判断数据是否合法
        if ( loginReqVo == null || StringUtils.isBlank(loginReqVo.getUsername()) || StringUtils.isBlank(loginReqVo.getPassword())){
            return R.error(ResponseCode.DATA_ERROR.getMessage());
        }

        // 判断验证码以及sessionId是否存在
        if ( StringUtils.isBlank(loginReqVo.getCode()) || StringUtils.isBlank(loginReqVo.getSessionId())){
            return R.error(ResponseCode.CHECK_CODE_NOT_EMPTY.getMessage());
        }

        // 校验验证码是否正确
        String redisCode = (String) redisTemplate.opsForValue().get(StockConstant.CHECK_PREFIX + loginReqVo.getSessionId());
        if ( StringUtils.isBlank(redisCode) ){
            return R.error(ResponseCode.CHECK_CODE_TIMEOUT.getMessage());
        }

        // 判断验证码是否正确
        if ( !redisCode.equalsIgnoreCase(loginReqVo.getCode()) ){
            return R.error(ResponseCode.CHECK_CODE_ERROR.getMessage());
        }

        // 2. 根据用户名查询用户数据
        SysUser sysUser = sysUserMapper.selectByName(loginReqVo.getUsername());
        if (sysUser == null){
            return R.error(ResponseCode.ACCOUNT_NOT_EXISTS.getMessage());
        }

        // 3. 判断用户数据是否正确
        if (!passwordEncoder.matches(loginReqVo.getPassword(),sysUser.getPassword())) {
            return R.error(ResponseCode.USERNAME_OR_PASSWORD_ERROR.getMessage());
        }


        // 4. 装配数据 --> 使用BeanUtils中的工具包copyProperties可以直接将前一个对象的数据装配到后一个对象
        //                前提是保证两个对象的属性名相同
        LoginRespVo loginRespVo = new LoginRespVo();
        BeanUtils.copyProperties(sysUser , loginRespVo);

        // 获取用户ID
        Long id = sysUser.getId();

        // 查询获取主要权限
        List<Map<String , Object>> menusData = sysPermissionMapper.getLoginMenus(id);
            
//        // 获取所有id
//        Set<Long> set = menusData.stream().map(item -> {
//            Long roleid = (Long) item.get("id");
//            return roleid;
//        }).collect(Collectors.toSet());

        ArrayList<UserLoginMenusDomain> userLoginMenus = new ArrayList<>();



        // permissions
        ArrayList<String> permissions = new ArrayList<>();


        // 获取所有的数据集对象
        HashMap<Long, UserLoginMenusDomain> menusDomainHashMap = new HashMap<Long, UserLoginMenusDomain>();


        // 获取用户对应岗位
        ArrayList<UserLoginMenusDomain> zeroData = new ArrayList<>();
        for (Map<String, Object> item : menusData) {
            Long pid = (Long) item.get("pid");
            Long user_id = (Long) item.get("id");
            String title = (String) item.get("title");
            String path = (String) item.get("path");
            String icon = (String) item.get("icon");
            String name = (String) item.get("name");
            String code = (String) item.get("code");
            if (!StringUtils.isBlank(code)){
                permissions.add(code);
            }
            UserLoginMenusDomain userLoginMenusDomain = new UserLoginMenusDomain();
            userLoginMenusDomain.setId(user_id);
            userLoginMenusDomain.setIcon(icon);
            userLoginMenusDomain.setPath(path);
            userLoginMenusDomain.setName(name);
            userLoginMenusDomain.setTitle(title);
            userLoginMenusDomain.setChildren(new ArrayList());
            menusDomainHashMap.put(user_id , userLoginMenusDomain);
            if (pid == 0){
                zeroData.add(userLoginMenusDomain);
            }
        }




        // 用于快速查找子菜单的映射
        Map<Long, List<UserLoginMenusDomain>> childrenMap = new HashMap<>();

        // 首先,构建一个映射,将每个父ID映射到其子菜单列表
        for (Map<String, Object> menusDatum : menusData) {
            Long pid = (Long) menusDatum.get("pid");
            // 循环获取每个对象的id
            Long id1 = (Long) menusDatum.get("id");

            // 从数据集中查询获取该循环的对象
            UserLoginMenusDomain domain = menusDomainHashMap.get(id1);
            // 如果可以查询到
            if (domain != null) {
                // 创建一个对应的映射菜单 --> pid : List<该pid对应的父对象>
                childrenMap.computeIfAbsent(pid, k -> new ArrayList<>()).add(domain);
            }
        }



        // 假设 menusDomainHashMap 已经根据菜单项的 ID 填充了 UserLoginMenusDomain 对象
        for (UserLoginMenusDomain zeroDatum : zeroData) {
            Long parentId = zeroDatum.getId();
            ArrayList<UserLoginMenusDomain> childrenList = new ArrayList<>();



            // 现在,我们可以轻松地找到每个主菜单项的子菜单
            if (childrenMap.containsKey(parentId)) {
                List<UserLoginMenusDomain> directChildren = childrenMap.get(parentId);
                for (UserLoginMenusDomain child : directChildren) {
                    // 递归地为每个子菜单设置其子菜单(如果有的话)
                    List<UserLoginMenusDomain> grandChildren = childrenMap.getOrDefault(child.getId(), new ArrayList<>());
                    child.setChildren(grandChildren);
                }
                childrenList.addAll(directChildren);
            }

            zeroDatum.setChildren(childrenList);
        }


        loginRespVo.setMenus(zeroData);
        loginRespVo.setPermissions(permissions);




        return R.ok(loginRespVo);
    }
3. Dao层
List<Map<String, Object>> getLoginMenus(@Param("id") Long id);
 <select id="getLoginMenus" resultType="java.util.Map">
        select sys_permission.id as id,
               sys_permission.title as title,
               sys_permission.icon as icon,
               sys_permission.url as path,
               sys_permission.name as name,
               sys_permission.code as code,
               sys_permission.pid as pid
        from sys_user_role
                 join sys_user on sys_user.id = sys_user_role.user_id
                 join sys_role on sys_user_role.role_id = sys_role.id
                 join sys_role_permission  on sys_user_role.role_id = sys_role_permission.role_id
                 join sys_permission  on sys_role_permission.permission_id = sys_permission.id

        where sys_user.id = #{id}
    </select>

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

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

相关文章

AI周报(9.29-10.5)

AI应用-Elayne公司临终规划和自动化遗产结算 创业公司Elayne成立于2023年&#xff0c;由Adria Ferrier和Jake Grafenstein共同创立&#xff0c;Adria Ferrier担任CEO&#xff0c;总部位于科罗拉多州丹佛市。 Elayne公司专注于遗产规划和结算领域&#xff0c;通过人工智能技术…

【Diffusion分割】CTS:基于一致性的医学图像分割模型

CTS: A Consistency-Based Medical Image Segmentation Model 摘要&#xff1a; 在医学图像分割任务中&#xff0c;扩散模型已显示出巨大的潜力。然而&#xff0c;主流的扩散模型存在采样次数多、预测结果慢等缺点。最近&#xff0c;作为独立生成网络的一致性模型解决了这一问…

【C++】STL——list的模拟实现

目录 前言list介绍list的模拟实现总体结构节点类迭代器类链表类 默认成员函数构造函数拷贝构造赋值重载析构函数 迭代器实现双向迭代器迭代器的其他功能用多参数模板完成最终的迭代器类 list的容量相关和数据访问empty()和size()front()和back() list的修改操作任意位置插入和删…

数据结构 ——— C语言实现无哨兵位单向不循环链表

目录 前言 动态顺序表的缺陷 单链表的概念 单链表中节点的结构 单链表逻辑结构示意图​编辑 实现单链表前的准备工作 实现单链表 1. 定义节点的指针 2. 创建节点 3. 打印单链表中的所有数据 4. 在单链表头部插入数据 5. 在单链表尾部插入数据 6. 在单链表头部删除数…

脏读、不可重复读、幻读的解决方法

上一篇博客提到了脏读、不可重复读、幻读的含义&#xff0c;也知道了是因为什么情况导致出现的这些问题&#xff0c;这篇博客就带大家一起来了解一下他们的解决办法~ 脏读&#xff1a;脏读出现的原因主要是因为一个事务读取了另外一个事务未提交的数据&#xff0c;就可能出现脏…

掌握嵌套子查询:复杂 SQL 中 * 列的准确表列关系

在日常开发中&#xff0c;我们常常需要对复杂的 SQL 进行数据血缘分析。 本文重点讨论在具有 * 列的嵌套子查询中建立表和列之间正确关系的挑战。使用 Teradata SQL 代码示例来说明该过程。 本文聚焦于一个别名为 SUBSCRIBER_ 的子查询及其派生的列&#xff0c;这些列在外层查…

无需VPN!大厂力作:免费AI对口型神器登场,让你的视频制作更简单!

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 &#xff08;偶尔会因为推荐工具&#xff…

《深度学习》OpenCV 图像拼接 原理、参数解析、案例实现

目录 一、图像拼接 1、直接看案例 图1与图2展示&#xff1a; 合并完结果&#xff1a; 2、什么是图像拼接 3、图像拼接步骤 1&#xff09;加载图像 2&#xff09;特征点检测与描述 3&#xff09;特征点匹配 4&#xff09;图像配准 5&#xff09;图像变换和拼接 6&am…

实验3 选择结构

1、计算分段函数的值 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h> int main() {double x,y0;scanf("%lf",&x);if(x<0){printf("error!\n");return 0;}if(0<x&&x<1){ylog10(x);}else if(1<…

缓存数据减轻服务器压力

问题:不是所有的数据都需要请求后端的 不是所有的数据都需要请求后端的,有些数据是重复的、可以复用的解决方案:缓存 实现思路:每一个分类为一个key,一个可以下面可以有很多菜品 前端是按照分类查询的,所以我们需要通过分类来缓存缓存代码 /*** 根据分类id查询菜品** @pa…

Java | Leetcode Java题解之第459题重复的子字符串

题目&#xff1a; 题解&#xff1a; class Solution {public boolean repeatedSubstringPattern(String s) {return kmp(s s, s);}public boolean kmp(String query, String pattern) {int n query.length();int m pattern.length();int[] fail new int[m];Arrays.fill(fa…

54.二叉树的最大深度

迭代 class Solution {public int maxDepth(TreeNode root) {if(rootnull){return 0;}int de0;Queue<TreeNode> qunew LinkedList<>();TreeNode tn;int le;qu.offer(root);while(!qu.isEmpty()){lequ.size();while(le>0){tnqu.poll();if(tn.left!null){qu.offe…

学会这几个简单的bat代码,轻松在朋友面前装一波13[通俗易懂]

大家好&#xff0c;又见面了&#xff0c;我是你们的朋友全栈君。 这个标题是干什么用的? 最近看晚上某些人耍cmd耍的十分开心&#xff0c;还自称为“黑客”&#xff0c;着实比较搞笑.他们那些花里胡哨的东西在外行看来十分nb,但只要略懂一些&#xff0c;就会发现他们的那些十…

论文阅读笔记-A Comparative Study on Transformer vs RNN in Speech Applications

前言 介绍 序列到序列模型已广泛用于端到端语音处理中,例如自动语音识别(ASR),语音翻译(ST)和文本到语音(TTS)。本文着重介绍把Transformer应用在语音领域上并与RNN进行对比。与传统的基于RNN的模型相比,将Transformer应用于语音的主要困难之一是,它需要更复杂的配…

JavaScript 数组方法

数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始)&#xff0c;整个数组用方括号表示。两端的方括号是数组的标志。 var a["a","b","c"]; 除了在定义时赋值&#xff0c;数组也可以先定义后赋值。 var arr[];arr[1]"a"…

Qt_绘图

目录 1、绘图核心类 2、QPainter类的使用 2.1 绘制线段 2.2 绘制矩形 2.3 绘制圆形 2.4 绘制文本 3、QPen类的使用 3.1 使用画笔 4、QBrush类的使用 4.1 使用画刷 5、绘制图片 5.1 测试QPixmap 5.1.1 图片移动 5.1.2 图标缩小 5.1.3 旋转图片 5.1.4 将…

windows10或11家庭版实现远程桌面连接控制

远程协助是一种Windows工具&#xff0c;允许控制者使用鼠标和键盘远程控制接受者的计算机&#xff0c;从某种程度上讲&#xff0c;这也是Win10家庭版无法远程桌面的一个有效替代方案。 步骤1. 在使用Windows远程协助之前&#xff0c;您需要先更改某些设置&#xff0c;右键单击…

封装el-upload组件,用于上传图片和视频

使用环境 vue3element-ui plus 需要根据后端返回结构修改的函数&#xff1a;onPreview onRemove onSuccess 组件使用 基本使用 源代码&#xff1a; <script setup> import AutoUploadFile from /components/auto-upload-file/index.vue function change(urls){console.…

金智维KRPA之Excel自动化

Excel自动化操作概述 Excel自动化主要用于帮助各种类型的企业用户实现Excel数据处理自动化&#xff0c;Excel自动化是可以从单元格、列、行或范围中读取数据&#xff0c;向其他电子表格或工作簿写入数据等活动。 通过相关命令&#xff0c;还可以对数据进行排序、进行格式…

javaScript数组(16个案例+代码+效果图)

目录 1.数组的概念 2.创建数组 1.通过数组字面量创建数组 1.代码 2.效果 2.通过new Array()创建数组 1.代码 2.效果 3.数组的基本操作 1.获取数组的长度 案例:获取数组的长度 1.代码 2.效果 2.修改数组的长度 1.代码 2.效果 4.访问数组 案例:访问数组 1.代码 2.效果 5.遍历数组…