123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- import { faker } from '@faker-js/faker';
- import { eventHandler, getQuery } from 'h3';
- import { verifyAccessToken } from '~/utils/jwt-utils';
- import {
- sleep,
- unAuthorizedResponse,
- usePageResponseSuccess,
- } from '~/utils/response';
- function generateMockDataList(count: number) {
- const dataList = [];
- for (let i = 0; i < count; i++) {
- const dataItem = {
- id: faker.string.uuid(),
- imageUrl: faker.image.avatar(),
- imageUrl2: faker.image.avatar(),
- open: faker.datatype.boolean(),
- status: faker.helpers.arrayElement(['success', 'error', 'warning']),
- productName: faker.commerce.productName(),
- price: faker.commerce.price(),
- currency: faker.finance.currencyCode(),
- quantity: faker.number.int({ min: 1, max: 100 }),
- available: faker.datatype.boolean(),
- category: faker.commerce.department(),
- releaseDate: faker.date.past(),
- rating: faker.number.float({ min: 1, max: 5 }),
- description: faker.commerce.productDescription(),
- weight: faker.number.float({ min: 0.1, max: 10 }),
- color: faker.color.human(),
- inProduction: faker.datatype.boolean(),
- tags: Array.from({ length: 3 }, () => faker.commerce.productAdjective()),
- };
- dataList.push(dataItem);
- }
- return dataList;
- }
- const mockData = generateMockDataList(100);
- export default eventHandler(async (event) => {
- const userinfo = verifyAccessToken(event);
- if (!userinfo) {
- return unAuthorizedResponse(event);
- }
- await sleep(600);
- const { page, pageSize, sortBy, sortOrder } = getQuery(event);
- // 规范化分页参数,处理 string[]
- const pageRaw = Array.isArray(page) ? page[0] : page;
- const pageSizeRaw = Array.isArray(pageSize) ? pageSize[0] : pageSize;
- const pageNumber = Math.max(
- 1,
- Number.parseInt(String(pageRaw ?? '1'), 10) || 1,
- );
- const pageSizeNumber = Math.min(
- 100,
- Math.max(1, Number.parseInt(String(pageSizeRaw ?? '10'), 10) || 10),
- );
- const listData = structuredClone(mockData);
- // 规范化 query 入参,兼容 string[]
- const sortKeyRaw = Array.isArray(sortBy) ? sortBy[0] : sortBy;
- const sortOrderRaw = Array.isArray(sortOrder) ? sortOrder[0] : sortOrder;
- // 检查 sortBy 是否是 listData 元素的合法属性键
- if (
- typeof sortKeyRaw === 'string' &&
- listData[0] &&
- Object.prototype.hasOwnProperty.call(listData[0], sortKeyRaw)
- ) {
- // 定义数组元素的类型
- type ItemType = (typeof listData)[0];
- const sortKey = sortKeyRaw as keyof ItemType; // 将 sortBy 断言为合法键
- const isDesc = sortOrderRaw === 'desc';
- listData.sort((a, b) => {
- const aValue = a[sortKey] as unknown;
- const bValue = b[sortKey] as unknown;
- let result = 0;
- if (typeof aValue === 'number' && typeof bValue === 'number') {
- result = aValue - bValue;
- } else if (aValue instanceof Date && bValue instanceof Date) {
- result = aValue.getTime() - bValue.getTime();
- } else if (typeof aValue === 'boolean' && typeof bValue === 'boolean') {
- if (aValue === bValue) {
- result = 0;
- } else {
- result = aValue ? 1 : -1;
- }
- } else {
- const aStr = String(aValue);
- const bStr = String(bValue);
- const aNum = Number(aStr);
- const bNum = Number(bStr);
- result =
- Number.isFinite(aNum) && Number.isFinite(bNum)
- ? aNum - bNum
- : aStr.localeCompare(bStr, undefined, {
- numeric: true,
- sensitivity: 'base',
- });
- }
- return isDesc ? -result : result;
- });
- }
- return usePageResponseSuccess(
- String(pageNumber),
- String(pageSizeNumber),
- listData,
- );
- });
|