# login-system **Repository Path**: physics_Ag/login-system ## Basic Information - **Project Name**: login-system - **Description**: 基于磁盘AVL树实现的在线登录系统 - **Primary Language**: C++ - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-10 - **Last Updated**: 2026-06-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 用户登录与注册系统 ## 项目简介 本项目是一个基于 Linux 平台开发的用户登录与注册系统,包含前端页面、后端服务和自定义磁盘数据库。系统使用 C++ 实现后端逻辑、认证服务和数据库索引结构,使用 HTML、CSS、JavaScript 实现前端交互页面。 项目的核心特点是基于磁盘文件实现 AVL 树索引数据库,用于模拟数据量较大、无法一次性全部加载到内存中的场景。系统通过索引文件定位数据文件中的用户记录,从而实现持久化存储和高效查询。 ## 功能特性 - 用户注册:将用户名和密码写入数据库。 - 用户登录:根据用户名查询用户记录,并验证密码是否匹配。 - 用户注销:从数据库中删除指定用户数据。 - 数据持久化:用户数据保存到磁盘文件,程序重启后数据不会丢失。 - 并发支持:后端使用多线程处理请求,并通过互斥锁保护数据库访问。 - 高效检索:数据库索引基于 AVL 树实现。 ## 技术栈 - 后端语言:C++ - 前端技术:HTML、CSS、JavaScript - 通信协议:HTTP - 数据格式:JSON - 并发模型:多线程 + 互斥锁 - 数据结构:AVL 树 - 数据存储:磁盘文件持久化 - 第三方依赖:jsoncpp ## 系统架构 系统整体分为三个主要模块: ### 前端模块 前端提供登录、注册和注销相关页面,负责收集用户输入并通过 `fetch` 向后端发送 HTTP 请求。请求体和响应体均采用 JSON 格式。 ### 后端模块 后端负责接收 HTTP 请求,解析请求数据,并调用认证服务完成用户注册、登录和注销逻辑。处理完成后,后端以 JSON 格式向前端返回结果。 ### 数据库模块 数据库模块基于磁盘文件和 AVL 树索引实现,负责用户数据的持久化存储、查询、插入、更新和删除。 系统通信流程如下: ```text 前端页面 -> HTTP JSON 请求 -> 后端服务 -> 数据库操作 -> JSON 响应 -> 前端页面 ``` ## 数据库设计 数据库模块是系统的核心部分,采用“数据文件 + 索引文件”的方式组织数据。 ### 存储结构 数据库包含两个主要文件: - 数据文件:顺序存储用户记录,每条记录通过文件偏移量定位。 - 索引文件:按固定大小的页组织,每一页存储一个 AVL 树节点。 索引节点结构如下: ```cpp struct Node { size_t id; // 当前节点的页 ID Key key; // 键值,通常为用户名 size_t rid; // 数据文件中的记录偏移量 size_t left; // 左子节点页 ID size_t right; // 右子节点页 ID size_t parent; // 父节点页 ID size_t balance; // 平衡因子 }; ``` 通过页 ID 和固定页大小,可以计算任意节点在索引文件中的位置。索引节点中的 `rid` 指向数据文件中的记录位置,因此查询时可以先查索引,再根据偏移量读取实际数据。 ### 字节缓冲区 由于磁盘文件中存储的是字节流,而不是 C++ 对象,系统通过 `ByteBuffer` 作为内存对象与磁盘字节之间的中间层。读写磁盘时,需要先将对象序列化到缓冲区,或从缓冲区反序列化为对象。 ## 数据库接口 数据库模块封装为模板类 `IndexedDatabase`,对外提供统一接口: ```cpp create(); // 创建新的数据库文件 open(); // 打开已有数据库文件 close(); // 关闭数据库并释放资源 put(key, value); // 插入或更新键值对 get(key, value); // 根据键查询对应值 remove(key); // 删除指定键的记录 ``` ## 后端认证模块 认证逻辑封装在 `AuthService` 类中,主要负责处理注册和登录请求。 主要接口包括: ```cpp register_user(username, password, err); login(username, password, err); ``` 其中: - `register_user`:将用户名和密码写入数据库。如果用户名已存在,则返回错误信息。 - `login`:根据用户名查询数据库,并比对密码是否正确。 为了保证多线程环境下的数据一致性,`AuthService` 内部使用 `pthread_mutex_t` 互斥锁。在访问数据库前加锁,操作完成后释放锁,避免并发读写导致数据异常。 ## 前端交互 前端使用 HTML、CSS 和 JavaScript 实现用户界面。用户输入用户名和密码后,前端通过 `fetch` 向后端发送 JSON 请求。 典型请求流程: ```text 用户输入账号密码 -> 前端发送 JSON 请求 -> 后端解析请求 -> 调用认证服务 -> 访问数据库 -> 返回 JSON 响应 -> 前端展示操作结果 ``` 前端根据后端返回结果展示登录成功、注册成功、用户名已存在、密码错误、用户不存在等提示信息。 ## 编译与运行 ### 安装依赖 Ubuntu: ```bash sudo apt-get install libjsoncpp-dev ``` CentOS: ```bash sudo yum install -y jsoncpp-devel ``` ### 编译项目 ```bash make ``` ### 启动服务 ```bash ./main <端口号> ``` 示例: ```bash ./main 8080 ```