当前位置:首页 > 技术 > 正文内容

用户管理系统的后端实现方案

访客 技术 2026年6月12日 1

在Web应用中,用户管理功能与密码修改等简单页面跳转不同,它需要通过后端API获取数据并动态渲染界面。当用户点击用户管理菜单时,系统会发送请求到服务器,而非直接跳转到新页面。

用户管理功能通常需要关联多个数据表进行查询操作,以确保获取完整的用户信息及其角色权限。

实现用户管理功能主要涉及三个核心部分:获取用户总数、分页获取用户列表以及获取所有角色信息。

第一步:实现用户总数统计功能

  1. 数据访问层接口设计
// 用户数据访问接口
public interface UserDataAccess {
    // 根据用户名和角色类型获取符合条件的用户总数
    int fetchUserCount(Connection dbConnection, String userName, int roleType) throws SQLException;
}
  1. 数据访问层实现
// 用户数据访问实现类
public class UserDataAccessImpl implements UserDataAccess {
    
    @Override
    public int fetchUserCount(Connection dbConnection, String userName, int roleType) throws SQLException {
        PreparedStatement queryStatement = null;
        ResultSet result = null;
        int totalRecords = 0;
        
        if (dbConnection != null) {
            StringBuilder sqlBuilder = new StringBuilder();
            sqlBuilder.append("select count(1) as total from system_users u, user_roles r where u.role_id = r.id");
            List<Object> paramList = new ArrayList<>();
            
            if (!StringUtil.isEmpty(userName)) {
                sqlBuilder.append(" and u.username like ?");
                paramList.add("%" + userName + "%");
            }
            
            if (roleType > 0) {
                sqlBuilder.append(" and u.role_id = ?");
                paramList.add(roleType);
            }
            
            Object[] parameters = paramList.toArray();
            System.out.println("UserDataAccessImpl->fetchUserCount: " + sqlBuilder.toString());
            
            result = DatabaseHelper.executeQuery(dbConnection, queryStatement, result, sqlBuilder.toString(), parameters);
            if (result.next()) {
                totalRecords = result.getInt("total");
            }
            DatabaseHelper.closeResources(null, queryStatement, result);
        }
        return totalRecords;
    }
}
  1. 业务逻辑层接口
// 用户服务接口
public interface UserService {
    // 获取用户总数
    int getUserCount(String userName, int roleType);
}
  1. 业务逻辑层实现
// 用户服务实现类
public class UserServiceImpl implements UserService {
    
    @Override
    public int getUserCount(String userName, int roleType) {
        int count = 0;
        Connection connection = null;
        try {
            connection = DatabaseUtil.createConnection();
            UserDataAccess userDataAccess = new UserDataAccessImpl();
            count = userDataAccess.fetchUserCount(connection, userName, roleType);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DatabaseUtil.closeConnection(connection);
        }
        return count;
    }
}

第二步:实现分页用户列表获取

  1. 数据访问层接口
// 用户数据访问接口扩展
public interface UserDataAccess {
    // ... 前面的方法 ...
    
    // 分页获取用户列表
    List<UserAccount> getUserList(Connection dbConnection, String userName, int roleType, 
                               int currentPage, int pageSize) throws Exception;
}
  1. 数据访问层实现
// 用户数据访问实现类扩展
public class UserDataAccessImpl implements UserDataAccess {
    
    // ... 前面的方法 ...
    
    @Override
    public List<UserAccount> getUserList(Connection dbConnection, String userName, int roleType, 
                                       int currentPage, int pageSize) throws Exception {
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        List<UserAccount> userList = new ArrayList<>();
        
        if (dbConnection != null) {
            StringBuilder sqlBuilder = new StringBuilder();
            sqlBuilder.append("select u.*, r.role_name from system_users u, user_roles r where u.role_id = r.id");
            List<Object> paramList = new ArrayList<>();
            
            if (!StringUtil.isEmpty(userName)) {
                sqlBuilder.append(" and u.username like ?");
                paramList.add("%" + userName + "%");
            }
            
            if (roleType > 0) {
                sqlBuilder.append(" and u.role_id = ?");
                paramList.add(roleType);
            }
            
            sqlBuilder.append(" order by creation_date DESC limit ?,?");
            int offset = (currentPage - 1) * pageSize;
            paramList.add(offset);
            paramList.add(pageSize);
            
            Object[] parameters = paramList.toArray();
            System.out.println("SQL query: " + sqlBuilder.toString());
            
            resultSet = DatabaseHelper.executeQuery(dbConnection, statement, resultSet, sqlBuilder.toString(), parameters);
            while (resultSet.next()) {
                UserAccount user = new UserAccount();
                user.setId(resultSet.getInt("id"));
                user.setUserCode(resultSet.getString("user_code"));
                user.setUserName(resultSet.getString("username"));
                user.setGender(resultSet.getInt("gender"));
                user.setBirthday(resultSet.getDate("birthday"));
                user.setPhone(resultSet.getString("phone"));
                user.setRoleType(resultSet.getInt("role_id"));
                user.setRoleName(resultSet.getString("role_name"));
                userList.add(user);
            }
            DatabaseHelper.closeResources(null, statement, resultSet);
        }
        return userList;
    }
}
  1. 业务逻辑层接口扩展
// 用户服务接口扩展
public interface UserService {
    // ... 前面的方法 ...
    
    // 分页获取用户列表
    List<UserAccount> getUserList(String searchName, int searchRole, int currentPage, int pageSize);
}
  1. 业务逻辑层实现扩展
// 用户服务实现类扩展
public class UserServiceImpl implements UserService {
    
    // ... 前面的方法 ...
    
    @Override
    public List<UserAccount> getUserList(String searchName, int searchRole, int currentPage, int pageSize) {
        Connection connection = null;
        List<UserAccount> userList = null;
        
        System.out.println("Search name: " + searchName);
        System.out.println("Search role: " + searchRole);
        System.out.println("Current page: " + currentPage);
        System.out.println("Page size: " + pageSize);
        
        try {
            connection = DatabaseUtil.createConnection();
            UserDataAccess userDataAccess = new UserDataAccessImpl();
            userList = userDataAccess.getUserList(connection, searchName, searchRole, currentPage, pageSize);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DatabaseUtil.closeConnection(connection);
        }
        return userList;
    }
}

第三步:实现角色列表获取

  1. 角色数据访问层接口
// 角色数据访问接口
public interface RoleDataAccess {
    // 获取所有角色列表
    List<Role> getAllRoles(Connection dbConnection) throws Exception;
}
  1. 角色数据访问层实现
// 角色数据访问实现
public class RoleDataAccessImpl implements RoleDataAccess {
    
    @Override
    public List<Role> getAllRoles(Connection dbConnection) throws Exception {
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        ArrayList<Role> roleList = new ArrayList<>();
        
        if (dbConnection != null) {
            String sql = "select * from system_roles";
            Object[] params = {};
            resultSet = DatabaseHelper.executeQuery(dbConnection, statement, resultSet, sql, params);
            
            while (resultSet.next()) {
                Role role = new Role();
                role.setId(resultSet.getInt("id"));
                role.setRoleName(resultSet.getString("role_name"));
                role.setRoleCode(resultSet.getString("role_code"));
                roleList.add(role);
            }
            DatabaseHelper.closeResources(null, statement, resultSet);
        }
        return roleList;
    }
}
  1. 角色业务逻辑层接口
// 角色服务接口
public interface RoleService {
    // 获取所有角色列表
    List<Role> getAllRoles();
}
  1. 角色业务逻辑层实现
// 角色服务实现
public class RoleServiceImpl implements RoleService {
    // 引入角色数据访问对象
    private RoleDataAccess roleDataAccess;
    
    public RoleServiceImpl() {
        roleDataAccess = new RoleDataAccessImpl();
    }
    
    @Override
    public List<Role> getAllRoles() {
        Connection connection = null;
        List<Role> roleList = null;
        
        try {
            connection = DatabaseUtil.createConnection();
            roleList = roleDataAccess.getAllRoles(connection);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DatabaseUtil.closeConnection(connection);
        }
        return roleList;
    }
}

通过以上三层架构的实现,我们完成了用户管理系统的后端核心功能,包括用户总数统计、分页获取用户列表以及角色列表获取。这种分层设计使得代码结构清晰,便于维护和扩展。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。