项目开发规范及说明
架构规范
└─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 beanpublic 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 beanpublic 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这个群的创始人 或者有没有权限解散,其他地方同理 )