源码位置:gitee - practice_00
创建一个基于 哈希表 的用户管理系统,数据的本地存储采用文件的方式。
项目语言:C语言
要求:
- 有两种的登录方式,管理员和普通用户;
- 验证管理员的用户名和密码,验证通过有使用权限;
- 管理员能够将新用户的用户名及用户信息存储到本地文件中(模拟数据库);
- 管理员能够删除用户;
- 普通用户能登陆在验证用户名和密码之后能够登陆;
- 数据模块采用用户名检索。
一、思路
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 函数接口调用图
三、界面展示
登陆界面:
管理员用户界面:
查看当前所有用户:
普通用户界面: