项目开发规范及说明
架构规范
└─com.chinamedcom
├─auth --- 各个模块,包里面放这个模块相关的内容(这里指权限相关)
│ ├─controller --- 权限相关的controller(类似Strtus2的Action,用于处理url映射的内容),controller 不允许去直接调用repository的方法(通过service)
│ ├─entity --- 权限相关的model
│ ├─repository --- 权限相关的repository(dao)
│ ├─service --- 权限相关的service,调用repository的方法.
│ └─shiro --- 其他.如果此模块里还需要其他包支持,单独建包存放,比如权限里面用到的shiro
│ ├─authc
│ │ └─credential
│ ├─cache
│ └─realm
├─controller --- 公共的controller,比如(验证码 读取城市列表 读取省份列表等)
│ └─base --- 存放controller的基础类,方便扩展
├─entity --- 公共的entity,比如(城市 省份)
│ └─base --- 存放entity的基础类,方便后期扩展
├─manager --- 各个模块需要的管理工具,比如redisManager(提供get set方法操作redis)
├─repository --- 公共的repository
│ └─base --- 存放基础repository
├─service --- 公共的service
│ └─base --- 存放基础service
└─util --- 工具类
开发相关
controller
@Controller // 注解,标志此类为controller,提供给spring mvc扫描映射
@RequestMapping("/common") // 整个类映射的url,此处映射为 /common,在此类中的所有方法都以/common开头
public class CaptchaController {
@RequestMapping("/captcha") // 此方法映射为/captcha,由于此类整体映射成/common,所以此方法的url映射完整路径为: "/common/captcha"
public void show(){
// 方法返回字符串:
// 默认解析位于/WEB-INF/viewer的模板,比如返回"auth/login.html",则会解析/WEB-INF/viewer/auth/login.html的模板
// 如果是返回的字符串以redirect开头,则跳转,比如返回"redirect:/auth/login",则会重定向到http://127.0.0.1/auth/login
// -------
// 返回json对象:
// 如需返回json,在此类中加入@ResponseBody注解,直接返回一个对象 数组 或者map,则会自动转换成json(参考\com\chinamedcom\auth\controller\LoginController.java - loginPost方法)
// 接受参数:
// 在定义方法的时候传入
// public void show(@RequestParam String username)
// 表示接受传入key等于username的参数,并由springmvc带上值执行此方法
// 参数: @RequestParam(value = ""(string,指定外部传进来参数名,如果变量名和参数名不一致的时候使用,默认和变量名相同),required=""(boolean,此参数是否必须,默认为true,如果不负责则直接返回404),default=""(String,默认值))
// 对于大量的表单提交(比如更新用户信息),可直接让spring mvc 给某个model赋值
// public void show(PhrMember memeber)
// 如果提交的表单包含member里的属性,自动会调用setXXX赋值上
// 比较灵活(不推荐):
// public void show(HttpServletRequest request,HttpServletResponse reponse)
// 传入request response 然后可以通过request获取参数等信息
// 显示验证码
}
}
entity
@Entity // 表明是一个entity(让jpa扫描)
@Data // lombok提供的方法,加上这个注解后,会自动生成所有属性的get set tostring hascode 方法
@NoArgsConstructor // lombok 提供的方法,加上这属性后,会提供一个空的构造方法
@AllArgsConstructor // lombok 听的方法,加上这属性后,提供一个带有所有参数的构造方法
@Table(name = "phr_dept") // 指定表名和相关一些属性(参考jpa文档)
public class PhrDept extends BaseEntity { // 集成BaseEntity方便后期扩展
@Id // 指明此字段为id(参考jpa文档)
@Column(name = "id", nullable = false, insertable = true, updatable = true) // 指明此为一个字段,并可加上一些属性
private int id;
@Basic
@Column(name = "name", nullable = false, insertable = true, updatable = true, length = 35)
private String name;
@Basic
@Column(name = "parent_id", nullable = true, insertable = true, updatable = true)
private Integer parentId;
}
repository
@Repository // 标志为spring bean
public interface MemberRepository extends BaseRepository<PhrMember, Long> { // 集成基础repository 带上所操作的类型和ID类型
@QueryHints({@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_CACHEABLE, value = "true")}) // 缓存(目前暂时不考虑缓存)
PhrMember findByUsername(String username); // spring data jpa 根据命名来决定该执行什么查询,定义一个方法就行, 不用自己去写实现,更多的查询方式参考: https://sqzr.cc/blog/2015/06/04/spring-data-select/
}
service
@Service // 标志为spring bean
public class MemberService extends BaseService<PhrMember, Long> { // 集成基础service 带上所操作的类型和ID类型
@Autowired // 让spring 自动将此类型注入进来
private MemberRepository memberRepository;
// 查询所有user对象,findOne为查询单个
@Transactional(readOnly = true) // 声明这个方法需要事务管理 readOnly=true 表示此方法只读(不更新新增删除),更多属性请参考spring 事务相关的
public List<PhrMember> findAllUsers() {
return memberRepository.findAll();
}
@Transactional(readOnly = true)
public PhrMember findByUsername(String username) {
return memberRepository.findByUsername(username);
}
}
一些规范
开发相关
- 遵循包规范建包
- 任何地方都不允许直接使用 + 拼接字符串,如需拼接:
- 使用StringBuffer 然后tostring
- 使用StrUtil.format提供的方法,用{}作代替:
- StrUtil.format("hello,{}","sqzr") -> "hello,sqzr"
- StrUtil.format("hello,{},{}","sqzr","xx") -> "hello,sqzr,xx"
- 更多的使用参考StrUtil里
- 使用好日志,捕捉异常禁止直接打印到终端,调用logger.debug(error info等,按错误严重度决定)
安全相关
- 用户id禁止在get post中传输,所有需要用用户id的地方都通过后台去获取
- 用户id 和 敏感信息禁止出现在js中
- 前端js验证(给用户友好的提示),后台java验证(防用户绕过js提交,或者直接构造post包)
- 判断好权限(比如用户解散一个群 /group/delete/2 解散id为2的群,传到后端后 先判断这个用户是不是id2这个群的创始人 或者有没有权限解散,其他地方同理 )