update new version
This commit is contained in:
@@ -4,7 +4,7 @@ import '../auth_manager.dart'; // 確保引入 AuthManager
|
||||
|
||||
// 共用 API 常數
|
||||
const String BASE_IP = "https://api.gex.com.tw:8033";
|
||||
const String COMMON_API_ENDPOINT = "xapi/v2/eis_demo/orm_api_v2/3/";
|
||||
const String COMMON_API_ENDPOINT = "xapi/v2/eis_demo/orm_api_v2/2/";
|
||||
const String COMMON_API_URL = "$BASE_IP/$COMMON_API_ENDPOINT";
|
||||
|
||||
class GenericApiService {
|
||||
@@ -15,20 +15,20 @@ class GenericApiService {
|
||||
/// [pk] : 主鍵欄位名稱 (API 參數)
|
||||
/// [queryFilter] : 查詢過濾條件 (API 參數)
|
||||
/// [fromJson] : 將 Map 轉換為物件的工廠方法 (例如 Announcement.fromJson)
|
||||
/// [action] : API 動作指令,預設為 'P'
|
||||
Future<List<T>> fetchList<T>({
|
||||
required String tableName,
|
||||
required String pk,
|
||||
required String queryFilter,
|
||||
required T Function(Map<String, dynamic>) fromJson,
|
||||
Map<String, String>? additionalParams, // 允許傳入額外參數 (如分頁)
|
||||
String action = 'P', // 對應 index.js 中的 _$_action
|
||||
Map<String, dynamic> data = const {}, // 存放實際要存入資料庫的欄位值
|
||||
}) async {
|
||||
|
||||
// 1. 讀取 Token
|
||||
// 1. 讀取 Token (index.js 會優先檢查 body.token)
|
||||
String? token = await AuthManager.getToken();
|
||||
if (token == null) {
|
||||
print("錯誤:未找到登入 Token");
|
||||
// 根據需求決定是否拋出錯誤或回傳空陣列
|
||||
throw Exception('未登入');
|
||||
throw Exception('未登入:找不到有效 Token');
|
||||
}
|
||||
|
||||
// 2. 建立 API 參數
|
||||
@@ -36,14 +36,16 @@ class GenericApiService {
|
||||
"token": token,
|
||||
"_\$_tableName": tableName,
|
||||
"_\$_pk": pk,
|
||||
"_\$_action": "P",
|
||||
"_\$_action": action, // [修改] 使用傳入的參數
|
||||
"_\$_query_filter": queryFilter,
|
||||
};
|
||||
|
||||
// 如果有額外參數,合併進去
|
||||
if (additionalParams != null) {
|
||||
params.addAll(additionalParams);
|
||||
}
|
||||
// 3. 處理動態資料欄位 (將所有 value 轉為 String 以符合 http.post body 要求)
|
||||
data.forEach((key, value) {
|
||||
if (value != null) {
|
||||
params[key] = value.toString();
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
final response = await http.post(
|
||||
@@ -57,28 +59,36 @@ class GenericApiService {
|
||||
if (response.statusCode == 200) {
|
||||
final Map<String, dynamic> responseData = json.decode(response.body);
|
||||
|
||||
// 檢查 code
|
||||
if (responseData['code'] == 0) {
|
||||
// 【修正】同時相容大寫 Code 與小寫 code
|
||||
final int code = responseData['code'] ?? responseData['Code'] ?? -1;
|
||||
|
||||
// 檢查後端回傳的 code
|
||||
if (code == 0) {
|
||||
final dynamic dataObject = responseData['data'];
|
||||
|
||||
// 檢查結構是否正確 (data -> items List)
|
||||
// 處理 index.js 回傳的資料結構 (data -> items)
|
||||
if (dataObject is Map && dataObject['items'] is List) {
|
||||
List<dynamic> listJson = dataObject['items'];
|
||||
|
||||
// 核心魔法:使用傳入的 fromJson 函數將資料轉換為 T 類型
|
||||
return listJson.map((json) => fromJson(json as Map<String, dynamic>)).toList();
|
||||
} else {
|
||||
return []; // 結構不符或無資料
|
||||
} else if (dataObject is Map) {
|
||||
// 處理直接回傳單一物件的情況
|
||||
return [fromJson(dataObject as Map<String, dynamic>)];
|
||||
}
|
||||
// 若直接回傳 List (部分 action 可能直接回傳 dataResult)
|
||||
else if (dataObject is List) {
|
||||
return dataObject.map((json) => fromJson(json as Map<String, dynamic>)).toList();
|
||||
}
|
||||
return [];
|
||||
} else {
|
||||
throw Exception(responseData['msg'] ?? 'API 邏輯錯誤');
|
||||
print("API 錯誤: ${responseData['msg'] ?? responseData['message']}");
|
||||
return [];
|
||||
}
|
||||
} else {
|
||||
throw Exception('HTTP 錯誤: ${response.statusCode}');
|
||||
}
|
||||
} catch (e) {
|
||||
print('API 請求錯誤 ($tableName): $e');
|
||||
throw Exception('無法載入資料: $e');
|
||||
print("GenericApiService 發生異常: $e");
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user