feat(admin): country drag-sort + always-available member detail sync

- Country 加 sort_order(默认 0 保持 id 序);PATCH /countries/sort 批量保存
  顺序(对齐 /tags/sort 模式);findAll 与公开 /public/countries 均按
  sortOrder 排序
- CountriesView 表格改为可拖拽行列表:拖动松开即全量保存新顺序,失败回滚
- 商品编辑弹窗成员展开面板:同步详情按钮常驻(已同步显示 重新同步详情),
  不再只在未同步态出现
- goods.service.spec 的 FamilyRecomputeService mock 补齐 syncFamilyTags 等
  方法(全量并行时其他套件的扫名归族会把本套件夹具收进族,create/update
  会调用到,mock 缺方法导致偶发 TypeError)
- api 164/164、admin typecheck+22/22+构建全绿
This commit is contained in:
yeuimu
2026-08-28 20:00:56 +08:00
parent 77f9c05346
commit 1e07c62fc8
12 changed files with 261 additions and 60 deletions
@@ -18,6 +18,7 @@ import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
import { CountriesService } from './countries.service';
import { CreateCountryDto } from './dto/create-country.dto';
import { UpdateCountryDto } from './dto/update-country.dto';
import { ReorderCountriesDto } from './dto/reorder-countries.dto';
@ApiTags('countries')
@ApiBearerAuth()
@@ -32,6 +33,13 @@ export class CountriesController {
return this.service.findAll();
}
// 注意:'sort' 静态路由必须声明在 ':id' 之前,否则会被参数路由吞掉
@Patch('sort')
@ApiOperation({ summary: 'Batch update country sort order (drag reorder)' })
reorder(@Body() dto: ReorderCountriesDto) {
return this.service.reorder(dto);
}
@Get(':id')
@ApiOperation({ summary: 'Get one country' })
findOne(@Param('id', ParseIntPipe) id: string) {