From 656538feccac8d7dcef6b86ef862f150ba53600d Mon Sep 17 00:00:00 2001 From: Litrix2 Date: Sun, 22 Dec 2024 11:02:50 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=202048=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 20 ++++---- src/App.vue | 8 ++-- src/api/index.ts | 18 ++++++-- src/bus.ts | 4 -- src/components/app/LoginRegisterDialog.vue | 2 +- src/components/app/VerifyInput.vue | 4 +- src/components/game2048/Game2048.vue | 53 ++++++++++++---------- src/main.ts | 11 ++--- src/schemas/response.ts | 43 +++++++++--------- src/utils/emitter.ts | 23 ++++++++++ src/views/Game2048Page.vue | 40 ++++++++++++++-- src/views/UserPage.vue | 18 +++++++- tsconfig.app.json | 1 + vite.config.ts | 15 ++---- 14 files changed, 169 insertions(+), 91 deletions(-) delete mode 100644 src/bus.ts create mode 100644 src/utils/emitter.ts diff --git a/package.json b/package.json index 2cd0abc..f0fbb78 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "@vueuse/core": "^10.11.1", "axios": "^1.7.9", "crypto-js": "^4.2.0", - "element-plus": "^2.9.0", + "element-plus": "^2.9.1", "jwt-decode": "^4.0.0", "lodash-es": "^4.17.21", "mitt": "^3.0.1", @@ -26,18 +26,19 @@ "vfonts": "^0.0.3", "vue": "^3.5.13", "vue-router": "^4.5.0", - "zod": "^3.23.8" + "vue3-touch-events": "^4.2.0", + "zod": "^3.24.1" }, "devDependencies": { "@babel/core": "^7.26.0", "@babel/preset-env": "^7.26.0", - "@iconify-json/ep": "^1.2.1", + "@iconify-json/ep": "^1.2.2", "@rushstack/eslint-patch": "^1.10.4", "@tsconfig/node20": "^20.1.4", "@types/crypto-js": "^4.2.2", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.17.9", - "@unocss/transformer-directives": "^0.65.1", + "@types/node": "^20.17.10", + "@unocss/transformer-directives": "^0.65.2", "@vitejs/plugin-legacy": "^6.0.0", "@vitejs/plugin-vue": "^5.2.1", "@vitejs/plugin-vue-jsx": "^4.1.1", @@ -48,15 +49,14 @@ "eslint-plugin-vue": "^9.32.0", "npm-run-all2": "^6.2.6", "prettier": "^3.4.2", - "sass": "^1.82.0", + "sass": "^1.83.0", "terser": "^5.37.0", "typescript": "^5.7.2", - "unocss": "^0.65.1", - "unplugin-auto-import": "^0.17.8", + "unocss": "^0.65.2", "unplugin-icons": "^0.18.5", "unplugin-vue-components": "^0.26.0", - "vite": "^6.0.0", - "vue-tsc": "^1.8.27" + "vite": "^6.0.5", + "vue-tsc": "^2.1.10" }, "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/src/App.vue b/src/App.vue index 142e223..4dc1f54 100644 --- a/src/App.vue +++ b/src/App.vue @@ -114,6 +114,8 @@ import LoginRegisterDialog, { loginImplKey, registerImplKey, } from '@/components/app/LoginRegisterDialog.vue'; +import router from '@/router'; +import { loginRespSchema, registerRespSchema } from '@/schemas/response'; import { useMediaStore } from '@/stores/media'; import { usePageStore } from '@/stores/page.js'; import { useUserStore } from '@/stores/user'; @@ -123,8 +125,6 @@ import type { AxiosError } from 'axios'; import { ElMessage } from 'element-plus'; import { storeToRefs } from 'pinia'; import { provide, ref, watch } from 'vue'; -import { loginResponseSchema, registerResponseSchema } from './schemas/response'; -import router from '@/router'; const userStore = useUserStore(); const pageStore = usePageStore(); const { mdLess } = storeToRefs(useMediaStore()); @@ -138,7 +138,7 @@ provide(loginImplKey, async (params) => { ElMessage.error([err.code, err.message].join(':')); }); if (!loginRespRaw) return false; - const resp = loginResponseSchema.parse(loginRespRaw); + const resp = loginRespSchema.parse(loginRespRaw); if (resp.type === 'error') { ElMessage.error([resp.code, resp.msg].join(':')); return false; @@ -153,7 +153,7 @@ provide(registerImplKey, async (params) => { ElMessage.error([err.code, err.message].join(':')); }); if (!raw) return false; - const resp = registerResponseSchema.parse(raw); + const resp = registerRespSchema.parse(raw); if (resp.type === 'error') { ElMessage.error([resp.code, resp.msg].join(':')); return false; diff --git a/src/api/index.ts b/src/api/index.ts index eb1d11b..5f2629d 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,4 +1,9 @@ -import { userInfoResponseSchema } from '@/schemas'; +import { + userInfoRespSchema, + userInfoRespSchemaNullable, + type SucceedUserInfoResp, + type SucceedUserInfoRespNullable, +} from '@/schemas'; import { useUserStore } from '@/stores/user'; import axios, { type AxiosError } from 'axios'; import { ElMessage } from 'element-plus'; @@ -26,9 +31,14 @@ axiosInstance.interceptors.response.use((response) => { }); export default axiosInstance; export type RawResp = Record; -export async function getUserInfo(showErrorMessage: boolean, userID?: string) { +export async function getUserInfo(showErrorMessage: boolean): Promise; +export async function getUserInfo( + showErrorMessage: boolean, + userID: number, +): Promise; +export async function getUserInfo(showErrorMessage: boolean, userID?: number) { let url = '/api/user/info'; - if (userID) { + if (userID !== undefined) { url += `/${userID}`; } const raw = await axiosInstance @@ -39,7 +49,7 @@ export async function getUserInfo(showErrorMessage: boolean, userID?: string) { ElMessage.error(errorMessage('获取用户信息失败', e.code, e.message)); }); if (!raw) return; - const resp = userInfoResponseSchema.parse(raw); + const resp = (userID !== undefined ? userInfoRespSchemaNullable : userInfoRespSchema).parse(raw); if (resp.type === 'error') { if (showErrorMessage) { ElMessage.error(errorMessage('获取用户信息失败', resp.code, resp.msg)); diff --git a/src/bus.ts b/src/bus.ts deleted file mode 100644 index 8983ec6..0000000 --- a/src/bus.ts +++ /dev/null @@ -1,4 +0,0 @@ -import mitt from 'mitt'; - -type Events = {}; -export const bus = mitt(); diff --git a/src/components/app/LoginRegisterDialog.vue b/src/components/app/LoginRegisterDialog.vue index d99a131..7ec181c 100644 --- a/src/components/app/LoginRegisterDialog.vue +++ b/src/components/app/LoginRegisterDialog.vue @@ -179,7 +179,7 @@ const inputLength = 3; const loginFormRules = reactive>({ username: [ { required: true, message: '请输入用户名' }, - { min: inputLength, message: `用户名长度不能小${inputLength}6位` }, + { min: inputLength, message: `用户名长度不能小于${inputLength}位` }, ], password: [ { required: true, message: '请输入密码' }, diff --git a/src/components/app/VerifyInput.vue b/src/components/app/VerifyInput.vue index 08a1d07..1309646 100644 --- a/src/components/app/VerifyInput.vue +++ b/src/components/app/VerifyInput.vue @@ -36,7 +36,7 @@