本周的工作内容在继续学习上周的项目上第一次参与实际的项目开发。虽然只是一个小任务,但是体会了职场上互相的沟通交流以及开发过程中的团队协作与配合。
首先团队开发项目自然就离不开一个工具:Git。Git是分布式版本控制系统,这里就引申出分布式和集中式控制系统之间的区别。第集中式版本控制系统,版本库是集中存放在中央服务器的,最大的缺点就是必须联网才能工作;分布式版本控制系统没有中央服务器,每个人的电脑上都是一个完整的版本库,这样工作的时候,就不需要联网了。但是在实际使用分布式版本控制系统的时候,通常也有一台充当中央服务器的电脑,用来方便交换大家的修改。
Git有两个重要的概念,第一个是管理修改(任何的一条三个区域的切换操作可以看成修改)。Git有三个区域,分别是工作区(电脑目录),暂存区和版本库(.git)。当每次修改了文件,需要将修改的文件添加到暂存区,然后一次性的提交暂存区的所有修改到版本库中。因此git记录的每次修改是来自于暂存区的修改,但也只记录这种修改。
第二个是分支管理。每个人有一个属于自己的分支,别人看不到,还继续在原来的分支上正常工作,而自己在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。合并分支的方式有两个,一个是快速合并(Fast-forward),是将主分支直接指向合并分支,合成速度快;另一种是普通合并,两个分支合并后会形成一个新的提交。在平时开发中最好选择普通合并,这样可以看出曾经做过分支。
在idea里也集成了git,方便使用不需要手动输入命令。在设置里选择version control,VCS(版本控制系统)选择git即可,然后就可以在菜单栏上或者右下角操作git了。
Git常用命令如下。虽然有idea或者使用sourceTree软件可以代替输入命令,但是它们也是通过git命令来实现的git操作。
git init 创建本地仓库 git add 添加文件提交到仓库
git commit -m "xxx" 提交文件到仓库,xxx为本次提交说明
git status 掌握仓库当前的状态 git diff 查看改动
git log 显示从最近到最远的提交日志 git reset --hard 版本号 回滚到指定版本
git checkout -- 文件名加后缀 把文件在工作区的修改全部撤销
git reset HEAD 文件名加后缀 把暂存区的修改撤销掉(unstage),重新放回工作区
git switch -c 分支名 新建并切换分支 git branch 查看当前分支
git switch 分支名 切换分支 git merge 分支名 合并分支
git merge --no-ff -m "xxx" 分支名 禁用fast-forward合并方式
git branch -d 分支名 删除分支
第二个学习的内容是Swagger。Swagger是一个规范且完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。其作用在于直接通过代码生成接口文档,以及提供 Web 页面在线测试接口。在线测试链接路径:/swagger-ui/index.html。
首先导入swagger3.0的包:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
然后可以自定义一个swagger配置类,
@Bean
public Docket docket() {
return new Docket(DocumentationType.OAS_30).pathMapping("/")
// 定义是否开启swagger,false为关闭,可以通过变量控制
.enable(swaggerProperties.getEnable())
// 将api的元信息设置为包含在json ResourceListing响应中。
.apiInfo(apiInfo())
//分组
.groupName("xxx")
// 选择哪些接口作为swagger的doc发布
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
这里需要返回一个Docket,swagger3.0里面的参数为DocumentationType.OAS_30。
select()来设置扫描,扫描接口配置的方法有如下几种方式:
- RequestHandlerSelectors扫描接口的方式
- basePackage指定扫描包
- any()扫描全部
- none()不扫描
enable决定是否开启swagger,这个功能在区别是否是发布版本还是测试版本中比较关键,测试的时候用swagger,发布的时候不用swagger。可以用environment.acceptsProfiles来判断是否处在环境中,然后在配置中添加Profiles profiles = Profiles.of("dev"), dev是自己设的值,在yaml配置文件中设置spring.profiles.active=dev即可。groupname是分组,可以写多个docket类,返回多个docket,区分就靠groupname。
而apiInfo则可以配置swagger的基本信息,可以新建一个apiInfo方法,返回ApiInfo类,里面几个重要的参数为:title, description,version和contact类,对应标题,描述,版本以及作者信息。
写好了配置类之后,接下来就可以使用注解在文档中设置注释,常用的注解如下:
@Api:用在controller类,描述API接口
@ApiOperation:用在 Controller 里的方法上,描述接口方法
@ApiModel:用在类上,表示对类进行说明
@ApiModelProperty:用于字段,描述对象属性
@ApiImplicitParams:描述接口参数,后面可以接value和required属性
- value:参数说明
- required:是否必填
在这周的开发任务中,有一项任务是需要后端主动向前端推送数据信息。完成这个需求需要用到webSocket模块。WebSocket是基于TCP协议的一种网络协议,它实现了浏览器与服务器全双工通信,支持客户端和服务端之间相互发送信息。该模块与springboot整合操作基本成熟,实现方法如下。
导入pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
添加配置类以开启webSocket模块
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
接下来编写服务端,这里需要一个注解@ServerEndpoint(路径),用以服务端与客户端之间的连接,前端代码也需要编写这个路径用于匹配服务端。服务端还需要几个注解,分别对应一下几种事件(代码实现略过):
@onopen 创建连接时触发
@onclose 连接断开时触发
@onmessage 接收到信息时触发
@onerror 通讯异常时触发
主动推送消息至前端的代码如下,模块整合基本实现完毕:
//实现服务器主动推送
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
项目要求需要每小时循环主动推送功能,需要使用@Scheduled注解。里面有几个参数(单位毫秒):
fixedRate:上一次开始执行时间点后x秒再次执行
fixedDelay:上一次执行完毕时间点x秒再次执行
initialDelay:开始时延迟x秒执行
还有一个cron表达式,各时间元素使用空格进行分割,表达式有至少6个或者7个,分别代表如下含义:
- 秒(0~59)
- 分钟(0~59)
- 小时(0~23)
- 天(月)(0~31,但是你需要考虑你月的天数)
- 月(0~11)
- 天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
- 7.年份(1970-2099)
可以使用通配符,
“*”字符代表所有可能的值
“/”字符用来指定数值的
“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值增量
则每小时循环的cron表达式为@Sceduled(cron="0 0 */1 * * ?"),前面的0和0代表0分0秒,*/1代表任意小时增量1小时,也就是每小时循环,后面的代表任意天和月。
最后,在要循环发布的方法里加入如下代码调用webSocket实现循环主动推送功能:
CopyOnWriteArraySet<WebSocket> webSocketSet = WebSocket.getWebSocketSet();
webSocketSet.forEach(c->{
try {
c.sendMessage(“xxx");
} catch (IOException e) {
e.printStackTrace();
}
});
总结一下,这一周初步试炼了一下参与实际项目,体会了团队间的配合,学习了团队配合工具git与接口文档测试工具swagger。接口文档也是团队协作中重要的一环,它让前后端工程师有一个统一的文件进行沟通交流开发,以及记录项目维护中或者项目人员更迭,方便后期人员查看、维护。在接下来的时间里继续磨练。