问题描述

大三了,一年一度的软件设计与编程实践到来了。

继今年的软件工程实验之后第二个大实验;要求类似,多用户登录的复杂系统,软件工程实验要求五个下午,本实验要求八个上午。

感谢Spring Data JPA,此框架真的是实验利器,大大提高了开发效率。

感谢团队,感谢潘老师。要不我可能也要和我的同学一样一起学Tomcat,写Servlet,生连JDBC,手写SELECT,最后把实验写黄。

clipboard.png

需求描述

三个角色:货主、司机、管理员。

clipboard.png

管理员负责维护基础信息,就是基础模块的增删改查,就是实体有点多。

clipboard.png

主要的就是业务流程:

货主在平台发起订单,司机能综合查询相关订单。

司机进行抢单,一个单可以被多个司机抢,然后货主选择我这批货由哪个司机进行承运,并进行付款。

司机能更改运输状态,当货物到站时,货主确认后,平台将经过抽成的钱转给司机。

问题

Spring Data JPA

@RepositoryRestResource(path = "Tax")
public interface TaxRepository extends JpaRepository<Tax, Long> {
    Tax findByMinPriceLessThanAndMaxPriceGreaterThanEqual(BigDecimal priceMin, BigDecimal priceMax);
}

直接在仓库接口上加注解,然后就在当前的path上生成了增删改查、分页、排序等接口。

这个框架用是很好用,就是有一个问题,查询数据时后台不序列化id

id: 1
name: zhangsan
age: 18

假如数据表中由这样一个实体,如果调用getAll接口的话,返回的却是这样的数据。

[{
    name: zhangsan,
    age: 18
}]

没有id在首页显示是没问题的,但是如果编辑的时候怎么办呢?

查找官方文档,实现RepositoryRestConfigurer接口,在configureRepositoryRestConfiguration中配置为哪个实体暴露id

@Configuration
public class CustomRestConfiguration implements RepositoryRestConfigurer {

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(GoodCategory.class)
                .exposeIdsFor(OrderDetail.class)
                .exposeIdsFor(Orders.class)
                .exposeIdsFor(Payment.class)
                .exposeIdsFor(Price.class)
                .exposeIdsFor(Tax.class)
                .exposeIdsFor(User.class)
                .exposeIdsFor(Vehicle.class);
    }
}

地图

clipboard.png

我们设计的是货主发起订单时的出发地与目的地都是在百度地图上选的。

所以,需要解决三个问题:

  1. 定位当前位置,点开地图时默认是这个位置。
  2. 用户选择了位置,我怎么知道选的是哪个地方?
  3. 计算出发地与目的地之间的距离,用于计算总价。

设计

和之前写定时任务不知道本初子午线一样,解决地图问题的时候,又暴露了我地理没学好的缺陷。

一直想怎么存储位置呢?后来学习了一下百度地图的开发文档发现,经纬度是最好的解决方法。

经纬度唯一地标识一个位置,我们可以根据经纬度再去百度查这个经纬度是一个什么地点。

最后就是这么设计的,先选出经纬度,然后前台去根据当前选中的经纬度去百度要数据,这个经纬度对应的是哪个市哪个区那条街?同时根据起点与终点调百度的接口查询距离是多少。

private String startPlace;                // 起点

private String endPlace;                  // 终点

private Float startLongitude;             // 起点经度

private Float startLatitude;              // 起点纬度

private Float endLongitude;               // 终点经度

private Float endLatitude;                // 终点纬度

private Float distance;                   // 运输距离

定位

百度地图开放平台上的DEMO特别详细,有四种定位方式确定当前用户在哪,我们采用的是根据ip的定位方式,虽然距离不太精确,但对于实验来说足够了。

clipboard.png

算距离

clipboard.png

发现百度地图的api和我想象中的有差距,点开获取两点间的距离,没想到竟然是勾股定理。

综合查询

司机查订单的时候,用到了团队的核心库。

想把这个YunzhiService的实例放到我的应用上下文中。

@Configuration
public class BeanConfig {

    @Bean
    public YunzhiService yunzhiService() {
        return new YunzhiServiceImpl();
    }
}

总结

弃用

虽然不太愿意承认,但是当我帮同学装环境的时候,npm提示grunt不推荐使用。新技术将至。

README

文档对于一个项目的参考价值来说十分重要,我之前在Github上看到过不少开源的项目,我看过以后觉得毫无参考价值,一个文档都不写,这个项目开源对他人来说有何意义吗?

物流运输平台 - Github

clipboard.png

深觉文档的价值,以后开源的每个项目,不管代码如何,在至少保证文档齐全。至少保证我这个项目开源,对他人有意义!


张喜硕
2.1k 声望423 粉丝

浅梦辄止,书墨未浓。