Преглед изворни кода

♻️ refactor(areas): 重构省市区管理API实现

- 删除自定义路由实现,统一使用通用CRUD路由
- 移除冗余的area.service.ts文件
- 更新列表响应验证schema为areaListResponseSchema
- 精简CRUD配置选项,移除filterFields和sortFields
- 修正middleware配置项名称(middlewares→middleware)
yourname пре 4 месеци
родитељ
комит
826709a214
2 измењених фајлова са 4 додато и 369 уклоњено
  1. 4 173
      src/server/api/admin/areas/index.ts
  2. 0 196
      src/server/modules/areas/area.service.ts

+ 4 - 173
src/server/api/admin/areas/index.ts

@@ -5,12 +5,7 @@ import {
   createAreaSchema,
   updateAreaSchema,
   getAreaSchema,
-  listAreasSchema,
-  deleteAreaSchema,
-  toggleAreaStatusSchema,
-  getAreasByLevelSchema,
-  getChildAreasSchema,
-  getAreaPathSchema
+  areaListResponseSchema
 } from '@/server/modules/areas/area.schema';
 
 // 使用通用CRUD路由创建省市区管理API
@@ -19,172 +14,8 @@ export default createCrudRoutes({
   createSchema: createAreaSchema,
   updateSchema: updateAreaSchema,
   getSchema: getAreaSchema,
-  listSchema: listAreasSchema,
-  deleteSchema: deleteAreaSchema,
-  toggleStatusSchema: toggleAreaStatusSchema,
+  listSchema: areaListResponseSchema,
   searchFields: ['name', 'code'],
-  filterFields: ['level', 'parentId', 'isDisabled'],
-  sortFields: ['name', 'level', 'code', 'createdAt'],
   relations: ['parent', 'children'],
-  middlewares: [authMiddleware]
-})
-// 获取省份列表
-.get('/provinces', authMiddleware, async (c) => {
-  try {
-    const areaService = c.get('areaService');
-    const provinces = await areaService.getProvinces();
-    return c.json({
-      success: true,
-      data: provinces,
-      message: '获取省份列表成功'
-    });
-  } catch (error) {
-    console.error('获取省份列表失败:', error);
-    return c.json({
-      success: false,
-      message: '获取省份列表失败',
-      error: error instanceof Error ? error.message : '未知错误'
-    }, 500);
-  }
-})
-// 根据省份ID获取城市列表
-.get('/cities', authMiddleware, async (c) => {
-  try {
-    const { provinceId } = c.req.query();
-    if (!provinceId) {
-      return c.json({
-        success: false,
-        message: '缺少省份ID参数'
-      }, 400);
-    }
-
-    const areaService = c.get('areaService');
-    const cities = await areaService.getCitiesByProvinceId(Number(provinceId));
-    return c.json({
-      success: true,
-      data: cities,
-      message: '获取城市列表成功'
-    });
-  } catch (error) {
-    console.error('获取城市列表失败:', error);
-    return c.json({
-      success: false,
-      message: '获取城市列表失败',
-      error: error instanceof Error ? error.message : '未知错误'
-    }, 500);
-  }
-})
-// 根据城市ID获取区县列表
-.get('/districts', authMiddleware, async (c) => {
-  try {
-    const { cityId } = c.req.query();
-    if (!cityId) {
-      return c.json({
-        success: false,
-        message: '缺少城市ID参数'
-      }, 400);
-    }
-
-    const areaService = c.get('areaService');
-    const districts = await areaService.getDistrictsByCityId(Number(cityId));
-    return c.json({
-      success: true,
-      data: districts,
-      message: '获取区县列表成功'
-    });
-  } catch (error) {
-    console.error('获取区县列表失败:', error);
-    return c.json({
-      success: false,
-      message: '获取区县列表失败',
-      error: error instanceof Error ? error.message : '未知错误'
-    }, 500);
-  }
-})
-// 获取省市区完整路径
-.get('/:id/path', authMiddleware, async (c) => {
-  try {
-    const id = Number(c.req.param('id'));
-    const validation = getAreaPathSchema.safeParse({ id });
-    if (!validation.success) {
-      return c.json({
-        success: false,
-        message: '参数验证失败',
-        errors: validation.error.errors
-      }, 400);
-    }
-
-    const areaService = c.get('areaService');
-    const path = await areaService.getAreaPath(id);
-    return c.json({
-      success: true,
-      data: path,
-      message: '获取省市区路径成功'
-    });
-  } catch (error) {
-    console.error('获取省市区路径失败:', error);
-    return c.json({
-      success: false,
-      message: '获取省市区路径失败',
-      error: error instanceof Error ? error.message : '未知错误'
-    }, 500);
-  }
-})
-// 根据层级获取省市区列表
-.get('/level/:level', authMiddleware, async (c) => {
-  try {
-    const level = Number(c.req.param('level'));
-    const validation = getAreasByLevelSchema.safeParse({ level });
-    if (!validation.success) {
-      return c.json({
-        success: false,
-        message: '参数验证失败',
-        errors: validation.error.errors
-      }, 400);
-    }
-
-    const areaService = c.get('areaService');
-    const areas = await areaService.findByLevel(level);
-    return c.json({
-      success: true,
-      data: areas,
-      message: '获取省市区列表成功'
-    });
-  } catch (error) {
-    console.error('获取省市区列表失败:', error);
-    return c.json({
-      success: false,
-      message: '获取省市区列表失败',
-      error: error instanceof Error ? error.message : '未知错误'
-    }, 500);
-  }
-})
-// 根据父级ID获取子级省市区列表
-.get('/parent/:parentId', authMiddleware, async (c) => {
-  try {
-    const parentId = Number(c.req.param('parentId'));
-    const validation = getChildAreasSchema.safeParse({ parentId });
-    if (!validation.success) {
-      return c.json({
-        success: false,
-        message: '参数验证失败',
-        errors: validation.error.errors
-      }, 400);
-    }
-
-    const areaService = c.get('areaService');
-    const areas = await areaService.findByParentId(parentId);
-    return c.json({
-      success: true,
-      data: areas,
-      message: '获取子级省市区列表成功'
-    });
-  } catch (error) {
-    console.error('获取子级省市区列表失败:', error);
-    return c.json({
-      success: false,
-      message: '获取子级省市区列表失败',
-      error: error instanceof Error ? error.message : '未知错误'
-    }, 500);
-  }
-});
+  middleware: [authMiddleware]
+})

+ 0 - 196
src/server/modules/areas/area.service.ts

@@ -1,196 +0,0 @@
-import { DataSource, Repository } from 'typeorm';
-import { AreaEntity, AreaLevel } from './area.entity';
-import { CreateAreaInput, UpdateAreaInput } from './area.schema';
-import { DisabledStatus } from '@/share/types';
-export class AreaService {
-  private areaRepository: Repository<AreaEntity>;
-
-  constructor(private dataSource: DataSource) {
-    this.areaRepository = this.dataSource.getRepository(AreaEntity);
-  }
-
-  /**
-   * 创建省市区
-   */
-  async create(input: CreateAreaInput): Promise<AreaEntity> {
-    const area = this.areaRepository.create(input);
-    return await this.areaRepository.save(area);
-  }
-
-  /**
-   * 更新省市区
-   */
-  async update(id: number, input: UpdateAreaInput): Promise<AreaEntity | null> {
-    const area = await this.areaRepository.findOne({ where: { id } });
-    if (!area) {
-      return null;
-    }
-
-    Object.assign(area, input);
-    return await this.areaRepository.save(area);
-  }
-
-  /**
-   * 获取省市区详情
-   */
-  async findById(id: number): Promise<AreaEntity | null> {
-    return await this.areaRepository.findOne({
-      where: { id },
-      relations: ['parent', 'children']
-    });
-  }
-
-  /**
-   * 获取省市区列表
-   */
-  async findAll(params: {
-    keyword?: string;
-    level?: AreaLevel;
-    parentId?: number;
-    isDisabled?: DisabledStatus;
-    page?: number;
-    pageSize?: number;
-    sortBy?: string;
-    sortOrder?: 'ASC' | 'DESC';
-  }): Promise<{ data: AreaEntity[]; total: number }> {
-    const {
-      keyword,
-      level,
-      parentId,
-      isDisabled,
-      page = 1,
-      pageSize = 20,
-      sortBy = 'createdAt',
-      sortOrder = 'DESC'
-    } = params;
-
-    const queryBuilder = this.areaRepository
-      .createQueryBuilder('area')
-      .leftJoinAndSelect('area.parent', 'parent')
-      .leftJoinAndSelect('area.children', 'children')
-      .where('area.isDeleted = :isDeleted', { isDeleted: 0 });
-
-    // 关键词搜索
-    if (keyword) {
-      queryBuilder.andWhere('(area.name LIKE :keyword OR area.code LIKE :keyword)', {
-        keyword: `%${keyword}%`
-      });
-    }
-
-    // 层级筛选
-    if (level) {
-      queryBuilder.andWhere('area.level = :level', { level });
-    }
-
-    // 父级ID筛选
-    if (parentId !== undefined) {
-      queryBuilder.andWhere('area.parentId = :parentId', { parentId });
-    }
-
-    // 状态筛选
-    if (isDisabled !== undefined) {
-      queryBuilder.andWhere('area.isDisabled = :isDisabled', { isDisabled });
-    }
-
-    // 排序
-    const orderBy = `area.${sortBy}`;
-    queryBuilder.orderBy(orderBy, sortOrder);
-
-    // 分页
-    const [data, total] = await queryBuilder
-      .skip((page - 1) * pageSize)
-      .take(pageSize)
-      .getManyAndCount();
-
-    return { data, total };
-  }
-
-  /**
-   * 删除省市区(软删除)
-   */
-  async delete(id: number): Promise<boolean> {
-    const result = await this.areaRepository.update(id, { isDeleted: 1 });
-    return result.affected !== 0;
-  }
-
-  /**
-   * 启用/禁用省市区
-   */
-  async toggleStatus(id: number, isDisabled: DisabledStatus): Promise<boolean> {
-    const result = await this.areaRepository.update(id, { isDisabled });
-    return result.affected !== 0;
-  }
-
-  /**
-   * 根据层级获取省市区列表
-   */
-  async findByLevel(level: AreaLevel): Promise<AreaEntity[]> {
-    return await this.areaRepository.find({
-      where: {
-        level,
-        isDeleted: 0,
-        isDisabled: DisabledStatus.ENABLED
-      },
-      order: { name: 'ASC' }
-    });
-  }
-
-  /**
-   * 根据父级ID获取子级省市区列表
-   */
-  async findByParentId(parentId: number): Promise<AreaEntity[]> {
-    return await this.areaRepository.find({
-      where: {
-        parentId,
-        isDeleted: 0,
-        isDisabled: DisabledStatus.ENABLED
-      },
-      order: { name: 'ASC' }
-    });
-  }
-
-  /**
-   * 获取省市区完整路径
-   */
-  async getAreaPath(id: number): Promise<AreaEntity[]> {
-    const path: AreaEntity[] = [];
-    let currentArea = await this.areaRepository.findOne({
-      where: { id },
-      relations: ['parent']
-    });
-
-    while (currentArea) {
-      path.unshift(currentArea);
-      if (currentArea.parentId === null || currentArea.parentId === 0) {
-        break;
-      }
-      currentArea = await this.areaRepository.findOne({
-        where: { id: currentArea.parentId },
-        relations: ['parent']
-      });
-    }
-
-    return path;
-  }
-
-  /**
-   * 获取省份列表
-   */
-  async getProvinces(): Promise<AreaEntity[]> {
-    return await this.findByLevel(AreaLevel.PROVINCE);
-  }
-
-  /**
-   * 根据省份ID获取城市列表
-   */
-  async getCitiesByProvinceId(provinceId: number): Promise<AreaEntity[]> {
-    return await this.findByParentId(provinceId);
-  }
-
-  /**
-   * 根据城市ID获取区县列表
-   */
-  async getDistrictsByCityId(cityId: number): Promise<AreaEntity[]> {
-    return await this.findByParentId(cityId);
-  }
-}