diff --git a/client/src/components/admin/AdminLayout.vue b/client/src/components/admin/AdminLayout.vue index 8a8b8e1..0e26e6f 100644 --- a/client/src/components/admin/AdminLayout.vue +++ b/client/src/components/admin/AdminLayout.vue @@ -183,8 +183,8 @@ const handleChangePassword = () => { } const refreshCurrentPage = () => { - // 刷新当前路由页面,不刷新整个浏览器 - router.replace(router.currentRoute.value.fullPath) + // 强制刷新当前路由页面 + router.go(0) } interface MenuItem { diff --git a/client/src/pages/admin/About.vue b/client/src/pages/admin/About.vue index 8cad8f0..2f1bdb4 100644 --- a/client/src/pages/admin/About.vue +++ b/client/src/pages/admin/About.vue @@ -1,204 +1,405 @@ - - - 关于页面管理 - - + 新增资料 - - + + 关于页面管理 - - - - - 姓名 - 头衔/简介 - 主要展示 - 最后更新 - 操作 - - - - - - - - {{ profile.name }} + + + + 基本信息 + + + + 姓名 + + + + + 头像 + + + + + + + 所在地 + + + + + 邮箱 + + + + + + + 微信 + + + + + + + + 设为主页展示资料 + + + + + + 个人简介 (支持 HTML) + + + + + 技术栈 + + 技术标签 (用英文逗号分隔) + + + {{ tag }} + + + + + + 工作经历 + + 添加经历 + + + + + × + + + + 年份/时间段 + - - {{ truncate(profile.bio, 50) }} - - 是 - 否 - - {{ formatDate(profile.updatedAt) }} - - - 编辑 - - - 删除 - - - - - 暂无数据 - - - + + 职位/角色 + + + + 公司/组织 + + + + + + 暂无工作经历,请点击右上角添加 + + + + + + + {{ isSubmitting ? '提交中...' : (currentProfileId ? '更新资料' : '创建资料') }} + + + \ No newline at end of file + diff --git a/client/src/router.ts b/client/src/router.ts index 8654592..83ce538 100644 --- a/client/src/router.ts +++ b/client/src/router.ts @@ -68,8 +68,6 @@ const routes = [ // 关于页面管理 { path: 'about', name: 'admin-about', component: () => import('./pages/admin/About.vue') }, - { path: 'about/create', name: 'admin-about-create', component: () => import('./pages/admin/AboutForm.vue') }, - { path: 'about/edit/:id', name: 'admin-about-edit', component: () => import('./pages/admin/AboutForm.vue') }, // 合作咨询管理 { path: 'inquiries', name: 'admin-inquiries', component: () => import('./pages/admin/Inquiries.vue') }, diff --git a/server/repositories/log_repository.go b/server/repositories/log_repository.go index 5fb3631..dbaaf63 100644 --- a/server/repositories/log_repository.go +++ b/server/repositories/log_repository.go @@ -51,23 +51,30 @@ type UVTrendData struct { // GetDailyUV 获取UV趋势 func GetDailyUV(startDate, endDate string) ([]UVTrendData, error) { - query := config.DB.Model(&models.UserAccessLog{}). - Select("FROM_UNIXTIME(access_time, '%Y-%m-%d') as date, COUNT(DISTINCT user_ip) as count") - + // 确定日期范围 + var startTime, endTime time.Time if startDate != "" { startUnix := parseDateToUnix(startDate, false) - query = query.Where("access_time >= ?", startUnix) + startTime = time.Unix(startUnix, 0) } else { - // 默认最近7天 - startUnix := time.Now().AddDate(0, 0, -6).Unix() - query = query.Where("access_time >= ?", startUnix) + startTime = time.Now().AddDate(0, 0, -6) + startTime = time.Date(startTime.Year(), startTime.Month(), startTime.Day(), 0, 0, 0, 0, time.Local) } if endDate != "" { endUnix := parseDateToUnix(endDate, true) - query = query.Where("access_time <= ?", endUnix) + endTime = time.Unix(endUnix, 0) + } else { + endTime = time.Now() + endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 23, 59, 59, 0, time.Local) } + // 查询数据库 + query := config.DB.Model(&models.UserAccessLog{}). + Select("FROM_UNIXTIME(access_time, '%Y-%m-%d') as date, COUNT(DISTINCT user_ip) as count"). + Where("access_time >= ?", startTime.Unix()). + Where("access_time <= ?", endTime.Unix()) + var results []UVTrendData err := query.Group("date"). Order("date ASC"). @@ -77,13 +84,36 @@ func GetDailyUV(startDate, endDate string) ([]UVTrendData, error) { return nil, err } - // 暂未实现真实的同比环比计算逻辑,设为0 - for i := range results { - results[i].YoY = 0 - results[i].MoM = 0 + // 创建日期到数据的映射 + resultMap := make(map[string]UVTrendData) + for _, r := range results { + resultMap[r.Date] = r } - return results, nil + // 生成完整日期列表 + var fullResults []UVTrendData + current := time.Date(startTime.Year(), startTime.Month(), startTime.Day(), 0, 0, 0, 0, time.Local) + endDay := time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, time.Local) + + for !current.After(endDay) { + dateStr := current.Format("2006-01-02") + if data, exists := resultMap[dateStr]; exists { + data.YoY = 0 + data.MoM = 0 + fullResults = append(fullResults, data) + } else { + // 填充0值 + fullResults = append(fullResults, UVTrendData{ + Date: dateStr, + Count: 0, + YoY: 0, + MoM: 0, + }) + } + current = current.AddDate(0, 0, 1) + } + + return fullResults, nil } // GetUserRegions 获取用户地域分布 diff --git a/server/repositories/post_repository.go b/server/repositories/post_repository.go index 20005f7..1a76f26 100644 --- a/server/repositories/post_repository.go +++ b/server/repositories/post_repository.go @@ -352,23 +352,31 @@ func GetTopPosts(limit int) ([]models.Post, error) { // GetNewPostsTrend 获取新增文章趋势 func GetNewPostsTrend(startDate, endDate string) ([]TrendData, error) { - query := config.DB.Model(&models.Post{}). - Select("FROM_UNIXTIME(created_at, '%Y-%m-%d') as date, COUNT(*) as count"). - Where("deleted_at = ?", 0) - + // 确定日期范围 + var startTime, endTime time.Time if startDate != "" { startUnix := parseDateToUnix(startDate, false) - query = query.Where("created_at >= ?", startUnix) + startTime = time.Unix(startUnix, 0) } else { - startUnix := time.Now().AddDate(0, 0, -6).Unix() - query = query.Where("created_at >= ?", startUnix) + startTime = time.Now().AddDate(0, 0, -6) + startTime = time.Date(startTime.Year(), startTime.Month(), startTime.Day(), 0, 0, 0, 0, time.Local) } if endDate != "" { endUnix := parseDateToUnix(endDate, true) - query = query.Where("created_at <= ?", endUnix) + endTime = time.Unix(endUnix, 0) + } else { + endTime = time.Now() + endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 23, 59, 59, 0, time.Local) } + // 查询数据库 + query := config.DB.Model(&models.Post{}). + Select("FROM_UNIXTIME(created_at, '%Y-%m-%d') as date, COUNT(*) as count"). + Where("deleted_at = ?", 0). + Where("created_at >= ?", startTime.Unix()). + Where("created_at <= ?", endTime.Unix()) + var results []TrendData err := query.Group("date"). Order("date ASC"). @@ -378,13 +386,36 @@ func GetNewPostsTrend(startDate, endDate string) ([]TrendData, error) { return nil, err } - // Set YoY and MoM to 0 - for i := range results { - results[i].YoY = 0 - results[i].MoM = 0 + // 创建日期到数据的映射 + resultMap := make(map[string]TrendData) + for _, r := range results { + resultMap[r.Date] = r } - return results, nil + // 生成完整日期列表 + var fullResults []TrendData + current := time.Date(startTime.Year(), startTime.Month(), startTime.Day(), 0, 0, 0, 0, time.Local) + endDay := time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, time.Local) + + for !current.After(endDay) { + dateStr := current.Format("2006-01-02") + if data, exists := resultMap[dateStr]; exists { + data.YoY = 0 + data.MoM = 0 + fullResults = append(fullResults, data) + } else { + // 填充0值 + fullResults = append(fullResults, TrendData{ + Date: dateStr, + Count: 0, + YoY: 0, + MoM: 0, + }) + } + current = current.AddDate(0, 0, 1) + } + + return fullResults, nil } // GetPostHistory 获取文章修改历史