- 取 消
- 保 存
+
+ 取 消
+ 保 存
+
diff --git a/resources/admin/src/pages/auth/roles/components/SaveDialog.vue b/resources/admin/src/pages/auth/roles/components/SaveDialog.vue
index 14eb025..9381ee0 100644
--- a/resources/admin/src/pages/auth/roles/components/SaveDialog.vue
+++ b/resources/admin/src/pages/auth/roles/components/SaveDialog.vue
@@ -1,6 +1,5 @@
-
+
@@ -20,8 +19,10 @@
- 取 消
- 保 存
+
+ 取 消
+ 保 存
+
diff --git a/resources/admin/src/pages/auth/roles/index.vue b/resources/admin/src/pages/auth/roles/index.vue
index 0cd05a7..4fe1089 100644
--- a/resources/admin/src/pages/auth/roles/index.vue
+++ b/resources/admin/src/pages/auth/roles/index.vue
@@ -72,13 +72,28 @@
- 查看
编辑
- 权限
复制
-
- 删除
-
+
+
+ 更多
+
+
+
+
+
+ 查看
+
+
+ 权限
+
+
+
+ 删除
+
+
+
+
@@ -100,6 +115,9 @@
+
+
+
+
+
diff --git a/resources/admin/src/pages/home/components/Welcome.vue b/resources/admin/src/pages/home/components/Welcome.vue
new file mode 100644
index 0000000..6d5e125
--- /dev/null
+++ b/resources/admin/src/pages/home/components/Welcome.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+
{{ greetingText }}
+
{{ userInfo?.username || '管理员' }},欢迎回来!
+
+
+
+
+
+ {{ currentDate }}
+
+
+
+ {{ currentTime }}
+
+
+
+ {{ weatherText }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/admin/src/pages/home/index.vue b/resources/admin/src/pages/home/index.vue
index b0244fc..dd04c90 100644
--- a/resources/admin/src/pages/home/index.vue
+++ b/resources/admin/src/pages/home/index.vue
@@ -1,444 +1,50 @@
-
-
-
-
-
-
- 活跃
-
-
-
-
-
-
-
-
- 配置
-
-
-
-
-
-
-
-
- 权限
-
-
-
-
-
-
-
-
- 在线
-
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
{{ item.label }}: {{ item.value }}
-
-
-
-
-
-
-
-
- {{ systemInfo.version }}
- {{ systemInfo.phpVersion }}
- {{ systemInfo.laravelVersion }}
- {{ systemInfo.serverTime }}
- {{ systemInfo.environment }}
-
-
-
-
-
-
-
-
-
-
-
-
-
- 用户管理
-
-
-
-
-
- 角色管理
-
-
-
-
-
- 权限管理
-
-
-
-
-
- 部门管理
-
-
-
-
-
- 在线用户
-
-
-
-
-
- 系统配置
-
-
-
-
-
-
-
-
-
-
-
-
- {{ item.level }}
- {{ item.message }}
-
-
- {{ item.created_at }}
-
-
-
-
-
-
-
-
+
+
+
+
diff --git a/resources/admin/src/pages/ucenter/components/BasicInfo.vue b/resources/admin/src/pages/ucenter/components/BasicInfo.vue
index 157dbb4..e21315b 100644
--- a/resources/admin/src/pages/ucenter/components/BasicInfo.vue
+++ b/resources/admin/src/pages/ucenter/components/BasicInfo.vue
@@ -25,41 +25,48 @@ const loading = ref(false)
// 表单初始值
const initialValues = computed(() => ({
username: props.userInfo.username || '',
- nickname: props.userInfo.nickname || '',
- mobile: props.userInfo.mobile || '',
+ real_name: props.userInfo.real_name || '',
+ phone: props.userInfo.phone || '',
email: props.userInfo.email || '',
- gender: props.userInfo.gender || 0,
- birthday: props.userInfo.birthday || null,
- bio: props.userInfo.bio || '',
}))
// 表单项配置
const formItems = [
- { field: 'username', label: '用户名', type: 'input' },
{
- field: 'nickname', label: '昵称', type: 'input', required: true,
+ field: 'username',
+ label: '用户名',
+ type: 'input',
rules: [
- { required: true, message: '请输入昵称', trigger: 'blur' },
- { min: 2, max: 20, message: '昵称长度在 2 到 20 个字符', trigger: 'blur' },
+ { required: true, message: '请输入用户名', trigger: 'blur' },
+ { min: 3, max: 20, message: '用户名长度在 3 到 20 个字符', trigger: 'blur' },
],
},
{
- field: 'phone', label: '手机号', type: 'input',
- rules: [{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }],
- },
- {
- field: 'email', label: '邮箱', type: 'input',
- rules: [{ type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' }],
- },
- {
- field: 'gender', label: '性别', type: 'radio',
- options: [
- { label: '男', value: 1 },
- { label: '女', value: 2 },
- { label: '保密', value: 0 },
+ field: 'real_name',
+ label: '真实姓名',
+ type: 'input',
+ required: true,
+ rules: [
+ { required: true, message: '请输入真实姓名', trigger: 'blur' },
+ { min: 2, max: 20, message: '姓名长度在 2 到 20 个字符', trigger: 'blur' },
+ ],
+ },
+ {
+ field: 'phone',
+ label: '手机号',
+ type: 'input',
+ rules: [
+ { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' },
+ ],
+ },
+ {
+ field: 'email',
+ label: '邮箱',
+ type: 'input',
+ rules: [
+ { type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' },
],
},
- { field: 'remark', label: '个人简介', type: 'textarea', rows: 4, maxLength: 200, showCount: true, },
]
// 表单提交
@@ -67,27 +74,32 @@ const handleFinish = async (values) => {
try {
loading.value = true
- // 调用更新当前用户信息接口
- let res = await api.users.edit.post({
+ // 获取当前用户ID
+ const userId = userStore.userInfo?.id
+
+ if (!userId) {
+ throw new Error('用户信息不存在,请重新登录')
+ }
+
+ // 调用更新用户信息接口
+ const res = await api.users.edit.put(userId, {
username: values.username,
- nickname: values.nickname,
- mobile: values.mobile,
+ real_name: values.real_name,
+ phone: values.phone,
email: values.email,
- gender: values.gender,
- remark: values.remark,
})
- if (!res || res.code !== 1) {
+ if (!res || res.code !== 200) {
throw new Error(res.message || '保存失败,请重试')
}
+
// 重新获取用户信息
- const response = await api.user.get()
+ const response = await api.me.get()
if (response && response.data) {
userStore.setUserInfo(response.data)
+ emit('update', response.data)
}
- // 通知父组件更新
- emit('update', values)
message.success('保存成功')
} catch (error) {
message.error(error.message || '保存失败,请重试')
diff --git a/resources/admin/src/pages/ucenter/components/Password.vue b/resources/admin/src/pages/ucenter/components/Password.vue
index 427132c..ef86bf4 100644
--- a/resources/admin/src/pages/ucenter/components/Password.vue
+++ b/resources/admin/src/pages/ucenter/components/Password.vue
@@ -6,30 +6,36 @@
diff --git a/resources/admin/src/pages/ucenter/index.vue b/resources/admin/src/pages/ucenter/index.vue
index ae0dbc3..84e4889 100644
--- a/resources/admin/src/pages/ucenter/index.vue
+++ b/resources/admin/src/pages/ucenter/index.vue
@@ -87,7 +87,7 @@ const initUserInfo = async () => {
userInfo.value = storeUserInfo
} else {
// 如果 store 中没有用户信息,则从接口获取
- const response = await api.user.get()
+ const response = await api.me.get()
if (response && response.data) {
userStore.setUserInfo(response.data)
userInfo.value = response.data
@@ -140,21 +140,52 @@ const handleAvatarChange = ({ fileList }) => {
}
// 上传头像
-const handleAvatarUpload = () => {
+const handleAvatarUpload = async () => {
if (avatarFileList.value.length === 0) {
message.warning('请先选择头像')
return
}
- loading.value = true
- // 模拟上传
- setTimeout(() => {
- const file = avatarFileList.value[0]
- userInfo.value.avatar = URL.createObjectURL(file.originFileObj)
+
+ try {
+ loading.value = true
+ const file = avatarFileList.value[0].originFileObj
+
+ // 调用上传接口
+ const uploadRes = await api.upload.post(file)
+ if (!uploadRes || uploadRes.code !== 200) {
+ throw new Error(uploadRes.message || '头像上传失败')
+ }
+
+ // 获取当前用户ID
+ const userId = userStore.userInfo?.id
+ if (!userId) {
+ throw new Error('用户信息不存在,请重新登录')
+ }
+
+ // 更新用户头像
+ const updateRes = await api.users.edit.put(userId, {
+ avatar: uploadRes.data.url,
+ })
+
+ if (!updateRes || updateRes.code !== 200) {
+ throw new Error(updateRes.message || '头像更新失败')
+ }
+
+ // 重新获取用户信息
+ const response = await api.me.get()
+ if (response && response.data) {
+ userStore.setUserInfo(response.data)
+ userInfo.value = response.data
+ }
+
message.success('头像更新成功')
showAvatarModal.value = false
avatarFileList.value = []
+ } catch (error) {
+ message.error(error.message || '头像上传失败,请重试')
+ } finally {
loading.value = false
- }, 1000)
+ }
}
onMounted(() => {
diff --git a/routes/admin.php b/routes/admin.php
index 86f52f0..7f01fda 100644
--- a/routes/admin.php
+++ b/routes/admin.php
@@ -101,12 +101,12 @@ Route::middleware(['auth.check:admin', 'log.request'])->group(function () {
// 系统操作日志
Route::prefix('logs')->group(function () {
Route::get('/', [\App\Http\Controllers\System\Admin\Log::class, 'index']);
+ Route::get('/export', [\App\Http\Controllers\System\Admin\Log::class, 'export']);
Route::get('/statistics', [\App\Http\Controllers\System\Admin\Log::class, 'getStatistics']);
Route::get('/{id}', [\App\Http\Controllers\System\Admin\Log::class, 'show']);
Route::delete('/{id}', [\App\Http\Controllers\System\Admin\Log::class, 'destroy']);
Route::post('/batch-delete', [\App\Http\Controllers\System\Admin\Log::class, 'batchDelete']);
Route::post('/clear', [\App\Http\Controllers\System\Admin\Log::class, 'clearLogs']);
- Route::post('/export', [\App\Http\Controllers\System\Admin\Log::class, 'export']);
});
// 数据字典管理