-->

威海天之卫网络空间安全科技有限公司    实习总结

2019-08-25 20:15发布

威海天之卫网络空间安全科技有限公司    实习总结

2019年7月13日 周六第一天上班(因为这周有一天停电,调到周六),期间周末双休。

2019年8月23日结束实习。

时间:2019年7月15日11:20:42

1、分层: 从上到下:api(对外提供接口)-biz(业务逻辑层)-domain(领域层)-dal(数据持久层)(dao和mapper)

2、数据流向:

数据库—PO对象—DO(对内的DO)—DO(对外的DO)—目标数据格式。

外部请求参数——内部请求innerRequest——PO——数据库。

注:PO(persistant object) 持久对象  数据库与PO对象一一对应。

       DO(Domain Object)领域对象

3、实现类中少写注释,写在接口中。注释的写法都是javadoc格式。

方法名、变量名 命名规范,使用驼峰命名法。命名体现方法、变量的含义。

 eg:VpnsLinkInfo ,List<VpnsLinkInfo> vpnsLinkInfos

4、git使用:

git clone ‘url’ :克隆一个项目到本地,“url” 是项目链接

git pull :拉取新的代码

git checkout -b "branch name"  :切出一个新的分支。

git add . :提交代码:若有新增文件 ,则先add .。

 git commit -a -m  “提交内容解释”:提交代码。“提交内容解释”是对本次修改的注释。

git push :将本地代码push到远端,也就是从本地push到网络中。

merge request :合并请求。

5、postman 接口测试软件

6、mybatis +mapper 操作数据库

7、redis  缓存

8、radius 

9、rabbitmq 消息队列

时间:2019年7月16日10:09:04

1、各层功能:

api层 功能少,参数校验、数据转换等。

biz层 负责主要的业务逻辑,各种判别,验证数据

domain层 用户与数据库交互的核心中转站,控制用户数据收集,控制请求转向

dal层 读写数据库 分为mapper和dao

mapper 直接读写数据库,dao继承自mapper。

2、IDEA使用小结:

格式化代码 ctrl+alt+L

全部修改变量名:shift+F6

时间:2019年7月17日10:25:39

1、获取实时在线人数,dao层需要两个参数,prefix和key,不用从上层传入,应该直接在dao层 写好。返回的是在线用户集合就Ok。

2、注解如何使用。

时间:2019年7月18日07:56:54

时间:2019年7月19日07:57:17

1、int 和Integer

Integer可以接收null,int不能接收null,所以如果存在可能是空值得参数,一般用Integer接收。

2019年7月22日09:28:16:

1、推送用户消息至RabbitMQ消息队列,从消息队列读取至influx数据库。

2019年7月23日08:13:20

1、工具类要写的通用一些。

2、mvn clean delopy:maven 指令的用法

3、跳板机的概念和使用。

4、实时推送用户注册消息。

      控制中心:新建一个监听器,监听到用户注册,将消息写入RabbitMQ

      大屏展示后端:接受用户注册消息,将消息写入Influxdb

2019年7月24日07:56:38:

1、实时推送用户上线消息

    控制中心:监听到用户上线,将消息写入RabbitMQ

    大屏展示后端:接收用户上线消息,将消息写入Influxdb

2019年7月29日15:36:48

2019年7月30日07:57:04

1、画序列图 :同步还是异步的画法不同。

2019年7月31日08:03:19

1、@value 读取properties 配置文件(归类位注解的用法)

2、配置文件和配置类有区别

3、

Integer.parseInt(StringUtils.remove(softVersion, '.')); 

此处代码使用了String的remove工具。

4、枚举的用法。

比如当用户类型有固定的两种,在程序中还经常使用,这时候应该定义一个UserType枚举类;

2019年8月1日09:26:53

1、Oss对象存储

2019年8月2日14:37:34:

1、Mapper层直接操作数据库,

2、DAO层 可加缓存

3、Swagger 用于接口测试

4、@postmapping 一般的写操作,包含敏感信息参数

@getmapping 一般的读操作

时间:2019年8月5日08:18:54

1、@ResponseBody 返回对象时候使用。

2、前端逻辑和后端逻辑要区分开来。

      后端只需要提供数据接口即可。

2019年8月6日13:44:59

1、@Param注解(归类为注解用法)

2019年8月7日14:04:17

1、Pojo类内 都用Integer类型参数

2、PO对象列表批量转换为DO对象列表的方法。

3、要学的内容:

Junit: 单元测试

Foeach: 批量查询、插入

Lambda表达式

时间:2019年8月13日16:03:29

1、

不再用get方法,直接用gatewayTypePO.id. (属于mybatis内容。)

时间:2019年8月14日08:09:39

1、innerRequest 应该处于domain层。

2、分页查询 

3、用到Lambda表达式的地方。

//1.获取国家名称列表
List<CountryDO> countryDOS = softDomainService.getCountries(countryCodes);
if (CollectionUtils.isEmpty(countryDOS)) {
    log.warn("不存在此国家列表,countryCodes:{}", countryCodes);
    return new HashMap<>();
}

//2.获取vpns
Map<Integer, List<String>> vpnIps = new HashMap<>();
List<String> countries = countryDOS.stream().map(CountryDO::getCountryName).collect(Collectors.toList());
List<VpnsResourceDO> vpnsResourceDOS = vpnServerDomainService.getVpnsResources(countries);
if (CollectionUtils.isEmpty(vpnsResourceDOS)) {
    log.warn("不存在与此国家列表对应的vpns资源,countries:{}", countries);
    return new HashMap<>();
}

//3.获取vpsIp列表
for (CountryDO countryDO : countryDOS) {
    List<String> vpnsIp = vpnsResourceDOS
            .stream()
            .filter(vpnsResourceDO -> (Objects.equals(vpnsResourceDO.getCountry(), countryDO.getCountryName())))
            .map(VpnsResourceDO::getVpnsIp)
            .collect(Collectors.toList());
    vpnIps.put(countryDO.getCode(), vpnsIp);
}
return vpnIps;

2019年8月20日14:28:01

1、类命名时候,注意是否显示业务含义。

例如;Request类,要体现业务含义。

2、去除字符串中的 “.”,强转为int。

Integer.parseInt(StringUtils.remove(softVersion, '.'))

3、Map的用法之一

4、swagger注解使用:

虽然接受参数是国家代码列表contryCodeList,但是dataType = "int", allowMultiple = true 。 因为allowMultiple=true,所以dataType=int

@ApiImplicitParams({
        @ApiImplicitParam(name = "countryCodes", value = "国家代码列表", required = true, dataType = "int", allowMultiple = true, paramType = "query"),
})
@GetMapping("/listvpnsips")
public @ResponseBody
PlainResult<Map<Integer, List<String>>> listVpnsIps(@RequestParam("countryCodes") List<Integer> countryCodes) {

 

标签: