内容关键词:GitBook开发环境搭建、规范约定
知识来源:720科技
开发环境搭建:
开发工具
MySql: 数据库
jetty: 开发服务器
Tomcat: 应用服务器
Git: 版本管理
Eclipse: 开发IDE
Navicat Model: 建模工具
Navicat for MySQL: 数据库客户端
开发环境
Jdk7+
Mysql5.5+
Elasticsearch2.4.0
项目部署
参考 铭飞环境配置手册
资源下载
JDK7
http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
Maven
Redis
Elastic Stack
规范约定:
分层
分层的概念
代码分层就是让每一块代码专注于自己功能的实现:比如持久化层就只关心持久化的功能,而不取关心实体层那里应该有多少属性。
目前用到的分层有
实体层:entity
- 一个自定义的数据类型
持久化层:dao
- 持久化层它只关注实体化的工作,是接口
实现层:impl
- 实现层关注如何实现接口
通用工具:util
- 该层包含一些基础的公共工具
业务层:biz
- 业务层关注一个功能的具体业务,比如注册时你要判读这个用户是否是已经注册过,这个用户填写的资料是符合规范等等
控制层:action
- 控制层会调用业务层,实现一个具体的功能,这个功能可能是调用了好几个业务层,并且会提供方法访问地址。
分层原则
每个层次向外公开接口,但是隐藏内部细节
下一层为上一层服务,但不使用上层的服务
不同层之间通过实体类传输数据
数据库
命名
统一采用小写字母,通过每个单词之间使用下划线分割
- 表名——模块名业务名,例如:铭飞的cms模块里面的文章,表名 cms_article;
- 字段名——表名加字段名,例如:文章的内容,字段名article_content;
- 外键——fk_字段名,例如:文章的主键,fk_basic_id,推荐使用业务功能去实现主外键的业务;
- 索引——idx_字段名,例如:文章的标题,idx_basic_title;
- 主键——pk_字段名,例如:文章的编号,pk_basic_id;
必备字段
- id 主键
- create_date 创建时间
- update_date 更新时间
- create_by 创建人
- update_by 更新人
- del 删除标记
- app_id 应用编号,多应用下场景必须存在该字段,如果是扩展通用模型模块可以不需要,因为通用模型已存在该字段;
包
项目的包结构统一采用 组织域名.模块名 的方式,例如:铭飞的basic模块 net.mingsoft.basic ,mdiy模块 net.mingsoft.mdiy,
以下描述的都是在 组织域名.模块名 下创建
- 实体 entity 对应包 组织域名.模块名.entity
- 持久化 dao 对应包 组织域名.模块名.dao
- 业务 biz 对应包 组织域名.模块名.biz
- 业务 biz 实现 对应包 组织域名.模块名.biz.impl
- 控制 action 对应包 组织域名.模块名.action
- web 访客访问 对应包 组织域名.模块名.action.web
- people 会员访问 对应包 组织域名.模块名.action.people
- 常量 constant 对应包 组织域名.模块名.constant
- 资源 resources 对应 组织域名.模块名.resources
视图
视图页面统一存放在 WEB-INF 文件夹,例如:铭飞的basic管理 列表页WEB-INF/manager/basic/index.ftl 表单页WEB-INF/manager/basic/form.ftl
命名
- index.ftl 主界面、列表界面
- form.ftl 表单界面
实体 entity
继承
以下描述的是三种场景下的继承,普通模块已经存在通用字段定义,如:id、createBy、createDate等,更详细的参考实体的介绍
- basic的扩展模块(即basic模块+新模块组合成新的模块),继承com.mingsoft.basic.entity,BasicEntity;
- 非basic扩展模块,但是需要区分应用数据(多站点),继承 com.mingsoft.basic.entity.BaseEntity;
- 普通模块,继承 com.mingsoft.base.eneity.BaseEntity;
命名
- 实体名与表名一致后面加Entity,例如:表名为news对应NewsEntity.java;
- 实体属性名必选与字段名、字段类型一致,例如:字段名为news_title对应属性定义 private String newsTitle;
属性处理
- 整型推荐使用integer;
相关注解
- DateTimeFormate :入参
JsonFormat :出参
时间类型要在属性之上添加@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")和 @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")注解。
注意事项:在实体中运用了时间的主界,在返回数据的list.do的方法中就避免用this.outjson 的方式返回数据,从而导致DateTimeFormat注解无效,在dao中resultmap避免用mybits的collection 和 association中的select属性去查询相关数据(暂时不支持)
相关实例:
持久化 dao
底层dao对CURD已经实现,如果模块是简单的CURD那么dao不需要编写代码,只需要在xml进行对应方法的SQL进行编写即可
继承
继承 com.mingsoft.base.dao.IBaseDao
命名
- 类名用大写i开头Dao结尾,同时创建名称一致的xml文件,例如:表名为news对应INewsDao.java;i表示接口类,对应xml文件
INewsDao.xml
XML对应方法
- saveEntity 对应 insert SQL语句
- updateEntity 对应 update SQL语句
- getEntity 对应 select SQL语句 ,当前实体为参数查询条件
- getByEntity 对应 select SQL语句,实体ID为查询条件
- deleteEntity 对应 delete SQL语句,实体为参数条件删除
- delete 对应 delete SQL语句,实体ID批量删除
- queryAll 对应 select SQL语句,查询所有
- query 对应 select SQL语句,实体为参数条件查询
业务 biz
继承
以下描述的是二种场景下的继承,底层对CURD进行了实现
- basic的扩展模块(即basic+新模块组合成新的模块),需要继承 com.mingsoft.basic.biz.IBasicBiz
- 普通模块,需要继承 com.mingsoft.base.biz.IBaseBiz;
命名
业务主要分接口类与实现类,接口用大写i 头Biz结尾,实现类以Impl结尾,例如:表名为news对应INewsBiz.java、INewsBizImpl.java
控制 action
继承
继承 com.mingsoft.base.action.BaseAction
以下描述的是二种场景下保存、更新使用
- basic的扩展模块(即basic+新模块组合成新的模块),在保存与更新、删除必须调用父类的save、update方法,例如:扩展basic模块的业务对应调用 saveBasic、updateBasic、deleteBasic;
- 普通模块,在保存与更新、删除的时候直接调用底层的 saveEntity、updateEntity、delete方法
命名
以Action结尾,例如:表名为news对应NewsAction.java;
以下描述各个方法的命名,所有方法的传递推荐采用模块实体方式
- index 模块主页
- list 模块数据列表
- form 模块编辑表单
- get 获取模块数据
- save 保存
- delete 删除
- update 更新
返回数据
- 保存和更新直接返回实体;
- 如果返回的是实体,且包含时间格式属性,那么需要对时间格式化。比如: this.outJson(response, net.mingsoft.base.util.JSONArray.toJSONString(entity,new DoubleValueFilter(),new DateValueFilter("yyyy-MM-dd")));
- 如果在json转化成实体时,包含时间类型,且后端并不需要,那么可以在实体属性上方法中添加@JsonIgnore注解。
模块编码
- 模块编码由8位数组成,如:00000000 ,每两位分别表示:项目-模块-子功能-CURDO(查:0添:1删:2改:3等其他)
- 当添加权限模块时,模块编码可以填写 项目:模块:子功能:save|update|del|view 例如:article:save 表示信息的保存,结合权限控制使用
权限控制
方法
通过在方法上使用@RequiresPermissions注解,注解的值为模块编码的值, 如:@RequiresPermissions("article:save")。
表示文章模块的保存功能的权限控制。
视图按钮
使用<@shiro.hasPermission name="xxxx:xxxx">标签进行视图显示控制,如:
<@shiro.hasPermission name="article:save"><@ms.panelNavBtnAdd title=""/></@shiro.hasPermission>
代表当前人员拥有”article:save“权限功能的人员,才能看见当前功能,否则将会被隐藏。