From 8353e81a0fc8c729b040da8be09b32d5ca456e1c Mon Sep 17 00:00:00 2001 From: zhangyahui Date: Fri, 31 Oct 2025 14:36:23 +0800 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=E5=AF=86=E7=A0=81=E7=94=A8MD5?= =?UTF-8?q?=E5=8A=A0=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 26 ++++++++++++++++++++++++++ package.json | 2 ++ src/utils/tools.ts | 11 +++++++++++ src/views/login/LoginPage.vue | 4 +++- src/views/login/ResetPage.vue | 3 ++- src/views/login/SignupPage.vue | 4 +++- 6 files changed, 47 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index dddcc45..a493c7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "hasInstallScript": true, "dependencies": { "axios": "^1.3.6", + "crypto-js": "^4.2.0", "gsap": "^3.13.0", "markdown-it": "^14.1.0", "normalize.css": "^8.0.1", @@ -22,6 +23,7 @@ }, "devDependencies": { "@rushstack/eslint-patch": "^1.2.0", + "@types/crypto-js": "^4.2.2", "@types/node": "^18.16.0", "@vant/auto-import-resolver": "^1.3.0", "@vitejs/plugin-vue": "^4.0.0", @@ -654,6 +656,13 @@ "node": ">=10.13.0" } }, + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.1.tgz", @@ -2104,6 +2113,12 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, "node_modules/css-select": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", @@ -8935,6 +8950,12 @@ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true }, + "@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "dev": true + }, "@types/estree": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.1.tgz", @@ -10039,6 +10060,11 @@ "which": "^2.0.1" } }, + "crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, "css-select": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", diff --git a/package.json b/package.json index 6abf0ff..931f726 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ }, "dependencies": { "axios": "^1.3.6", + "crypto-js": "^4.2.0", "gsap": "^3.13.0", "markdown-it": "^14.1.0", "normalize.css": "^8.0.1", @@ -26,6 +27,7 @@ }, "devDependencies": { "@rushstack/eslint-patch": "^1.2.0", + "@types/crypto-js": "^4.2.2", "@types/node": "^18.16.0", "@vant/auto-import-resolver": "^1.3.0", "@vitejs/plugin-vue": "^4.0.0", diff --git a/src/utils/tools.ts b/src/utils/tools.ts index 69b2286..65a05ec 100644 --- a/src/utils/tools.ts +++ b/src/utils/tools.ts @@ -1,3 +1,5 @@ +import CryptoJS from 'crypto-js' + function getUniversalZoomLevel() { // 现代浏览器方案 if (window.visualViewport) { @@ -146,3 +148,12 @@ export async function DownloadImages(list: Array<{ url: string, name?: string }> } typeof onSuccess === "function" && onSuccess(successCount, errCount); } + +/** + * MD5加密密码 + * @param password 原始密码 + * @returns MD5加密后的密码 + */ +export function encryptPassword(password: string): string { + return CryptoJS.MD5(password).toString() +} \ No newline at end of file diff --git a/src/views/login/LoginPage.vue b/src/views/login/LoginPage.vue index d7fb2dd..6ddb689 100644 --- a/src/views/login/LoginPage.vue +++ b/src/views/login/LoginPage.vue @@ -50,6 +50,7 @@ import { useUserInfoStore } from '@/stores' import { showToast } from 'vant' import { google } from '@/assets/base64' import { fetchRegisterOrLogin } from '@/api/login' +import { encryptPassword } from '@/utils/tools' const router = useRouter() const userInfoStore = useUserInfoStore() @@ -109,7 +110,8 @@ const handleLogin = async () => { isLoading.value = true - fetchRegisterOrLogin({ ...formData, operationType: 'LOGIN' }).then((response) => { + const encryptedPassword = encryptPassword(formData.password) + fetchRegisterOrLogin({ ...formData, password: encryptedPassword, operationType: 'LOGIN' }).then((response) => { console.log('登录成功', response) userInfoStore.setToken(response.token) userInfoStore.setUserInfo(response.user) diff --git a/src/views/login/ResetPage.vue b/src/views/login/ResetPage.vue index 3561a50..59c643a 100644 --- a/src/views/login/ResetPage.vue +++ b/src/views/login/ResetPage.vue @@ -43,6 +43,7 @@ import Verify from './components/Verify.vue' import Password from './components/Password.vue' import { showToast } from 'vant' import { precheckEmail, resetPassword } from '@/api/login' +import { encryptPassword } from '@/utils/tools' const router = useRouter() const step = ref<'mail' | 'verify' | 'password'>('mail') @@ -92,7 +93,7 @@ const handleCheckVerifyCode = (data: any) => { } const handleSuccess = (data: any) => { - fromData.value.password = data.password + fromData.value.password = encryptPassword(data.password) resetPassword(fromData.value).then((res) => { // console.log('res', res) showToast('the password has been reset') diff --git a/src/views/login/SignupPage.vue b/src/views/login/SignupPage.vue index cb368c3..e1ef9cc 100644 --- a/src/views/login/SignupPage.vue +++ b/src/views/login/SignupPage.vue @@ -56,6 +56,7 @@ import { useRouter } from 'vue-router' import { showToast } from 'vant' import { google } from '@/assets/base64' import { fetchRegisterOrLogin } from '@/api/login' +import { encryptPassword } from '@/utils/tools' const router = useRouter() @@ -121,7 +122,8 @@ const handleConfirm = async () => { isLoading.value = true - fetchRegisterOrLogin({ ...formData, operationType: 'REGISTER' }) + const encryptedPassword = encryptPassword(formData.password) + fetchRegisterOrLogin({ ...formData, password: encryptedPassword, operationType: 'REGISTER' }) .then((res) => { console.log('res', res) showToast('register success') From 1f8051a266d149a06e7c1b5214c613444f15bbc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E9=B9=8F?= <2916022834@qq.com> Date: Fri, 31 Oct 2025 14:41:07 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E8=B7=AF=E7=94=B1=E9=AA=8C=E8=AF=81id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/index.ts | 68 ++++++++++++++++++++++++++-------- src/router/router-config.ts | 16 ++++++-- src/views/Workshop/product.vue | 1 + 3 files changed, 67 insertions(+), 18 deletions(-) diff --git a/src/router/index.ts b/src/router/index.ts index 1ddc069..9bb4099 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,13 +1,38 @@ import { createRouter, createWebHistory } from 'vue-router' +import { useGenerateStore } from '@/stores/modules/generate' /** * 路由缓存机制: * 1. 设置路由的meta属性为{ cache: true },表示需要缓存 * 2. App.vue中使用RouteCache组件,通过路由的name来进行匹配 * 3. 路由的name默认是文件名,如果文件名与name不一致,通过defineOptions({ name: 'componentName' })来设置 + * + * 自定义验证规则: + * meta:{ verify: ()=> boolean || string } + * 1. boolean true 跳转 false 不跳转 + * 2. string 跳转的路由path */ - +/** 验证id + * @param num 验证id的数量1-5 + * 1. 顾客id + * 2. 进店记录id + * 3. 服装id + * 4. 模特照片id + * 5. 原始试穿id-优先AI魔改 + * @returns boolean + */ +const VerifyIDs = (num: number) => { + const ids = [ + !!useGenerateStore().customerId, + !!useGenerateStore().visitRecordId, + !!useGenerateStore().styleId, + // !!useGenerateStore().modelPhotoId, + true, + !!useGenerateStore().originalTryOnId, + ]; + return ids.splice(0, num).every(id => id) ? true : "/stylist/customer"; +} const router = createRouter({ history: createWebHistory('/'), // history: createWebHistory(import.meta.env.VITE_APP_URL), @@ -45,22 +70,25 @@ const router = createRouter({ { path: 'index', name: 'index', - component: () => import('@/views/stylist/index.vue') + component: () => import('@/views/stylist/index.vue'), + meta: { verify: ()=> VerifyIDs(2) } }, { path: 'sex', name: 'sex', - component: () => import('@/views/stylist/sex.vue') + component: () => import('@/views/stylist/sex.vue'), + meta: { verify: ()=> VerifyIDs(2) } }, { path: 'dressfor', name: 'dressfor', - component: () => import('@/views/stylist/dressfor.vue') + component: () => import('@/views/stylist/dressfor.vue'), + meta: { verify: ()=> VerifyIDs(2) } }, { path: 'customer', name: 'customer', - component: () => import('@/views/stylist/customer.vue') + component: () => import('@/views/stylist/customer.vue'), } ] }, @@ -68,7 +96,7 @@ const router = createRouter({ path: '/asistant', name: 'asistant', component: () => import('../views/asistant/index.vue'), - meta: { cache: true } + meta: { cache: true, verify: ()=> VerifyIDs(2) } }, { path: '/workshop', @@ -83,57 +111,67 @@ const router = createRouter({ path: '/workshop/selectStyle', name: 'SelectStyle', component: () => import('../views/Workshop/selectStyle.vue'), + meta: { verify: ()=> VerifyIDs(2) } }, { path: '/workshop/selectModel', name: 'SelectModel', - component: () => import('../views/Workshop/selectModel.vue') + component: () => import('../views/Workshop/selectModel.vue'), + meta: { verify: ()=> VerifyIDs(3) } }, { path: '/workshop/product', name: 'Product', - component: () => import('../views/Workshop/product.vue') + component: () => import('../views/Workshop/product.vue'), + meta: { verify: ()=> VerifyIDs(4) } }, { // 上传照片1 path: '/workshop/uploadFace', name: 'uploadFace', - component: () => import('../views/Workshop/uploadFace1.vue') + component: () => import('../views/Workshop/uploadFace1.vue'), + meta: { verify: ()=> VerifyIDs(5) } }, { // 上传照片2 path: '/workshop/uploadFace2', name: 'uploadFace2', - component: () => import('../views/Workshop/uploadFace2.vue') + component: () => import('../views/Workshop/uploadFace2.vue'), + meta: { verify: ()=> VerifyIDs(5) } }, { // 自定义创作 path: '/workshop/customize', name: 'customize', - component: () => import('../views/Workshop/customize.vue') + component: () => import('../views/Workshop/customize.vue'), + meta: { verify: ()=> VerifyIDs(5) } }, { // library path: '/workshop/library', name: 'library', - component: () => import('../views/Workshop/library.vue') + component: () => import('../views/Workshop/library.vue'), + meta: { verify: ()=> VerifyIDs(2) } }, { path: '/workshop/profile', name: 'profile', - component: () => import('../views/Workshop/profile.vue') + component: () => import('../views/Workshop/profile.vue'), + meta: { verify: ()=> VerifyIDs(1) } }, { // creation path: '/workshop/creation', name: 'creation', - component: () => import('../views/Workshop/creation/index.vue') + component: () => import('../views/Workshop/creation/index.vue'), + meta: { verify: ()=> VerifyIDs(2) } }, { // 完成创建 path: '/workshop/end', name: 'end', - component: () => import('../views/Workshop/end.vue') + component: () => import('../views/Workshop/end.vue'), + meta: { verify: ()=> VerifyIDs(2) } } ] } diff --git a/src/router/router-config.ts b/src/router/router-config.ts index 3fdf1ac..2bab148 100644 --- a/src/router/router-config.ts +++ b/src/router/router-config.ts @@ -5,10 +5,20 @@ const whiteList = ['/login'] console.log(whiteList) router.beforeEach((to, from, next) => { - next() + const verify = to.meta?.verify; + if (typeof verify === 'function') { + let res = verify() + if (res === false) { + return next(false) + } else if (typeof res === 'string') { + console.log(res) + return next({ path: res }) + } + } + next() }) router.afterEach(() => { - // finish progress bar - // NProgress.done() + // finish progress bar + // NProgress.done() }) diff --git a/src/views/Workshop/product.vue b/src/views/Workshop/product.vue index 6898005..022d94b 100644 --- a/src/views/Workshop/product.vue +++ b/src/views/Workshop/product.vue @@ -179,6 +179,7 @@ const { isLoading } = toRefs(data); width: 100%; height: 100%; object-fit: contain; + display: block; } > .operation{ position: absolute; From 9d9794c6b0e1ef75cf1f91d51ba44d5e555d26e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E9=B9=8F?= <2916022834@qq.com> Date: Fri, 31 Oct 2025 14:41:40 +0800 Subject: [PATCH 3/7] fix --- src/router/index.ts | 22 +++++++++++----------- src/router/router-config.ts | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/router/index.ts b/src/router/index.ts index 9bb4099..ce5cba2 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,5 +1,16 @@ import { createRouter, createWebHistory } from 'vue-router' import { useGenerateStore } from '@/stores/modules/generate' +const VerifyIDs = (num: number) => { + const ids = [ + !!useGenerateStore().customerId, + !!useGenerateStore().visitRecordId, + !!useGenerateStore().styleId, + // !!useGenerateStore().modelPhotoId, + true, + !!useGenerateStore().originalTryOnId, + ]; + return ids.splice(0, num).every(id => id) ? true : "/stylist/customer"; +} /** * 路由缓存机制: @@ -22,17 +33,6 @@ import { useGenerateStore } from '@/stores/modules/generate' * 5. 原始试穿id-优先AI魔改 * @returns boolean */ -const VerifyIDs = (num: number) => { - const ids = [ - !!useGenerateStore().customerId, - !!useGenerateStore().visitRecordId, - !!useGenerateStore().styleId, - // !!useGenerateStore().modelPhotoId, - true, - !!useGenerateStore().originalTryOnId, - ]; - return ids.splice(0, num).every(id => id) ? true : "/stylist/customer"; -} const router = createRouter({ history: createWebHistory('/'), // history: createWebHistory(import.meta.env.VITE_APP_URL), diff --git a/src/router/router-config.ts b/src/router/router-config.ts index 2bab148..d0485d7 100644 --- a/src/router/router-config.ts +++ b/src/router/router-config.ts @@ -7,7 +7,7 @@ console.log(whiteList) router.beforeEach((to, from, next) => { const verify = to.meta?.verify; if (typeof verify === 'function') { - let res = verify() + const res = verify() if (res === false) { return next(false) } else if (typeof res === 'string') { From ef5392e28c5a78378ba734de9ec3553154bd809c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E9=B9=8F?= <2916022834@qq.com> Date: Fri, 31 Oct 2025 14:52:16 +0800 Subject: [PATCH 4/7] fix --- src/router/router-config.ts | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/router/router-config.ts b/src/router/router-config.ts index d0485d7..e9379b0 100644 --- a/src/router/router-config.ts +++ b/src/router/router-config.ts @@ -5,17 +5,19 @@ const whiteList = ['/login'] console.log(whiteList) router.beforeEach((to, from, next) => { - const verify = to.meta?.verify; - if (typeof verify === 'function') { - const res = verify() - if (res === false) { - return next(false) - } else if (typeof res === 'string') { - console.log(res) - return next({ path: res }) + requestAnimationFrame(() => { + const verify = to.meta?.verify; + if (typeof verify === 'function') { + const res = verify() + if (res === false) { + return next(false) + } else if (typeof res === 'string') { + console.log(res) + return next({ path: res }) + } } - } - next() + next() + }) }) router.afterEach(() => { From d98bedd66317af04f44362aa292d939c2fbb5806 Mon Sep 17 00:00:00 2001 From: zhangyahui Date: Fri, 31 Oct 2025 14:54:42 +0800 Subject: [PATCH 5/7] =?UTF-8?q?feat:=20=E9=87=8D=E7=BD=AE=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E5=80=92=E8=AE=A1=E6=97=B6=E6=9C=BA=E5=88=B6=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/login/ResetPage.vue | 9 +- src/views/login/components/Verify.vue | 115 +++++++++++++++++++++++--- 2 files changed, 105 insertions(+), 19 deletions(-) diff --git a/src/views/login/ResetPage.vue b/src/views/login/ResetPage.vue index 59c643a..c8ad072 100644 --- a/src/views/login/ResetPage.vue +++ b/src/views/login/ResetPage.vue @@ -22,7 +22,6 @@ v-else-if="step === 'verify'" :ct="emailCode" @nextStep="handleCheckVerifyCode" - @resend="handleSendVerifyCode" /> @@ -42,7 +41,7 @@ import Mail from './components/Mail.vue' import Verify from './components/Verify.vue' import Password from './components/Password.vue' import { showToast } from 'vant' -import { precheckEmail, resetPassword } from '@/api/login' +import { resetPassword } from '@/api/login' import { encryptPassword } from '@/utils/tools' const router = useRouter() @@ -80,10 +79,8 @@ const handleSendVerifyCode = (data: any) => { if (data?.email) { fromData.value.email = data?.email } - precheckEmail({ email: fromData.value.email }).then(() => { - showToast('the verification code has been sent to your email') - handleStep('verify') - }) + // 只切换步骤,验证码的发送由 Verify 组件负责 + handleStep('verify') } const handleCheckVerifyCode = (data: any) => { diff --git a/src/views/login/components/Verify.vue b/src/views/login/components/Verify.vue index 8305b0f..ca2f411 100644 --- a/src/views/login/components/Verify.vue +++ b/src/views/login/components/Verify.vue @@ -31,8 +31,10 @@
Confirm