2016年底,我们经理由于自身优秀的品质,在一次和客户项目合作中,被客户所欣赏,客户愿意为他在深圳开一间分公司.客户那边主要是硬件研发以及工厂生产,所以他们想在深圳开一间软件公司,最终达到软硬件结合来为他们的客户提供完整的解决方案.
恰好经理所在的公司A(地址在东莞)由于老板想转行不想做软件行业而宣布解散. A公司也是我和我老婆(那时是女友现在结婚了)毕业后的第一个公司. 去A公司实习也是由于经理来我们学校招实习生, 他们不需要笔试面试 就可以直接录用,实习三个月后再考核决定是否转正. 为了我和我老婆能在一个公司, 我们就一起去了A公司.
从14年10月实习(15年毕业)到16年4月一直在A公司, 我负责后台接口的开发,而我老婆则负责原型设计,因为某些原因我和我老婆跳槽来到了深圳.我们还是在一个公司B(顺便说一句我和我老婆是高中同一个班,高中追的她,高考分数比她高一分,大学同一个班,毕业之后也一直在同一个公司.) ,但是不在同一个部门.
时间到了16年底, 也就是经理已经答应客户愿意负责深圳这边开的公司,经理就找到了我们夫妻两,希望我们能加入他们,因为那是他们什么都没有什么也都没准备内心里还是觉得有点不靠谱. 不过说来也奇怪,在经理找我们的前几天,我突然意识到在一个大公司里一个小程序员是很难发展起来的,因为在B公司我主要是维护一个有十几年历史的大系统,有什么需求就修修改改,如果一直这样下去待遇和能力并不会有质的提升而且老系统的话就不会有很多新技术的研究.
我还清晰的记得我和B公司的同事说:"像我们这样是混不起来的,只有在一个小公司当一个核心人员,然后和公司一起发展,公司发展起来,我们才能发展的起来." 这个同事现在也被我叫到这个新开的公司C了.所以经理一说这个我心里就有共鸣了,加上待遇比现在的也高些,我们就一起辞职来到新公司.
由于老板直接在深圳买了一间毛坯的办公室,因为装修需要时间,我们暂时也办不了工,所以我们那时享受了三个月的带薪休假,爽的不行. 不得不说老板的眼光真好,这间办公室升值了不少而且办公室不远就是商业公寓, 3分半就可以从家到公司, 最爽的是吃完午饭还可以回家趟在床上睡午觉, 想想就开心. 以前都是趴在桌子上每次睡完觉手脚都是麻的.
17年3月1日正式办公,公司就只有5个人,我主要负责项目的架构以及技术,我老婆负责项目的原型设计,还有两个也是在A公司解散时经理带的两个同事.也是和我一起在14年同一批入职A公司. 大家都非常熟悉关系也蛮好 不过这两位因为不同的原因现在已经离职了. 不过有一位同事我要说一下, 他离职的原因是因为他老婆生了孩子,在东莞请的月嫂工资比他高多了, 所以家里人叫他回去继承家产并照顾一下老婆孩子. 他老爸在东莞开了厂是个大老板,他自己开的是四五十万的路虎, 算是一个富二代吧 ,但是平时也很节约,做事也很认真为人也很好相处也很朴实 . 不得不说一下我们的老板也是一个90后,真正的富二代,为人大方开朗,做事一丝不苟每天各地到处飞,比我们这些程序员辛苦多了,饭桌上还给我们斟茶倒水平易近人.
回到正题, 我负责项目架构以及技术,那么我现在就要考虑我们的系统该怎么做,该用什么技术做.
在A公司的时候,项目主要是由eclipse, java,maven,spring mvc,mybatis前端使用easyui .前后端数据交互使用json.接口类似于这样
这有几个问题
1 数据解析复杂
2 重复代码太多
3 容易出错
所以并不想沿用以前的方式, 由于核心是spring, 所以在spring 官网浏览的时候突然发现了spring boot这个东西 就点进去看看并搭建一个环境试一下. 虽然无xml配置很强大但是印象最深的还是热部署,修改代码不需要重启.记得以前都是改完代码,然后重启tomcat再测试,这样的话节省了很多时间.立马就被spring boot吸引了,然后就是网上找书籍学习.
从 <
所以现在的核心是学习jhipster
1 搭建jhipster框架
2 学习前端源码
3 学习后端源码
4 理解jhipster前后端交互过程
虽然我前几年专注于后端,心里十分抵触学习前端但是为了完全理解jhipster还是硬着头皮去学习. 学nodejs, npm,angular,webpack,typescript哪里不懂就去百度(现在基本是google) 这也为我后来自己写自动代码生成工具打基础.
而后端就主要学习到了交互过程的面向对象思想. 数据交互还是json但是到达接口的时候,已经被spring准确来说是jackson转换成对象了,返回的数据也是对象,spring会自动转换成json传递给前端, 而不像我们以前输入和输出参数都是String, 前端需要拼json后端也需要拼json.
到这里我才真正理解并应用面向对象思想,这是非常重要的.
我们系统接口设计是以表为核心,以用户表user为例, 那么至少会有4个接口:
1 getList(search : userSearch):List
获取用户列表,传递的是搜索条件对象,一般是用户表的字段.
2 getInfo(id:String):User
获取用户信息,根据id返回用户详细信息.注意getList一般只会获取某些信息.
3 save(user:User):Int
保存用户信息如果user中的id不为空则为更新,id为空则为新增.
4 delete(id:String):Int
删除用户.
如果要以面向对象的思想写这样的接口,那么至少 5个类.
1 UserResource springboot中暴露restful接口.
2 UserService 接口的详细逻辑.
3 UserMapper user表的数据库操作(如果有复杂的sql还需要UserMapper.xml).
4 User 实体类.
5 UserSeacrh 搜索类.
6 UserDto dto的意思是数据传输对象. 意思是如果接口不需要user实体的那么多字段可以新建一个对象只有部分user字段(已废弃).
那么既然每一张表都需要这些方法为什么不把它抽象出来,于是就有了
1 BaseModel 每一张表的实体类继承它.
2 BaseSearch 每一张表的查询类都继承它.
3 Result 每一个接口的返回对象都是它.
4 BaseMapper 每一个表的mapper都继承它.
5 BaseService 每一个表的逻辑实现都继承它,需要修改的话重载里面的方法即可.主要包括那4个方法的实现 .
6 BaseResource
那么实际例子如下. 那么只要继承写好了,mapper里的sql写好了那么这4个接口就已经写好了 .
由于jhipster过于复杂,我们并不是直接使用它作为项目架构而是结合我们自身的业务以及经验, 重新构造一个项目架构.主要是保留了jhipster整体思想以及spring security ,spring aop ,web配置的代码,增加了对mybaits的集成(当时也考虑了很久, 使用mybatis而不使用hibernate和jpa)以及自身业务的Base类
那么现在的后台架构是 eclipse , maven, spring boot, mybatis,抽象类 前端使用angular,typescript,bootstrap
刚好学习完这些需要做我们的第一个系统,这个系统的表的数量有79个,除去和业务无关的还剩下将近50个也就是说,这50张表都需要建search,model,service,rest,mapper并且每一个表需要写增删改查4条sql语句. 那时只有一个后台人员和2个前端人员.即使时间很紧迫,但我还是放弃写接口. 优先创作 自动代码生成工具 见另一篇文章.创作成功后果然大大减少了我的工作量,而且也帮前端生成了ts版的model类.
现在的后台架构
eclipse , maven, spring boot, mybatis,抽象类, 自动代码生成工具
这个已经成型,也已经开发了几个系统, 这个就叫架构1.0.