Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 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
50 changes: 32 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 @@ -45,26 +50,35 @@ export default eventHandler(async (event) => {

const { page, pageSize, sortBy, sortOrder } = getQuery(event);
const listData = structuredClone(mockData);
if (sortBy && Reflect.has(listData[0], sortBy as string)) {

// 规范化 query 入参,兼容 string[]
const sortKeyRaw = Array.isArray(sortBy) ? sortBy[0] : sortBy;

// 检查 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 断言为合法键

listData.sort((a, b) => {
if (sortOrder === 'asc') {
if (sortBy === 'price') {
return (
Number.parseFloat(a[sortBy as string]) -
Number.parseFloat(b[sortBy as string])
);
} else {
return a[sortBy as string] > b[sortBy as string] ? 1 : -1;
}
const aValue = a[sortKey];
const bValue = b[sortKey];

return typeof aValue === 'number' && typeof bValue === 'number'
? aValue - bValue
: String(aValue).localeCompare(String(bValue));
} 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 aValue = a[sortKey];
const bValue = b[sortKey];

return typeof aValue === 'number' && typeof bValue === 'number'
? aValue - bValue
: String(aValue).localeCompare(String(bValue));
}
});
}
Expand Down
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