| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- import { OpenAPIHono } from '@hono/zod-openapi';
- import { createRoute, z } from '@hono/zod-openapi';
- import { authMiddleware } from '@d8d/auth-module';
- import { AreaService } from '../../modules/areas/area.service';
- import { AreaLevel } from '../../modules/areas/area.entity';
- // 获取完整树形结构
- const getAreaTreeRoute = createRoute({
- method: 'get',
- path: '/tree',
- description: '获取完整的省市区树形结构',
- tags: ['省市区管理'],
- middleware: [authMiddleware],
- responses: {
- 200: {
- description: '成功获取树形结构',
- content: {
- 'application/json': {
- schema: z.object({
- success: z.boolean(),
- data: z.array(z.object({
- id: z.number(),
- parentId: z.number().nullable(),
- name: z.string(),
- level: z.number(),
- code: z.string(),
- isDisabled: z.number(),
- children: z.array(z.any()).optional()
- }))
- })
- }
- }
- },
- 500: {
- description: '服务器错误',
- content: {
- 'application/json': {
- schema: z.object({
- success: z.boolean(),
- error: z.string()
- })
- }
- }
- }
- }
- });
- // 根据层级获取树形结构
- const getAreaTreeByLevelRoute = createRoute({
- method: 'get',
- path: '/tree/level/{level}',
- description: '根据层级获取树形结构',
- tags: ['省市区管理'],
- middleware: [authMiddleware],
- request: {
- params: z.object({
- level: z.coerce.number().min(1).max(3)
- })
- },
- responses: {
- 200: {
- description: '成功获取层级树形结构',
- content: {
- 'application/json': {
- schema: z.object({
- success: z.boolean(),
- data: z.array(z.object({
- id: z.number(),
- parentId: z.number().nullable(),
- name: z.string(),
- level: z.number(),
- code: z.string(),
- isDisabled: z.number(),
- children: z.array(z.any()).optional()
- }))
- })
- }
- }
- },
- 500: {
- description: '服务器错误',
- content: {
- 'application/json': {
- schema: z.object({
- success: z.boolean(),
- error: z.string()
- })
- }
- }
- }
- }
- });
- // 获取子树
- const getSubTreeRoute = createRoute({
- method: 'get',
- path: '/tree/{id}',
- description: '获取指定节点的子树',
- tags: ['省市区管理'],
- middleware: [authMiddleware],
- request: {
- params: z.object({
- id: z.coerce.number().positive('区域ID必须为正整数')
- })
- },
- responses: {
- 200: {
- description: '成功获取子树',
- content: {
- 'application/json': {
- schema: z.object({
- success: z.boolean(),
- data: z.object({
- id: z.number(),
- parentId: z.number().nullable(),
- name: z.string(),
- level: z.number(),
- code: z.string(),
- isDisabled: z.number(),
- children: z.array(z.any()).optional()
- }).nullable()
- })
- }
- }
- },
- 404: {
- description: '区域不存在',
- content: {
- 'application/json': {
- schema: z.object({
- success: z.boolean(),
- error: z.string()
- })
- }
- }
- },
- 500: {
- description: '服务器错误',
- content: {
- 'application/json': {
- schema: z.object({
- success: z.boolean(),
- error: z.string()
- })
- }
- }
- }
- }
- });
- // 获取区域路径
- const getAreaPathRoute = createRoute({
- method: 'get',
- path: '/path/{id}',
- description: '获取区域路径(从根节点到当前节点)',
- tags: ['省市区管理'],
- middleware: [authMiddleware],
- request: {
- params: z.object({
- id: z.coerce.number().positive('区域ID必须为正整数')
- })
- },
- responses: {
- 200: {
- description: '成功获取区域路径',
- content: {
- 'application/json': {
- schema: z.object({
- success: z.boolean(),
- data: z.array(z.object({
- id: z.number(),
- parentId: z.number().nullable(),
- name: z.string(),
- level: z.number(),
- code: z.string(),
- isDisabled: z.number()
- }))
- })
- }
- }
- },
- 404: {
- description: '区域不存在',
- content: {
- 'application/json': {
- schema: z.object({
- success: z.boolean(),
- error: z.string()
- })
- }
- }
- },
- 500: {
- description: '服务器错误',
- content: {
- 'application/json': {
- schema: z.object({
- success: z.boolean(),
- error: z.string()
- })
- }
- }
- }
- }
- });
- const app = new OpenAPIHono()
- // 注册路由 - 使用链式结构
- .openapi(getAreaTreeRoute, async (c) => {
- const areaService = new AreaService(c.var.dataSource);
- try {
- const treeData = await areaService.getAreaTree();
- return c.json({
- success: true,
- data: treeData
- }, 200);
- } catch (error) {
- console.error('获取省市区树形结构失败:', error);
- return c.json({
- success: false,
- error: '获取省市区树形结构失败'
- }, 500);
- }
- })
- .openapi(getAreaTreeByLevelRoute, async (c) => {
- const areaService = new AreaService(c.var.dataSource);
- try {
- const { level } = c.req.valid('param');
- const treeData = await areaService.getAreaTreeByLevel(level);
- return c.json({
- success: true,
- data: treeData
- }, 200);
- } catch (error) {
- console.error('获取层级树形结构失败:', error);
- return c.json({
- success: false,
- error: '获取层级树形结构失败'
- }, 500);
- }
- })
- .openapi(getSubTreeRoute, async (c) => {
- const areaService = new AreaService(c.var.dataSource);
- try {
- const { id } = c.req.valid('param');
- const subTree = await areaService.getSubTree(id);
- if (!subTree) {
- return c.json({
- success: false,
- error: '区域不存在'
- }, 404);
- }
- return c.json({
- success: true,
- data: subTree
- }, 200);
- } catch (error) {
- console.error('获取子树失败:', error);
- return c.json({
- success: false,
- error: '获取子树失败'
- }, 500);
- }
- })
- .openapi(getAreaPathRoute, async (c) => {
- const areaService = new AreaService(c.var.dataSource);
- try {
- const { id } = c.req.valid('param');
- const path = await areaService.getAreaPath(id);
- if (path.length === 0) {
- return c.json({
- success: false,
- error: '区域不存在'
- }, 404);
- }
- return c.json({
- success: true,
- data: path
- }, 200);
- } catch (error) {
- console.error('获取区域路径失败:', error);
- return c.json({
- success: false,
- error: '获取区域路径失败'
- }, 500);
- }
- });
- export default app;
|