作為一個記帳工具,讀取一周的帳目是非常重要的,這樣我們才能知道這周花了多少錢,錢都花在哪裡。
而這也是我們後端開發路程中記帳類別的最後一個API,完成這一天後,就要來到前端的開發了。
這個部分也是把基本的參數應用的項目,在後端的部分我們會根據年分與周數來取得區間,當大家會應用之後,也可以去開發指定月份的區間。
那就讓我們開始吧!
整個開發的邏輯依然是照著Repository-Service-Controller的架構開發,取得周數這並不是基本的CRUD,所以我們在Repository的地方也要新增方法,我們要新增的是findAllByDateBetween這個方法,提供開始日期與結束日期,所以程式會如下:
package net.Eric.accounting.repository;
import java.time.LocalDateTime;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import net.Eric.accounting.entity.Account;
public interface AccountRepository extends JpaRepository<Account, Long>{
List<Account> findByCategory(String category);
List<Account> findAllByDateBetween(LocalDateTime startDate, LocalDateTime endDate);
}
在前面已經一起實作的夥伴們應該已經非常熟練,而到了Service層,一樣也是先建立Serivce,然後再建立Impl層
這個部分我們要新增getAccountsForWeek這個功能,根據年分與周數來提供查詢資料
package net.Eric.accounting.service;
import java.util.List;
import net.Eric.accounting.dto.AccountDto;
public interface AccountsService {
AccountDto createAccount(AccountDto accountDto);
AccountDto getAccount(Long id);
List<AccountDto> getAllAccounts();
AccountDto updateAccount(AccountDto accountDto,Long id);
void deleteAccount(Long id);
List<AccountDto> getAllAccountsByCategory(String category);
public List<AccountDto> getAccountsForWeek(int year, int weekNumber);
}
這個部分就比較複雜,整體的概念是抓取到開始到結束的日子,丟到我們的Repository裡面,那要取得到開始到結束的時間,先根據年分與周數,取得開始的周與結束的周,然後再去取得當周的第一天資料,以及當周的最後一天資料,最後再找出當周第一天與最後一天的時間,再取得完整之後才去呼叫Repository的功能去取得所有資料,再取得之後呢,return的部分要轉換成前端要用的形式,所以要再用stream與map來處理資料
@Override
public List<AccountDto> getAccountsForWeek(int year, int weekNumber) {
// 獲取指定年份和周數的第一天
LocalDate startOfWeek = LocalDate.of(year, 1, 1)
.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)) // 找到當年第一個星期
.plusWeeks(weekNumber - 1); // 根據數值調整
// 獲得該周的最後一天
LocalDate endOfWeek = startOfWeek.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
// 轉換為LocalDateTime来表示一天的開始和结束時間
LocalDateTime startDateTime = startOfWeek.atStartOfDay(); // 周開始的时間(00:00)
LocalDateTime endDateTime = endOfWeek.atTime(23, 59, 59); // 周结束的时間(23:59:59)
List<Account> accounts = accountRepository.findAllByCreateDateBetween(startDateTime, endDateTime);
return accounts.stream().map((account)->modelMapper.map(account,AccountDto.class)).collect(Collectors.toList());
}
完成之後,就來到controller,GetMapping中輸入week來跟其他的API做區別,並且在其中輸入年與周數,取得這些資料之後,直接呼叫Service的功能,即可以得到完整的當周周數清單。
@GetMapping("week/{year}/{weekNumber}")
public ResponseEntity<List<AccountDto>> getAccountsForWeek(@PathVariable("year") int year, @PathVariable("weekNumber") int weekNumber){
List<AccountDto> accountDtos = accountsService.getAccountsForWeek(year, weekNumber);
return new ResponseEntity<>(accountDtos,HttpStatus.OK);
}
記得要重新啟動Spring boot,啟動的方式之前有教,大家也可以用eclispe畫面上方的工具,直接點一下來重新啟動或者停止Spring boot
最後就來到測試環節,之前有教大家創建測試的資料夾,接下來就是新增一個Get的API,然後輸入
http://localhost:8080/api/accounts/week/{年}/{周}
請大家在測試前先回到資料庫中,確定這個時間已經有資料,可以新增資料,也可以調整post的資料來嘗試取得
測試最後出現了資料,就代表我們已經成功執行了!
到了這裡,恭喜你已經完成整個API的開發,對於後端的開發方式非常熟練了!