大厂JAVA项目规范范文

一、前言,首先大致说下,大公司的基本流程。

1、需求评审:基本会用一人天来讲述大致需求,并分配需求到每个人头上

2、开发设计:需求下来后,根据自己的需求,到需求文档中查找自己对应的需求,根据自己的需求,做出对应的开发设计(一般以画图的形式,例如需求简单点的可以使用:EdrawMax,复杂的一般会使用时序图:Visual paradigm),开发设计里面会细节到开发的每一个业务流程步骤,如果开发设计出现问题,那么编写业务代码也将会是错的,所以这一步很重要很重要

3、设计评审:开发设计完成后,会组织一个会议,公司熟悉业务的大佬会过一下每个人的开发设计,若没问题则进入开发。有问题则标注问题点,会议结束后,将标注问题的地方修改好,重新过一下开发设计,没问题则再进行开发

4、代码评审:根据开发设计流程,一步一步编写业务代码,手上所有需求完成后,提交到代码至对应的分支(此时代码不会被合入,需要进行代码评审),评审若出现代码规范问题或者业务逻辑问题,则会被指出,并对问题点进行备注,后面所有代码评审完后,再进行修改。说明:若修改的地方不多,一般会被先合入到对应的分支中,再进行修改,修改完成再提交代码。反之,修改的地方比较多,则需要撤回代码,这个建议提前做好备份(我个人习惯,因人而异)

5、功能测试:代码提交并被合入到对应的分支后,需要和测试人员进行对应的功能点测试联调。一般是自己在本地先测试,测试没什么问题后,会通过jenkins部署到测试环境,测试环境多种场景测试没问题,测试人员会再指定的时间进行项目发版

6、修改BUG:测试人员在测试环境测试功能可能会出现BUG,自己可能测了很多个应用场景没问题,但是测试人员使用的应用场景可能会比你自测的场景多一些,所以就可能出现某个场景的BUG出现,这时候就需要修改对应的功能点,并重新提交代码,重新测试,测试所有功能点没问题后,才算通过

大致就那么多了吧,废话不多说了,上代码-------------->

二、代码部分

声明:这里只提供参考代码规范,代码规范有几点基本要求:

① 参数不得超过3个参数,超过3个参数必须用对象进行封装

② 命名规范,不得用中文去命名,可以对名字进行翻译后进行命名,且必须遵守驼峰的命名规范

③ 三层架构不可出现数字或字符串,若需要则需要单独再一个文件中编写,再三层代码中进行调用

④ 代码复用,使用前全局搜索是否已存在,在进行添加,不然项目代码过于冗余

Controller层:

package com.bat.outsoursing.workload.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * 工作量明细和汇总明细接口
 * 查询,导出
 *
 * @author liulei 工号
 * @since 日期 上午11:03
 */
@Api(tags = "工作量明细和汇总明细")
@Slf4j
@RestController
@RequestMapping("/workloadDetail")
public class WorkloadDetailController {
    @Autowired
    private WorkloadDetailService workloadDetailService;
    
    @ApiOperation("工作量汇总明细查询")
    @PostMapping(value = "/queryWorkloadSummaryDetail")
    @ResponseBody
    public BaseResp queryWorkloadSummaryDetail(@ApiParam(value = "查询参数", required = true) @RequestBody QueryParam<Long> queryParam) {

        // 获取分页后的结果
        PageRows<WorkloadSummaryDetailVO> voPageRows = workloadDetailService.workloadSummaryDetailBOList2VOList(queryParam);
        return BaseResp.ok(voPageRows);

    }
}    

Service层:

package com.bat.outsoursing.workload.service;

import org.springframework.web.multipart.MultipartFile;
/**
 * 工作量明细和汇总明细接口
 * 查询,导出
 * @author liulei 工号
 * @since 时间 上午11:32
 */
public interface WorkloadDetailService {

    /**
     * 汇总明细BO转VO
     *
     * @param queryParam
     * @return
     */
    PageRows<WorkloadSummaryDetailVO> workloadSummaryDetailBOList2VOList(QueryParam<Long> queryParam);
    
}

实现类:

package com.bat.outsoursing.workload.service.impl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.alibaba.excel.util.DateUtils;
import com.alibaba.fastjson.JSON;import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.curator.shaded.com.google.common.collect.Maps;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;

/**
 * 工作量明细和汇总明细
 * 查询,导出,删除 接口
 *
 * @author liulei 工号
 * @since 日期 上午11:32
 */
@Slf4j
@Service("DOMESTIC_WORKLOAD_APPLICATION")
public class WorkloadDetailServiceImpl extends AbstractImportExcelStrategy implements WorkloadDetailService {
@Override
public PageRows<WorkloadSummaryDetailVO> workloadSummaryDetailBOList2VOList(QueryParam<Long> queryParam) {
    PageRows<WorkloadSummaryDetailBO> pageRows = PageUtils.doPageQuery(queryParam.getPageNum(), queryParam.getPageSize(),
            anything -> queryWorkloadSummaryDetail(queryParam));
    //转换vo对象并返回
    PageRows<WorkloadSummaryDetailVO> workloadSummaryDetailVOPageRows = new PageRows<>();
    workloadSummaryDetailVOPageRows.setTotal(pageRows.getTotal());
    workloadSummaryDetailVOPageRows.setCurrent(pageRows.getCurrent());
    workloadSummaryDetailVOPageRows.setRows(workloadSummaryDetailConverter.workloadSummaryDetailBOList2VOList(pageRows.getRows()));
    return workloadSummaryDetailVOPageRows;
}
/**
 * 查询拼接后的汇总明细List
 *
 * @param queryParam
 * @return
 */
private List<WorkloadSummaryDetailBO> queryWorkloadSummaryDetail(QueryParam<Long> queryParam) {
    // 根据工作量确认单id查询明细
    List<WorkloadSummaryDetailBO> workloadSummaryDetailBOList = workloadDetailDAO.queryWorkloadSummaryDetail(queryParam.getParam());
    // 根据工作量确认单id查询明细
    if (CollectionUtils.isEmpty(workloadSummaryDetailBOList)) {
        return workloadSummaryDetailBOList;
    }

    // 从明细数据中获取prId并存储到list集合
    List<Long> prIdList = workloadSummaryDetailBOList.stream().map(WorkloadSummaryDetailBO::getPrId).collect(Collectors.toList());
    // 根据prIdList查询对应的所有采购区域
    List<PurchasingAreaBO> purchasingAreaBOList = workloadDetailDAO.queryPurchasingAreaNames(prIdList);
    if (CollectionUtils.isEmpty(purchasingAreaBOList)) {
        return workloadSummaryDetailBOList;
    }

    // 采购区域实例转map对象
    Map<Long, PurchasingAreaBO> purchasingAreaBOListToMap = getPurchasingAreaBOListToMap(purchasingAreaBOList);

    // 汇总明细拼接采购区域
    for (WorkloadSummaryDetailBO workloadSummaryDetailBO : workloadSummaryDetailBOList) {
        PurchasingAreaBO purchasingAreaBO = purchasingAreaBOListToMap.get(workloadSummaryDetailBO.getPrId());
        if (null != purchasingAreaBO) {
            workloadSummaryDetailBO.setDescriptionEn(purchasingAreaBO.getDescriptionEn());
            workloadSummaryDetailBO.setDescriptionZn(purchasingAreaBO.getDescriptionZh());
        }
    }

    return workloadSummaryDetailBOList;
}
/**
 * 采购区域实例转map对象
 *
 * @param purchasingAreaBOList
 * @return
 */
private Map<Long, PurchasingAreaBO> getPurchasingAreaBOListToMap(List<PurchasingAreaBO> purchasingAreaBOList) {
    if (CollectionUtils.isEmpty(purchasingAreaBOList)) {
        return Maps.newHashMap();
    }
    return purchasingAreaBOList.stream().filter(purchasingAreaBO -> purchasingAreaBO.getPrId() > 0).collect(Collectors.toMap(PurchasingAreaBO::getPrId, t -> t, (v1, v2) -> v2));
}
}

DAO层:

package com.bat.outsoursing.workload.dao;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;

/**
 * 工作量明细和汇总明细
 * 查询,导出,删除 接口
 *
 * @author liulei 工号
 * @since 日期 上午11:34
 */
@Mapper
public interface WorkloadDetailDAO {
/**
 * 根据工作量确认单id查询汇总明细
 *
 * @param applyOid
 * @return
 */
List<WorkloadSummaryDetailBO> queryWorkloadSummaryDetail(Long applyOid);
/**
 * 根据prIdList查询对应的所有采购区域
 *
 * @param prIdList
 * @return
 */
List<PurchasingAreaBO> queryPurchasingAreaNames(@Param("prIdList") List<Long> prIdList);
}

xxDAO.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.bat.outsoursing.workload.dao.WorkloadDetailDAO">

    <!-- 采购区域 -->
    <resultMap id="getPurchasingArea_Map" type="com.bat.outsoursing.workload.bo.PurchasingAreaBO">
        <result column="PR_ID" jdbcType="NUMERIC" property="prId"/>
        <result column="DESCRIPTION_ZH" jdbcType="VARCHAR" property="descriptionZh"/>
        <result column="DESCRIPTION_EN" jdbcType="VARCHAR" property="descriptionEn"/>
    </resultMap>

    <!-- 工作量明细 -->
    <resultMap id="getWorkloadDetail_Map" type="com.bat.outsoursing.workload.bo.WorkloadDetailBO">
        <result column="OID" jdbcType="NUMERIC" property="oid"/>
        <result column="LINE_OID" jdbcType="NUMERIC" property="lineOid"/>
        <result column="LINE_NUM" jdbcType="VARCHAR" property="lineNum"/>
        <result column="ITEM_NUM" jdbcType="VARCHAR" property="itemNum"/>
        <result column="ITEM_DESCRIPTION" jdbcType="VARCHAR" property="itemDescription"/>
        <result column="UNIT" jdbcType="VARCHAR" property="unit"/>
        <result column="QUANTITY" jdbcType="DECIMAL" property="quantity"/>
        <!-- 确认数量 -->
        <result column="POLINE_CONFIRM_NUM" jdbcType="DECIMAL" property="polineConfirmNum" />
        <!-- 申请数量 -->
        <result column="WCC_CONFIRM_NUM" jdbcType="DECIMAL" property="wccConfirmNum"/>
        <result column="PR_ID" jdbcType="NUMERIC" property="prId"/>
        <result column="TASK_ID" jdbcType="VARCHAR" property="taskId"/>
        <result column="APPLY_OID" jdbcType="NUMERIC" property="applyOid" />
    </resultMap>
<select id="queryWorkloadSummaryDetail" parameterType="java.lang.Long" resultMap="getWorkloadSummaryDetail_Map">
    SELECT
        l.oid ,
        l.LINE_NUM,
        l.ITEM_NUM,
        l.ITEM_DESCRIPTION,
        l.UNIT,
        l.PR_ID,
        sum(m.CONFIRM_NUM) WCC_CONFIRM_NUM
    FROM
        ecc_epm.po_dispatch_line l
    LEFT JOIN ecc_epm.epm_bysite_item m ON
        m.LINE_OID = l.oid
        AND m.ENABLE_FLAG ='T'
    WHERE
        m.APPLY_OID = #{applyOid,jdbcType=BIGINT}
        AND l.ENABLE_FLAG = 'T'
    GROUP BY
        l.oid ,
        l.LINE_NUM,
        l.ITEM_NUM,
        l.ITEM_DESCRIPTION,
        l.UNIT,
        l.PR_ID
    ORDER BY l.LINE_NUM ASC
</select>
<select id="queryPurchasingAreaNames" parameterType="java.util.List" resultMap="getPurchasingArea_Map">
    SELECT
        e.OID PR_ID,
        s.DESCRIPTION_ZH ,
        s.DESCRIPTION_EN
    FROM
        ecc_cpr.eng_site_v s
    LEFT JOIN ECC_EPM.EPM_REQ_ITEM e ON
        e.AREA_OID = s.ENG_SITE_ID
        AND e.ENABLE_FLAG ='T'
    WHERE e.OID IN
    <if test="prIdList != null and prIdList.size() > 0">
        <foreach collection="prIdList" index="index" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
    </if>
        AND s.ENABLED_FLAG ='Y'
</select>        
</mapper>

BO实体类(用于Service业务层,这里只介绍BO,同时还有PO,DTO,这里就不细谈了):

package com.bat.outsoursing.workload.bo;

import lombok.Data;
import java.math.BigDecimal;

/**
 * 汇总明细BO
 *
 * @author liulei 工号
 * @since 日期 下午3:38
 */
@Data
public class WorkloadSummaryDetailBO {
    /**
     * pr_id
     */
    private Long prId;

    /**
     * PO行号
     */
    private String lineNum;

    /**
     * ITEM编码
     */
    private String itemNum;

    /**
     * ITEM名称
     */
    private String itemDescription;

    /**
     * 单位
     */
    private String unit;

    /**
     * 采购区域英文
     */
    private String descriptionEn;

    /**
     * 采购区域中文
     */
    private String descriptionZn;

    /**
     * 申请数量
     */
    private BigDecimal wccConfirmNum;

}

VO实体类(用于Controller层返回,声明:BO转VO,字段一定是一致的,否则找不到):

package com.bat.outsoursing.workload.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import java.math.BigDecimal;

/**
 * 汇总明细VO
 *
 * @author liulei 工号 
 * @since 日期 下午4:56
 */
@Data
@ToString
@ApiModel("汇总明细VO")
public class WorkloadSummaryDetailVO {

    /**
     * PO行号
     */
    @ApiModelProperty("PO行号")
    private String lineNum;

    /**
     * ITEM编码
     */
    @ApiModelProperty("ITEM编码")
    private String itemNum;

    /**
     * ITEM名称
     */
    @ApiModelProperty("ITEM名称")
    private String itemDescription;

    /**
     * 单位
     */
    @ApiModelProperty("单位")
    private String unit;

    /**
     * 采购区域英文
     */
    @ApiModelProperty("采购区域英文")
    private String descriptionEn;

    /**
     * 采购区域中文
     */
    @ApiModelProperty("采购区域中文")
    private String descriptionZn;

    /**
     * 申请数量
     */
    @ApiModelProperty("申请数量")
    private BigDecimal wccConfirmNum;
}

Converter(用于BO/PO/DTO转VO使用,至于如何转换,spring已经帮我们完成了,下面的@Mapper(componentModel="spring")就是 ):

package com.bat.outsoursing.workload.converter;

import org.mapstruct.Mapper;
import java.util.List;

/**
 * 汇总明细BO转汇总明细VO
 *
 * @author liulei 工号
 * @since 日期 下午4:56
 */
@Mapper(componentModel = "spring")
public interface WorkloadSummaryDetailConverter {
    /**
     * 汇总明细BOList转VOList
     *
     * @param workloadSummaryDetailBOList
     */
    List<WorkloadSummaryDetailVO> workloadSummaryDetailBOList2VOList(List<WorkloadSummaryDetailBO> workloadSummaryDetailBOList);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 大厂java后端开发规范包括以下几个方面: 1. 代码规范大厂java后端开发中非常重视代码规范,包括命名规范、注释规范、代码风格等。合理的命名、清晰的注释以及统一的代码风格可以提高代码的可读性和可维护性。 2. 项目结构:大厂通常会要求有清晰、合理的项目结构,包括分模块、分层等。每个模块的功能要明确,便于团队合作开发和维护。 3. 运行环境:大厂一般会规定开发环境、测试环境和生产环境的配置。开发环境需要包括所需的IDE、数据库、版本控制等,测试环境的配置要与生产环境尽量一致,保证测试的有效性。 4. 数据库设计:在数据库设计上,需要规范表的命名、字段的命名以及数据类型的选择。合理的数据库设计可以提高查询性能和数据存储的效率。 5. 接口设计:对于大型后端项目,接口的设计尤为关键。接口需要规范输入输出参数、返回结果的格式、错误码等方面,以提供给前端或其他系统使用。 6. 测试规范大厂通常会要求进行单元测试、集成测试和性能测试等。测试代码的编写规范同样重要,可以保证代码的质量和功能的正确性。 7. 代码管理:大厂一般会使用版本控制工具对代码进行管理,如Git。规范的代码提交、分支管理以及代码合并流程可以保证团队协作的顺利进行。 以上是大厂java后端开发规范的几个方面,通过遵循这些规范,可以提高代码的质量和开发效率,同时也有利于团队协作和项目的维护。 ### 回答2: 大厂Java后端开发规范是指在大型软件开发公司或互联网公司中,Java后端开发人员遵循的一定规范和标准,以保证团队合作效率、代码质量和系统可维护性。以下是一些常见的大厂Java后端开发规范: 1. 代码规范:采用统一的命名规范,如驼峰命名法,避免使用拼音或缩写等不规范命名方式。代码格式应统一,使用约定俗成的缩进、空格、注释等规范,提高代码的可读性。 2. 设计模式:遵循常见的设计模式,如单例模式、工厂模式、观察者模式等,提高代码的可重用性和可扩展性,降低耦合度。 3. 异常处理:合理处理异常,使用try-catch块捕获异常并进行适当的处理,避免异常影响系统的稳定性和可用性。 4. 数据库操作:使用数据库连接池进行数据库连接,避免频繁地创建和关闭连接。使用预编译语句或者ORM框架进行数据库操作,提高数据库访问性能。 5. 日志记录:使用统一的日志框架,如log4j、slf4j等,记录关键操作和异常信息,方便系统的排查和定位问题。 6. 并发控制:合理使用线程池和锁机制,控制并发访问,保证数据的正确性和系统的性能。 7. 测试规范:编写良好的单元测试和集成测试,覆盖核心代码。使用相关的测试框架和工具,如JUnit、Mockito等,提高测试效率和代码质量。 8. 安全规范:对用户输入进行合理的校验和过滤,避免安全漏洞。对重要信息进行加密传输,保证数据的安全性。 以上是大厂Java后端开发常见的规范,遵循这些规范可以提高代码的质量和可维护性,提高团队协作效率,保证整个系统的稳定性和可用性。 ### 回答3: 大厂 java 后端开发规范可以从以下几个方面进行描述。 1. 代码风格规范大厂 java 后端开发规范会要求遵循统一的代码风格,包括代码缩进、命名规范、注释规范等。这样可以提高代码的可读性和可维护性。 2. 设计模式规范大厂 java 后端开发规范会强调使用设计模式来解决常见的设计问题,例如单例模式、工厂模式、代理模式等。这样可以提高代码的可扩展性和灵活性。 3. 异常处理规范大厂 java 后端开发规范会明确规定如何处理异常,包括捕获异常、处理异常和抛出异常等。这样可以提高系统的稳定性和可靠性。 4. 数据库访问规范大厂 java 后端开发规范会规定如何进行数据库的访问,包括使用什么类型的数据库连接池、如何编写 SQL 语句等。这样可以提高数据库操作的效率和安全性。 5. 接口设计规范大厂 java 后端开发规范会要求清晰定义接口的输入和输出,遵循 RESTful 设计原则,使用合适的 HTTP 方法和状态码等。这样可以提高接口的可用性和易用性。 6. 性能优化规范大厂 java 后端开发规范会指导如何进行性能优化,包括数据库查询优化、缓存设计和使用合适的并发控制等。这样可以提高系统的响应速度和并发能力。 7. 安全规范大厂 java 后端开发规范会强调安全性,包括防止 SQL 注入、XSS 攻击、CSRF 攻击等。这样可以提高系统的安全性和抵御恶意攻击的能力。 总之,大厂 java 后端开发规范旨在提高团队协作效率、代码质量和系统性能,保证软件项目的高效开发和稳定运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值