上课,上实验,写文档,终于有时间写博客了。前端
我以为这学期的Android
实验上的仍是颇有意义的,课上,与个人舍友张一帆(自学Android
及相关框架,有过Android
比赛项目经验)一块儿讨论了Android
的架构分层设计,以及对Retrofit
和RxAndroid
框架的封装。java
通过在实验中的学习,以及请教了一些在Android
界算是有小有经验的人以后,发现本身年初对Android
实验设计的有些问题:mysql
年初计划使用Data-Binding
与Fragmentation
实现单Activity
架构,后来发现这样并很差。nginx
Data-Binding
学习成本过高,且对原项目结构破坏性较大,对新人学习并理解Android
无益。Activity
架构虽然很优秀,但实际项目中仍然是多Activity
+多Fragment
架构,去追求单Activity
意义不大,手动管理Fragment
会十分麻烦。发现错误,就改吧。目前已经在实验中引入并应用了ButterKnife
、Litepal
、Retrofit
、RxAndroid
等框架,感受技术上应该不会有太大变化。之后再一块儿和你们分享一下我在Android
方面的学习收获。面试
同时,华软虚拟化管理系统1.0
版本正式完成,本周花费整三天完成了项目发布及部署文档的撰写(感谢潘佳琦,为了尽快交付,MySQL
的安装与配置文档是他帮我写的,写得很是好)。算法
如今再回想华软项目,仍是存在不少细节当时没有考虑到,在此进行反思与总结。sql
后台设计得没什么问题:当发生错误时,后台会抛出异常,全局异常处理处理掉该异常,并将错误信息返回给前台。typescript
笨拙在前台的拦截器这里:api
起初设计的是拦截器处理掉全部异常,并给予用户友好的提示,这样订阅时就不用处理error
了。浏览器
当须要的时候,再去写error
方法,好比登陆时要在error
里提示用户名或密码错误的提示信息。
拦截器处理异常,为了拦截器能准确地提示错误信息,因此扩展了HTTP
状态码,对512
等状态码扩展了新的含义。
switch (error.status) { case 401: if (this.router.url !== '/passport/login') { this.msg.error('用户认证发生错误'); // noinspection JSIgnoredPromiseFromCall this.router.navigateByUrl('/passport/login'); } break; case 403: this.msg.error('访问被拒绝, ' + error.error); break; case 404: this.msg.error('资源不存在, ' + error.error); break; case 502: this.msg.error('服务器网关错误,请联系系统管理员'); break; case 504: this.msg.error('服务器网关请求超时,请联系系统管理员'); break; case 512: this.msg.error('数据同步异常,' + error.error); break; case 513: this.msg.error('主机操做异常,' + error.error); break; case 514: this.msg.error('访问被拒绝异常,' + error.error); break; }
当时写完这个拦截器的时候内心仍是挺爽的,心想,之后可不再用管理error
了,多省事。如今再看看这个拦截器,说不上来什么缘由,就是感受怪怪的。
由于拦截器中是一个通用的提示信息,因此就出现了有时候须要在拦截器里加提示,有时候须要在error
里提示,不想拦截器提示信息。
后来反思了一下,自定义状态码应该是合理的,也就是后台返回512
、513
之类的,前台能直接经过状态码准确地判断当先后台到底哪错了。
可是这个拦截器这样写,就变成了,后台一个状态码对应一个提示信息,至关于我这个拦截器和后台抛出的异常绑定了,因此有时候虽然也是那个错,可是在这个界面提示出来就显得格格不入。
奇怪就奇怪在前台误解了自定义状态码的本质,自定义的状态码其实不是我后台有什么,前台就要拦截什么,新加一个状态码,就是为了前台能够更准确地提示信息,而不是一个500
的服务器错误
。
改正:之后拦截器只处理通用的状态码,如:401
跳转到登陆,403
提示访问被拒绝。而一些涉及到具体业务的状态码,仍是应该放到onError
方法中处理。
Loading
这是上次开会的时候晨澍提出来的,友好起见,当网络请求的时候应该显示Loading
的动画。
想起来NG-ALAIN
实际上是为咱们封装好了的,只是没有启用。
其实本身实现原理也简单,就是装饰器模式:
对原生的HttpClient
进行装饰一下,组合一个带Loading
的YunzhiHttpClient
。
之后Service
请求就使用YunzhiHttpClient
,发起时,将Loading
置为true
,数据回来的时候,将Loading
置为false
。
组件中若是想用怎么办呢?直接注YunzhiHttpClient
,由于在同一个模块中是单例的,因此直接使用注入的YunzhiHttpClient
的Loading
来控制加载动画是否显示。
改正:使用此方式添加Loading
动画。
@Entity public class HostGroup { ... // 和电脑多对多 @ManyToMany @JsonView({NoneJsonView.class, HostGroupJsonView.getAllGroups.class, HostGroupJsonView.getGroupById.class, UserJsonView.getCurrentLoginUser.class }) private List<Host> hostList = new ArrayList<>(); ... }
HostGroup
中有字段是hostList
,存储计算机列表。
具体的场景忘了,好像是潘佳琦在写功能的时候,我给提了点思路,忽然一想,若是这个计算机存的是个Set
,那就不用这样费事了。
假设咱们这样改:
private Set<Host> hostSet = new HashSet<>();
后台是简单了,前台表示很无辜。
List
和Set
,都是Json
里的[]
,前台绑定的都是Array
,我无论你后台怎么存,可是请你改数据结构的时候不要牵连前台。
既然List
和Set
在前台看起来同样,那为何不改为hosts
呢?后台数据结构随便改,对前台无影响。
改正:之后再有新实体,字段名与数据结构分离。
HTTPS
使用BASIC
认证方式进行登陆,前台将用户名和密码进行Base64
加密传给后台。
HTTP
请求,在网络传输过程当中黑客能够直接拦截数据,并查看header
,Base64
解密很容易。
既然大势所趋,那之后要求安全的项目仍是使用HTTPS
吧。
简单学习了一下,SpringBoot
配置SSL
须要证书,证书能够买也能够本身生成。既然能本身生成,为何还要买呢?HTTPS
证书好像还挺贵呢?
无心间点开天猫的cookie
,发现里面只认识XSRF-TOKEN
,其余的都不知道。仔细想了一下,应该是天猫对安全的要求很高,不光是HTTPS
保证数据传输的安全,更重要的是要保证发起请求的必定是客户本人,可能有好多算法的验证,保证用户不受损失。
想一想我写的,用户的token
若是被窃取了,谁访问都行。
看来在数据安全的道路上,咱们还有不少路要走。
写华软部署文档的时候发现,写一个软件如何安装的教程真的是太困难了,而且如何再有项目,再写文档,还须要再写一遍。
能够直接建一个软件安装的文档仓库,再写部署文档,直接说我须要mysql
,须要nginx
。
直接在adoc
中使用文件包含,将网上的这个adoc
文件包含到个人文档中,就好像是本身写的同样,实际上是外部引进来的。
Angular
架构你们看图,这是个人前台设计思路。
多模块主要是在NG-ALAIN
那里学习的,此架构设计适用于权限分配系统,由于采用loadChildren
动态加载模块,也就是说,只有当用户访问/student
这个路由时,才会加载学生管理Module
,而不是无论有没有这个模块的权限,直接都交给浏览器去加载。
Core Module
,被学生管理等实际的业务Module
引用,该模块引入外部第三方组件。
包含基础实体,即与后台对应的实体,拓展实体,实际项目中发现不只须要基础实体,还须要根据组件要的数据结构本身构建实体并传过去。
基础组件、基础过滤器、Service
,都放在这里,这样在业务组件里想用就用,很方便。
设计出来了,感受付诸实践时应该仍是有所困难,毕竟目前用的是NG-ALAIN
现成的,之后须要本身搭。
Angular
最后为Angular
点个赞,通过一个项目的洗礼,发现技术选型是正确的,选择Angular
是多么的明智。
咱们追随的一直是国外的脚步,VAR
三者,确定不用Vue
,毕竟TypeScript
都不支持。
因此国外的主流技术一直是Angular
和React
,二者都支持TypeScript
,只是在设计思想上有所不一样。
Google
和Facebook
都是互联网巨头,咱们中国的互联网企业与之相比根据不算什么。(去年Facebook
的股票跌了6
个京东)
Angular
是框架,完善,直接把Angular
一安装,什么网络请求,什么路由都有了,直接拿来用。
React
是库,小巧灵活,须要整合其余库才能开发应用,在Facebook
改协议以前,React
当之无愧的前端第一框架。
Facebook
改了开源协议,就被Apache
基金会封杀,同时国内全面弃用React
,因此国内涌现了无数类React
框架。
即在不修改原React
项目的前提下,只修改依赖的框架,框架对外提供的api
相同,便可实现无缝切换。
最优秀的类React
框架要数京东的Nerv
,性能很是好。京东主页采用该框架构建。
以前看到过通过前端的性能优化博客,采用本身设计的链表优化性能,如今也算是明白了面试官的真意。能当上面试官的,确定都是通读开源项目源码或本身写框架级别的人物,人太多,基础的框架使用是我的学习学习官方文档都会,怎么筛选呢?而后面试官写框架的技术功底就用上了。
因此,你进不去阿里,不是你不够优秀,是你不适合写框架。
总有一天,咱们也要写一款属于本身的框架。