|
|
@@ -1,13 +1,15 @@
|
|
|
import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
|
|
|
import { z } from '@hono/zod-openapi';
|
|
|
+import { AreaService } from '@/server/modules/areas/area.service';
|
|
|
+import { AreaLevel } from '@/server/modules/areas/area.entity';
|
|
|
|
|
|
// 省份查询参数Schema
|
|
|
const getProvincesSchema = z.object({
|
|
|
- page: z.coerce.number().int().min(1).default(1).openapi({
|
|
|
+ page: z.coerce.number<number>().int().min(1).default(1).openapi({
|
|
|
example: 1,
|
|
|
description: '页码'
|
|
|
}),
|
|
|
- pageSize: z.coerce.number().int().min(1).max(100).default(50).openapi({
|
|
|
+ pageSize: z.coerce.number<number>().int().min(1).max(100).default(50).openapi({
|
|
|
example: 50,
|
|
|
description: '每页数量'
|
|
|
})
|
|
|
@@ -15,15 +17,15 @@ const getProvincesSchema = z.object({
|
|
|
|
|
|
// 城市查询参数Schema
|
|
|
const getCitiesSchema = z.object({
|
|
|
- provinceId: z.coerce.number().int().positive('省份ID必须为正整数').openapi({
|
|
|
+ provinceId: z.coerce.number<number>().int().positive('省份ID必须为正整数').openapi({
|
|
|
example: 1,
|
|
|
description: '省份ID'
|
|
|
}),
|
|
|
- page: z.coerce.number().int().min(1).default(1).openapi({
|
|
|
+ page: z.coerce.number<number>().int().min(1).default(1).openapi({
|
|
|
example: 1,
|
|
|
description: '页码'
|
|
|
}),
|
|
|
- pageSize: z.coerce.number().int().min(1).max(100).default(50).openapi({
|
|
|
+ pageSize: z.coerce.number<number>().int().min(1).max(100).default(50).openapi({
|
|
|
example: 50,
|
|
|
description: '每页数量'
|
|
|
})
|
|
|
@@ -31,15 +33,15 @@ const getCitiesSchema = z.object({
|
|
|
|
|
|
// 区县查询参数Schema
|
|
|
const getDistrictsSchema = z.object({
|
|
|
- cityId: z.coerce.number().int().positive('城市ID必须为正整数').openapi({
|
|
|
+ cityId: z.coerce.number<number>().int().positive('城市ID必须为正整数').openapi({
|
|
|
example: 34,
|
|
|
description: '城市ID'
|
|
|
}),
|
|
|
- page: z.coerce.number().int().min(1).default(1).openapi({
|
|
|
+ page: z.coerce.number<number>().int().min(1).default(1).openapi({
|
|
|
example: 1,
|
|
|
description: '页码'
|
|
|
}),
|
|
|
- pageSize: z.coerce.number().int().min(1).max(100).default(50).openapi({
|
|
|
+ pageSize: z.coerce.number<number>().int().min(1).max(100).default(50).openapi({
|
|
|
example: 50,
|
|
|
description: '每页数量'
|
|
|
})
|
|
|
@@ -184,25 +186,15 @@ const app = new OpenAPIHono()
|
|
|
.openapi(getProvincesRoute, async (c) => {
|
|
|
try {
|
|
|
const { page, pageSize } = c.req.valid('query');
|
|
|
+ const areaService = new AreaService();
|
|
|
|
|
|
- // 模拟省份数据
|
|
|
- const mockProvinces = [
|
|
|
- { id: 1, name: '北京市', code: '110000', level: 1, parentId: null },
|
|
|
- { id: 2, name: '天津市', code: '120000', level: 1, parentId: null },
|
|
|
- { id: 3, name: '河北省', code: '130000', level: 1, parentId: null },
|
|
|
- { id: 4, name: '山西省', code: '140000', level: 1, parentId: null },
|
|
|
- { id: 5, name: '内蒙古自治区', code: '150000', level: 1, parentId: null },
|
|
|
- { id: 6, name: '辽宁省', code: '210000', level: 1, parentId: null },
|
|
|
- { id: 7, name: '吉林省', code: '220000', level: 1, parentId: null },
|
|
|
- { id: 8, name: '黑龙江省', code: '230000', level: 1, parentId: null },
|
|
|
- { id: 9, name: '上海市', code: '310000', level: 1, parentId: null },
|
|
|
- { id: 10, name: '江苏省', code: '320000', level: 1, parentId: null }
|
|
|
- ];
|
|
|
+ // 获取所有省份数据
|
|
|
+ const provinces = await areaService.getAreaTreeByLevel(AreaLevel.PROVINCE);
|
|
|
|
|
|
// 分页
|
|
|
const startIndex = (page - 1) * pageSize;
|
|
|
const endIndex = startIndex + pageSize;
|
|
|
- const paginatedProvinces = mockProvinces.slice(startIndex, endIndex);
|
|
|
+ const paginatedProvinces = provinces.slice(startIndex, endIndex);
|
|
|
|
|
|
return c.json({
|
|
|
success: true,
|
|
|
@@ -211,8 +203,8 @@ const app = new OpenAPIHono()
|
|
|
pagination: {
|
|
|
page,
|
|
|
pageSize,
|
|
|
- total: mockProvinces.length,
|
|
|
- totalPages: Math.ceil(mockProvinces.length / pageSize)
|
|
|
+ total: provinces.length,
|
|
|
+ totalPages: Math.ceil(provinces.length / pageSize)
|
|
|
}
|
|
|
},
|
|
|
message: '获取省份列表成功'
|
|
|
@@ -228,23 +220,11 @@ const app = new OpenAPIHono()
|
|
|
.openapi(getCitiesRoute, async (c) => {
|
|
|
try {
|
|
|
const { provinceId, page, pageSize } = c.req.valid('query');
|
|
|
+ const areaService = new AreaService();
|
|
|
|
|
|
- // 模拟城市数据(基于省份ID)
|
|
|
- const mockCities = {
|
|
|
- 1: [ // 北京市
|
|
|
- { id: 11, name: '北京市', code: '110100', level: 2, parentId: 1 }
|
|
|
- ],
|
|
|
- 9: [ // 上海市
|
|
|
- { id: 31, name: '上海市', code: '310100', level: 2, parentId: 9 }
|
|
|
- ],
|
|
|
- 10: [ // 江苏省
|
|
|
- { id: 32, name: '南京市', code: '320100', level: 2, parentId: 10 },
|
|
|
- { id: 33, name: '苏州市', code: '320500', level: 2, parentId: 10 },
|
|
|
- { id: 34, name: '无锡市', code: '320200', level: 2, parentId: 10 }
|
|
|
- ]
|
|
|
- };
|
|
|
-
|
|
|
- const cities = mockCities[provinceId] || [];
|
|
|
+ // 获取指定省份下的所有城市
|
|
|
+ const allCities = await areaService.getAreaTreeByLevel(AreaLevel.CITY);
|
|
|
+ const cities = allCities.filter(city => city.parentId === provinceId);
|
|
|
|
|
|
// 分页
|
|
|
const startIndex = (page - 1) * pageSize;
|
|
|
@@ -275,33 +255,11 @@ const app = new OpenAPIHono()
|
|
|
.openapi(getDistrictsRoute, async (c) => {
|
|
|
try {
|
|
|
const { cityId, page, pageSize } = c.req.valid('query');
|
|
|
+ const areaService = new AreaService();
|
|
|
|
|
|
- // 模拟区县数据(基于城市ID)
|
|
|
- const mockDistricts = {
|
|
|
- 11: [ // 北京市
|
|
|
- { id: 110101, name: '东城区', code: '110101', level: 3, parentId: 11 },
|
|
|
- { id: 110102, name: '西城区', code: '110102', level: 3, parentId: 11 },
|
|
|
- { id: 110105, name: '朝阳区', code: '110105', level: 3, parentId: 11 },
|
|
|
- { id: 110106, name: '丰台区', code: '110106', level: 3, parentId: 11 },
|
|
|
- { id: 110107, name: '石景山区', code: '110107', level: 3, parentId: 11 }
|
|
|
- ],
|
|
|
- 31: [ // 上海市
|
|
|
- { id: 310101, name: '黄浦区', code: '310101', level: 3, parentId: 31 },
|
|
|
- { id: 310104, name: '徐汇区', code: '310104', level: 3, parentId: 31 },
|
|
|
- { id: 310105, name: '长宁区', code: '310105', level: 3, parentId: 31 },
|
|
|
- { id: 310106, name: '静安区', code: '310106', level: 3, parentId: 31 },
|
|
|
- { id: 310107, name: '普陀区', code: '310107', level: 3, parentId: 31 }
|
|
|
- ],
|
|
|
- 34: [ // 无锡市
|
|
|
- { id: 320202, name: '梁溪区', code: '320202', level: 3, parentId: 34 },
|
|
|
- { id: 320205, name: '锡山区', code: '320205', level: 3, parentId: 34 },
|
|
|
- { id: 320206, name: '惠山区', code: '320206', level: 3, parentId: 34 },
|
|
|
- { id: 320211, name: '滨湖区', code: '320211', level: 3, parentId: 34 },
|
|
|
- { id: 320214, name: '新吴区', code: '320214', level: 3, parentId: 34 }
|
|
|
- ]
|
|
|
- };
|
|
|
-
|
|
|
- const districts = mockDistricts[cityId] || [];
|
|
|
+ // 获取指定城市下的所有区县
|
|
|
+ const allDistricts = await areaService.getAreaTreeByLevel(AreaLevel.DISTRICT);
|
|
|
+ const districts = allDistricts.filter(district => district.parentId === cityId);
|
|
|
|
|
|
// 分页
|
|
|
const startIndex = (page - 1) * pageSize;
|