项目5:实现数据字典的上传下载

news/2024/5/21 21:08:14/文章来源:https://blog.csdn.net/qq_44724899/article/details/130103327

项目5:实现数据字典的上传下载

1.什么是数据字典?如何设计?

2.业务流程逻辑

3.数据库表的设计

4.实现上传下载逻辑(前端)

5.实现上传逻辑(后端)

6.实现下载依赖(后端)

项目5:实现数据字典的上传下载

1.什么是数据字典?如何设计?

①什么是数据字典?

数据字典是用来管理系统常用的分类数据和固定设计

②数据字典的设计?

  • id
  • parent_id
  • 即parent_id即为本标题的父标题,没有则为0

③数据字典中数据库对应后端pojo

  • 数据库中的数据字典(Dict对象)
    需要存储creat_time,update_time,is_deleted
  • 后端pojo
    对应具体的excel即传输对象,不需要上述三个字段的存储,故对象为(ExcelDictDTO)

2.业务流程逻辑

①上传excel表

  • 前端单击上传
  • 后端接收到excel表解析为ExcelDictDTO对象
  • 然后通过mapper保存到数据库中

②下载excel表

  • 前端单击下载
  • 后端接受到请求后通过mapper查询数据库并且封装为ExcelDictDTO对象
  • 然后通过http响应返回文件

③注意

  • ajax请求只能解析字符串
  • http请求可以解析字符串,解析文件
  • 故在上传时可以用ajax请求
  • 故在下载时只能用普通的请求

3.数据库表的设计

①数据库表

在这里插入图片描述

②数据库表对应的entity

package com.atguigu.srb.core.pojo.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 数据字典* </p>** @author Likejin* @since 2023-04-09*/
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="Dict对象", description="数据字典")
public class Dict implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "id")@TableId(value = "id", type = IdType.AUTO)private Long id;@ApiModelProperty(value = "上级id")private Long parentId;@ApiModelProperty(value = "名称")private String name;@ApiModelProperty(value = "值")private Integer value;@ApiModelProperty(value = "编码")private String dictCode;@ApiModelProperty(value = "创建时间")private LocalDateTime createTime;@ApiModelProperty(value = "更新时间")private LocalDateTime updateTime;@ApiModelProperty(value = "删除标记(0:不可用 1:可用)")@TableField("is_deleted")@TableLogicprivate Boolean deleted;}

③数据传输对象dto(与excel对应)

package com.atguigu.srb.core.pojo.dto;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;@Data
public class ExcelDictDTO {@ExcelProperty("id")private Long id;@ExcelProperty("上级id")private Long parentId;@ExcelProperty("名称")private String name;@ExcelProperty("值")private Integer value;@ExcelProperty("编码")private String dictCode;
}

4.实现上传逻辑(前端)

①在路由中加入系统设置/数据字典路由

在这里插入图片描述
srb-admin\src\router\index.js

{path: '/core',component: Layout,redirect: '/core/dict/list',name: 'coreDict',meta: { title: '系统设置', icon: 'el-icon-setting' },alwaysShow: true,children: [{path: 'dict/list',name: '数据字典',component: () => import('@/views/core/dict/list'),meta: { title: '数据字典' },},],},

②新建页面组件(配合路由渲染主内容区)

srb-admin\src\views\core\dict\list.vue

<template><div class="app-container"><!--Excel导入按钮--><div style="margin-bottom: 10px"><el-button@click="dialogVisible = true"type="primary"size="mini"icon="el-icon-download">导入Excel</el-button><el-button@click="exportData"type="primary"size="mini"icon="el-icon-upload2">导出Excel</el-button></div><!--显示一个dialog对话框--><el-dialog title="数据字典导入" :visible.sync="dialogVisible" width="30%"><el-form><el-form-item label="请选择Excel文件"><!--accept为只接受xls,xlsx的文件后缀,name名字必须要和后端的名字保持一致,avtion为提交地址发起ajax远程调用(和自己写的request请求无关),自己处理成功失败--><el-upload:auto-upload="true":multiple="false":limit="1":on-exceed="fileUploadExceed":on-success="fileUploadSuccess":on-error="fileUploadError":action="BASE_API + '/admin/core/dict/import'"name="file"accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"><el-button size="small" type="primary">点击上传</el-button></el-upload></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click="dialogVisible = false">取消</el-button></div></el-dialog></div>
</template><script>
export default {data() {return {dialogVisible: false, //对话框是否显式BASE_API: process.env.VUE_APP_BASE_API, //获取后端接口地址}},methods: {// 上传多于一个文件时fileUploadExceed() {this.$message.warning('只能选取一个文件')},//上传成功回调(http通信成功,有可能业务失败或业务失败)fileUploadSuccess(response) {if (response.code === 0) {//业务成功this.$message.success('数据导入成功')this.dialogVisible = false} else {//业务事变this.$message.error(response.message)}},//上传失败回调(http通信不成功)fileUploadError(error) {this.$message.error('数据导入失败')},//Excel数据导出exportData() {//导出excel,此时不能用ajax请求,无法响应文件window.location.href = this.BASE_API + '/admin/core/dict/export'},},
}
</script>

5.实现上传逻辑(后端)

①逻辑流程

  • 前端单击上传(发起ajax请求)
  • 后端controller接收到文件类型数据,调用service层保存
  • service层调用easyexcel接口读取excel数据(利用监听器)
  • 监听器调用mapper接口存储excel数据到数据库

②创建dto数据传输对象(封装excel表格数据)

package com.atguigu.srb.core.pojo.dto;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;@Data
public class ExcelDictDTO {@ExcelProperty("id")private Long id;@ExcelProperty("上级id")private Long parentId;@ExcelProperty("名称")private String name;@ExcelProperty("值")private Integer value;@ExcelProperty("编码")private String dictCode;
}

③引入easyexcel依赖

        <!--excel依赖--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId></dependency><!--excel底层用xml存储,需要xml解析器--><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId></dependency>

④编写controller接口(接受文件调用sevice存储数据库)

package com.atguigu.srb.core.controller.admin;import com.alibaba.excel.EasyExcel;
import com.atguigu.common.exception.BusinessException;
import com.atguigu.common.result.R;
import com.atguigu.common.result.ResponseEnum;
import com.atguigu.srb.core.pojo.dto.ExcelDictDTO;
import com.atguigu.srb.core.service.DictService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;/*** <p>* 数据字典 前端控制器* </p>** @author Likejin* @since 2023-04-09*/
@Api(tags = "数据字典管理")
@RestController
@RequestMapping("/admin/core/dict")
@Slf4j
@CrossOrigin
public class AdminDictController {@ResourceDictService dictService;@ApiOperation("Excel数据的批量导入(导入到数据库)")@PostMapping("/import")public R batchImport(@ApiParam(value="Excel数据字典文件")@RequestParam("file") MultipartFile file){try {InputStream inputStream = file.getInputStream();dictService.importData(inputStream);return R.ok().message("数据字典批量导入成功");} catch (Exception e) {//返回R对象,并且打印异常跟踪栈throw new BusinessException(ResponseEnum.UPLOAD_ERROR,e);}}@ApiOperation("Excel数据的导出")//访问页面@GetMapping("/export")public void export(HttpServletResponse response){try {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman//设置类型为excelresponse.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("mydict", "UTF-8").replaceAll("\\+", "%20");//设置附件的形式下载到浏览器端response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream(), ExcelDictDTO.class).sheet("数据字典").doWrite(dictService.listDictData());} catch (IOException e) {//EXPORT_DATA_ERROR(104, "数据导出失败"),throw  new BusinessException(ResponseEnum.EXPORT_DATA_ERROR, e);}}}

⑤编写service接口和serviceimpl

package com.atguigu.srb.core.service;import com.atguigu.srb.core.pojo.dto.ExcelDictDTO;
import com.atguigu.srb.core.pojo.entity.Dict;
import com.baomidou.mybatisplus.extension.service.IService;import java.io.InputStream;
import java.util.List;/*** <p>* 数据字典 服务类* </p>** @author Likejin* @since 2023-04-09*/
public interface DictService extends IService<Dict> {void importData(InputStream inputStream);List<ExcelDictDTO> listDictData();
}
package com.atguigu.srb.core.service.impl;import com.alibaba.excel.EasyExcel;
import com.atguigu.srb.core.listener.ExcelDictDTOListener;
import com.atguigu.srb.core.mapper.DictMapper;
import com.atguigu.srb.core.pojo.dto.ExcelDictDTO;
import com.atguigu.srb.core.pojo.entity.Dict;
import com.atguigu.srb.core.service.DictService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;/*** <p>* 数据字典 服务实现类* </p>** @author Likejin* @since 2023-04-09*/
@Slf4j
@Service
public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements DictService {@Resourceprivate  DictMapper dictMapper;//读取数据//写入数据库,利用事务的操作成功全成功,失败全失败(只要异常出现则回滚)@Transactional(rollbackFor = Exception.class)@Overridepublic void importData(InputStream inputStream) {//传入输入流,EasyExcel.read(inputStream, ExcelDictDTO.class, new ExcelDictDTOListener(dictMapper)).sheet().doRead();log.info("Excel导入成功");}@Overridepublic List<ExcelDictDTO> listDictData() {List<Dict> dictList = dictMapper.selectList(null);//创建ExcelDictDTO列表,将Dict列表转化为ExcelDictDTO列表ArrayList<ExcelDictDTO> excelDictDTOList = new ArrayList<>(dictList.size());dictList.forEach(dict -> {ExcelDictDTO excelDictDTO = new ExcelDictDTO();//对象拷贝,dict拷贝到excelDictDTO(相同列拷贝)BeanUtils.copyProperties(dict, excelDictDTO);excelDictDTOList.add(excelDictDTO);});return excelDictDTOList;}
}

⑥编写excel读取监听器并调用mapper接口

package com.atguigu.srb.core.listener;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.atguigu.srb.core.mapper.DictMapper;
import com.atguigu.srb.core.pojo.dto.ExcelDictDTO;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;
import java.util.List;@Slf4j
@NoArgsConstructor
public class ExcelDictDTOListener extends AnalysisEventListener<ExcelDictDTO> {//@Resource注入mapper不行,因为本类并没有被spring管理,需要用参数构造的方式加入mapperprivate DictMapper dictMapper;public ExcelDictDTOListener(DictMapper dictMapper){this.dictMapper = dictMapper;}//数据列表List<ExcelDictDTO> list = new ArrayList<ExcelDictDTO>();//每隔五条记录存储一次数据static final  int BATCH_SIZE=5;@Overridepublic void invoke(ExcelDictDTO data, AnalysisContext analysisContext) {log.info("解析到一条数据{}",data);//调用mapper层的save数据//批量解析,列表达到一定数量,然后一次性存储数据//数据存入数据列表list.add(data);if(list.size()>=BATCH_SIZE){saveData();list.clear();}}private void saveData() {log.info("{}条数据被存储到数据库",list.size());//调用mapper层的批量save方法//TODOdictMapper.insertBatch(list);log.info("{}条数据被存储到数据库成功",list.size());}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {//最后剩余的数据不足BATCH_SIZE,最终一次性存储剩余数据saveData();log.info("解析完成");}
}

⑦编写mapper接口和具体的sql语句

package com.atguigu.srb.core.mapper;import com.atguigu.srb.core.pojo.dto.ExcelDictDTO;
import com.atguigu.srb.core.pojo.entity.Dict;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;import java.util.List;/*** <p>* 数据字典 Mapper 接口* </p>** @author Likejin* @since 2023-04-09*/
public interface DictMapper extends BaseMapper<Dict> {void insertBatch(List<ExcelDictDTO> list);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.srb.core.mapper.DictMapper"><insert id="insertBatch">insert into dict (id ,parent_id ,name ,value ,dict_code) values<foreach collection="list" item="item" index="index" separator=",">(#{item.id} ,#{item.parentId} ,#{item.name} ,#{item.value} ,#{item.dictCode})</foreach></insert></mapper>

⑧配置打包时打包JAVA文件内的xml

  • JAVA目录下的xml不会被打包,只会打包.java
  • 代码生成器生成的xml文件都放在java包下
  • 两种解决方法:
    将xml文件都放入resources下
    打包方式改变
  • 使用打包方式
    <build><!-- 项目打包时会将java目录中的*.xml文件也进行打包 --><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources></build>

6.实现下载依赖(后端)

①业务流程

  • 前端单击下载(向后端发起非ajax请求,可以不用设置跨域)
  • 后端controller接受请求,controller调用easyexcel接口返回excel文件
  • easyexcel接口利用service的获取到的数据封装为excel
  • 注意:
    调用代码生成器的service接口获得的是Dict类型数据,需要封装为ExcelDictDTO数据返回excel文件

②controller

package com.atguigu.srb.core.controller.admin;import com.alibaba.excel.EasyExcel;
import com.atguigu.common.exception.BusinessException;
import com.atguigu.common.result.R;
import com.atguigu.common.result.ResponseEnum;
import com.atguigu.srb.core.pojo.dto.ExcelDictDTO;
import com.atguigu.srb.core.service.DictService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;/*** <p>* 数据字典 前端控制器* </p>** @author Likejin* @since 2023-04-09*/
@Api(tags = "数据字典管理")
@RestController
@RequestMapping("/admin/core/dict")
@Slf4j
@CrossOrigin
public class AdminDictController {@ResourceDictService dictService;@ApiOperation("Excel数据的批量导入(导入到数据库)")@PostMapping("/import")public R batchImport(@ApiParam(value="Excel数据字典文件")@RequestParam("file") MultipartFile file){try {InputStream inputStream = file.getInputStream();dictService.importData(inputStream);return R.ok().message("数据字典批量导入成功");} catch (Exception e) {//返回R对象,并且打印异常跟踪栈throw new BusinessException(ResponseEnum.UPLOAD_ERROR,e);}}@ApiOperation("Excel数据的导出")//访问页面@GetMapping("/export")public void export(HttpServletResponse response){try {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman//设置类型为excelresponse.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("mydict", "UTF-8").replaceAll("\\+", "%20");//设置附件的形式下载到浏览器端response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream(), ExcelDictDTO.class).sheet("数据字典").doWrite(dictService.listDictData());} catch (IOException e) {//EXPORT_DATA_ERROR(104, "数据导出失败"),throw  new BusinessException(ResponseEnum.EXPORT_DATA_ERROR, e);}}}

③service层

  • 封装代码生成器返回Dict的list为DTO的list
package com.atguigu.srb.core.service;import com.atguigu.srb.core.pojo.dto.ExcelDictDTO;
import com.atguigu.srb.core.pojo.entity.Dict;
import com.baomidou.mybatisplus.extension.service.IService;import java.io.InputStream;
import java.util.List;/*** <p>* 数据字典 服务类* </p>** @author Likejin* @since 2023-04-09*/
public interface DictService extends IService<Dict> {void importData(InputStream inputStream);List<ExcelDictDTO> listDictData();
}
package com.atguigu.srb.core.service.impl;import com.alibaba.excel.EasyExcel;
import com.atguigu.srb.core.listener.ExcelDictDTOListener;
import com.atguigu.srb.core.mapper.DictMapper;
import com.atguigu.srb.core.pojo.dto.ExcelDictDTO;
import com.atguigu.srb.core.pojo.entity.Dict;
import com.atguigu.srb.core.service.DictService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;/*** <p>* 数据字典 服务实现类* </p>** @author Likejin* @since 2023-04-09*/
@Slf4j
@Service
public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements DictService {@Resourceprivate  DictMapper dictMapper;//读取数据//写入数据库,利用事务的操作成功全成功,失败全失败(只要异常出现则回滚)@Transactional(rollbackFor = Exception.class)@Overridepublic void importData(InputStream inputStream) {//传入输入流,EasyExcel.read(inputStream, ExcelDictDTO.class, new ExcelDictDTOListener(dictMapper)).sheet().doRead();log.info("Excel导入成功");}@Overridepublic List<ExcelDictDTO> listDictData() {List<Dict> dictList = dictMapper.selectList(null);//创建ExcelDictDTO列表,将Dict列表转化为ExcelDictDTO列表ArrayList<ExcelDictDTO> excelDictDTOList = new ArrayList<>(dictList.size());dictList.forEach(dict -> {ExcelDictDTO excelDictDTO = new ExcelDictDTO();//对象拷贝,dict拷贝到excelDictDTO(相同列拷贝)BeanUtils.copyProperties(dict, excelDictDTO);excelDictDTOList.add(excelDictDTO);});return excelDictDTOList;}
}

未更新

未更新

未更新

未更新

未更新

未更新

未更新

未更新

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

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

相关文章

代码随想录Day49

今天继续学习动规解决完全背包问题。 322.零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;…

vuex中的 mapState, mapMutations

vuex中的 mapState&#xff0c; mapMutations Start 今天使用vuex的过程中&#xff0c;遇到 mapState&#xff0c; mapMutations 这么两个函数&#xff0c;今天学习一下这两个函数。 本文介绍的vuex基于 vuex3.0 1. 官方文档说明 1.1 mapState 官方解释 点击这里&#xff1…

【JUC进阶】详解synchronized锁升级

文章目录1. synchronized概述2. synchronized 的实现原理2.1 Java对象组成2.2 Monitor2.3 从字节码角度看synchronized3. 锁升级3.1 偏向锁3.2 轻量级锁1. synchronized概述 synchronized是一个悲观锁&#xff0c;可以实现线程同步&#xff0c;在多线程的环境下&#xff0c;需…

DIN35电压电流转频率单位脉冲输出信号变换器集电极开路隔离变送器

主要特性 将直流电压或电流信号转换成单位脉冲信号。 精度等级&#xff1a;0.1 级、0.2 级。产品出厂前已检验校正&#xff0c;用户可以直接使用。 国际标准信号输入:0-5V/0-10V/1-5V 等电压信号,0-10mA/0-20mA/4-20mA 等电流信号。 输出标准信号&#xff1a;0-5KHz/0-…

Flink CDC 在京东的探索与实践

摘要&#xff1a;本文整理自京东资深技术专家韩飞&#xff0c;在 Flink Forward Asia 2022 数据集成专场的分享。本篇内容主要分为四个部分&#xff1a; 京东自研 CDC 介绍京东场景的 Flink CDC 优化业务案例未来规划点击查看直播回放和演讲 PPT 一、京东自研 CDC 介绍 京东自研…

小白学Pytorch系列- -torch.distributions API Distributions (1)

小白学Pytorch系列- -torch.distributions API Distributions (1) 分布包包含可参数化的概率分布和抽样函数。这允许构造用于优化的随机计算图和随机梯度估计器。这个包通常遵循TensorFlow分发包的设计。 不可能通过随机样本直接反向传播。但是&#xff0c;有两种主要方法可以…

tomcat中出现RFC7230和RFC3986问题解析

问题截图 问题分析 出现上述问题&#xff0c;是因为各版本tomcat中对特殊字符和请求路径中携带中文参数而产生的错误提示。 解决办法 1、调整tomcat版本 tomcat 7.0.76之前的版本不会出现类似问题 2、tomcat9之前&#xff0c;修改tomcat目录底下的/conf/catalina.properti…

chapter-5 数据库设计

以下课程来源于MOOC学习—原课程请见&#xff1a;数据库原理与应用 考研复习 引言 设计的时候: 我们为什么不能设计成R&#xff08;学号&#xff0c;课程号&#xff0c;姓名&#xff0c;所咋系&#xff0c;系主任&#xff0c;成绩&#xff09;&#xff1f; 因为存在数据冗余…

C++算法初级7——二分查找

C算法初级7——二分查找 文章目录C算法初级7——二分查找在升序的数组上进行二分查找总结应用范围应用二分查找的原理&#xff1a;每次排除掉一半答案&#xff0c;使可能的答案区间快速缩小。 二分查找的时间复杂度&#xff1a;O(log n)&#xff0c;因为每次询问会使可行区间的…

appium+python自动化测试启动app

一、部署环境 1、依次下载安装以下工具&#xff0c;并配置环境变量&#xff1a; android sdk Nodejs appium appium-doctor Appium-Python-Client pycharm64 ps:安装包下载和配置环境变量的操作步骤跟着网上各路大神的帖子一步一步做就好了&#xff0c;没啥难度 二、连…

Machine Learning-Ex4(吴恩达课后习题)Neural Networks Learning

目录 1. Neural Networks 1.1 Visualizing the data 1.2 Model representation 1.3 Feedforward and cost function 1.4 Regularized cost function 2. Backpropagation 2.1 Sigmoid gradient 2.2 Random initialization 2.3 Backpropagation 2.4 Gradient Checking…

【数据库原理 • 四】数据库设计和规范化理论

前言 数据库技术是计算机科学技术中发展最快&#xff0c;应用最广的技术之一&#xff0c;它是专门研究如何科学的组织和存储数据&#xff0c;如何高效地获取和处理数据的技术。它已成为各行各业存储数据、管理信息、共享资源和决策支持的最先进&#xff0c;最常用的技术。 当前…

linux之jdk1.8环境安装与配置和Maven安装与配置

文章目录一、jdk1.8环境安装1、官网下载&#xff1a;<https://www.oracle.com/java/technologies/downloads/#java8>2、在usr文件夹下新建一个java文件夹3、解压完成后&#xff0c;将文件jdk文件传入到java目录下二、配置环境&#xff08;重点&#xff09;1、按 i 进行编…

蓝牙技术|苹果获空间音频新专利,AirPods可动态调整声学输出

美国商标和专利局&#xff08;USPTO&#xff09;公示的清单显示&#xff0c;苹果在近日获得了一项名为“测定虚拟聆听环境”的新专利。据悉&#xff0c;该技术可以改善用户的聆听体验&#xff0c;增强空间音频的沉浸感&#xff0c;未来有望应用在AirPods上。 这项专利技术可以…

代码随想录_二叉树_二叉树的层序遍历十道题

leetcode102.二叉树的程序遍历 102. 二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&…

文心一言对于宣传文案理解

前言 前段时间对于文心一言开放部分内测邀请&#xff0c;有幸获得邀请内测权限&#xff01;抱着试一试的态度对其进行了使用&#xff0c;结果还是比较满意的。我们来看一下我所说的满意是否能够达到你的要求&#xff01;&#xff01;&#xff01; 使用逻辑 文心一言的使用还…

FPGA lattice 深力科LCMXO3LF-4300C-6BG256I 可实现高效、灵活和安全的工业应用开发 低功耗FPGA解决方案详情讲解

FPGA lattice 深力科LCMXO3LF-4300C-6BG256I 可实现高效、灵活和安全的工业应用开发 低功耗FPGA解决方案详情讲解 超低密度FPGA 是最新的立即启用、非挥发性、小型覆盖区 FPGA&#xff0c;采用先进的封装技术&#xff0c;能让每个元件达到最低成本。此系列采用最新的小型封装&…

android12 displayArea学习

一&#xff1a;数据结构分析 1&#xff1a;android 12 WindowContainer 的类继承关系如下 下图为 WindowContainer 简要的对象图。 下图是 Aosp默认的display层次结构对象图。 Aosp定义的feature有如下 FEATURE_ROOT 0; FEATURE_DEFAULT_TASK_CONTAINER 1; FEATURE_WINDOW_…

正版软件 Directory Opus 12 Pro Windows 平台上的资源管理器,定是功能完全、可定制化程度高的那款。

Directory Opus 是一款 Windows 平台上的资源管理器&#xff0c;定是功能最完全、可定制化程度最高的那款。你可以通过它完成几乎所有操作&#xff0c;包括查看图片元信息、预览图片、阅读文本文件内容、批量重命名、操作压缩文件以及 FTP 同步请求等。 Directory Opus 是一款由…