done dashboard

This commit is contained in:
2026-07-02 16:06:26 +07:00
parent 2181547184
commit 986bd08e5f
6 changed files with 344 additions and 126 deletions
@@ -1,11 +1,25 @@
package com.sisvietnamvn.web.controller.manage;
import com.sisvietnamvn.web.domain.Post;
import com.sisvietnamvn.web.domain.PageStatus;
import com.sisvietnamvn.web.repository.PostRepository;
import com.sisvietnamvn.web.repository.PageRepository;
import com.sisvietnamvn.web.service.PostService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.security.access.prepost.PreAuthorize;
import com.sisvietnamvn.web.security.AuthoritiesConstants;
import java.io.File;
import java.lang.management.ManagementFactory;
import com.sun.management.OperatingSystemMXBean;
import java.util.List;
import java.util.stream.Collectors;
/**
* Controller for the admin dashboard index page.
* Serves the main "/manage" landing page.
@@ -15,8 +29,69 @@ import com.sisvietnamvn.web.security.AuthoritiesConstants;
@PreAuthorize("hasAnyAuthority(\"" + AuthoritiesConstants.ADMIN + "\", \"" + AuthoritiesConstants.EDITOR + "\", \"" + AuthoritiesConstants.AUTHOR + "\", \"" + AuthoritiesConstants.CONTRIBUTOR + "\", \"" + AuthoritiesConstants.SUBSCRIBER + "\", \"" + AuthoritiesConstants.USER + "\")")
public class ManageDashboardController {
private final PostRepository postRepository;
private final PageRepository pageRepository;
private final PostService postService;
public ManageDashboardController(PostRepository postRepository, PageRepository pageRepository, PostService postService) {
this.postRepository = postRepository;
this.pageRepository = pageRepository;
this.postService = postService;
}
@GetMapping({"", "/"})
public String index() {
public String index(Model model) {
// At a Glance stats
long postCount = postRepository.count();
long pageCount = pageRepository.count();
model.addAttribute("postCount", postCount);
model.addAttribute("pageCount", pageCount);
// Recent Activity (Top 5 posts)
List<Post> recentPosts = postRepository.findAllByOrderByCreatedDateDesc().stream()
.limit(5)
.collect(Collectors.toList());
model.addAttribute("recentPosts", recentPosts);
// Telemetry Stats
Runtime runtime = Runtime.getRuntime();
long totalRam = runtime.totalMemory();
long freeRam = runtime.freeMemory();
long usedRam = totalRam - freeRam;
int ramPercentage = totalRam > 0 ? (int) ((usedRam * 100.0f) / totalRam) : 0;
model.addAttribute("ramPercentage", ramPercentage);
model.addAttribute("usedRamMb", usedRam / (1024 * 1024));
model.addAttribute("totalRamMb", totalRam / (1024 * 1024));
File root = new File("/");
long totalSpace = root.getTotalSpace();
long freeSpace = root.getUsableSpace();
long usedSpace = totalSpace - freeSpace;
int ioPercentage = totalSpace > 0 ? (int) ((usedSpace * 100.0f) / totalSpace) : 0;
model.addAttribute("ioPercentage", ioPercentage);
model.addAttribute("usedSpaceGb", usedSpace / (1024 * 1024 * 1024));
model.addAttribute("totalSpaceGb", totalSpace / (1024 * 1024 * 1024));
try {
OperatingSystemMXBean osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
double cpuLoad = osBean.getCpuLoad(); // returns 0.0 to 1.0. Returns < 0 if not available.
int cpuPercentage = cpuLoad >= 0 ? (int) (cpuLoad * 100) : 0;
model.addAttribute("cpuPercentage", cpuPercentage);
} catch (Exception e) {
model.addAttribute("cpuPercentage", 0);
}
return "manage/index";
}
@PostMapping("/quick-draft")
public String quickDraft(@RequestParam("title") String title, @RequestParam("content") String content) {
Post post = new Post();
post.setTitle(title);
post.setContent(content);
post.setStatus(PageStatus.DRAFT);
postService.save(post);
return "redirect:/manage";
}
}
@@ -0,0 +1,62 @@
package com.sisvietnamvn.web.controller.manage;
import com.sisvietnamvn.web.service.SettingService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.sisvietnamvn.web.security.AuthoritiesConstants;
import java.util.Map;
/**
* Controller for the admin Updates page.
*/
@Controller
@RequestMapping("/manage/updates")
@PreAuthorize("hasAnyAuthority(\"" + AuthoritiesConstants.ADMIN + "\", \"" + AuthoritiesConstants.EDITOR + "\")")
public class ManageUpdatesController {
private final SettingService settingService;
private static final String LATEST_VERSION = "4.0.7";
public ManageUpdatesController(SettingService settingService) {
this.settingService = settingService;
}
@GetMapping
public String updates(Model model) {
Map<String, String> settings = settingService.getAllAsMap();
String currentVersion = settings.getOrDefault("core_version", "4.0.6");
boolean updateAvailable = !LATEST_VERSION.equals(currentVersion);
model.addAttribute("coreVersionCurrent", currentVersion);
model.addAttribute("coreVersionLatest", LATEST_VERSION);
model.addAttribute("coreUpdateAvailable", updateAvailable);
// Plugin mock logic
String pluginSeoVersion = settings.getOrDefault("plugin_seo_version", "1.0.0");
model.addAttribute("pluginSeoVersion", pluginSeoVersion);
model.addAttribute("pluginSeoUpdateAvailable", !"1.1.2".equals(pluginSeoVersion));
return "manage/updates";
}
@PostMapping("/core")
public String updateCore(RedirectAttributes redirectAttributes) {
settingService.setValue("core_version", LATEST_VERSION);
redirectAttributes.addFlashAttribute("successMessage", "System successfully updated to version " + LATEST_VERSION);
return "redirect:/manage/updates";
}
@PostMapping("/plugins")
public String updatePlugins(RedirectAttributes redirectAttributes) {
settingService.setValue("plugin_seo_version", "1.1.2");
redirectAttributes.addFlashAttribute("successMessage", "Selected plugins successfully updated.");
return "redirect:/manage/updates";
}
}