<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>河北保尔后台管理系统</title>
<script src="JS/util.js"></script>
<link rel="stylesheet" href="css/index.css">
</head>
<body>
<!-- 顶部导航栏 -->
<header class="top-bar">
<!-- 网站 logo -->
<div class="logo">
<img src="https://oa.baoerkeji.com.cn/assets/logo-BOKAGd4s.png" alt="河北保尔">
<span style="font-weight: bold; font-size: 1.2rem;">河北保尔后台管理系统</span>
</div>
<!-- 时间和用户信息 -->
<div class="time-user">
<span id="current-time">2025年09月25日 16:12:10</span>
<span class="user">PGCHEF</span>
</div>
</header>
<!-- 左侧功能导航栏 -->
<aside class="sidebar">
<h1>后台管理系统</h1>
<ul>
<!-- 首页菜单 -->
<li class="parent index active">
<span>首页</span>
</li>
<!-- 管理员管理菜单 -->
<li class="parent">
<span>管理员管理</span>
</li>
<!-- 帖子管理菜单及子菜单 -->
<li class="parent">
<span>帖子管理</span>
<ul class="child">
<li>待审核帖子</li>
<li>帖子列表</li>
<li>帖子详情</li>
<li>帖子删除</li>
<li>帖子信息</li>
</ul>
</li>
<!-- 审核管理菜单及子菜单 -->
<li class="parent">
<span>审核管理</span>
<ul class="child">
<li>审核帖子</li>
<li>未审核通过的原因</li>
</ul>
</li>
<!-- 用户管理菜单及子菜单 -->
<li class="parent">
<span>用户管理</span>
<ul class="child">
<li>查看用户信息</li>
<li>拉黑操作</li>
<li>查看评论及回复</li>
</ul>
</li>
</ul>
</aside>
<!-- 主内容区 -->
<main class="content">
<!-- 首页内容 -->
<div id="home-section" class="content-section active">
<h2>系统概览</h2>
<div class="welcome-img">
<img src="https://oa.baoerkeji.com.cn/assets/Hello-CZbGWvKg.png" alt="欢迎使用">
</div>
</div>
<!-- 管理员管理内容 -->
<div id="admin-section" class="content-section">
<h2>管理员管理</h2>
<div style="display: flex; justify-content: space-between; margin-bottom: 20px;">
<button class="btn btn-primary" id="add-admin-btn">添加管理员</button>
<div>
<input type="text" id="search-admin" placeholder="搜索管理员昵称..." style="padding: 8px; border: 1px solid #ddd; border-radius: 4px;">
<button class="btn btn-success" id="search-admin-btn">搜索</button>
</div>
</div>
<div id="admin-table-container">
<table id="admin-table">
<thead>
<tr>
<th>ID</th>
<th>账号</th>
<th>昵称</th>
<th>电话</th>
<th>创建时间</th>
<th>头像</th>
<th>操作</th>
</tr>
</thead>
<tbody id="admin-table-body">
<!-- 动态加载管理员数据 -->
</tbody>
</table>
<div class="pagination" id="admin-pagination">
<!-- 分页按钮 -->
</div>
</div>
</div>
<!-- 帖子管理内容 -->
<div id="post-section" class="content-section">
<h2>帖子管理</h2>
<p>选择左侧子菜单查看具体内容</p>
</div>
<!-- 审核管理内容 -->
<div id="audit-section" class="content-section">
<h2>审核管理</h2>
<p>选择左侧子菜单查看具体内容</p>
</div>
<!-- 用户管理内容 -->
<div id="user-section" class="content-section">
<h2>用户管理</h2>
<p>选择左侧子菜单查看具体内容</p>
</div>
</main>
<div id="admin-modal" class="modal">
<div class="modal-content">
<div class="modal-header">
<h3 id="modal-title">添加管理员</h3>
<button class="modal-close" id="modal-close">×</button>
</div>
<form id="admin-form">
<input type="hidden" id="admin-id">
<div class="form-group">
<label for="admin-account">账号</label>
<input type="text" id="admin-account" required>
</div>
<div class="form-group">
<label for="admin-password">密码</label>
<input type="password" id="admin-password" required>
</div>
<div class="form-group">
<label for="admin-nickname">昵称</label>
<input type="text" id="admin-nickname" required>
</div>
<div class="form-group">
<label for="admin-tel">电话</label>
<input type="text" id="admin-tel">
</div>
<div class="form-group">
<label for="admin-icon">头像</label>
<input type="file" id="admin-icon" accept="image/*">
<div id="icon-preview" style="margin-top: 10px;"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn" id="modal-cancel">取消</button>
<button type="submit" class="btn btn-primary" id="modal-submit">保存</button>
</div>
</form>
</div>
</div>
<script>
window.onload = ()=>{
const nickName = localStorage.getItem('loginNickname');
const user = document.querySelector(".time-user .user");
if(nickName==null ){
console.log("没有信息,传入错误");
}else{
user.textContent = nickName;
}
}
// 设置项目基础路径
const BASE_URL = '/PGtieba';
// 修复变量定义
const page = document.querySelector("#admin-pagination");
const tableBody = document.querySelector("#admin-table-body"); // 修复:使用tbody
let pageIndex = 1;
let pageSize = 5;
let pageCount = 0;
let searchKeyword = "";
// 页面加载完成后初始化
window.onload = function() {
console.log("页面加载完成,BASE_URL:", BASE_URL);
loadAdminList();
bindEvents();
};
// 修复后的绑定事件函数
function bindEvents() {
// 搜索按钮事件
document.getElementById('search-admin-btn').addEventListener('click', function() {
searchKeyword = document.getElementById('search-admin').value.trim();
pageIndex = 1;
loadAdminList();
});
// 添加管理员按钮事件
document.getElementById('add-admin-btn').addEventListener('click', openAddModal);
// 模态框关闭事件
document.getElementById('modal-close').addEventListener('click', function() {
document.getElementById('admin-modal').style.display = 'none';
});
document.getElementById('modal-cancel').addEventListener('click', function() {
document.getElementById('admin-modal').style.display = 'none';
});
// 表单提交事件
document.getElementById('admin-form').addEventListener('submit', function(e) {
e.preventDefault();
const formData = new FormData(this);
saveAdmin(formData);
});
}
//加载管理员列表函数
function loadAdminList() {
let params = {
pageIndex: pageIndex,
pageSize: pageSize
};
if (searchKeyword) {
params.nickName = searchKeyword;
}
console.log("加载管理员列表,参数:", params);
// 使用BASE_URL前缀
ajax.get(BASE_URL + '/admin/adminList', {data: JSON.stringify(params)}, function(response) {
console.log("管理员列表响应:", response);
if (response.code === 200) {
const adminList = response.data.adminList;
pageCount = response.data.pageCount;
let content = '';
if (!adminList || adminList.length === 0) {
content = '<tr><td colspan="7" style="text-align: center;">暂无数据</td></tr>';
} else {
adminList.forEach(admin => {
content += `
<tr>
<td>${admin.adminId}</td>
<td>${admin.account}</td>
<td>${admin.nickName || '未设置'}</td>
<td>${admin.tel || '未设置'}</td>
<td>${admin.createtime || '未知'}</td>
<td>${admin.icon ? `<img src="${admin.icon}" style="width: 50px; height: 50px;">` : '无'}</td>
<td>
<button class="btn btn-primary" onclick="editAdmin(${admin.adminId})">编辑</button>
<button class="btn btn-danger" onclick="deleteAdmin(${admin.adminId})">删除</button>
</td>
</tr>`;
});
}
tableBody.innerHTML = content;
updatePagination();
} else {
alert('加载管理员列表失败: ' + response.msg);
}
});
}
// 修复分页显示
function updatePagination() {
if (page) {
page.innerHTML = `
共${pageCount}页,当前第${pageIndex}页
<button onclick="changePage(0)">首页</button>
<button onclick="changePage(1)">上一页</button>
<button onclick="changePage(2)">下一页</button>
<button onclick="changePage(3)">尾页</button>
`;
checkButton();
}
}
// 检查分页按钮状态
function checkButton() {
if (!page) return;
let pageBtns = page.querySelectorAll("button");
if (pageIndex == 1 && pageIndex == pageCount) {
pageBtns[0].disabled = true;
pageBtns[1].disabled = true;
pageBtns[2].disabled = true;
pageBtns[3].disabled = true;
} else if (pageIndex == 1) {
pageBtns[0].disabled = true;
pageBtns[1].disabled = true;
pageBtns[2].disabled = false;
pageBtns[3].disabled = false;
} else if (pageIndex == pageCount) {
pageBtns[0].disabled = false;
pageBtns[1].disabled = false;
pageBtns[2].disabled = true;
pageBtns[3].disabled = true;
} else {
pageBtns[0].disabled = false;
pageBtns[1].disabled = false;
pageBtns[2].disabled = false;
pageBtns[3].disabled = false;
}
}
// 改变页码
function changePage(status) {
switch (status) {
case 0:
pageIndex = 1;
break;
case 1:
pageIndex -= 1;
break;
case 2:
pageIndex += 1;
break;
case 3:
pageIndex = pageCount;
break;
}
loadAdminList();
}
// 打开添加管理员模态框
function openAddModal() {
document.getElementById('modal-title').textContent = '添加管理员';
document.getElementById('admin-form').reset();
document.getElementById('admin-id').value = '';
document.getElementById('icon-preview').innerHTML = '';
document.getElementById('admin-modal').style.display = 'flex';
}
// 修复编辑管理员函数
function editAdmin(adminId) {
console.log("编辑管理员:", adminId);
ajax.get(BASE_URL + '/admin/getAdmin', {data: JSON.stringify({adminId: adminId})}, function(response) {
console.log("管理员详情响应:", response);
if (response.code === 200) {
const admin = response.data;
document.getElementById('modal-title').textContent = '编辑管理员';
document.getElementById('admin-id').value = admin.adminId;
document.getElementById('admin-account').value = admin.account;
document.getElementById('admin-nickname').value = admin.nickName || '';
document.getElementById('admin-tel').value = admin.tel || '';
document.getElementById('admin-password').value = ''; // 密码留空
if (admin.icon) {
document.getElementById('icon-preview').innerHTML = `<img src="${admin.icon}" style="max-width: 100px; max-height: 100px;">`;
} else {
document.getElementById('icon-preview').innerHTML = '';
}
document.getElementById('admin-modal').style.display = 'flex';
} else {
alert('获取管理员信息失败: ' + response.msg);
}
});
}
// 删除管理员
function deleteAdmin(adminId) {
if (confirm('确定要删除这个管理员吗?')) {
ajax.get(BASE_URL + '/admin/deleteList', {data: JSON.stringify({adminId: adminId})}, function(response) {
if (response.code === 200) {
alert('删除成功');
loadAdminList();
} else {
alert('删除失败: ' + response.msg);
}
});
}
}
// 修复保存管理员函数
function saveAdmin(formData) {
const adminData = {
account: document.getElementById('admin-account').value,
password: document.getElementById('admin-password').value,
nickName: document.getElementById('admin-nickname').value,
tel: document.getElementById('admin-tel').value
};
const adminId = document.getElementById('admin-id').value;
const iconFile = document.getElementById('admin-icon').files[0];
// 如果有头像文件,先上传头像
if (iconFile) {
uploadIcon(iconFile, function(imageUrl, error) {
if (error) {
alert('头像上传失败: ' + error);
return;
}
adminData.icon = imageUrl;
saveAdminData(adminId, adminData);
});
} else {
saveAdminData(adminId, adminData);
}
}
function saveAdminData(adminId, adminData) {
if (adminId) {
// 编辑操作
adminData.adminId = adminId;
ajax.get(BASE_URL + '/admin/updateList', {data: JSON.stringify(adminData)}, function(response) {
handleSaveResponse(response, '更新');
});
} else {
// 添加操作
ajax.get(BASE_URL + '/admin/addAdmin', {data: JSON.stringify(adminData)}, function(response) {
handleSaveResponse(response, '添加');
});
}
}
function handleSaveResponse(response, operation) {
if (response.code === 200) {
alert(operation + '成功');
document.getElementById('admin-modal').style.display = 'none';
if (operation === '添加') {
pageIndex = 1;
}
loadAdminList();
} else {
alert(operation + '失败: ' + response.msg);
}
}
// 上传头像
function uploadIcon(file, callback) {
const formData = new FormData();
formData.append('file', file);
ajax.formData(BASE_URL + '/admin/uploadIcon', formData, function(response) {
if (response.code === 200) {
callback(response.data.imageUrl || response.data);
} else {
callback(null, response.msg || '上传失败');
}
});
}
// 实时更新时间
function updateTime() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, "0");
const day = String(now.getDate()).padStart(2, "0");
const hours = String(now.getHours()).padStart(2, "0");
const minutes = String(now.getMinutes()).padStart(2, "0");
const seconds = String(now.getSeconds()).padStart(2, "0");
const timeStr = `${year}年${month}月${day}日 ${hours}:${minutes}:${seconds}`;
document.getElementById("current-time").textContent = timeStr;
}
updateTime();
setInterval(updateTime, 1000);
// 页面加载完成后初始化
document.addEventListener('DOMContentLoaded', function() {
const parents = document.querySelectorAll('.parent');
const childItems = document.querySelectorAll('.child li');
const contentSections = document.querySelectorAll('.content-section');
// 父菜单点击事件
parents.forEach(parent => {
parent.addEventListener('click', function(e) {
// 如果点击的是子菜单项,不处理父菜单点击
if (e.target.tagName === 'LI' && e.target.classList.contains('child')) return;
if (e.target.parentElement && e.target.parentElement.classList.contains('child')) return;
// 切换当前菜单的active状态
const isActive = this.classList.contains('active');
// 移除所有active类
parents.forEach(p => p.classList.remove('active'));
contentSections.forEach(section => section.classList.remove('active'));
// 如果之前不是active状态,则设置为active
if (!isActive) {
this.classList.add('active');
}
// 显示对应内容区域
const index = Array.from(parents).indexOf(this);
if (contentSections[index]) {
contentSections[index].classList.add('active');
// 如果是管理员管理页面,加载数据
if (index === 1) {
adminManager.loadAdminList();
}
}
});
});
// 子菜单点击事件
childItems.forEach(item => {
item.addEventListener('click', function(e) {
e.stopPropagation(); // 阻止事件冒泡
// 移除所有子菜单active类
childItems.forEach(li => li.classList.remove('active'));
// 为当前子菜单添加active类
this.classList.add('active');
// 这里可以添加加载对应内容的逻辑
const parentSection = this.closest('.parent');
const sectionId = parentSection.querySelector('span').textContent.trim();
// 在实际应用中,这里应该加载对应的内容
console.log(`加载${sectionId}的"${this.textContent}"内容`);
// 可以根据子菜单项显示不同的内容
showSubContent(this.textContent);
});
});
// 显示子菜单内容的函数
function showSubContent(subMenuText) {
// 获取当前激活的主内容区域
const activeSection = document.querySelector('.content-section.active');
// 根据子菜单文本更新内容
activeSection.innerHTML = `
<h2>${activeSection.querySelector('h2').textContent} - ${subMenuText}</h2>
<p>这是 ${subMenuText} 的详细内容区域。</p>
<p>在实际应用中,这里会加载对应的数据和管理功能。</p>
<div style="margin-top: 20px;">
<button class="btn btn-primary">刷新数据</button>
<button class="btn btn-success" style="margin-left: 10px;">导出报表</button>
</div>
`;
}
// 管理员管理相关事件绑定
document.getElementById('add-admin-btn').addEventListener('click', function() {
adminManager.openAddModal();
});
document.getElementById('search-admin-btn').addEventListener('click', function() {
adminManager.searchKeyword = document.getElementById('search-admin').value;
adminManager.loadAdminList(1);
});
document.getElementById('search-admin').addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
adminManager.searchKeyword = this.value;
adminManager.loadAdminList(1);
}
});
// 模态框相关事件
document.getElementById('modal-close').addEventListener('click', function() {
document.getElementById('admin-modal').style.display = 'none';
});
document.getElementById('modal-cancel').addEventListener('click', function() {
document.getElementById('admin-modal').style.display = 'none';
});
// 表单提交
document.getElementById('admin-form').addEventListener('submit', function(e) {
e.preventDefault();
const formData = new FormData(this);
const iconFile = document.getElementById('admin-icon').files[0];
if (iconFile) {
// 如果有头像文件,先上传头像
adminManager.uploadIcon(iconFile, function(result, error) {
if (error) {
alert('头像上传失败: ' + error);
return;
}
// 头像上传成功后保存管理员信息
formData.set('icon', result);
adminManager.saveAdmin(formData);
});
} else {
// 没有头像文件,直接保存管理员信息
adminManager.saveAdmin(formData);
}
});
// 头像预览
document.getElementById('admin-icon').addEventListener('change', function(e) {
const file = e.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = function(e) {
document.getElementById('icon-preview').innerHTML =
`<img src="${e.target.result}" style="max-width: 100px; max-height: 100px; border-radius: 4px;">`;
};
reader.readAsDataURL(file);
}
});
// 默认激活首页
document.querySelector('.parent.index').classList.add('active');
document.querySelector('#home-section').classList.add('active');
});
</script>
</body>
</html>package com.yyq.servlet;
import com.alibaba.fastjson.JSONObject;
import com.yyq.dao.AdminDao;
import com.yyq.entity.Admin;
import com.yyq.util.R;
import com.yyq.util.ResultCode;
import com.yyq.util.UploadUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@WebServlet(urlPatterns = "/admin/*")
@MultipartConfig(maxFileSize = 10485760,maxRequestSize = 10485760)
public class AdminManagementServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static AdminDao adminDao = new AdminDao();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("application/json;charset=utf-8");
resp.setCharacterEncoding("UTF-8");
String path = req.getPathInfo();
if (path == null) {
sendError(resp, "路径不能为空");
return;
}
path = path.substring(1); // 去掉开头的/
System.out.println("接收到请求,路径: " + path);
System.out.println("查询参数: " + req.getQueryString());
String res = null;
PrintWriter out = null;
try {
out = resp.getWriter();
switch (path) {
case "adminList": {
System.out.println("---------管理员列表-----------");
String data = req.getParameter("data");
System.out.println("接收到的data参数: " + data);
Map<String,Object> map = new HashMap<>();
if(data != null && !data.isEmpty()) {
map = JSONObject.parseObject(data, Map.class);
}
int pageIndex = map.get("pageIndex") != null ? Integer.parseInt(map.get("pageIndex").toString()) : 1;
int pageSize = map.get("pageSize") != null ? Integer.parseInt(map.get("pageSize").toString()) : 5;
map.put("pageIndex", pageIndex);
map.put("pageSize", pageSize);
List<Admin> adminList = adminDao.adminList(map);
int pageCount = adminDao.pageCount(pageSize);
Map<String,Object> resultMap = new HashMap<>();
resultMap.put("pageCount", pageCount);
resultMap.put("adminList", adminList);
res = R.ok(resultMap).toJSONString();
break;
}
case "addAdmin": {
System.out.println("---------添加管理员-------------");
String data = req.getParameter("data");
System.out.println("接收到的data参数: " + data);
if(data == null || data.isEmpty()) {
res = R.er(ResultCode.PARAM_ERROR, "数据参数为空").toJSONString();
break;
}
Admin admin = JSONObject.parseObject(data, Admin.class);
System.out.println("解析后的admin对象: " + admin);
int i = adminDao.addAdmin(admin);
res = i > 0 ? R.ok().toJSONString() : R.er(ResultCode.ERROR, "添加管理员失败").toJSONString();
break;
}
case "deleteList": {
System.out.println("----------删除管理员-------------");
String data = req.getParameter("data");
if(data != null && !data.isEmpty()) {
Map<String, Object> map = JSONObject.parseObject(data, Map.class);
int adminId = Integer.parseInt(map.get("adminId").toString());
int i = adminDao.deleteAdmin(adminId);
res = i > 0 ? R.ok().toJSONString() : R.er(ResultCode.ERROR, "删除失败").toJSONString();
} else {
res = R.er(ResultCode.PARAM_ERROR, "参数错误").toJSONString();
}
break;
}
case "updateList": {
System.out.println("-------更新管理员-------------");
String data = req.getParameter("data");
if(data != null && !data.isEmpty()) {
Admin admin = JSONObject.parseObject(data, Admin.class);
int row = adminDao.updateAdmin(admin);
res = row > 0 ? R.ok().toJSONString() : R.er(ResultCode.ERROR, "更新失败").toJSONString();
} else {
res = R.er(ResultCode.PARAM_ERROR, "没有收到前端参数").toJSONString();
}
break;
}
case "uploadIcon": {
System.out.println("---------上传头像-----------");
String imagepath = UploadUtil.uploadFile(req);
System.out.println("图片的路径是: " + imagepath);
Map<String, String> result = new HashMap<>();
result.put("imageUrl", imagepath);
res = R.ok(result).toJSONString();
break;
}
case "getAdmin": {
System.out.println("---------获取管理员详情-----------");
String data = req.getParameter("data");
if(data != null && !data.isEmpty()) {
Map<String, Object> map = JSONObject.parseObject(data, Map.class);
int adminId = Integer.parseInt(map.get("adminId").toString());
// 这里需要实现getAdminById方法
Admin admin = adminDao.getAdminById(adminId);
if(admin != null) {
res = R.ok(admin).toJSONString();
} else {
res = R.er(ResultCode.ERROR, "管理员不存在").toJSONString();
}
} else {
res = R.er(ResultCode.PARAM_ERROR, "参数错误").toJSONString();
}
break;
}
default: {
res = R.er(ResultCode.ERROR, "未知操作: " + path).toJSONString();
break;
}
}
// 确保有响应
if (res == null) {
res = R.er(ResultCode.ERROR, "操作未完成").toJSONString();
}
System.out.println("返回响应: " + res);
out.print(res);
} catch (Exception e) {
e.printStackTrace();
if (out != null) {
out.print(R.er(ResultCode.ERROR, "服务器异常: " + e.getMessage()).toJSONString());
}
}
}
private void sendError(HttpServletResponse resp, String message) throws IOException {
resp.setStatus(400);
PrintWriter out = resp.getWriter();
out.print(R.er(ResultCode.ERROR, message).toJSONString());
out.flush();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp); // 或者实现独立的POST处理
}
}查看一下我的搜索功能为什么出 问题
最新发布