【项目总结】基于哈希表的用户管理系统_模块化&分层思想

源码位置:gitee - practice_00

创建一个基于 哈希表 的用户管理系统,数据的本地存储采用文件的方式。
项目语言:C语言
要求:

  1. 有两种的登录方式,管理员和普通用户;
  2. 验证管理员的用户名和密码,验证通过有使用权限;
  3. 管理员能够将新用户的用户名及用户信息存储到本地文件中(模拟数据库);
  4. 管理员能够删除用户;
  5. 普通用户能登陆在验证用户名和密码之后能够登陆;
  6. 数据模块采用用户名检索。

一、思路

1.1 分层:

  • 交互层 —— 主要处理交互界面
  • 业务层 —— 承上启下,接收交互界面传递的选项,并存储数据给数据层
  • 数据层 —— 数据的底层操作

代码中业务层和数据层的解耦做的不是太好,在业务层中直接调用了数据层的接口。
下次项目考虑增加 服务层,将数据层封装,对业务层提供通用的接口。

1.2 模块

考虑到运行的效率问题,需要一个数据结构来 动态管理 数据,本次指定采用 哈希表。
如果要保证每次程序启动后可以继续上次的数据来使用,就需要本地存储,本次项目指定采用文件来代替数据库。
综上所述:

  • 交互层 可以封装为 交互模块
  • 业务层 可以封装为 业务模块
  • 数据层可以分为:哈希表模块、数据库文件模块。

1.3 各层间的交互

交互层 --> 业务层

// 界面选择相关
enum ui_options
{
    UI_LOGIN,            // 登录界面
    UI_QUIT,             // 退出当前界面
    UI_ADD,              // 添加用户操作
    UI_DEL,              // 删除用户操作
    UI_MODIFY,           // 修改用户信息操作
    UI_SEARCH,           // 搜索用户信息操作
    UI_ERROR,            // 错误
    // 权限管理
    UI_P_MANAGER = 100,  // 管理员权限
    UI_P_USER,           // 普通用户权限
    UI_P_REJECT          // 拒绝
};

业务层 --> 数据层

enum modify_opt
{
    M_ALL,   	// 查看所有数据
    M_NAME,  	// 根据用户名操作
    M_PASSWD,   // 根据用户密码操作
    // M_TELEPHONE, // 根据用户电话号码操作
    M_ADD,      // 添加用户操作
    M_DEL       // 删除用户操作
};

二、主要信息说明

2.1 数据结构

哈希表结构体:

typedef struct _hash_node
{
    char username[SIZE];
    char passwd[SIZE];
    // char telephone[PHONE_NUM];
    struct _hash_node *next;
} data_node;

typedef struct _hash_table
{
    data_node *data[HASH_SIZE];
    int count;
} data_manager;

位置记录结构体:

typedef struct _pos
{
    data_node *pre;
    data_node *search;
} data_pos;

修改信息记录结构体

typedef union _modify_msg
{
    char username[SIZE];
    char passwd[SIZE];
    // char telephone[PHONE_NUM];
} modify_msg;

2.2 接口

交互模块

int ui_main(data_node *user);
int ui_of_user();
int ui_of_manager(data_node *user_info, modify_msg *modify, 
                  int *option_way);

业务模块

int login(data_manager *hash, data_node *user);
void add_user(data_manager *hash, data_node *user);
void del_user(data_manager *hash, data_node *user);
void modify_user_info(data_manager *hash, data_node *user, 
                      modify_msg *modify, int option_way);
void search_user_info(data_manager *hash, data_node *user, 
					  int option_way);

哈希表模块

data_manager *hash_create();
void hash_insert(data_manager *hash, data_node *pNode);
void hash_del(data_manager *hash, data_pos *pNode);
void hash_modify(data_node *pNode, modify_msg *modify, int option_way);
data_pos *hash_search(data_manager *hash, modify_msg *search, 
                      int option_way);
void hash_move(data_manager *hash, data_pos *pos, modify_msg *pMsg);
void hash_traversal(data_manager *hash);
void hash_destroy(data_manager *hash);

数据库模块

data_manager *database_load();
void database_write(data_manager *hash);
void database_read(data_manager *hash);

2.3 函数接口调用图

请添加图片描述

三、界面展示

登陆界面:

管理员用户界面:

查看当前所有用户:

普通用户界面:

  • 33
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值