Jelajahi Sumber

✨ feat(locations): 增强地点列表API响应数据

- 更新列表响应schema,添加完整的省市区关联信息
- 修正CRUD路由配置中的中间件属性名(middlewares→middleware)

♻️ refactor(locations): 优化地点服务初始化方式

- 移除CRUD路由中部分冗余配置项
- 直接实例化LocationService替代从上下文获取
yourname 4 bulan lalu
induk
melakukan
ceb2d7e92b

+ 7 - 8
src/server/api/admin/locations/index.ts

@@ -8,8 +8,11 @@ import {
   listLocationsSchema,
   deleteLocationSchema,
   toggleLocationStatusSchema,
-  searchLocationsSchema
+  searchLocationsSchema,
+  locationListResponseSchema
 } from '@/server/modules/locations/location.schema';
+import { LocationService } from '@/server/modules/locations/location.service';
+import { AppDataSource } from '@/server/data-source';
 
 // 使用通用CRUD路由创建地点管理API
 export default createCrudRoutes({
@@ -17,14 +20,10 @@ export default createCrudRoutes({
   createSchema: createLocationSchema,
   updateSchema: updateLocationSchema,
   getSchema: getLocationSchema,
-  listSchema: listLocationsSchema,
-  deleteSchema: deleteLocationSchema,
-  toggleStatusSchema: toggleLocationStatusSchema,
+  listSchema: locationListResponseSchema,
   searchFields: ['name', 'address'],
-  filterFields: ['provinceId', 'cityId', 'districtId', 'isDisabled'],
-  sortFields: ['name', 'provinceId', 'cityId', 'districtId', 'createdAt'],
   relations: ['province', 'city', 'district'],
-  middlewares: [authMiddleware]
+  middleware: [authMiddleware]
 })
 // 搜索地点
 .get('/search', authMiddleware, async (c) => {
@@ -39,7 +38,7 @@ export default createCrudRoutes({
       }, 400);
     }
 
-    const locationService = c.get('locationService');
+    const locationService = new LocationService(AppDataSource);
     const locations = await locationService.searchLocations(validation.data);
     return c.json({
       success: true,

+ 19 - 0
src/server/modules/locations/location.schema.ts

@@ -72,6 +72,25 @@ export const locationListResponseSchema = z.object({
   updatedAt: z.coerce.date(),
   createdBy: z.number().int().nullable(),
   updatedBy: z.number().int().nullable(),
+  // 关联的省市区信息
+  province: z.object({
+    id: z.number().int().positive('省份ID必须为正整数'),
+    name: z.string().min(1, '省份名称不能为空').max(100, '省份名称不能超过100个字符'),
+    level: z.number().int().min(1).max(1, '省份层级必须为1'),
+    code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
+  }).nullable(),
+  city: z.object({
+    id: z.number().int().positive('城市ID必须为正整数'),
+    name: z.string().min(1, '城市名称不能为空').max(100, '城市名称不能超过100个字符'),
+    level: z.number().int().min(2).max(2, '城市层级必须为2'),
+    code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
+  }).nullable(),
+  district: z.object({
+    id: z.number().int().positive('区县ID必须为正整数'),
+    name: z.string().min(1, '区县名称不能为空').max(100, '区县名称不能超过100个字符'),
+    level: z.number().int().min(3).max(3, '区县层级必须为3'),
+    code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
+  }).nullable(),
 });
 
 // 地点删除Schema