分层

分层的概念

代码分层就是让每一块代码专注于自己功能的实现:比如持久化层就只关心持久化的功能,而不取关心实体层那里应该有多少属性。

目前用到的分层有

  • 实体层: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等,更详细的参考实体的介绍

  1. basic的扩展模块(即basic模块+新模块组合成新的模块),继承 com.mingsoft.basic.entity,BasicEntity
  2. 非basic扩展模块,但是需要区分应用数据(多站点),继承 com.mingsoft.basic.entity.BaseEntity
  3. 普通模块,继承 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进行了实现

  1. basic的扩展模块(即basic+新模块组合成新的模块),需要继承 com.mingsoft.basic.biz.IBasicBiz
  2. 普通模块,需要继承 com.mingsoft.base.biz.IBaseBiz

命名

业务主要分接口类与实现类,接口用大写i 头Biz结尾,实现类以Impl结尾,例如:表名为news对应INewsBiz.java、INewsBizImpl.java

控制 action

继承

继承 com.mingsoft.base.action.BaseAction

以下描述的是二种场景下保存、更新使用

  1. basic的扩展模块(即basic+新模块组合成新的模块),在保存与更新、删除必须调用父类的save、update方法,例如:扩展basic模块的业务对应调用 saveBasic、updateBasic、deleteBasic
  2. 普通模块,在保存与更新、删除的时候直接调用底层的 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“权限功能的人员,才能看见当前功能,否则将会被隐藏。

results matching ""

    No results matching ""