feat: 优化管理后台页面UI、修复TS编译错误、新增人生事件模块

- 优化 AI 配置列表页面:重构统计卡片、搜索表单、表格列展示
- 修复 3 处 TypeScript TS6133 编译错误,恢复构建
- 新增管理员修改密码和重置密码功能
- 优化小程序多个页面样式和交互
- 人生事件模块完善

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-10 23:23:09 +08:00
parent 60c63850ee
commit 755059807a
62 changed files with 4661 additions and 3019 deletions
+71
View File
@@ -61,6 +61,7 @@
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="profile">个人信息</el-dropdown-item>
<el-dropdown-item command="changePassword">修改密码</el-dropdown-item>
<el-dropdown-item command="logout" divided>退出登录</el-dropdown-item>
</el-dropdown-menu>
</template>
@@ -73,6 +74,25 @@
</el-main>
</el-container>
</el-container>
<!-- 修改密码对话框 -->
<el-dialog v-model="passwordDialogVisible" title="修改密码" width="450px">
<el-form ref="passwordFormRef" :model="passwordForm" :rules="passwordRules" label-width="80px">
<el-form-item label="原密码" prop="oldPassword">
<el-input v-model="passwordForm.oldPassword" type="password" show-password placeholder="请输入原密码" />
</el-form-item>
<el-form-item label="新密码" prop="newPassword">
<el-input v-model="passwordForm.newPassword" type="password" show-password placeholder="请输入新密码" />
</el-form-item>
<el-form-item label="确认密码" prop="confirmPassword">
<el-input v-model="passwordForm.confirmPassword" type="password" show-password placeholder="请再次输入新密码" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="passwordDialogVisible = false">取消</el-button>
<el-button type="primary" @click="handlePasswordSubmit" :loading="passwordSubmitting">确定</el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
@@ -81,6 +101,8 @@ import { useRoute } from 'vue-router'
import { useAdminStore } from '@/stores/admin'
import { Fold, Expand } from '@element-plus/icons-vue'
import { menuConfig } from '@/config/menu'
import { changeMyPassword } from '@/api/admin'
import { ElMessage, type FormInstance, type FormRules } from 'element-plus'
const route = useRoute()
// const router = useRouter()
@@ -91,6 +113,53 @@ const adminInfo = computed(() => adminStore.adminInfo)
const activeMenu = computed(() => route.path)
const passwordDialogVisible = ref(false)
const passwordSubmitting = ref(false)
const passwordFormRef = ref<FormInstance>()
const passwordForm = ref({
oldPassword: '',
newPassword: '',
confirmPassword: ''
})
const validateConfirmPassword = (_rule: any, value: string, callback: any) => {
if (!value) {
callback(new Error('请再次输入密码'))
} else if (value !== passwordForm.value.newPassword) {
callback(new Error('两次输入的密码不一致'))
} else {
callback()
}
}
const passwordRules: FormRules = {
oldPassword: [{ required: true, message: '请输入原密码', trigger: 'blur' }],
newPassword: [{ required: true, message: '请输入新密码', trigger: 'blur' }],
confirmPassword: [{ required: true, validator: validateConfirmPassword, trigger: 'blur' }]
}
const handlePasswordSubmit = async () => {
if (!passwordFormRef.value) return
await passwordFormRef.value.validate(async (valid) => {
if (!valid) return
passwordSubmitting.value = true
try {
await changeMyPassword({
oldPassword: passwordForm.value.oldPassword,
newPassword: passwordForm.value.newPassword
})
ElMessage.success('密码修改成功,请重新登录')
passwordDialogVisible.value = false
passwordForm.value = { oldPassword: '', newPassword: '', confirmPassword: '' }
adminStore.logout()
} catch (error: any) {
ElMessage.error(error?.response?.data?.message || '修改密码失败')
} finally {
passwordSubmitting.value = false
}
})
}
const menuRoutes = computed(() => {
return menuConfig.filter(item => !item.hidden)
})
@@ -104,6 +173,8 @@ const handleCommand = (command: string) => {
adminStore.logout()
} else if (command === 'profile') {
// TODO: 跳转到个人信息页面
} else if (command === 'changePassword') {
passwordDialogVisible.value = true
}
}