iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
Modern Web

前後端整合,用Spring boot 與React 開發屬於自己的記帳網頁系列 第 12

Day12 創建後端讀取指定周數時間帳目的特殊API

  • 分享至 

  • xImage
  •  

前言

作為一個記帳工具,讀取一周的帳目是非常重要的,這樣我們才能知道這周花了多少錢,錢都花在哪裡。

而這也是我們後端開發路程中記帳類別的最後一個API,完成這一天後,就要來到前端的開發了。

這個部分也是把基本的參數應用的項目,在後端的部分我們會根據年分與周數來取得區間,當大家會應用之後,也可以去開發指定月份的區間。

那就讓我們開始吧!

Repository設置

整個開發的邏輯依然是照著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層

Service層建立

這個部分我們要新增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);
}

ServiceImpl層開發

這個部分就比較複雜,整體的概念是抓取到開始到結束的日子,丟到我們的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的功能,即可以得到完整的當周周數清單。

Controller開發

	@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
https://ithelp.ithome.com.tw/upload/images/20240922/20152864X7RplAVCxd.png

API測試

最後就來到測試環節,之前有教大家創建測試的資料夾,接下來就是新增一個Get的API,然後輸入
http://localhost:8080/api/accounts/week/{年}/{周}
https://ithelp.ithome.com.tw/upload/images/20240922/20152864HkwnzKzxGG.png
請大家在測試前先回到資料庫中,確定這個時間已經有資料,可以新增資料,也可以調整post的資料來嘗試取得
https://ithelp.ithome.com.tw/upload/images/20240922/20152864P3u5YaxneE.png

https://ithelp.ithome.com.tw/upload/images/20240922/20152864vq5EjTNAs6.png
測試最後出現了資料,就代表我們已經成功執行了!
到了這裡,恭喜你已經完成整個API的開發,對於後端的開發方式非常熟練了!


上一篇
Day11 開發根據不同類別篩選帳目API
下一篇
Day13 React & Vite介紹與啟動第一個前端專案
系列文
前後端整合,用Spring boot 與React 開發屬於自己的記帳網頁30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言