feat: v1.12.0 添加用户管理、登录注册、馆员审核功能

- User 模型添加密码、角色、状态字段
- UserService 添加登录、注册、审核、密码管理功能
- SQLDialect 更新用户表结构
- CLI 端扩展支持全部15个功能模块
- 默认管理员账户: admin@library.com / admin123
main
SLMS Development Team 5 months ago
parent a103a283c7
commit f5b6f13a84

@ -1,21 +1,41 @@
package com.smartlibrary.cli;
import com.smartlibrary.service.BookService;
import com.smartlibrary.model.Book;
import com.smartlibrary.service.*;
import com.smartlibrary.model.*;
import com.smartlibrary.ai.SmartAIService;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
/**
* -
* - v1.12.0
* 15
*/
public class CLIApplication {
private final BookService bookService;
private final UserService userService;
private final NotificationService notificationService;
private final ReservationService reservationService;
private final LoanHistoryService loanHistoryService;
private final ReaderInteractionService readerService;
private final StatisticsService statisticsService;
private final SystemSettingsService settingsService;
private final SmartAIService aiService;
private final Scanner scanner;
private boolean running = true;
private User currentUser = null; // 当前登录用户
public CLIApplication() {
this.bookService = new BookService();
this.userService = new UserService();
this.notificationService = new NotificationService();
this.reservationService = new ReservationService();
this.loanHistoryService = new LoanHistoryService();
this.readerService = new ReaderInteractionService();
this.statisticsService = new StatisticsService();
this.settingsService = new SystemSettingsService();
this.aiService = new SmartAIService();
this.scanner = new Scanner(System.in);
}
@ -29,14 +49,97 @@ public class CLIApplication {
}
public void run() {
showHelp();
while (running) {
System.out.print("\n请输入命令 > ");
String input = scanner.nextLine().trim();
processCommand(input);
// 先显示登录菜单
showLoginMenu();
if (currentUser != null) {
showHelp();
while (running) {
String prompt = currentUser != null ?
String.format("\n[%s] 请输入命令 > ", currentUser.getName()) :
"\n请输入命令 > ";
System.out.print(prompt);
String input = scanner.nextLine().trim();
processCommand(input);
}
}
System.out.println("感谢使用,再见!");
}
private void showLoginMenu() {
System.out.println("\n===== 用户登录 =====");
System.out.println(" 1. 登录");
System.out.println(" 2. 注册");
System.out.println(" 3. 游客模式");
System.out.println(" 0. 退出");
System.out.print("请选择: ");
String choice = scanner.nextLine().trim();
switch (choice) {
case "1" -> doLogin();
case "2" -> doRegister();
case "3" -> {
currentUser = new User("GUEST", "游客", "guest@temp.com", "");
currentUser.setStatus(User.Status.APPROVED);
currentUser.setRole(User.Role.READER);
System.out.println("✓ 游客模式,部分功能受限");
}
case "0" -> running = false;
default -> showLoginMenu();
}
}
private void doLogin() {
System.out.print("邮箱: ");
String email = scanner.nextLine().trim();
System.out.print("密码: ");
String password = scanner.nextLine().trim();
User user = userService.login(email, password);
if (user != null) {
currentUser = user;
System.out.println("✓ 登录成功! 欢迎 " + user.getName());
if (user.isStaff()) {
int pending = userService.countPendingUsers();
if (pending > 0) {
System.out.printf(" [提醒] 有 %d 个用户待审核%n", pending);
}
}
} else {
System.out.println("✗ 登录失败,邮箱或密码错误,或账户未审核");
showLoginMenu();
}
}
private void doRegister() {
System.out.println("\n===== 用户注册 =====");
System.out.print("姓名: ");
String name = scanner.nextLine().trim();
System.out.print("邮箱: ");
String email = scanner.nextLine().trim();
System.out.print("密码: ");
String password = scanner.nextLine().trim();
System.out.print("电话: ");
String phone = scanner.nextLine().trim();
System.out.print("性别 (男/女): ");
String gender = scanner.nextLine().trim();
System.out.print("年龄: ");
int age = Integer.parseInt(scanner.nextLine().trim());
System.out.print("院系: ");
String department = scanner.nextLine().trim();
System.out.print("专业: ");
String major = scanner.nextLine().trim();
System.out.print("类型 (学生/教师/访客): ");
String userType = scanner.nextLine().trim();
boolean success = userService.register(name, email, password, phone, gender, age, department, major, userType);
if (success) {
System.out.println("✓ 注册成功! 请等待馆员审核后登录");
} else {
System.out.println("✗ 注册失败,邮箱可能已存在");
}
showLoginMenu();
}
private void processCommand(String input) {
if (input.isEmpty()) return;
@ -46,6 +149,7 @@ public class CLIApplication {
String args = parts.length > 1 ? parts[1] : "";
switch (command) {
// 图书管理
case "help", "h", "?" -> showHelp();
case "list", "ls" -> listBooks();
case "search", "s" -> searchBooks(args);
@ -53,10 +157,46 @@ public class CLIApplication {
case "edit", "e" -> editBook(args);
case "detail", "info" -> showBookDetail(args);
case "delete", "d" -> deleteBook(args);
case "category", "cat" -> listByCategory(args);
// 借阅管理
case "borrow", "b" -> borrowBook(args);
case "return", "r" -> returnBook(args);
case "category", "cat" -> listByCategory(args);
case "renew" -> renewLoan(args);
case "loans" -> showMyLoans();
// 用户管理 (馆员功能)
case "users" -> listUsers();
case "pending" -> showPendingUsers();
case "approve" -> approveUser(args);
case "reject" -> rejectUser(args);
// 通知中心
case "notify", "notifications" -> showNotifications();
// 预约管理
case "reserve" -> reserveBook(args);
case "reservations" -> showReservations();
case "cancel" -> cancelReservation(args);
// 借阅历史
case "history" -> showHistory();
// 读书笔记
case "notes" -> showNotes();
case "addnote" -> addNote();
// 收藏
case "favorites", "fav" -> showFavorites();
case "addfav" -> addFavorite(args);
// 评论
case "comments" -> showComments(args);
case "comment" -> addComment(args);
// 反馈
case "feedback" -> submitFeedback();
// 数据统计
case "stats" -> showStatistics();
// 智能AI
case "ai", "ask" -> askAI(args);
case "recommend" -> showRecommendations();
// 系统设置
case "settings" -> showSettings();
case "passwd" -> changePassword();
case "logout" -> { currentUser = null; showLoginMenu(); }
// 端切换
case "gui" -> switchToGUI();
case "web" -> switchToWeb();
case "app" -> showAppQRCode();
@ -66,29 +206,65 @@ public class CLIApplication {
}
private void showHelp() {
String staffCmds = currentUser != null && currentUser.isStaff() ? """
===== () =====
users -
pending -
approve <ID> -
reject <ID> -
""" : "";
System.out.println("""
===== =====
===== =====
list, ls -
search <> -
add, a -
edit <ISBN> -
detail <ISBN> -
delete <ISBN> -
category [] -
stats -
category [] -
===== =====
===== =====
borrow <ISBN> -
return <ISBN> -
renew <ID> -
loans -
history -
===== =====
reserve <ISBN> -
reservations -
cancel <ID> -
===== =====
gui - GUI
web - Web
app - App
help, h, ? -
exit, quit, q - 退
""");
===== =====
notes -
addnote -
favorites -
addfav <ISBN> -
comments <ISBN> -
comment <ISBN> -
feedback -
===== =====
notifications -
stats -
===== AI =====
ai <> - AI
recommend -
===== =====
settings -
passwd -
logout - 退
gui - GUI
web - Web
app - App
help, h -
exit, q - 退
""" + staffCmds);
}
private void listBooks() {
@ -408,4 +584,277 @@ public class CLIApplication {
if (str == null) return "";
return str.length() > maxLen ? str.substring(0, maxLen - 2) + ".." : str;
}
// ==================== 新增功能方法 v1.12.0 ====================
private void renewLoan(String loanId) {
if (loanId.isEmpty()) {
System.out.print("请输入借阅记录ID: ");
loanId = scanner.nextLine().trim();
}
var result = loanHistoryService.renewLoan(loanId);
System.out.println(result.success() ? "✓ 续借成功! " + result.message() : "✗ " + result.message());
}
private void showMyLoans() {
String userId = currentUser.getId();
var loans = bookService.findAllLoans().stream()
.filter(l -> userId.equals(l.getUserId()) && !l.isReturned())
.toList();
if (loans.isEmpty()) {
System.out.println("暂无借阅记录");
return;
}
System.out.println("\n我的借阅:");
for (var loan : loans) {
System.out.printf(" [%s] 图书:%s 到期:%s%n",
loan.getId(), loan.getBookId(), loan.getDueDate());
}
}
private void listUsers() {
if (currentUser == null || !currentUser.isStaff()) {
System.out.println("✗ 权限不足");
return;
}
var users = userService.findAllUsers();
System.out.println("\n用户列表:");
for (var u : users) {
System.out.printf(" [%s] %s <%s> 角色:%s 状态:%s%n",
u.getId(), u.getName(), u.getEmail(), u.getRole(), u.getStatus());
}
}
private void showPendingUsers() {
if (currentUser == null || !currentUser.isStaff()) {
System.out.println("✗ 权限不足");
return;
}
var pending = userService.getPendingUsers();
if (pending.isEmpty()) {
System.out.println("暂无待审核用户");
return;
}
System.out.println("\n待审核用户:");
for (var u : pending) {
System.out.printf(" [%s] %s <%s> %s/%s%n",
u.getId(), u.getName(), u.getEmail(), u.getDepartment(), u.getMajor());
}
}
private void approveUser(String userId) {
if (currentUser == null || !currentUser.isStaff()) {
System.out.println("✗ 权限不足");
return;
}
if (userId.isEmpty()) {
System.out.print("请输入用户ID: ");
userId = scanner.nextLine().trim();
}
boolean success = userService.approveUser(userId);
System.out.println(success ? "✓ 审核通过!" : "✗ 操作失败");
}
private void rejectUser(String userId) {
if (currentUser == null || !currentUser.isStaff()) {
System.out.println("✗ 权限不足");
return;
}
if (userId.isEmpty()) {
System.out.print("请输入用户ID: ");
userId = scanner.nextLine().trim();
}
boolean success = userService.rejectUser(userId);
System.out.println(success ? "✓ 已拒绝!" : "✗ 操作失败");
}
private void showNotifications() {
var notifications = notificationService.getUserNotifications(currentUser.getId());
int unread = notificationService.getUnreadCount(currentUser.getId());
System.out.printf("\n通知中心 (未读: %d):%n", unread);
if (notifications.isEmpty()) {
System.out.println(" 暂无通知");
} else {
notifications.forEach(n -> System.out.println(" - " + n));
}
}
private void reserveBook(String isbn) {
if (isbn.isEmpty()) {
System.out.print("请输入图书ISBN: ");
isbn = scanner.nextLine().trim();
}
Book book = bookService.findBookByIsbn(isbn);
if (book == null) {
System.out.println("✗ 未找到该图书");
return;
}
var result = reservationService.reserveBook(book.getId(), currentUser.getId());
System.out.println(result.success() ? "✓ 预约成功! " + result.message() : "✗ " + result.message());
}
private void showReservations() {
var reservations = reservationService.getUserReservations(currentUser.getId());
if (reservations.isEmpty()) {
System.out.println("暂无预约");
return;
}
System.out.println("\n我的预约:");
reservations.forEach(r -> System.out.println(" - " + r));
}
private void cancelReservation(String id) {
if (id.isEmpty()) {
System.out.print("请输入预约ID: ");
id = scanner.nextLine().trim();
}
boolean success = reservationService.cancelReservation(id);
System.out.println(success ? "✓ 已取消!" : "✗ 取消失败");
}
private void showHistory() {
var history = loanHistoryService.getUserHistory(currentUser.getId());
double fine = loanHistoryService.getTotalFine(currentUser.getId());
System.out.printf("\n借阅历史 (累计罚款: ¥%.2f):%n", fine);
if (history.isEmpty()) {
System.out.println(" 暂无记录");
} else {
history.forEach(h -> System.out.println(" - " + h));
}
}
private void showNotes() {
var notes = readerService.getUserNotes(currentUser.getId());
System.out.println("\n我的读书笔记:");
if (notes.isEmpty()) {
System.out.println(" 暂无笔记");
} else {
notes.forEach(n -> System.out.println(" - " + n));
}
}
private void addNote() {
System.out.print("图书ISBN: ");
String isbn = scanner.nextLine().trim();
Book book = bookService.findBookByIsbn(isbn);
if (book == null) {
System.out.println("✗ 未找到该图书");
return;
}
System.out.print("笔记标题: ");
String title = scanner.nextLine().trim();
System.out.print("笔记内容: ");
String content = scanner.nextLine().trim();
String id = readerService.addNote(currentUser.getId(), book.getId(), title, content, 0, "", true);
System.out.println(id != null ? "✓ 笔记添加成功!" : "✗ 添加失败");
}
private void showFavorites() {
var favorites = readerService.getUserFavorites(currentUser.getId());
System.out.println("\n我的收藏:");
if (favorites.isEmpty()) {
System.out.println(" 暂无收藏");
} else {
favorites.forEach(f -> System.out.println(" - " + f));
}
}
private void addFavorite(String isbn) {
if (isbn.isEmpty()) {
System.out.print("图书ISBN: ");
isbn = scanner.nextLine().trim();
}
Book book = bookService.findBookByIsbn(isbn);
if (book == null) {
System.out.println("✗ 未找到该图书");
return;
}
boolean success = readerService.addFavorite(currentUser.getId(), book.getId());
System.out.println(success ? "✓ 收藏成功!" : "✗ 收藏失败");
}
private void showComments(String isbn) {
if (isbn.isEmpty()) {
System.out.print("图书ISBN: ");
isbn = scanner.nextLine().trim();
}
Book book = bookService.findBookByIsbn(isbn);
if (book == null) {
System.out.println("✗ 未找到该图书");
return;
}
var comments = readerService.getBookComments(book.getId());
double avgRating = readerService.getBookAverageRating(book.getId());
System.out.printf("\n《%s》评论 (评分: %.1f):%n", book.getTitle(), avgRating);
if (comments.isEmpty()) {
System.out.println(" 暂无评论");
} else {
comments.forEach(c -> System.out.println(" - " + c));
}
}
private void addComment(String isbn) {
if (isbn.isEmpty()) {
System.out.print("图书ISBN: ");
isbn = scanner.nextLine().trim();
}
Book book = bookService.findBookByIsbn(isbn);
if (book == null) {
System.out.println("✗ 未找到该图书");
return;
}
System.out.print("评分(1-5): ");
int rating = Integer.parseInt(scanner.nextLine().trim());
System.out.print("评论内容: ");
String content = scanner.nextLine().trim();
String id = readerService.addComment(currentUser.getId(), book.getId(), content, rating, null);
System.out.println(id != null ? "✓ 评论成功!" : "✗ 评论失败");
}
private void submitFeedback() {
System.out.println("\n===== 意见反馈 =====");
System.out.print("反馈类型(建议/问题/其他): ");
String type = scanner.nextLine().trim();
System.out.print("标题: ");
String title = scanner.nextLine().trim();
System.out.print("内容: ");
String content = scanner.nextLine().trim();
String id = readerService.submitFeedback(currentUser.getId(), type, title, content, currentUser.getEmail());
System.out.println(id != null ? "✓ 反馈提交成功!" : "✗ 提交失败");
}
private void askAI(String question) {
if (question.isEmpty()) {
System.out.print("请输入问题: ");
question = scanner.nextLine().trim();
}
System.out.println("\nAI回答:");
String answer = aiService.chat(question);
System.out.println(" " + answer);
}
private void showRecommendations() {
System.out.println("\n智能推荐:");
String recommendation = aiService.getRecommendation(currentUser.getId());
System.out.println(recommendation);
}
private void showSettings() {
var status = settingsService.getSystemStatus();
var version = settingsService.getVersionInfo();
System.out.println("\n===== 系统设置 =====");
System.out.printf(" 版本: %s%n", version);
System.out.printf(" 环境: %s%n", status.environment());
System.out.printf(" 数据库: %s%n", status.databaseType());
System.out.printf(" 连接状态: %s%n", status.dbConnected() ? "正常" : "异常");
}
private void changePassword() {
System.out.print("当前密码: ");
String oldPwd = scanner.nextLine().trim();
System.out.print("新密码: ");
String newPwd = scanner.nextLine().trim();
boolean success = userService.changePassword(currentUser.getId(), oldPwd, newPwd);
System.out.println(success ? "✓ 密码修改成功!" : "✗ 修改失败");
}
}

@ -212,25 +212,29 @@ public class SQLDialect {
}
/**
* DDL
* DDL - v1.12.0
*/
public static String createUsersTable() {
return createTableIfNotExists("users", String.format("""
id %s,
name %s NOT NULL,
email %s,
email %s UNIQUE,
phone %s,
password %s,
gender %s DEFAULT '',
age INTEGER DEFAULT 0,
department %s DEFAULT '',
major %s DEFAULT '',
user_type %s DEFAULT '',
role %s DEFAULT 'READER',
status %s DEFAULT 'PENDING',
created_at %s,
updated_at %s
""",
textPrimaryKey(),
textType(), textType(), textType(), textType(),
textType(), textType(), textType(),
textType(), textType(), textType(), textType(),
textType(), textType(),
dateTimeType(), dateTimeType()
));
}

@ -3,19 +3,27 @@ package com.smartlibrary.model;
import java.util.Date;
/**
* - v1.4.0
* /
* - v1.12.0
*
*/
public class User {
// 用户状态枚举
public enum Status { PENDING, APPROVED, REJECTED }
// 用户角色枚举
public enum Role { READER, LIBRARIAN, ADMIN }
private String id;
private String name;
private String email;
private String phone;
private String password; // 密码(加密存储)
private String gender; // 性别: 男/女/其他
private int age; // 年龄
private String department; // 院系
private String major; // 专业
private String userType; // 用户类型: 学生/教师/访客
private Role role; // 角色: 读者/馆员/管理员
private Status status; // 状态: 待审核/已审核/已拒绝
private Date createdAt;
private Date updatedAt;
@ -32,6 +40,8 @@ public class User {
this.department = "";
this.major = "";
this.userType = "学生";
this.role = Role.READER;
this.status = Status.PENDING;
this.createdAt = new Date();
this.updatedAt = new Date();
}
@ -47,6 +57,30 @@ public class User {
this.department = department;
this.major = major;
this.userType = userType;
this.role = Role.READER;
this.status = Status.PENDING;
this.createdAt = new Date();
this.updatedAt = new Date();
}
/**
*
*/
public User(String id, String name, String email, String phone, String password,
String gender, int age, String department, String major, String userType,
Role role, Status status) {
this.id = id;
this.name = name;
this.email = email;
this.phone = phone;
this.password = password;
this.gender = gender;
this.age = age;
this.department = department;
this.major = major;
this.userType = userType;
this.role = role;
this.status = status;
this.createdAt = new Date();
this.updatedAt = new Date();
}
@ -139,6 +173,51 @@ public class User {
this.userType = userType;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
/**
*
*/
public boolean isApproved() {
return status == Status.APPROVED;
}
/**
*
*/
public boolean isStaff() {
return role == Role.LIBRARIAN || role == Role.ADMIN;
}
/**
*
*/
public boolean isAdmin() {
return role == Role.ADMIN;
}
/**
*
*/

@ -11,9 +11,13 @@ import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.nio.charset.StandardCharsets;
/**
* - v1.4.0
*
* - v1.12.0
*
*/
public class UserService {
private static final Logger LOGGER = Logger.getLogger(UserService.class.getName());
@ -33,21 +37,31 @@ public class UserService {
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
email TEXT,
email TEXT UNIQUE,
phone TEXT,
password TEXT,
gender TEXT DEFAULT '',
age INTEGER DEFAULT 0,
department TEXT DEFAULT '',
major TEXT DEFAULT '',
user_type TEXT DEFAULT '',
role TEXT DEFAULT 'READER',
status TEXT DEFAULT 'PENDING',
created_at TEXT,
updated_at TEXT
)
""";
// 添加默认管理员账户
String adminSql = String.format("""
INSERT OR IGNORE INTO users (id, name, email, password, role, status, created_at, updated_at)
VALUES ('ADMIN001', '', 'admin@library.com', '%s', 'ADMIN', 'APPROVED', %s, %s)
""", hashPassword("admin123"), SQLDialect.now(), SQLDialect.now());
try {
Connection conn = dbConnection.getConnection();
try (Statement stmt = conn.createStatement()) {
stmt.execute(sql);
stmt.execute(adminSql); // 创建默认管理员
}
} catch (SQLException e) {
LOGGER.log(Level.WARNING, "初始化用户表失败: {0}", e.getMessage());
@ -204,11 +218,234 @@ public class UserService {
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
user.setPhone(rs.getString("phone"));
user.setPassword(rs.getString("password"));
user.setGender(rs.getString("gender"));
user.setAge(rs.getInt("age"));
user.setDepartment(rs.getString("department"));
user.setMajor(rs.getString("major"));
user.setUserType(rs.getString("user_type"));
// 读取角色和状态
String roleStr = rs.getString("role");
String statusStr = rs.getString("status");
user.setRole(roleStr != null ? User.Role.valueOf(roleStr) : User.Role.READER);
user.setStatus(statusStr != null ? User.Status.valueOf(statusStr) : User.Status.PENDING);
return user;
}
// ==================== v1.12.0 登录注册功能 ====================
/**
*
*/
public static String hashPassword(String password) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hash = md.digest(password.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : hash) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
return password; // 降级处理
}
}
/**
*
*/
public boolean register(String name, String email, String password, String phone,
String gender, int age, String department, String major, String userType) {
// 检查邮箱是否已存在
if (findUserByEmail(email) != null) {
LOGGER.warning("注册失败: 邮箱已存在 - " + email);
return false;
}
String sql = String.format("""
INSERT INTO users (id, name, email, password, phone, gender, age, department, major, user_type, role, status, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'READER', 'PENDING', %s, %s)
""", SQLDialect.now(), SQLDialect.now());
try {
Connection conn = dbConnection.getConnection();
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, generateUserId());
pstmt.setString(2, name);
pstmt.setString(3, email);
pstmt.setString(4, hashPassword(password));
pstmt.setString(5, phone);
pstmt.setString(6, gender);
pstmt.setInt(7, age);
pstmt.setString(8, department);
pstmt.setString(9, major);
pstmt.setString(10, userType);
return pstmt.executeUpdate() > 0;
}
} catch (SQLException e) {
LOGGER.log(Level.WARNING, "注册失败: {0}", e.getMessage());
return false;
}
}
/**
*
*/
public User login(String email, String password) {
String sql = "SELECT * FROM users WHERE email = ? AND password = ?";
try {
Connection conn = dbConnection.getConnection();
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, email);
pstmt.setString(2, hashPassword(password));
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
User user = mapResultSetToUser(rs);
if (user.getStatus() != User.Status.APPROVED) {
LOGGER.warning("登录失败: 账户未审核通过 - " + email);
return null;
}
LOGGER.info("用户登录成功: " + email);
return user;
}
}
}
} catch (SQLException e) {
LOGGER.log(Level.WARNING, "登录失败: {0}", e.getMessage());
}
return null;
}
/**
*
*/
public User findUserByEmail(String email) {
String sql = "SELECT * FROM users WHERE email = ?";
try {
Connection conn = dbConnection.getConnection();
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, email);
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
return mapResultSetToUser(rs);
}
}
}
} catch (SQLException e) {
LOGGER.log(Level.WARNING, "查询用户失败: {0}", e.getMessage());
}
return null;
}
/**
*
*/
public List<User> getPendingUsers() {
List<User> users = new ArrayList<>();
String sql = "SELECT * FROM users WHERE status = 'PENDING' ORDER BY created_at DESC";
try {
Connection conn = dbConnection.getConnection();
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
users.add(mapResultSetToUser(rs));
}
}
} catch (SQLException e) {
LOGGER.log(Level.WARNING, "查询待审核用户失败: {0}", e.getMessage());
}
return users;
}
/**
*
*/
public boolean approveUser(String userId) {
return updateUserStatus(userId, User.Status.APPROVED);
}
/**
*
*/
public boolean rejectUser(String userId) {
return updateUserStatus(userId, User.Status.REJECTED);
}
/**
*
*/
private boolean updateUserStatus(String userId, User.Status status) {
String sql = String.format("UPDATE users SET status = ?, updated_at = %s WHERE id = ?", SQLDialect.now());
try {
Connection conn = dbConnection.getConnection();
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, status.name());
pstmt.setString(2, userId);
return pstmt.executeUpdate() > 0;
}
} catch (SQLException e) {
LOGGER.log(Level.WARNING, "更新用户状态失败: {0}", e.getMessage());
return false;
}
}
/**
*
*/
public boolean updateUserRole(String userId, User.Role role) {
String sql = String.format("UPDATE users SET role = ?, updated_at = %s WHERE id = ?", SQLDialect.now());
try {
Connection conn = dbConnection.getConnection();
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, role.name());
pstmt.setString(2, userId);
return pstmt.executeUpdate() > 0;
}
} catch (SQLException e) {
LOGGER.log(Level.WARNING, "更新用户角色失败: {0}", e.getMessage());
return false;
}
}
/**
*
*/
public boolean changePassword(String userId, String oldPassword, String newPassword) {
User user = findUserById(userId);
if (user == null || !user.getPassword().equals(hashPassword(oldPassword))) {
return false;
}
String sql = String.format("UPDATE users SET password = ?, updated_at = %s WHERE id = ?", SQLDialect.now());
try {
Connection conn = dbConnection.getConnection();
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, hashPassword(newPassword));
pstmt.setString(2, userId);
return pstmt.executeUpdate() > 0;
}
} catch (SQLException e) {
LOGGER.log(Level.WARNING, "修改密码失败: {0}", e.getMessage());
return false;
}
}
/**
*
*/
public int countPendingUsers() {
String sql = "SELECT COUNT(*) FROM users WHERE status = 'PENDING'";
try {
Connection conn = dbConnection.getConnection();
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
if (rs.next()) {
return rs.getInt(1);
}
}
} catch (SQLException e) {
LOGGER.log(Level.WARNING, "统计待审核用户失败: {0}", e.getMessage());
}
return 0;
}
}

Loading…
Cancel
Save