# 前端开发规范

# 文件夹/文件命名规范

文件名必须用 蛇形命名法,例如:user-list.vue

相关模块文件必须放在同一目录下,目录入口文件必须命名为 index.vue

# Vue 组件命名规范

组件的命名需遵从以下原则:

  • 有意义的 : 不过于具体,也不过于抽象
  • 简短 : 2 到 3 个单词
  • 具有可读性 : 以便于沟通交流

同时还需要注意:

  • 必须符合自定义元素规范 : 使用连字符分隔单词,切勿使用保留字。
  • app-前缀作为命名空间 : 如果非常通用的话可使用一个单词来命名,这样可以方便于其它项目里复用。

# 路由命名规范

路由 path 必须使用蛇形命名法,例如 /user/user-index,必须符合 restfull 定义规范

路由跳转必须使用 name 定位, 禁止直接使用 path 定位,

# 组件模板规范

模板中禁止出现复杂的三元表达式计算式,应用 computedmethod 代替。

模板中禁止出现行内样式

# 验证组件的 props

props 应尽量使用原始数据类型,并强制要求增加数据类型限制。

# Javascript 规范

Javascript 代码 统一采用 ES6 规范编写.

如无特殊需要,function() 一律用箭头函数代替

禁止出现使用 "+" 号连接动态字符串,应使用魔术字符串代替

处理异步代码时,统一使用 async await 方式编写,禁止使用 *, yield

必须符合项目定义的 ESLint 标准,代码必须统一格式化


# 后端开发规范

# 总体命名规范

  1. 命名即设计。好的代码,有意义的名字,一看就懂。
  2. 项目名、包名、目录名,以模块为基准;类名、方法名、流程名、rest 资源名以模型为基准。
  3. 表名不要超过30个字符,所以可以用缩写。其他不建议用缩写。rest 里面要用-分隔,其他命名要驼峰式。
  4. 除了常量、枚举类外,不建议大写。

# Restful命名规范

  • 规范

    1. 统一前缀,一般是所有path前缀为/api;
    2. 统一前缀后面一般是系统名(或者模块名),然后是资源名
    3. 资源名:
      1. 使用名词,而不是动词
      2. 使用复数,而不是单数
      3. 资源名必须小写,或者用短横线“-”连接,如tree-node
    4. HTTP Method
      1. GET:从服务器中查询一个或多个资源
      2. DELETE:在服务器中删除资源
      3. PUT:在服务器中更新资源
      4. POST:在服务器新建一个资源
      5. 其他方法一般不用
    5. PathParam还是QueryParam:一般来讲,通过资源唯一标识查询单个资源实体时,将唯一标识放在path上,即用PathParam。而通过资源其他属性来做过滤查询的话,则用QueryParam。
    6. 资源操作:如果资源需要做一些具体的操作可以用actions作为path(尽量避免用action)
  • 示例(resteasy 和 swagger)


/**
* 构建定义相关API
*
*
*/
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/api/ci/builddefs")
@Api(description="构建定义管理对外接口")
public interface IBuildDefinitionController {
 
    /**
    * 获取构建定义
    *
    * @param buildDefinitionId 构建定义ID
    * @return 构建定义
    * @throws Exception
    */
    @GET
    @Path("/{buildDefinitionId}")
    @ApiOperation("获取构建定义")
    BuildDefinition getBuildDefinition(@PathParam("buildDefinitionId")@ApiParam("构建定义ID") String buildDefinitionId) throws Exception;

    /**
    * 获取构建定义详细信息
    *
    * @param buildDefinitionId 构建定义ID
    * @return 构建定义详细信息
    * @throws Exception
    */
    @GET
    @Path("/{buildDefinitionId}/details")
    @ApiOperation("获取构建定义详细信息")
    BuildDefinition getBuildDefinitionDetails(@PathParam("buildDefinitionId")@ApiParam("构建定义ID") String buildDefinitionId) throws Exception;

    /**
    * 查询项目所有的构建定义
    *
    * @param projectId 项目ID
    * @return 构建定义列表
    * @throws Exception
    */
    @GET
    @Path("/")
    @ApiOperation("查询项目所有的构建定义")
    PageResultList<BuildDefinition> queryBuildDefinitions(@QueryParam("projectId")@ApiParam("项目ID") String projectId,
    @QueryParam("pageIndex")@ApiParam("起始页数") int pageIndex,
    @QueryParam("pageSize")@ApiParam("每页大小") int pageSize) throws Exception;

    /**
    * 创建一个构建定义
    *
    * @param buildDefinition 构建定义
    * @param componentIds 组件IDs
    * @return 构建定义
    * @throws Exception
    */
    @POST
    @Path("/")
    @ApiOperation("创建一个构建定义")
    BuildDefinition createBuildDefinition(@ApiParam("构建定义") BuildDefinition buildDefinition) throws Exception;

    /**
    * 克隆一个构建定义
    *
    * @param buildDefinitionId 构建定义ID
    * @param buildDefinitionName 构建定义名称
    * @return 构建定义
    * @throws Exception
    */
    @POST
    @Path("/{buildDefinitionId}/actions/clone")
    @ApiOperation("克隆一个构建定义")
    BuildDefinition cloneBuildDefinition(@PathParam("buildDefinitionId")@ApiParam("构建定义ID") String buildDefinitionId,
    @QueryParam("buildDefinitionName")@ApiParam("构建定义名称") String buildDefinitionName) throws Exception;

    /**
    * 修改构建定义
    *
    * @param buildDefinition 构建定义
    * @param componentIds 组件IDs
    * @return
    * @throws Exception
    */
    @PUT
    @Path("/{buildDefinitionId}")
    @ApiOperation("修改构建定义")
    BuildDefinition modifyBuildDefinition(@ApiParam("构建定义") BuildDefinition buildDefinition) throws Exception;

    /**
    * 删除构建定义
    *
    * @param buildDefinitionId 构建定义ID
    * @return 构建定义
    * @throws Exception
    */
    @DELETE
    @Path("/{buildDefinitionId}")
    @ApiOperation("删除构建定义")
    BuildDefinition removeBuildDefinition(@PathParam("buildDefinitionId")@ApiParam("构建定义ID") String buildDefinitionId) throws Exception;

    /**
    * 执行构建
    *
    * @param buildDefinitionId 构建定义ID
    * @param buildParams 构建参数
    * @param buildTag 构建标签
    * @return 构建实例
    * @throws Exception
    */
    @POST
    @Path("/{buildDefinitionId}/actions/execute")
    @ApiOperation("执行构建")
    BuildInstance executeBuildDefinition(@PathParam("buildDefinitionId")@ApiParam("构建定义ID") String buildDefinitionId) throws Exception;

    /**
    * 取消构建
    *
    * @param buildDefinitionId 构建定义ID
    * @param buildInstanceId 构建实例ID
    * @throws Exception
    */
    @POST
    @Path("/{buildDefinitionId}/instances/{buildInstanceId}/actions/cancel")
    @ApiOperation("取消构建")
    BuildInstance cancelBuildDefinition(@PathParam("buildDefinitionId")@ApiParam("构建定义ID") String buildDefinitionId,
    @PathParam("buildInstanceId")@ApiParam("构建实例ID") String buildInstanceId) throws Exception;

    /**
    * 分页查询构建实例历史
    *
    * @param buildDefinitionId 构建定义ID
    * @param pageIndex 起始页数
    * @param pageSize 每页大小
    * @return 构建实例历史列表
    * @throws Exception
    */
    @GET
    @Path("/{buildDefinitionId}/instances")
    @ApiOperation("查询构建实例历史")
    PageResultList<BuildInstance> queryBuildInstances(@PathParam("buildDefinitionId")@ApiParam("构建定义ID") String buildDefinitionId,
    @QueryParam("pageIndex")@ApiParam("起始页数")int pageIndex,
    @QueryParam("pageSize")@ApiParam("每页大小")int pageSize) throws Exception;

    /**
    * 获取构建实例
    *
    * @param buildInstanceId 构建实例ID
    * @return 构建实例
    * @throws Exception
    */
    @GET
    @Path("/{buildDefinitionId}/instances/{buildInstanceId}")
    @ApiOperation("获取构建实例")
    BuildInstance getBuildInstance(@PathParam("buildInstanceId")@ApiParam("构建实例ID") String buildInstanceId) throws Exception;

    /**
    * 删除构建实例
    *
    * @param buildInstanceId 构建实例ID
    * @return 构建实例
    * @throws Exception
    */
    @DELETE
    @Path("/{buildDefinitionId}/instances/{buildInstanceId}")
    @ApiOperation("删除构建实例")
    BuildInstance removeBuildInstance(@PathParam("buildInstanceId")@ApiParam("构建实例ID") String buildInstanceId) throws Exception;

    /**
    * 清空构建历史
    *
    * @param buildDefinitionId 构建定义ID
    * @return
    * @throws Exception
    */
    @DELETE
    @Path("/{buildDefinitionId}/instances")
    @ApiOperation("删除构建实例")
    void clearBuildInstances(@PathParam("buildDefinitionId")@ApiParam("构建定义ID") String buildDefinitionId) throws Exception;
    
}

# Java开发规范

  1. 代码不只是用于机器执行,更重要的是要给人看的。
  2. 命名规范
    1. 所有命名一定要通俗易懂,宁可长一点。
    2. 项目命名规范:一般是系统名-子系统名[-模块名]
    3. 包命名规范:固定前缀. 系统名 . 子系统名 . [ 模块名 ] .[ 子模块名 ].[代码类型]
      1. 固定前缀: 比如:com.gdrcu.itamp
      2. 代码类型:
        • api:api接口
        • spi:spi接口
        • impl:实现接口
        • model:模型
        • exception:异常定义
        • constant:常量定义
        • util:工具类
        • extension:扩展
        • controller:rest对外接口及实现
        • service:业务逻辑接口及实现
        • dao:数据库模型操作
    4. 类命名规范:有意义的英文名词,接口一般以I为前缀,工具类一般以Util为后缀
    5. 方法命名规范:动宾结构。
      1. controller/service前缀: get(query)/create/remove/modify, get返回的是单个实体,query返回的是List或者Array;如果是其他业务,可以是使用其他更有意义的名字;
      2. dao前缀: get(query)/insert/delete/update, get返回的是单个实体,query返回的是List或者Array
      3. controller:方法不允许重名
  3. 代码文件规范
    1. 全部文件必须使用UTF-8编码
    2. 文件名不允许使用中文字符
    3. 文件名不允许使用空格,目录不允许大写
    4. 代码一定要统一格式化,要注意可阅读性
  4. 注释规范
    1. Class必须有注释说明(JavaDoc)
    2. 对外API的方法必须有注释说明(JavaDoc),参数也要说明
    3. restApI必须要有swagger注解
    4. Public方法建议有注释说明(JavaDoc)
    5. 关键复杂算法,一定要有注释说明
  5. 日志规范
    1. error 出错时,除了堆栈信息外的一些参数需要在此加入
    2. 不允许使用system.out,e.printStackTrace记录日志
  6. 异常规范
    1. 如果不知道如何处理异常,不要捕获异常
    2. 如果捕获异常,一定要记录异常日志信息,或者转译异常(一定要带着原始异常)
  7. 单元测试
    1. 类名:单元测试XXXTestCase,比如:UserTestCase
    2. 方法名:testXXX前缀,比如:testUser
    3. assertXXX,正向判断
    4. 可重复执行(增删改查,还原系统)
    5. 测试最外层即可(因为覆盖率很重要),比如controller;除非测试不到
  8. 代码提交日志规范
    1. TASK:完成JIRA系统中的任务 示例:TASK:12345,EPP部署
    2. BUG:修改BUG系统中的BUG
    3. Review:修改代码评审发现的缺陷
    4. Update:修改了XXX功能,或者新增了XXX,或者删除了XXXX,或者重构了XXX
    5. 禁止强推(git push -f)或者其他工具,比如eclipse

# 数据库规范

  1. 命名
    1. 总体
      1. 全部大写,一般不区分大小写
      2. 不能太长,不超过30个字符,如果超长,必须缩写
      3. 有意义的英文单词
      4. 不能有空格
      5. 不能使用中文
      6. 不建议使用中文拼音
      7. 一般没有阿拉伯数字
      8. 使用下划线连接
    2. 表名:系统名称缩写_对象名称,示例:DPS_DEPLOY_DESIGN,DPS_USER
    3. 列名:有意义的英文单词,示例:ORG_ID,ORG_CODE,ORG_NAME,CREATE_TIME,IS_EDITABLE,USER_NAME, PASSWORD等
    4. 值:不建议大写、缩写。建议小写,中杠分隔。
  2. 列类型
    1. 一个表一般都要有主键(除了关联表之外),主键一般是数字构成,即使是varchar类型(主键是给计算机用的)
    2. varchar类型,一定要设置合适的长度
    3. 时间类型,一定要选取合适类型,有的只有日期,有的只有时间,有的全有,比如date,time,timestamp
    4. 表设计时,注意增加扩展列的可能性,考虑一定的冗余
上次更新: 2023-4-6 9:25:06