diff --git a/src/api/login.js b/src/api/login.js
index 388017b..50effd7 100644
--- a/src/api/login.js
+++ b/src/api/login.js
@@ -182,3 +182,18 @@ export const resetPassword = async (token, password) => {
}
}
+/**
+ * 忘记密码
+ * @param {string} qq - QQ号
+ * @param {string} new_password - 新密码
+ * @param {string} token - 验证码token
+ * @param {string} captcha - 用户输入的验证码
+ */
+export const forgetPassword = async (qq, new_password, token, captcha) => {
+ try {
+
+ } catch (error) {
+ throw error;
+ }
+}
+
diff --git a/src/components/ChangePasswordDialog.vue b/src/components/ChangePasswordDialog.vue
new file mode 100644
index 0000000..cade203
--- /dev/null
+++ b/src/components/ChangePasswordDialog.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/ErrorDialog.vue b/src/components/ErrorDialog.vue
index e40a908..171e56a 100644
--- a/src/components/ErrorDialog.vue
+++ b/src/components/ErrorDialog.vue
@@ -47,7 +47,7 @@ const handleClose = () => {
display: flex;
justify-content: center;
align-items: center;
- z-index: 1000;
+ z-index: 2000;
}
.error-dialog {
diff --git a/src/components/forget_module.vue b/src/components/forget_module.vue
new file mode 100644
index 0000000..7266250
--- /dev/null
+++ b/src/components/forget_module.vue
@@ -0,0 +1,498 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/index.vue b/src/components/index.vue
deleted file mode 100644
index 96c0baf..0000000
--- a/src/components/index.vue
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/components/login_module.vue b/src/components/login_module.vue
index db58145..1619919 100644
--- a/src/components/login_module.vue
+++ b/src/components/login_module.vue
@@ -47,7 +47,10 @@
+
+
@@ -296,8 +299,9 @@ onMounted(() => {
}
.register-link {
+ display: flex;
+ justify-content: space-between;
margin-top: 12px;
- text-align: right;
}
.register-link a {
@@ -313,6 +317,7 @@ onMounted(() => {
text-decoration: underline;
}
+
/* VAPTCHA 相关样式 */
.VAPTCHA-init-main {
display: table;
diff --git a/src/router/index.js b/src/router/index.js
index 6cb9bc8..b6ac7f5 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -119,6 +119,11 @@ const routes = [
meta: { requiresAuth: true }
}
]
+ },
+ {
+ path: '/user/resetpassword/:token',
+ name: 'ResetPassword',
+ component: () => import('@/views/ResetPassword.vue')
}
]
diff --git a/src/views/ResetPassword.vue b/src/views/ResetPassword.vue
new file mode 100644
index 0000000..4313019
--- /dev/null
+++ b/src/views/ResetPassword.vue
@@ -0,0 +1,435 @@
+
+
+
+
![重置密码背景]()
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/backend/Login.vue b/src/views/backend/Login.vue
index 1d6f582..5dd6fd9 100644
--- a/src/views/backend/Login.vue
+++ b/src/views/backend/Login.vue
@@ -11,8 +11,20 @@
返回主界面
-
-
+
+
+
@@ -25,6 +37,7 @@ import { hasValidToken } from '@/utils/jwt'
import loginBg from '@/assets/login_1.jpg'
import loginBg1 from '@/assets/login_2.jpg'
import loginBg3 from '@/assets/login_3.jpg'
+import ForgetModule from "@/components/forget_module.vue";
import LoginModule from '@/components/login_module.vue'
import RegisterModule from '@/components/register_module.vue'
@@ -34,6 +47,7 @@ const bgImg = ref(images[randomIndex])
const router = useRouter()
const showRegister = ref(false)
+const showForget = ref(false)
const loginModuleRef = ref(null)
const handleBack = () => {
@@ -43,6 +57,7 @@ const handleBack = () => {
// 处理从注册模块切换到登录模块
const handleSwitchToLogin = () => {
showRegister.value = false
+ showForget.value = false
// 在下一个tick中重置登录表单,确保组件已经渲染
setTimeout(() => {
if (loginModuleRef.value) {
@@ -51,6 +66,12 @@ const handleSwitchToLogin = () => {
}, 0)
}
+// 处理切换到忘记密码页面
+const handleSwitchToForget = () => {
+ showForget.value = true
+ showRegister.value = false
+}
+
// 检查登录状态,如果已登录则跳转到首页
onMounted(() => {
if (hasValidToken()) {
diff --git a/src/views/index.vue b/src/views/index.vue
index 302beda..7abcdd0 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -9,6 +9,7 @@ const PrivilegeRequestDialog = defineAsyncComponent(() => import('@/components/P
const SuccessDialog = defineAsyncComponent(() => import('@/components/SuccessDialog.vue'))
const ErrorDialog = defineAsyncComponent(() => import('@/components/ErrorDialog.vue'))
const ChangeUsernameDialog = defineAsyncComponent(() => import('@/components/ChangeUsernameDialog.vue'))
+const ChangePasswordDialog = defineAsyncComponent(() => import('@/components/ChangePasswordDialog.vue'))
const isLoggedIn = computed(() => {
return !!localStorage.getItem('access_token') && !!currentUserData.value
@@ -210,6 +211,7 @@ const privilegeDialogName = ref('')
const privilegeDialogKey = ref('')
const successDialog = ref({ visible: false, message: '' })
const changeUsernameDialogVisible = ref(false)
+const changePasswordDialogVisible = ref(false)
const privilegeDisplayNames = {
'lv-admin': '管理员',
@@ -284,6 +286,12 @@ function showChangeUsernameDialog() {
showDropdown.value = false
}
+// 显示修改密码对话框
+function showChangePasswordDialog() {
+ changePasswordDialogVisible.value = true
+ showDropdown.value = false
+}
+
// 处理修改用户名成功
function handleUsernameChangeSuccess(newUsername) {
if (currentUserData.value) {
@@ -297,6 +305,19 @@ function handleUsernameChangeError(errorMessage) {
errorDialogMessage.value = errorMessage
errorDialogVisible.value = true
}
+
+// 处理修改密码成功
+function handlePasswordChangeSuccess(message) {
+ successDialog.value = { visible: true, message: message }
+}
+
+// 处理修改密码错误
+function handlePasswordChangeError(errorMessage) {
+ errorDialogMessage.value = errorMessage
+ errorDialogVisible.value = true
+ // 关闭修改密码弹窗
+ changePasswordDialogVisible.value = false
+}
@@ -392,6 +413,10 @@ function handleUsernameChangeError(errorMessage) {
修改用户名
+
+
+ 修改密码
+
管理后台
@@ -423,6 +448,11 @@ function handleUsernameChangeError(errorMessage) {
+
-
+