Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion apps/backend-mock/api/auth/codes.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { unAuthorizedResponse } from '~/utils/response';
import { MOCK_CODES } from '~/utils/mock-data';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';

export default eventHandler((event) => {
const userinfo = verifyAccessToken(event);
Expand Down
8 changes: 7 additions & 1 deletion apps/backend-mock/api/auth/login.post.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
import { defineEventHandler, readBody, setResponseStatus } from 'h3';
import {
clearRefreshTokenCookie,
setRefreshTokenCookie,
} from '~/utils/cookie-utils';
import { generateAccessToken, generateRefreshToken } from '~/utils/jwt-utils';
import { forbiddenResponse } from '~/utils/response';
import { MOCK_USERS } from '~/utils/mock-data';
import {
forbiddenResponse,
useResponseError,
useResponseSuccess,
} from '~/utils/response';

export default defineEventHandler(async (event) => {
const { password, username } = await readBody(event);
Expand Down
2 changes: 2 additions & 0 deletions apps/backend-mock/api/auth/logout.post.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { defineEventHandler } from 'h3';
import {
clearRefreshTokenCookie,
getRefreshTokenFromCookie,
} from '~/utils/cookie-utils';
import { useResponseSuccess } from '~/utils/response';

export default defineEventHandler(async (event) => {
const refreshToken = getRefreshTokenFromCookie(event);
Expand Down
4 changes: 3 additions & 1 deletion apps/backend-mock/api/auth/refresh.post.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { defineEventHandler } from 'h3';
import {
clearRefreshTokenCookie,
getRefreshTokenFromCookie,
setRefreshTokenCookie,
} from '~/utils/cookie-utils';
import { verifyRefreshToken } from '~/utils/jwt-utils';
import { generateAccessToken, verifyRefreshToken } from '~/utils/jwt-utils';
import { MOCK_USERS } from '~/utils/mock-data';
import { forbiddenResponse } from '~/utils/response';

export default defineEventHandler(async (event) => {
Expand Down
4 changes: 4 additions & 0 deletions apps/backend-mock/api/demo/bigint.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import { eventHandler, setHeader } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { unAuthorizedResponse } from '~/utils/response';

export default eventHandler(async (event) => {
const userinfo = verifyAccessToken(event);
if (!userinfo) {
Expand Down
4 changes: 3 additions & 1 deletion apps/backend-mock/api/menu/all.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { unAuthorizedResponse } from '~/utils/response';
import { MOCK_MENUS } from '~/utils/mock-data';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';

export default eventHandler(async (event) => {
const userinfo = verifyAccessToken(event);
Expand Down
3 changes: 3 additions & 0 deletions apps/backend-mock/api/status.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import { eventHandler, getQuery, setResponseStatus } from 'h3';
import { useResponseError } from '~/utils/response';

export default eventHandler((event) => {
const { status } = getQuery(event);
setResponseStatus(event, Number(status));
Expand Down
3 changes: 3 additions & 0 deletions apps/backend-mock/api/system/dept/.post.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,6 @@ export default eventHandler(async (event) => {
await sleep(600);
return useResponseSuccess(null);
});
function eventHandler(_: (event: any) => Promise<any>) {
throw new Error('Function not implemented.');
}
1 change: 1 addition & 0 deletions apps/backend-mock/api/system/dept/[id].delete.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import {
sleep,
Expand Down
1 change: 1 addition & 0 deletions apps/backend-mock/api/system/dept/[id].put.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import {
sleep,
Expand Down
1 change: 1 addition & 0 deletions apps/backend-mock/api/system/dept/list.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { faker } from '@faker-js/faker';
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';

Expand Down
1 change: 1 addition & 0 deletions apps/backend-mock/api/system/menu/list.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { MOCK_MENU_LIST } from '~/utils/mock-data';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';
Expand Down
3 changes: 2 additions & 1 deletion apps/backend-mock/api/system/menu/name-exists.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { eventHandler, getQuery } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { MOCK_MENU_LIST } from '~/utils/mock-data';
import { unAuthorizedResponse } from '~/utils/response';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';

const namesMap: Record<string, any> = {};

Expand Down
3 changes: 2 additions & 1 deletion apps/backend-mock/api/system/menu/path-exists.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { eventHandler, getQuery } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { MOCK_MENU_LIST } from '~/utils/mock-data';
import { unAuthorizedResponse } from '~/utils/response';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';

const pathMap: Record<string, any> = { '/': 0 };

Expand Down
1 change: 1 addition & 0 deletions apps/backend-mock/api/system/role/list.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { faker } from '@faker-js/faker';
import { eventHandler, getQuery } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { getMenuIds, MOCK_MENU_LIST } from '~/utils/mock-data';
import { unAuthorizedResponse, usePageResponseSuccess } from '~/utils/response';
Expand Down
80 changes: 62 additions & 18 deletions apps/backend-mock/api/table/list.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import { faker } from '@faker-js/faker';
import { eventHandler, getQuery } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { unAuthorizedResponse, usePageResponseSuccess } from '~/utils/response';
import {
sleep,
unAuthorizedResponse,
usePageResponseSuccess,
} from '~/utils/response';

function generateMockDataList(count: number) {
const dataList = [];
Expand Down Expand Up @@ -44,30 +49,69 @@ export default eventHandler(async (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);
if (sortBy && Reflect.has(listData[0], sortBy as string)) {

// 规范化 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) => {
if (sortOrder === 'asc') {
if (sortBy === 'price') {
return (
Number.parseFloat(a[sortBy as string]) -
Number.parseFloat(b[sortBy as string])
);
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 {
return a[sortBy as string] > b[sortBy as string] ? 1 : -1;
result = aValue ? 1 : -1;
}
} else {
if (sortBy === 'price') {
return (
Number.parseFloat(b[sortBy as string]) -
Number.parseFloat(a[sortBy as string])
);
} else {
return a[sortBy as string] < b[sortBy as string] ? 1 : -1;
}
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(page as string, pageSize as string, listData);
return usePageResponseSuccess(
String(pageNumber),
String(pageSizeNumber),
listData,
);
});
2 changes: 2 additions & 0 deletions apps/backend-mock/api/test.get.ts
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
import { defineEventHandler } from 'h3';

export default defineEventHandler(() => 'Test get handler');
2 changes: 2 additions & 0 deletions apps/backend-mock/api/test.post.ts
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
import { defineEventHandler } from 'h3';

export default defineEventHandler(() => 'Test post handler');
3 changes: 2 additions & 1 deletion apps/backend-mock/api/upload.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { unAuthorizedResponse } from '~/utils/response';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';

export default eventHandler((event) => {
const userinfo = verifyAccessToken(event);
Expand Down
3 changes: 2 additions & 1 deletion apps/backend-mock/api/user/info.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { unAuthorizedResponse } from '~/utils/response';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';

export default eventHandler((event) => {
const userinfo = verifyAccessToken(event);
Expand Down
1 change: 1 addition & 0 deletions apps/backend-mock/middleware/1.api.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { defineEventHandler } from 'h3';
import { forbiddenResponse, sleep } from '~/utils/response';

export default defineEventHandler(async (event) => {
Expand Down
2 changes: 2 additions & 0 deletions apps/backend-mock/routes/[...].ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { defineEventHandler } from 'h3';

export default defineEventHandler(() => {
return `
<h1>Hello Vben Admin</h1>
Expand Down
13 changes: 12 additions & 1 deletion apps/backend-mock/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
{
"extends": "./.nitro/types/tsconfig.json"
"$schema": "https://json.schemastore.org/tsconfig",
"extends": "@vben/tsconfig/node.json",
"compilerOptions": {
"composite": true,
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
"baseUrl": ".",
"paths": {
"~/utils/*": ["utils/*"]
},
"noEmit": false
},
"include": ["**/*.ts", "**/*.*.ts"]
}
2 changes: 2 additions & 0 deletions apps/backend-mock/utils/cookie-utils.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import type { EventHandlerRequest, H3Event } from 'h3';

import { deleteCookie, getCookie, setCookie } from 'h3';

export function clearRefreshTokenCookie(event: H3Event<EventHandlerRequest>) {
deleteCookie(event, 'jwt', {
httpOnly: true,
Expand Down
26 changes: 22 additions & 4 deletions apps/backend-mock/utils/jwt-utils.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import type { EventHandlerRequest, H3Event } from 'h3';

import type { UserInfo } from './mock-data';

import { getHeader } from 'h3';
import jwt from 'jsonwebtoken';

import { UserInfo } from './mock-data';
import { MOCK_USERS } from './mock-data';

// TODO: Replace with your own secret key
const ACCESS_TOKEN_SECRET = 'access_token_secret';
Expand Down Expand Up @@ -31,12 +34,22 @@ export function verifyAccessToken(
return null;
}

const token = authHeader.split(' ')[1];
const tokenParts = authHeader.split(' ');
if (tokenParts.length !== 2) {
return null;
}
const token = tokenParts[1] as string;
try {
const decoded = jwt.verify(token, ACCESS_TOKEN_SECRET) as UserPayload;
const decoded = jwt.verify(
token,
ACCESS_TOKEN_SECRET,
) as unknown as UserPayload;

const username = decoded.username;
const user = MOCK_USERS.find((item) => item.username === username);
if (!user) {
return null;
}
const { password: _pwd, ...userinfo } = user;
return userinfo;
} catch {
Expand All @@ -50,7 +63,12 @@ export function verifyRefreshToken(
try {
const decoded = jwt.verify(token, REFRESH_TOKEN_SECRET) as UserPayload;
const username = decoded.username;
const user = MOCK_USERS.find((item) => item.username === username);
const user = MOCK_USERS.find(
(item) => item.username === username,
) as UserInfo;
if (!user) {
return null;
}
const { password: _pwd, ...userinfo } = user;
return userinfo;
} catch {
Expand Down
2 changes: 2 additions & 0 deletions apps/backend-mock/utils/response.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import type { EventHandlerRequest, H3Event } from 'h3';

import { setResponseStatus } from 'h3';

export function useResponseSuccess<T = any>(data: T) {
return {
code: 0,
Expand Down
Loading