Spring Boot + Vue3 前后端分离 实战 wiki 知识库系统<二>---后端架构完善与接口开发
数据库准备:
在上一次Spring Boot + Vue3 前后端分离 实战 wiki 知识库系统<一>---Spring Boot项目搭建已经将SpringBoot相关的配置环境给搭建好了,接下来则需要为咱们的项目创建一个数据库。
1、mysql的安装:
关于mysql的安装这里就不过多说明了,这块在当时https://www.cnblogs.com/webor2006/p/14984451.html的学习中已经安装好了:
目前服务是暂停状态,貌似我点“Start MySQL Server”启动不了,需要用如下命令:
sudo /usr/local/mysql/support-files/mysql.server start
此时就成功启动mysql服务了:
2、连接mysql:
然后接下来用工具连接一下mysql,我这用的是“Navicat Premium”这款软件:
3、创建数据库:
接下来创建一个数据库:
其中utf8mb4是真正的utf8,可以存放表情符号,则utf8它是伪uft8,三个字节,不支持表情符号。
IDEA数据库插件配置:
通常我们都会用一个三方的数据库软件来进行数据库数据的查看,但是,其实也可以借助IntelliJ IDEA自带的它进行数据库连接的配置:
这样就省得来回切窗口,直接在IDE中进行数据库数据的查看,这也挺方便的,所以接下来配置一下:
目前此库中还木有表,接下来创建一张表:
drop table if exists `demo`;
create table `demo` (`id` bigint not null comment 'id',`name` varchar(50) comment '名称',primary key (`id`)
) engine=innodb default charset=utf8mb4 comment='测试';insert into `demo` (id, name) values (1, '测试');
如果想查看表中的数据,可以直接双击,就会有一个结果窗口出来:
是不是也挺方便的,而且这个还免费,最主要是不用切换窗口。另外还有一个比较好用的功能,就是我们新建的sql文件可以直接进行执行,最终就会到已连接的数据库表中,比如:
集成持久层框架Mybatis:
集成Mybatis:
接下来需要集成持久层框架,也就是跟数据库打交道的这一层,通常持久层框架有两个:Mybatis和Hibernate, 其中Mybatis是半自动的,需要我们自己写sql,而Hibernate是全自动的,不需要咱们写sql,我记得当年ssh框架盛行时,学这玩意可费劲了,这里我们选择Mybatis。
1、添加依赖:
<!-- 集成mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version></dependency><!-- 集成mysql连接 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.22</version></dependency>
2、配置数据源:
# 增加数据库连接
spring.datasource.url=jdbc:mysql://localhost/wiki?characterEncoding=UTF8&autoReconnect=true&serverTimezone=Asia/Shanghai&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=你自己的用户名密码
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
3、新建数据库对应的实体:
4、新建数据库操作层:
其实这一层就是熟知的dao层,由于之后会使用Mybatis的代码生成器功能,生成的包名就中mapper,所以这里也取名叫mapper。
5、定义接口对应的SQL:
对于这个list查询所有demo表中的数据那它的具体sql是啥呢?这里就需要到这块xml中进行定义了:
<?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.cexo.wiki.mapper.DemoMapper"><select id="list" resultType="com.cexo.wiki.domain.Demo">select `id`, `name` from `demo`</select>
</mapper>
这块的代码基本固定,直接拷过来就成,其中有个注意的地方就是这个sql中是用的反斜线。
6、free mybatis tool插件安装:
有木有发现,对于mybatis中的这个xml配置你想从这块跳到具体的方法定义是比较麻烦的:
当然你可以直接先定位到DemoMapper主个类,然后再去定位到list()这个方法,但是有一个更加方便的方式,就是安装一个这么个插件:
所以,咱们安装试一下:
试一下效果:
嗯,挺好用的。
7、增加持久层扫描注解:@MapperScan
对于咱们定义的这个持有层的接口对于Spring Boot而言它是不知道的,所以需要在这增加这么一个注解:
8、配置mybatis所有mapper.xml所在的路径:
对于我们配置的这块文件:
那SpringBoot是如何知道该xml就是要执行的SQL呢?同样需要进行配置一下:
# 配置mybatis所有Mapper.xml所在的路径
mybatis.mapper-locations=classpath:/mapper/**/*.xml
演示查询test表:
mybatis的配置一切就绪,接下来咱们来使用一下是否能进行数据库的操作,当然需要弄个接口来演示下。
1、新建service:
为了将我们的DemoMapper接口应用上,需要新建一个service,主要是处理业务逻辑:
而要想让它被SpringBoot管理,类上需要加个注解:
接着咱们来定义一个方法,刚好跟DemoMapper定义的list()对应:
其中对于demoMapper这上成员变量木有实例化对吧,是因为还得加载注解将其注入:
另外还有可使用springboot自身的注入注解:
这块咱们选择@Resource。
2、将service使用到controller上:
接下来咱们则需要回到Controller中来调用这个service,如下:
3、运行:
接下来咱们做一下测试,还是回到test.http这个类中:
集成Mybatis官方代码生成器:
概述:
在上面我们已经成功的集成了Mybatis到工程中了,有木有发现,步骤还是比较多的,需要准备这么多东东:
有木有发现其实这些类起名都是以Demo开头,其实Mybatis官方已经给我们自动生成这些模板代码,用来加速我们平常的开发,所以下面就来看一下如何自动生产这些类。
集成Mybatis Generator:
1、添加依赖:
<!-- mybatis generator 自动生成代码插件 --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.0</version><configuration><configurationFile>src/main/resources/generator/generator-config.xml</configurationFile><overwrite>true</overwrite><verbose>true</verbose></configuration><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.22</version></dependency></dependencies></plugin>
2、配置generator-config.xml生成规则:
其中代码生成的规则是依赖于这么一个xml文件:
所以咱们在这个指定的目录中新建这么一个文件:
其内容这里是一个模板代码,如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat"><!-- 自动检查关键字,为关键字增加反引号 --><property name="autoDelimitKeywords" value="true"/><property name="beginningDelimiter" value="`"/><property name="endingDelimiter" value="`"/><!--覆盖生成XML文件--><plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" /><!-- 生成的实体类添加toString()方法 --><plugin type="org.mybatis.generator.plugins.ToStringPlugin"/><!-- 不生成注释 --><commentGenerator><property name="suppressAllComments" value="true"/></commentGenerator><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost/wiki?serverTimezone=Asia/Shanghai"userId="root"password="你的密码"></jdbcConnection><!-- domain类的位置 --><javaModelGenerator targetProject="src/main/java"targetPackage="com.cexo.wiki.domain"/><!-- mapper xml的位置 --><sqlMapGenerator targetProject="src/main/resources"targetPackage="mapper"/><!-- mapper类的位置 --><javaClientGenerator targetProject="src/main/java"targetPackage="com.cexo.wiki.mapper"type="XMLMAPPER"/><table tableName="demo" domainObjectName="Demo"/></context>
</generatorConfiguration>
其中需要更改的地方主要是这几个地方:
这块根据自己的项目情况再来修改既可。
3、增加启动命令:
代码生成器的配置一切ok,接下来则需要执行生成命令,这里在run这块增加一个生成命令,如下:
4、测试生成效果:
接下来咱们来看一下自动生成mybais的相关代码的效果:
由于我们之前已经手动创建了相关mybatis的类了,所以这里再生成时会提示已经存在相关文件了:
其中有一个这个类貌似不知道有何意义?
这个在之后会用到的,到时再说,其中DemoMapper生成一大堆通用的数据表的操作:
package com.cexo.wiki.mapper;import com.cexo.wiki.domain.Demo;
import com.cexo.wiki.domain.DemoExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;public interface DemoMapper {long countByExample(DemoExample example);int deleteByExample(DemoExample example);int deleteByPrimaryKey(Long id);int insert(Demo record);int insertSelective(Demo record);List<Demo> selectByExample(DemoExample example);Demo selectByPrimaryKey(Long id);int updateByExampleSelective(@Param("record") Demo record, @Param("example") DemoExample example);int updateByExample(@Param("record") Demo record, @Param("example") DemoExample example);int updateByPrimaryKeySelective(Demo record);int updateByPrimaryKey(Demo record);
}
要是自己手写,得费死了劲了,所以能利用这个代码生成器可以大大的增加开发效率。
5、演示demo表列表查询:
接下来咱们用新生成的再来测一下,看是否好使,还是以list接口为例,目前报错了:
需要更改一下:
它表示查所有,其中这个方法的参数就是上面所生成的DemoExample,不传的话就是查所有,最终运行当然都正常啦,这里就不演示了。
6、优化Controller代码:
最后,对于Controller还有一个细节待优化,就是:
这样就可以在定义接口时将公共的路径给省掉了。
电子书列表查询接口开发:
电子书表结构设计:
接下来则来正式进行电子书的开发,先来进行表结构的设计,这里其实可以从最终效果图中可以大致感受到它的结构:
这里就直接给出sql了:
# 电子书表
drop table if exists `ebook`;
create table `ebook` (`id` bigint not null comment 'id',`name` varchar(50) comment '名称',`category1_id` bigint comment '分类1',`category2_id` bigint comment '分类2',`description` varchar(200) comment '描述',`cover` varchar(200) comment '封面',`doc_count` int not null default 0 comment '文档数',`view_count` int not null default 0 comment '阅读数',`vote_count` int not null default 0 comment '点赞数',primary key (`id`)
) engine=innodb default charset=utf8mb4 comment='电子书';insert into `ebook` (id, name, description) values (1, 'Spring Boot 入门教程', '零基础入门 Java 开发,企业级应用开发最佳首选框架');
insert into `ebook` (id, name, description) values (2, 'Vue 入门教程', '零基础入门 Vue 开发,企业级应用开发最佳首选框架');
insert into `ebook` (id, name, description) values (3, 'Python 入门教程', '零基础入门 Python 开发,企业级应用开发最佳首选框架');
insert into `ebook` (id, name, description) values (4, 'Mysql 入门教程', '零基础入门 Mysql 开发,企业级应用开发最佳首选框架');
insert into `ebook` (id, name, description) values (5, 'Oracle 入门教程', '零基础入门 Oracle 开发,企业级应用开发最佳首选框架');
这里将其拷到all.sql中:
执行一下:
此时可以看到成功执行了:
可以看到,用了这个内置的Database,在开发中真的挺方便,所有都只需要在IDE中来处理,不需要来回切到三方窗口中了。
使用代码生成器快速开发列表接口:
好,有了表之后,接下来就可以使用Mybatis的这个代码生成利器将持久层相关的类全部生成了,先做一下这个配置上的改动:
接下来则就可以执行代码生成了,如下:
测试:
1、新建Controller:
拉下来咱们就可以进行测试了,先新建一个Controller,这里直接基于TestController拷贝一下:
然后此时需要手动改一下这里面的代码是吧,其实都不用手动改,直接整体替换就可以了,怎么替换呢?如下:
这样整体替换之后,接下来再来替换一下:
再整体替换一下,另外这里的test的路径也改一下:
目前还缺一个EbookService对吧,下面就来新建一下。
2、新建Service:
其方法也是跟上面Controller一样,不需要自己手写,就是整体替换就成:
这样两步操作,其Service层就搞定了。
3、编写测试用例:
接下来则编写一个测试用例,如下:
4、总结:
通过mybatis的这个自动生成器,对于一个新表的常规持久化的功能是不是非常之快,基本上就是整体替换,一个简单的增删改查的持久化层逻辑就搞定了,相当happy。
封装通用返回值:
1、定义通用返回类:
目前我们电子书的查询列表的接口直接返回的是一个列表对象对吧:
很明显对于前端来说不太人性,应该返回值中有成功与失败的一些通用状态字段,所以接下来咱们有必要能返回值进行一个通用结构化的处理,如下:
package com.cexo.wiki.resp;public class CommonResp<T> {/*** 业务上的成功或失败*/private boolean success = true;/*** 返回信息*/private String message;/*** 返回泛型数据,自定义类型*/private T content;public boolean getSuccess() {return success;}public void setSuccess(boolean success) {this.success = success;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getContent() {return content;}public void setContent(T content) {this.content = content;}@Overridepublic String toString() {final StringBuffer sb = new StringBuffer("ResponseDto{");sb.append("success=").append(success);sb.append(", message='").append(message).append('\'');sb.append(", content=").append(content);sb.append('}');return sb.toString();}
}
这样的话,以一个登录接口为例,如果登录失败,返回的样子就是这样了:
而如果登录成功,返回格式就是:
当然不同公司,其通用的返回格式都不太一样,但是都会有一个统一的结构的。
2、使用通用返回类:
接下来则可以改造一下咱们的电子书列表接口了,如下:
3、测试:
接下来热部署测一下效果:
封装请求参数和返回参数:
根据名称模糊查询电子书:
接下来增加一个需求就是查询电子书可以根据书名进行模糊匹配,那如何做呢?先来给接口增加一个参数:
其中EbookService该如何改造呢?此时就需要使用到EbookEample这个类了:
因为它里面包含所有对表操作的封装方法,下面来看一下针对此场景如何使用它:
好,接下来测试一下效果:
封装请求参数:
接下来假如查询参数又需要根据description来进行模糊匹配呢?是不是咱们在list方法中又得增加一个参数?
那如果之后需求又变更,是不是这里面的参数就会越来越多?所以有必要对其请求参数进行一下封装,如下:
其里面的内容可以从Ebook中来拷,觉得有必要的就留下,比如这里用两个字段:
package com.cexo.wiki.req;public class EbookReq {private Long id;private String name;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "EbookQueryReq{" +"id=" + id +", name='" + name + '\'' +"} ";}
}
然后此时我们的查询参数就可以改用这个请求类了:
然后在service类中也需要改:
其结果也是一样的,Spring Boot会根据请求参数自动映射到EbookReq中对应的字段上的。
封装返回参数:
这里对于返回值也需要封装一下,先看一下目前我们对于电子书列表查询的返回值:
但是实际情况对于结果的返回,并非将所有的数据库信息都返回给前端,最典型的就是用户登录,登录成功之后,并不会将整个User返回前端,比如密码字段就不会给前端,所以咱们有必要对返回参数进行一个封装,如下:
目前它跟Ebook的字段是一模一样的,随着之后的业务迭待会有不同的,接下来咱们将它应用一下:
其中有个TODO,是因为这块有更好省事的解决方案,如下:
改完之后再测试一下,一切正常。
制作CopyUtil封装BeanUtils:
最后,这里做一个代码优化,就是刚才咱们写的这块代码:
这块是个通用功能可能之后会被大量用到,如果每次都写这么一大堆,还是比较繁琐的,所以有必要对它进行一个封装,这里直接把工具类贴出来:
package com.cexo.wiki.util;import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;import java.util.ArrayList;
import java.util.List;public class CopyUtil {/*** 单体复制*/public static <T> T copy(Object source, Class<T> clazz) {if (source == null) {return null;}T obj = null;try {obj = clazz.newInstance();} catch (Exception e) {e.printStackTrace();return null;}BeanUtils.copyProperties(source, obj);return obj;}/*** 列表复制*/public static <T> List<T> copyList(List source, Class<T> clazz) {List<T> target = new ArrayList<>();if (!CollectionUtils.isEmpty(source)){for (Object c: source) {T obj = copy(c, clazz);target.add(obj);}}return target;}
}
这块代码逻辑比较简单,就不过多解释了,接下来看一下如何有这个工具来优化咱们的代码,首先是单个对象的拷贝,原来我们是需要用两句代码对吧:
现在只需要一句搞定:
而接下来对于整个列表的拷贝,则可以又可以优化为:
总结:
这次学的东西还是非常之多的,收获也多,下一次则开启Vue3的界面搭建啦,加油~~
关注个人公众号,获得实时推送
相关文章:
Spring Boot + Vue3 前后端分离 实战 wiki 知识库系统<二>---后端架构完善与接口开发
数据库准备: 在上一次Spring Boot Vue3 前后端分离 实战 wiki 知识库系统<一>---Spring Boot项目搭建已经将SpringBoot相关的配置环境给搭建好了,接下来则需要为咱们的项目创建一个数据库。 1、mysql的安装: 关于mysql的安装这里就…...
如何在logback.xml中自定义动态属性
原文地址:http://blog.jboost.cn/trick-logback-prop.html 当使用logback来记录Web应用的日志时,我们通过在logback.xml中配置appender来指定日志输出格式及输出文件路径,这在一台主机或一个文件系统上部署单个实例没有问题,但是…...
嵌入式系统硬件设计与实践(第一步下载eda软件)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 现实生活中,我们经常发现有的人定了很多的目标,但是到最后一个都没有实现。这听上去有点奇怪,但确实是实实在在…...
Portraiture4免费磨皮插件支持PS/LR
Portraiture 4免去了繁琐的手工劳动,选择性的屏蔽和由像素的平滑,以帮助您实现卓越的肖像润色。智能平滑,并删除不完善之处,同时保持皮肤的纹理和其他重要肖像的细节,如头发,眉毛,睫毛等。 一键…...
Python学习笔记202302
1、numpy.empty 作用:根据给定的维度和数值类型返回一个新的数组,其元素不进行初始化。 用法:numpy.empty(shape, dtypefloat, order‘C’) 2、logging.debug 作用:Python 的日志记录工具,这个模块为应用与库实现了灵…...
2023年大数据面试开胃菜
1、kafka的message包括哪些信息一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成,header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成。当magic的值为1的时候,会在magic和crc32之间多一个字节…...
优雅的controller层设计
controller层设计 Controller 层逻辑 MVC架构下,我们的web工程结构会分为三层,自下而上是dao层,service层和controller层。controller层为控制层,主要处理外部请求。调用service层,一般情况下,contro…...
同步、通信、死锁
基础概念竞争资源引起两个问题死锁:因资源竞争陷入永远等待的状态饥饿:一个可运行程序由于其他进程总是优先于它,而被调用程序总是无限期地拖延而不能执行进程互斥:若干进程因相互争夺独占型资源而产生的竞争关系进程同步…...
【聚类】谱聚类解读、代码示例
【聚类】谱聚类详解、代码示例 文章目录【聚类】谱聚类详解、代码示例1. 介绍2. 方法解读2.1 先验知识2.1.1 无向权重图2.1.2 拉普拉斯矩阵2.2 构建图(第一步)2.2.1 ϵ\epsilonϵ 邻近法2.2.2 k 近邻法2.2.3 全连接法2.3 切图(第二步…...
最牛逼的垃圾回收期ZGC(1),简介
1丶什么是ZGC? ZGC是JDK 11中引入的一种可扩展的、低延迟的垃圾收集器。ZGC最主要的特点是:在非常短的时间内(一般不到10ms),就可以完成一次垃圾回收,而且这个时间是与堆的大小无关的。另外,ZGC支持非常大…...
微服务的Feign到底是什么
Feign是什么 分区是一种数据库优化技术,它可以将大表按照一定的规则分成多个小表,从而提高查询和维护的效率。在分区的过程中,数据库会将数据按照分区规则分配到不同的分区中,并且可以在分区中使用索引和其他优化技术来提高查询效…...
JavaScript 正则表达式
正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。搜索模式可用于文本搜索和文本替换。什么是正则表达式?正则表达式是由一…...
【批处理脚本】-1.15-文件内字符串查找命令find
"><--点击返回「批处理BAT从入门到精通」总目录--> 共7页精讲(列举了所有find的用法,图文并茂,通俗易懂) 在从事“嵌入式软件开发”和“Autosar工具开发软件”过程中,经常会在其集成开发环境IDE(CodeWarrior,S32K DS,Davinci,EB Tresos,ETAS…)中,…...
【手撕面试题】JavaScript(高频知识点二)
目录 面试官:请你谈谈JS的this指向问题 面试官:说一说call apply bind的作用和区别? 面试官:请你谈谈对事件委托的理解 面试官:说一说promise是什么与使用方法? 面试官:说一说跨域是什么&a…...
Web学习1_HTML
在学校期间学的Web知识忘了一些,很多东西摸棱两可,现重新系统的学习一下。 首先下载安装完vsc后并下载拓展文件live server(模拟一个服务器) Auto Rename Tag(在写网页时,自动对齐前后标签)在设…...
华为OD机试真题Java实现【靠谱的车】真题+解题思路+代码(20222023)
靠谱的车 题目 程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。 出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。 比如: 23再多一块钱就变为25; 39再多一块钱变…...
【C++入门(下篇)】C++引用,内联函数,auto关键字的学习
前言: 在上一期我们进行了C的初步认识,了解了一下基本的概念还学习了包括:命名空间,输入输出以及缺省参数等相关的知识。今天我们将进一步对C入门知识进行学习,主要还需要大家掌握我们接下来要学习的——引用…...
基于合作型Stackerlberg博弈的考虑差别定价和风险管理的微网运行策略研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
2023年全国最新保安员精选真题及答案8
百分百题库提供保安员考试试题、保安职业资格考试预测题、保安员考试真题、保安职业资格证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 81.以下各组情形都属于区域巡逻中异常情况的是()。 A&#x…...
JavaScript高级程序设计读书分享之6章——MapSet
JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 Map 作为 ECMAScript 6 的新增特性,Map 是一种新的集合类型,为这门语言带来了真正的键/值存储机制。Map 的大多数特性都可以通过 Object 类型实现,但二者之间还是存在…...
改进的 A*算法的路径规划(路径规划+代码+毕业设计)
引言 近年来,随着智能时代的到来,路径规划技术飞快发展,已经形成了一套较为成熟的理论体系。其经典规划算法包括 Dijkstra 算法、A算法、D算法、Field D算法等,然而传统的路径规划算法在复杂的场景的表现并不如人意,例…...
Tina_Linux存储性能参考指南
OpenRemoved_Tina_Linux_存储性能_参考指南 1 概述 1.1 编写目的 介绍TinaLinux 存储性能的测试方法和历史数据,提供参考。 1.2 适用范围 Tina V3.0 及其后续版本。 1.3 相关人员 适用于TinaLinux 平台的客户及相关技术人员。 2 经验性能值 Flash 性能与实…...
NCRE计算机等级考试Python真题(四)
第四套试题1、以下选项中,不属于需求分析阶段的任务是:A.需求规格说明书评审B.确定软件系统的性能需求C.确定软件系统的功能需求D.制定软件集成测试计划正确答案: D2、关于数据流图(DFD)的描述,以下选项中正…...
LeetCode每周刷题总结2.20-2.26
本栏目记录本人每周写的力扣题的相关学习总结。 虽然开新的栏目都没有完成 70.爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 解题思路: 斐波那契数列递归 class Solution {…...
u盘里删除的文件可以恢复吗?分享解决方法
u盘里删除的文件可以恢复吗?不知道使用过U盘的你,是否遇到过这样的问题呢?其实正常情况下,在电脑中操作u盘,并删除相关的文件,删除的文件是不会经过电脑回收站的。想要找回就需要借助相关的恢复工具才能实现。下面小编给大家分享…...
十、vben框架如何使用table来写报表
在项目开发的过程中,有很多特殊的table样式,有的时候后端会用帆软来写报表,但是有的特殊的报表后端就不能支持实现了,那么前端是如何实现的呢,今天我们就来讲讲。 先上效果图: 本次使用的tsx组件来写的报表…...
jQuery:入门
jQuery 入门 Date: January 19, 2023 目标: 能够说出什么是 jQuery 能够说出 jQuery 的优点 能够简单使用 jQuery 能够说出 DOM 对象和 jQuery 对象的区别 jQuery 概述 JavaScript 库 仓库: 可以把很多东西放到这个仓库里面。找东西只需要到仓库里…...
实例3:树莓派呼吸灯
实例3:树莓派呼吸灯 实验目的 通过背景知识学习,了解digital与analog的区别。通过GPIO对外部LED灯进行呼吸控制,熟悉PWM技术。 实验要求 通过python编程,用GPIO控制LED灯,使之亮度逐渐增大,随后减小&am…...
android适配ipv6,请求慢?
先贴一篇我们经常能搜索到的解决方案: Android 在 4G 下访问 IPV6 慢的解决方案 文章很有参考意义,但也并不是所有请求慢的的原因! 本文是另一种原因,有兴趣就继续往下看一看. 使用的okhttp框架,模式支持ipv6和ipv4协议,但两种协议同时存在时…...
【LeetCode】剑指 Offer(10)
目录 题目:剑指 Offer 27. 二叉树的镜像 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 28. 对称的二叉树 - 力扣࿰…...
做家政网站公司名称/seo优化软件哪个好
Idea 的 task server 配置为 Gitlab 个人站点 http://ronnie.wang 找到配置窗口,Preferences -> Tools -> Tasks -> Servers 点击加号,添加 Gitlab 点击增加之后的条目,可以看到下面的配置项 在 Server URL 填 Gitlab 服务器的…...
建设网站一定要会代码吗/关键词是网站seo的核心工作
客服微信:meijing8001您只管发布,我们来为您宣传你好香河、香河新鲜事、香河招聘网指尖香河、香河限号、香河生活通等无论您在哪里发布,这些平台都将同步显示从此找工作,招人才就是这么简单!2020年10月31日统计全新打造…...
建设中小企业网站/精准推广引流5000客源
2019独角兽企业重金招聘Python工程师标准>>> 开源IDE,LightTable,比较小巧,居然有种完爆我大Sublime的赶脚,可惜全是英文的,特此记录一些用法。 其实就是它自带的帮助文档,不过全是英文,全当练翻…...
2022年时事新闻摘抄/seo可以从哪些方面优化
所谓程序锁就是当用户启动某个程序的时候需要用户校验,如果校验成功,则进入应用程序. 也可以用于功能锁,也就是当用户使用程序的某个时,进行进行校验如果校验成功则进入该功能. 效果如下图所示: 该项目是google的开源项目. 下载地址:http://download.csdn.net/detail/johnny…...
go语言做的网站/北京出大大事了
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html .focus() 命令 聚焦 DOM 元素 语法格式 .focus() .focus(options) 正确写法 cy.get(input).first().focus() 重点 必须是 DOM 元素才能调用 .focus() 方法&am…...
wordpress新手/百度竞价推广是什么工作
当下电子阅读逐渐流行,但多限于纯文字类网文小说阅读。市面上主流的电子书阅读器多为8英寸以下的小屏产品,很多都不能很好地解决大版面的PDF文件阅读舒适度的问题,更没法满足读者批注写笔记的需求。一直走大屏路线的BOOX电纸书,在…...