Gitee 更新日志

码云的用户群中关于码云企业版集成度不高的、使用体验不一致的吐槽,一直不绝于耳,特别是企业版中的仓库页面需要跳到企业外打开的问题。后来可能大家吐啊吐啊,也就习惯了。但是我们坚决不能忍受这样的吐槽,已经解决了不少吐槽的人,开个玩笑,别当真。

所以年初的时候我们就把企业版集成仓库页面的改造列为今年重点任务之一。仓库页面是整个码云系统最为复杂也是功能点最为繁多的部分,它同时还承担着开源项目和社区交互的重担。

我们花了很大精力准备了几个月的时间,现在终于迎来了码云六周年系列更新的第三弹 —— 企业版代码仓库页面集成。

码云 6 周年的其他更新系列:

  1. 码云六周年系列更新第一弹 —— 企业知识库管理改版
  2. 码云六周年系列更新第二弹 —— Git 只读文件支持

企业版全面集成代码仓库页面。如下图所示:

1. 企业版仓库的概览页面

2. 企业版仓库的代码浏览页面

这次更新我们重写了企业版代码仓库页面,将原有独立的仓库页面的所有功能集成到企业工作台内,用户的所有关于企业内的操作都可以在企业工作台内完成。

同时我们依然保留了独立的仓库页面,特别是企业的开源仓库。

由于牵扯仓库操作的功能点特别多,目前该更新还处于公测阶段,尚有个别功能点没有完全集成(如仓库的任务和 PR)。

欢迎大家体验。使用过程中有任何问题欢迎随时吐槽,我们会及时予以处理。

码云企业版体验地址:https://gitee.com/enterprises

Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。

图 1.  流管道 (Stream Pipeline) 的构成

那么 Java 8 的 Stream 到底是王者,还是个巨坑,这完全取决于你是怎么玩的?

我不得不说,下面代码是我从业 20 年(说谁呢,谁从业 20 年,我今年 19  岁!!!)看过最牛逼的 Stream 的用法:

Optional.of(req)
        .map(e -> e.clueUid)
        .map(id -> {
            final ClueExample example = new ClueExample();
            example.createCriteria()
                    .andClueUidEqualTo(id)
                    .andDeletedEqualTo(false)
                    .andReceivedEqualTo(false)
                    .andCreateTimeGreaterThan(now - cluetime);
            example.setOrderByClause("create_time asc");
            return example;
        })  // 获取该被邀请人所有未过期且未被领取的线索的线索
        .map(clueMapper::selectByExample)
        .filter(StringUtil::isNotEmpty)
        .ifPresent(clues -> {
                    final ClueResp clueResp = Optional.of(req)
                            .filter(c -> {
                                c.count = clues.size();
                                return true;
                            })
                            .map(this::awardValue)
                            .orElseThrow(() -> ExceptionUtil.createParamException("参数错误"));
                    final Integer specialId = req.getIsHead()
                            ? clues.get(0).getId()
                            : clues.get(clues.size() - 1).getId();
                    clues.stream()
                            .peek(clue -> {
                                final AwardConfig awardConfigclone = Optional.of(awardConfig)
                                        .map(JSONUtil::obj2Json)
                                        .map(json -> JSONUtil.json2Obj(json, AwardConfig.class))
                                        .orElseGet(AwardConfig::new);
                                awardConfigclone.setMoney(
                                        Optional.of(clue.getId())
                                                .filter(specialId::equals)
                                                .map(e -> clueResp.specialReward.longValue())
                                                .orElse(clueResp.otherAverageReward.longValue())
                                );
                                eventActionService.assembleAward(
                                        awardConfigclone,
                                        clue.getAdviserUid(),
                                        clue.getAdviserUid(),
                                        clue.getClueUid(),
                                        eventAction,
                                        new PasMessageParam(),
                                        clue.getId(),
                                        AwardRelationType.Clud.code()
                                );
                            })
                            .forEach(clue -> {
                                clue.setOrderNo(req.orderNo);
                                clue.setCommodityName(req.commodityName);
                                clue.setOrderAmount(req.orderAmount);
                                clue.setReceived(true);
                                clue.setModifyTime(now);
                                clueMapper.updateByPrimaryKeySelective(clue);
                            });
                }
        );

Java 就是这么一门神奇的语言,任何水平的人都能写出可以运行的代码,但是一看代码便知水平高低。

但是这样的 Stream 代码你一定一口老谈不吐不快,请移步下面链接发表评论,领取奖品:

https://gitee.com/oschina/bullshit-codes/blob/master/java/NBStream.java

码云 6 周年,我们正在征集各种坑爹代码,很多奖品等你来拿

详细的参与方法请看  https://gitee.com/oschina/bullshit-codes

------ 分割线 ------

其他坑爹代码吐槽:

玩 Java 的人,刚开始会被各种异常虐,空指针应该是最常见的。多玩两年就开始玩异常,各种奇葩异常玩法层出不穷。

你觉得下面这种异常的定义妥吗?

public class CommandException extends BaseException {

	private static final long serialVersionUID = -6354513454371927970L;
	
	public static CommandException PARAM_NULL= new CommandException("Command_assemble_01", "Parameter is Needed But Empty");
	public static CommandException DEVID_NULL = new CommandException("Command_assemble_02", "DevId Cannot Be Null");
	public static CommandException MDCODE_NULL = new CommandException("Command_assemble_03", "Model Code Cannot Be Empty");
	public static CommandException ORDER_NULL = new CommandException("Command_assemble_04", "Order Cannot Be Empty");
	public static CommandException TYPE_NULL = new CommandException("Command_assemble_05", "Upstream / Downstream Type Cannot Be Empty");
	public static CommandException MENUID_NULL = new CommandException("Command_assemble_06", "Menu Id Cannot Be Null");
	public static CommandException CTRLTYPE_NOT_RANGE= new CommandException("Command_assemble_07", "Ctrltype Cannot Be Recognized, Which is not in Range");
	public static CommandException CMD_NULL = new CommandException("Command_analyze_01", "CMD Cannot Be Null");
	public static CommandException PAYLOAD_NULL = new CommandException("Command_analyze_02", "Payload Cannot Be Null");
	public static CommandException FRAMEWORK_FAILED= new CommandException("Command_analyze_03", "Framework Failed to be Checked");
	public static CommandException CHECK_FAILED= new CommandException("Command_analyze_04", "Command Failed to be Checked");
	public static CommandException CONFIGURE_NOT_EXIST = new CommandException("Command_error_1001", "Configure is not Exist");
	public static CommandException REDIS_ERROR = new CommandException("Command_error_1002", "Cache Command in Redis Error", true);
	
	public CommandException() {
		super();
	}

如果不妥,有什么问题呢? 

请到下面链接发表评论,领取奖品:

https://gitee.com/oschina/bullshit-codes/blob/master/java/BadException.java

码云 6 周年,我们正在征集各种坑爹代码,很多奖品等你来拿

详细的参与方法请看  https://gitee.com/oschina/bullshit-codes

------ 分割线 ------

其他坑爹代码吐槽:

什么样的程序员是一个好程序员呢?当我们在给客户开发系统时候,为了后期的优化,预留一些埋点。

通过对这些埋点的优化,可以让客户瞬间感觉系统在运行速度上有质的飞跃,让公司顺利的签署二期开发合同,收取巨额开发费用。

从公司角度来看,这样的程序员就是一个好程序员。 —— 这句话不是红薯说的!

比如:

/***
 * 为了后期优化查询速度
 */
public class Sleep {
	
	public Object getObect(){
		/***
		  查询代码
		*/
		Thread.sleep(5000)
		return object;
	}

}

我想说的是:凶碟,你下手能否不那么狠啊,建议对代码进行优化,改成 Thread.sleep(1000);  —— 这句话也不是红薯说的。

或者你有什么更好的建议呢?不要觉得骇人听闻,真有这样的人,这样的代码!!!

请到下面链接发表评论,领取奖品:

https://gitee.com/oschina/bullshit-codes/blob/master/java/Sleep.java

另外一种隐性的坑请看:

入职第一天.php

码云 6 周年,我们正在征集各种坑爹代码,很多奖品等你来拿

详细的参与方法请看  https://gitee.com/oschina/bullshit-codes

------ 分割线 ------

其他坑爹代码吐槽:

for 循环和 if 条件判断语句,必不可少吧。但是你见过最多嵌套的循环和条件判断有几层呢?或者说,你最多能容忍多少层的嵌套呢?

我们还是先来看看极端的坑爹代码吧:

// 这个无限循环嵌套,只是总循环的一部分。。。我已经绕晕在黄桷湾立交
if (recordList.size() > start) {
    for (int i = start; i < end; i++) {
        Map<String, Object> map = recordList.get(i);
        Map<String, Object> field11 = (Map<String, Object>) map.get("field"); //name -> code
        Map<String, Object> record11 = (Map<String, Object>) map.get("record"); // code -> value
        String catagory1 = map.get("categoryId").toString();
        //  查询第一种类型对应的其他类型
        SalaryDataVo ss = JSON.parseObject(JSON.toJSONString(map), SalaryDataVo.class);
        Page page3 = salaryManagerService.getAllRecordsByCondition(ss);
        if (page3.getRecords().size() > 0) {
            List<Map<String, Object>> salaryDataVos = page3.getRecords();
            salaryDataVos = this.reSetMap(salaryDataVos,null,null);
            for (Map<String, Object> map2 : salaryDataVos) {
                Map<String, Object> field2 = (Map<String, Object>) map2.get("field");
                Map<String, Object> record2 = (Map<String, Object>) map2.get("record");
                String catagory2 = map2.get("categoryId").toString();
                List<SalaryGroupVO> groupList2 = salaryGroupService.getSalaryGroupsItems(this.getUserCorpId(), catagory2);
                for (SalaryGroupVO cc : groupList2) {
                    cc.setCode(cc.getParentId() + cc.getCode());
                }
                //计算
                for (Map.Entry<String, Object> entity : field2.entrySet()) {
                    String keyName = entity.getKey();
                    for (SalaryGroupVO s2 : groupList2) {
                        if ("bigDecimal".equals(s2.getItemType()) && s2.getCode().equals(field2.get(keyName).toString()) && ("部门" != keyName) && ("姓名" != keyName) && StringUtils.isNotEmpty(s2.getItemType())) {
                            if (field11.containsKey(keyName)) {
                                if (field11.containsKey(keyName)) {
                                    String code1 = field11.get(keyName).toString();
                                    Double newValue = 0.0;
                                    Double oldValue=0.0;
                                    if (!record11.get(code1).toString().matches("^[0-9]*$")) {
                                        oldValue = Double.parseDouble(record11.get(code1).toString());
                                        if (record2.containsKey(entity.getValue().toString()) && (!record2.get(entity.getValue().toString()).toString().matches("^[0-9]*$"))) {
                                            String value2 = record2.get(entity.getValue().toString()).toString();
                                            newValue = Double.parseDouble(value2);
                                        }
                                        record11.remove(field11.get(keyName).toString());
                                    }

我数了数,一共有 11 层的嵌套!!!

吐槽归吐槽,这样的代码逻辑有什么重构的好方法吗?

到下面链接发表评论,领取奖品:

https://gitee.com/oschina/bullshit-codes/blob/master/java/InfiniteCycle

码云 6 周年,我们正在征集各种坑爹代码,很多奖品等你来拿

详细的参与方法请看  https://gitee.com/oschina/bullshit-codes

前两期坑爹代码: