通讯录管理系统
通讯录管理系统设计报告

通讯录管理系统设计报告一、引言通讯录在日常生活中扮演着重要的角色,用来存储和管理各种联系人信息,方便人们随时找到需要联系的人或组织。
随着移动互联网的普及,通讯录的管理变得更加便捷和高效。
为了提高通讯录的管理效率,我们设计并开发了一款通讯录管理系统。
二、系统概述通讯录管理系统是一个基于Web的应用程序,用户可以通过浏览器访问系统,进行通讯录的管理操作。
系统主要包括以下功能:•用户登录与注册:用户可以注册新账号,并通过账号密码登录系统。
•联系人管理:用户可以添加、编辑、删除联系人信息,包括姓名、电话号码、邮箱等。
•分组管理:用户可以创建分组并将联系人归类到不同分组。
•搜索功能:用户可以通过关键词搜索联系人信息。
•导出和导入功能:用户可以将联系人信息导出为Excel表格,并可以通过Excel文件导入联系人到系统中。
三、系统架构通讯录管理系统采用了前后端分离的架构,前端使用Vue.js框架开发,提供友好的用户界面;后端使用Node.js和Express框架搭建RESTful API,负责数据的存储和管理。
系统中的数据存储在MySQL数据库中,用户的密码使用bcrypt进行加密存储,确保用户信息的安全性。
同时,系统对用户权限进行了细致管理,保障用户在系统中的数据安全。
四、系统界面系统的界面设计简洁直观,用户可以轻松进行操作。
主要包括登录页面、通讯录首页、联系人管理页面、分组管理页面等。
用户登录页面:[登录页面截图]通讯录首页:[通讯录首页截图]联系人管理页面:[联系人管理页面截图]五、系统特色•简洁高效:系统操作简单直观,提供了快速的联系人管理功能。
•个性化定制:用户可以根据自己的需求创建分组,快速查找联系人。
•数据安全:采用了加密技术和权限管理,确保用户数据的安全性。
•导入导出功能:支持Excel文件导入导出,方便用户管理大批量联系人信息。
六、未来展望通讯录管理系统将继续进行优化和迭代,引入更多智能化功能,如联系人推荐、消息提醒等,提升用户体验。
数据结构 通讯录管理系统

数据结构通讯录管理系统数据结构通讯录管理系统1、引言1.1 目的和范围本文档旨在详细描述一个通讯录管理系统的设计和实现,以便帮助开发人员了解系统的功能和特性。
本系统可以用于存储和管理个人联系信息,实现添加、删除、修改和查询等功能。
1.2 定义、缩略语和缩写词- 通讯录:存储个人联系信息的系统。
- 系统:通讯录管理系统。
2、总体概述2.1 系统背景通讯录管理系统是为了方便用户管理个人联系信息而开发的软件。
它提供了一系列功能,包括添加联系人、删除联系人、修改联系人信息以及搜索联系人等。
该系统旨在提供一个高效、方便和可靠的通讯录管理解决方案。
2.2 产品功能- 添加联系人:用户可以添加新的联系人,并输入其姓名、方式号码、电子邮箱等信息。
- 删除联系人:用户可以删除已经存在的联系人。
- 修改联系人信息:用户可以修改已经存在的联系人的姓名、方式号码、电子邮箱等信息。
- 搜索联系人:用户可以根据姓名、方式号码等信息搜索联系人。
- 显示所有联系人:系统可以显示所有已经存在的联系人。
2.3 用户特点通讯录管理系统的主要用户群体为个人用户,他们需要管理自己的联系人信息。
这些用户对于系统的易用性、稳定性和功能性要求较高,因此系统需要提供简单直观的用户界面,并保证操作的正确性和数据的安全性。
3、系统需求3.1 功能需求3.1.1 添加联系人- 用户可以输入联系人的姓名、方式号码、电子邮箱等信息进行添加。
- 系统应该对输入进行合法性检查,确保输入的信息符合格式要求。
- 添加联系人后,系统应该将联系人信息保存到数据库中。
3.1.2 删除联系人- 用户可以删除已经存在的联系人。
- 删除联系人后,系统应该将联系人信息从数据库中删除。
3.1.3 修改联系人信息- 用户可以修改已经存在的联系人的姓名、方式号码、电子邮箱等信息。
- 系统应该对输入进行合法性检查,确保输入的信息符合格式要求。
- 修改联系人信息后,系统应该将修改后的联系人信息保存到数据库中。
Java通讯录管理系统设计报告

Java通讯录管理系统设计报告1. 引言随着社会发展和信息技术的进步,通讯录在人们的日常生活和工作中变得越来越重要。
Java通讯录管理系统是一种用于管理个人和组织联系信息的软件系统。
本篇文档将详细介绍Java通讯录管理系统的设计和实现。
2. 功能需求Java通讯录管理系统具有以下功能需求: - 添加联系人:用户可以添加新的联系人,包括姓名、电话号码、电子邮件等相关信息。
- 删除联系人:用户可以删除已存在的联系人。
- 编辑联系人:用户可以修改已存在联系人的信息。
- 搜索联系人:用户可以根据姓名、电话号码或其他关键字搜索联系人。
- 显示联系人列表:用户可以查看所有联系人的列表,并按照姓名或其他方式进行排序。
- 导入/导出联系人:用户可以将联系人导入/导出到文件中,以实现数据的备份和共享。
3. 系统设计3.1 技术栈选择Java通讯录管理系统采用Java语言进行开发,使用Java的面向对象特性来实现系统的各个功能模块。
系统使用MySQL数据库来存储联系人的信息。
3.2 系统架构Java通讯录管理系统采用三层架构,分为表示层、业务逻辑层和数据访问层。
•表示层:负责与用户的交互,包括图形界面和用户输入输出的处理。
•业务逻辑层:负责处理用户的请求,对联系人信息进行增加、删除、编辑、搜索等操作,并调用数据访问层进行数据的读写。
•数据访问层:负责与数据库交互,进行联系人信息的读写操作。
3.3 类设计在Java通讯录管理系统中,主要涉及以下类的设计: - Contact类:表示一个联系人,包含姓名、电话号码、电子邮件等属性。
- ContactDAO接口:定义对联系人的增删改查等操作。
- ContactDAOImpl类:实现ContactDAO接口,负责与数据库进行交互。
- ContactService类:负责处理业务逻辑,调用ContactDAOImpl 类进行联系人信息的操作。
- ContactConsole类:表示层的用户界面,处理用户输入输出和展示联系人信息。
java课程设计(通讯录管理系统)

掌握Java语言基础
理解面向对象编程思 想
掌握数据库操作技术
提高团队协作和沟通 能力
完成一个实用的通讯 录管理系统
联系人管理:添加、删除、修改、查询联系人信息 联系人分组:创建、删除、修改、查询联系人分组 联系人搜索:根据姓名、电话、邮箱等信息进行搜索 联系人导出:将联系人信息导出为Excel、CSV等格式的文件 联系人导入:从Excel、CSV等格式的文件中导入联系人信息 系统设置:修改系统语言、主题、字体等设置
数据库类型:MySQL
数据库表结构:用户表、 联系人表、分组表等
主键和外键:用户ID、联 系人ID、分组ID等
数据库操作:增删改查等 基本操作
数据库优化:索引、缓存、 分表等优化措施
数据库安全:用户权限管 理、数据加密等安全措施
界面布局:简洁 明了,易于操作
色彩搭配:协调 统一,易于阅读
功能模块:联系 人管理、分组管 理、搜索功能等
汇报人:
添加标题
添加标题
查询方式:支持模糊查询和精确查 询
查询优化:使用索引提高查询效率
功能描述:删除指定联系人信 息
实现方法:调用数据库删除接 口
操作步骤:选择联系人,点击 删除按钮,确认删除
注意事项:确保删除操作不会 影响其他数据完整性
添加联系人:输入姓名、电话、邮箱等信 息
修改联系人:修改姓名、电话、邮箱等信 息
删除联系人:删除指定联系人
查询联系人:根据姓名、电话、邮箱等信 息进行查询
导出联系人:将联系人信息导出为Excel 或CSV文件
导入联系人:将Excel或CSV文件中的联系 人信息导入到系统中
修改模块界面:提供用户友 好的界面,方便用户操作
数据结构课程设计通讯录管理系统报告

数据结构课程设计通讯录管理系统报告前言通讯录管理系统是一种常见的应用程序,用于帮助用户有效地组织和管理他们的联系人信息。
本报告旨在介绍和分析一个基于数据结构设计的通讯录管理系统,其中实现了基本的通讯录功能,并且通过合适的数据结构和算法进行优化。
功能需求通讯录管理系统需要实现以下基本功能: - 添加联系人信息 - 查找联系人信息 - 删除联系人信息 - 更新联系人信息 - 显示所有联系人信息数据结构选择为了实现通讯录管理系统的功能,我们选择使用链表作为数据结构。
链表是一种简单而灵活的数据结构,可以动态地添加或删除节点,非常适合存储联系人信息这种动态的数据。
在这里,我们采用双向链表,使得查找、插入和删除操作更加高效。
算法设计添加联系人信息添加联系人信息时,我们需要遍历链表找到合适的位置插入新节点,这里的算法复杂度为O(n),其中n表示链表的长度。
查找联系人信息查找联系人信息时,我们需要遍历链表查找目标节点,这里的算法复杂度为O(n)。
删除联系人信息删除联系人信息时,我们同样需要遍历链表找到目标节点并删除,其算法复杂度为O(n)。
更新联系人信息更新联系人信息时,我们首先需要查找到目标节点,然后进行更新操作,其算法复杂度也为O(n)。
系统优化为了提高系统的性能,我们可以通过以下几种方式进行优化: - 使用哈希表索引联系人信息,减少查找联系人的时间复杂度; - 引入缓存机制,减少频繁的IO 操作。
总结通过本报告的介绍和分析,我们了解了一个基于数据结构设计的通讯录管理系统的实现原理和优化方法。
在实际应用中,针对具体需求和场景,我们可以进一步优化系统性能,提升用户体验。
通讯录管理系统作为一种简单而实用的应用程序,将在日常生活中发挥重要作用。
通讯录管理系统(C语言)

通讯录管理系统(C语⾔)/** 对通讯录进⾏插⼊、删除、排序、查找、单个显⽰功能*/#include <stdio.h>#include <malloc.h>#include <string.h>#include <stdlib.h>int n;typedef struct _Address_List{char name[30]; //名字char work[30]; //职业char handset[20]; //⼿机号码char email[30]; //电⼦邮件char address[30]; //地址struct _Address_List *next;}address_List;#define LEN sizeof(address_List)address_List *Release(address_List *head);//创建⼀个通讯录address_List *Create(void){address_List *head,*p1,*p2;char name[30];n = 0;p1 = (address_List *)malloc(LEN);p2 = p1;printf("请输⼊通讯录的内容!\n姓名输⼊为0时表⽰创建完毕!\n");printf("请输⼊姓名:");gets(name);if(strcmp(name,"0")!=0){strcpy(p1->name,name);printf("请输⼊职业:");gets(p1->work);printf("请输⼊⼿机:");gets(p1->handset);printf("请输⼊电⼦邮件:");gets(p1->email);printf("请输⼊通讯地址:");gets(p1->address);head = NULL;while(1){n = n+1;if(n == 1){head = p1;}else{p2->next = p1;}p2 = p1;printf("请输⼊姓名:");gets(name);if(strcmp(name,"0") == 0){break;}else{p1 = (address_List *)malloc(LEN);strcpy(p1->name,name);printf("请输⼊职业:");gets(p1->work);printf("请输⼊⼿机:");gets(p1->handset);printf("请输⼊电⼦邮件:");gets(p1->email);printf("请输⼊通讯地址:");gets(p1->address);}}return head;}else{return0;}}//打印整个通讯录void print(address_List *head){address_List *p;if(head != NULL){p = head;printf("本通讯录现在共有%d⼈;\n",n);printf("---姓名---------职业----------⼿机--------Email-------------通讯地址\n");printf("====================================================================\n");do{printf("=%s\t\t",p->name);printf("=%s\t\t",p->work);printf("=%s\t\t",p->handset);printf("=%s\t\t",p->email);printf("=%s\n",p->address);p = p->next;}while(p != NULL);printf("==================================================================\n"); }else{printf("通讯录为空,⽆法输出!\n");}}//在通讯录插⼊address_List *insert(address_List *head){address_List *p0,*p1,*p2;char name[20];p1 = head;printf("请输⼊增加的内容:\n");printf("请输⼊姓名:");gets(name);if(strcpy(name,"0") == 0){printf("姓名不能为0,增加失败!\n");return head;}else{p0 = (address_List *)malloc(LEN);strcpy(p0->name,name);printf("请输⼊职业:");gets(p1->work);printf("请输⼊⼿机:");gets(p1->handset);printf("请输⼊电⼦邮件:");gets(p1->email);printf("请输⼊通讯地址:");gets(p1->address);n = n+1;if(head == NULL){head = p0;p0->next = NULL;return head;}else{while(strcmp(p0->name,p1->name) > 0 && (p1->next != NULL)){p2 = p1;p1 = p1->next;}if(strcmp(p0->name,p1->name) <0 || strcmp(p0->name,p1->name) == 0){if(head == p1){head = p0;}else{}p0->next = p1;}else{p1->next = p0;p0->next = NULL;}return head;}}}//删除通讯录中某个⼈address_List *delete_txl(address_List *head){address_List *p,*q;char name[30];if(head == NULL){printf("通讯录为空,⽆法删除!\n");return head;}p = head;printf("请输⼊需要删除的⼈姓名:");gets(name);if(strcmp(head->name,name) == 0){head = head->next;free(p);printf("删除操作成功!\n");return head;}else{q = head;p = head->next;while(p != NULL){if(strcmp(p->name,name) == 0){q->next = p->next;free(p);printf("删除操作成功!\n");return head;}p = p->next;q = q->next;}}}//显⽰通讯录中某个⼈address_List *display(address_List *head){address_List *p1,*p2;char name[30];int m;if(head == NULL){printf("通讯录为空,⽆法显⽰!\n");return head;}p1 = head;m = 0;printf("请输⼊要显⽰⼈的姓名:");gets(name);while(p1 != NULL){while(strcmp(p1->name,name) != 0 && p1->next != NULL){p2 = p1;p1 = p1->next;}if(strcmp(p1->name,name) == 0){m++;printf("%s的通讯内容如下:\n",name);printf("---姓名---------职业----------⼿机--------Email-------------通讯地址\n");printf("====================================================================\n"); printf("=%s=\t\t",p1->name);printf("=%s=\t\t",p1->work);printf("=%s=\t\t",p1->handset);printf("=%s=\n",p1->address);printf("====================================================================\n"); }p1 = p1->next;}if(m == 0){printf("此⼈不在通讯录中!\n");}return head;}//对通讯录进⾏排序操作address_List *Sort(address_List *head){address_List *p1,*p2;int i,j;typedef struct _Address_List1{char name[30]; //名字char work[30]; //职业char handset[20]; //⼿机号码char email[30]; //电⼦邮件char address[30]; //地址}address_List1;address_List1 Sort[200];address_List1 temp;if(head == NULL){printf("通讯录为空,⽆法排序!\n");return head;}p1 = head;for(i = 0;i < n,p1 != NULL; i++){strcpy(Sort[i].name,p1->name);strcpy(Sort[i].work,p1->work);strcpy(Sort[i].handset,p1->handset);strcpy(Sort[i].email,p1->email);strcpy(Sort[i].address,p1->address);p2 = p1;p1 = p1->next;}head = Release(head);for(j = 0; j < n-1; j++){for(i = j+1; i < n; i++){if(strcmp(Sort[i].name,Sort[j].name) < 0){Sort[i] = temp;temp = Sort[j];Sort[j] = temp;}}}p1 = (address_List *)malloc(LEN);p2 = p1;strcpy(p1->name,Sort[0].name);strcpy(p1->work,Sort[0].work);strcpy(p1->handset,Sort[0].handset);strcpy(p1->email,Sort[0].email);strcpy(p1->address,Sort[0].address);head = p1;for(i = 1; i < n; i++){p1 = (address_List *)malloc(LEN);strcpy(p1->name,Sort[i].name);strcpy(p1->work,Sort[i].work);strcpy(p1->handset,Sort[i].handset);strcpy(p1->email,Sort[i].email);strcpy(p1->address,Sort[i].address);p2->next = p1;p2 = p1;}p2->next = NULL;printf("按姓名排序后的结果是:\n");print(head);return head;}address_List *Search_name(address_List *head){address_List *p1,*p2;int m;char name[30];if(head == NULL){printf("通讯录为空,⽆法查找!\n");return head;}p1 = head;printf("**************************\n");printf("****请输⼊要查找的姓名:**\n");printf("**************************\n");m = 0;gets(name);while(p1 != NULL){while(strcmp(p1->name,name) != 0 && (p1->next != NULL)){p2 = p1;p1 = p1->next;}if(strcmp(p1->name,name) == 0){m++;printf("你查找的内容是:\n");printf("++++++++++++++++++++++++++++++++\n");printf("++ %s\t%s\t%s\t%s\t%s ++",p1->name,p1->work,p1->handset,p1->email,p1->address); printf("++++++++++++++++++++++++++++++++\n");}p1 = p1->next;if(m == 0){printf("你查找的姓名不在通讯录中!\n");}break;}return head;}//释放整个通讯录address_List *Release(address_List *head){address_List *p;while(head != NULL){p = head;head = head->next;free(p);}return head;}//保存(以⽂件的形式保存)void save(address_List *head){FILE *fp;address_List *p;char Filename[30]; //保存后的⽂件名if(head ==NULL){printf("待保存的通讯录为空,⽆法保存!\n");return ;}printf("请输⼊保存后的⽂件名:");gets(Filename);fp = fopen("Filename.txt","w");if(fp == NULL){printf("⽆法打开⽂件!\n");return ;}p = head;fprintf(fp,"姓名\t职业\t⼿机\tEmail\t地址\n");for(;p != NULL;){fprintf(fp,"姓名\t职业\t⼿机\tEmail\t地址",p->name,p->work,p->handset,p->email,p->address);p = p->next;}printf("保存完毕!\n");}//⽂件读出函数address_List *Load(address_List *head){FILE *fp;char Filename[30];address_List *p1,*p2;printf("请输⼊要输出的⽂件名:");gets(Filename);fp = fopen("Filename.txt","r");if(fp == NULL){printf("此通讯录不存在,⽆法输出!\n");return head;}else{head = Release(head);}p1 = (address_List *)malloc(LEN);fscanf(fp,"%s%s%s%s%s",p1->name,p1->work,p1->handset,p1->email,p1->address);if(feof(fp) != 0){printf("⽂件为空,⽆法打开!\n");return head;}else{rewind(fp);p2 = p1;head = p1;n = 0;while(feof(fp) == 0){fscanf(fp,"%s%s%s%s%s",p1->name,p1->work,p1->handset,p1->email,p1->address);if(feof(fp) != 0){break;}p2->next = p1;p2 = p1;p1 = (address_List *)malloc(LEN);n = n+1;}p2->next = NULL;p1 = head;head = head->next;n = n-1;free(p1);print(head);printf("打开完毕!\n");return head;}fclose(fp);}//菜单选择函数address_List *menu(address_List *head){char num[10];while(1){printf("*******************************\n");printf("*****1. 姓名查找 **********\n");printf("*****2. 单个显⽰ **********\n");printf("*****3. 增加 **********\n");printf("*****4. 退出 **********\n");printf("*******************************\n");printf("请输⼊你选择的操作:");gets(num);switch(*num){case'1':{head = Search_name(head);print(head);}break;case'2':{head = display(head);break;case'3':{head = insert(head);print(head);}break;case'4':return head;default:printf("操作有误,此项不存在!\n");break;}if(strcmp(num,"6") == 0){break;}}return head;}//主函数int main(void){address_List *head = NULL;char num[10];printf("*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n"); printf("*=*=*=*=*=*=*= 程序说明 *=*=*=*=*=*=*\n");printf("*=*=*=*=*=*=*= 请及时保存创建完毕的通讯录内容 *=*=*=*=*=*=*\n");printf("*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n"); while(1){printf("*******************************\n");printf("****** 1. 创建通讯录 *******\n");printf("****** 2. 按名字排序 *******\n");printf("****** 3. 综合操作 *******\n");printf("****** 4. 保存 *******\n");printf("****** 5. 打开 *******\n");printf("****** 6. 删除 *******\n");printf("****** 7. 退出 *******\n");printf("*******************************\n");printf("请输⼊你选择的操作:");gets(num);switch(*num){case'1':{if(head == NULL){head = Create();print(head);}else{head = Release(head);head = Create();print(head);}}break;case'2':{head = Sort(head);}break;case'3':{head = menu(head);}break;case'4':{save(head);print(head);}break;case'5':{head = Load(head);}break;case'6':{print(head);}break;case'7':{head = Release(head);}break;default:{printf("操作有误,此项不存在!\n"); }break;}if(strcmp(num,"7") == 0){break;}}return0;}。
通讯录信息管理系统的函数调用关系

通讯录信息管理系统的函数调用关系通讯录信息管理系统的函数调用关系可以分为以下几个部分:1. 初始化函数:负责初始化通讯录,如创建联系人列表、打开或创建存储文件等。
2. 显示菜单函数:显示欢迎界面,让用户选择功能,如添加联系人、删除联系人、查询联系人等。
3. 添加联系人函数:当用户选择添加联系人时,调用此函数。
该函数负责获取用户输入的联系人信息(如姓名、性别、年龄、电话等),并将其添加到联系人列表中。
如果联系人数量已达到上限(如1000人),则询问用户是否覆盖现有联系人。
4. 删除联系人函数:当用户选择删除联系人时,调用此函数。
该函数负责根据用户输入的姓名查找并删除联系人列表中的对应联系人。
5. 查询联系人函数:当用户选择查询联系人时,调用此函数。
该函数负责根据用户输入的姓名在联系人列表中查找对应联系人,并显示其信息。
6. 保存联系人函数:在用户完成操作后,将联系人列表保存到文件中。
7. 读取联系人函数:在程序启动时,从文件中读取联系人列表。
8. 退出通讯录系统函数:当用户选择退出时,调用此函数。
该函数负责清理资源,如关闭文件、释放内存等。
9. 错误处理函数:在程序运行过程中,处理可能出现的错误,如输入合法性检查、文件操作失败等。
10. 界面切换函数:在各个功能之间切换时调用,如从菜单界面切换到添加联系人界面等。
这些函数之间的关系如下:-初始化函数-> 显示菜单函数-显示菜单函数-> 添加联系人函数/ 删除联系人函数/ 查询联系人函数-添加联系人函数-> 保存联系人函数-删除联系人函数-> 保存联系人函数-查询联系人函数-> 保存联系人函数-保存联系人函数-> 读取联系人函数-读取联系人函数-> 显示菜单函数-显示菜单函数-> 退出通讯录系统函数在整个程序运行过程中,各个函数相互调用,形成一个完整的通讯录信息管理系统。
数据结构课程设计通讯录管理系统

数据结构课程设计通讯录管理系统
数据结构课程设计中的通讯录管理系统可以涉及到以下几个方面的知识点:
1. 数据结构:通讯录管理系统中需要使用到的数据结构包括数组、链表、哈希表等。
其中,数组用于存储通讯录中的人员信息,链表用于存储联系人信息,哈希表用于实现快速查找功能。
2. 算法:通讯录管理系统中需要使用到的算法包括查找算法、排序算法、动态规划算法等。
其中,查找算法用于实现快速查找联系人功能,排序算法用于实现通讯录的排序功能,动态规划算法用于实现最长公共子序列问题等。
3. 数据库:通讯录管理系统需要使用到数据库来存储通讯录中的数据。
需要掌握关系型数据库的设计和操作,包括数据表的设计、SQL 语句的编写等。
4. 界面设计:通讯录管理系统需要有友好的用户界面,需要进行界面设计和开发,包括前端技术的使用,如HTML、CSS和JavaScript等。
5. 系统测试:通讯录管理系统需要进行系统测试,包括功能测试、性
能测试等,确保系统能够正常运行并满足用户需求。
通过设计和实现通讯录管理系统,可以锻炼学生对数据结构和算法的理解和应用能力,同时还能提高学生的编程能力和团队合作能力。
数据结构课程设计通讯录管理系统

数据结构课程设计通讯录管理系统一、系统需求分析通讯录管理系统的主要目标是提供一个方便、高效的方式来管理联系人信息。
具体需求包括:1、能够添加联系人,包括姓名、电话号码、电子邮件、地址等基本信息。
2、可以对联系人信息进行修改和删除操作。
3、支持按照姓名、电话号码等关键字进行快速查找。
4、能够以列表形式展示所有联系人的信息。
二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储联系人信息。
考虑到联系人信息的多样性和动态性,链表是一个不错的选择。
链表可以方便地进行插入、删除和修改操作,并且能够灵活地调整存储空间。
另外,为了提高查找效率,我们可以结合使用哈希表。
通过将联系人的关键信息(如姓名或电话号码)进行哈希运算,快速定位到对应的联系人节点。
三、系统功能实现1、添加联系人功能当用户选择添加联系人时,系统会提示用户输入联系人的各项信息。
这些信息被封装成一个结构体,并通过链表的插入操作添加到链表中。
同时,将关键信息映射到哈希表中,以便后续快速查找。
2、修改联系人功能用户输入要修改的联系人的关键字,系统通过哈希表快速找到对应的联系人节点。
然后,提示用户输入修改后的信息,并更新链表和哈希表中的数据。
3、删除联系人功能与修改功能类似,通过关键字找到联系人节点,从链表和哈希表中删除相应的节点和信息。
4、查找联系人功能用户输入查找关键字,系统通过哈希表进行快速定位,如果找到匹配的联系人,则显示其详细信息。
5、展示所有联系人功能遍历链表,将所有联系人的信息以列表形式输出到屏幕上。
四、系统界面设计为了提高用户体验,系统设计了简洁直观的界面。
主界面提供了添加、修改、删除、查找和展示所有联系人等功能选项。
用户通过选择相应的选项,进入对应的操作流程。
五、代码实现示例以下是部分关键代码的示例:```c//联系人结构体typedef struct Contact {char name50;char phoneNumber20;char email50;char address100;struct Contact next;} Contact;//哈希表节点结构体typedef struct HashNode {char key50;Contact contact;struct HashNode next;} HashNode;//链表插入联系人void insertContact(Contact head, Contact newContact) {newContact>next = head;head = newContact;}//哈希函数unsigned int hashFunction(const char key) {unsigned int hash = 0;while (key) {hash =(hash << 5) + key++;}return hash % HASH_TABLE_SIZE;}//查找联系人Contact findContact(Contact head, const char key, HashNode hashTable) {unsigned int hashValue = hashFunction(key);HashNode node = hashTablehashValue;while (node) {if (strcmp(node>key, key) == 0) {return node>contact;}node = node>next;}Contact current = head;while (current) {if (strcmp(current>name, key) == 0 ||strcmp(current>phoneNumber, key) == 0) {//更新哈希表HashNode newNode =(HashNode )malloc(sizeof(HashNode));strcpy(newNode>key, key);newNode>contact = current;newNode>next = hashTablehashValue;hashTablehashValue = newNode;return current;}current = current>next;}return NULL;}```六、系统测试在完成系统的开发后,需要进行全面的测试以确保系统的稳定性和可靠性。
通讯录管理系统应具备以下功能(知识参考)

通讯录管理系统应具备以下功能:①系统初始化:显示欢迎语:“欢迎使用通讯录管理系统!”和“按任意键系统开始初始化,显示通讯录!”,完成将从数据文件address.dat中读出的记录送入结构体数组temp(如果该文件中不存在记录,要求用户输入),以便程序运行过程中由其他函数使用;显示通讯录;返回通讯录含记录的条数;②添加记录:向通讯录添加新记录;③修改记录:修改通讯录中的记录;④删除记录:删除通讯录中的记录;⑤按姓名排序:显示通讯录中按姓名排序的记录;⑥按姓名查询:显示通讯录中按姓名查询得到的记录;⑦快速查询:显示通讯录中按姓名通过快速查询得到的记录;⑧退出系统:将记录数据写入磁盘文件,显示结束语,退出系统。
⒁主菜单函数int menuselect(void):制作含有8个功能项的菜单,如下:********************菜单********************* 0.显示通讯录** 1.添加记录** 2.修改记录** 3.删除记录** 4.按姓名排序** 5.按姓名查询** 6.快速查询** 7.退出**********************************************提示用户进行选择(编号),如果选择错误要求重新选择,选择正确提示确认,如果用户确认选错了,再重新选择,如果用户确认是选该项,返回主函数,去执行相应的功能,仅由主函数调用;⒂退出系统函数void quit(void):将记录数据写入磁盘文件,显示结束语:“欢迎再次使用通讯录管理系统,再见!”,等待用户按键(用户按键不显示)退出系统;/* HELLO.C -- Hello, world */#include<stdio.h>struct person{char name[8];char tel[15];char addr[50];};char filename[20]="E:\\txl.txt";FILE *fp;void creat();void output();void search();void append();void modify();void delete();main( ){int m;creat();while(1){printf("\n\t\t*********欢迎使用通讯录信息管理系统*********\n\n"); printf("\n\t\t添加,请按1");printf("\n\t\t查找,请按2");printf("\n\t\t修改,请按3");printf("\n\t\t删除,请按4");printf("\n\t\t输出,请按5");printf("\n\t\t退出,请按0\n");printf("\n\t\t********************************************\n\n");printf("Please select(0--5):");scanf("%d",&m);if(m>=0&&m<=5){switch(m){case 1: append();break;case 2: search();break;case 3: modify();break;case 4: delete();break;case 5: output();break;case 0: exit();}printf("\n\n操作完毕,请再次选择!");}elseprintf("\n\n选择错误,请再次选择!");}。
通讯录管理系统

通讯录管理系统一、引言随着科技的不断发展,电子设备的运用愈发广泛,通讯工具也从最早的电话、传真、邮件演变到如今的移动电话、微信等APP软件。
同时,人们通讯的宽带和速度也得到了很大的进步,这里提到的速度指的是通讯的速度和传输的速度。
在日常生活中,人们需要不断联系和交流,而一个完善的通讯管理系统能够辅助人们做到这一点。
二、通讯录管理系统的概述通讯录管理系统是一个集成化的系统,它包括通讯录的建立、搜索、编辑、删除等基本功能,同时也有通讯录的导入、导出、备份、恢复等高级功能。
对于个人而言,通讯录管理系统是一个非常有用的工具,可以让我们对日常生活中的联系人实现精细化管理。
对于企业和组织而言,通讯录管理系统则是一个不可或缺的管理工具,它可以让企业和组织对内外联系人进行统一管理,提高工作效率,实现快速响应与灵活沟通。
三、通讯录管理系统的需求分析1. 用户管理需求通讯录管理系统的用户一般包括个人、企业和组织等,他们的管理需求有所不同,例如个人通讯录管理系统需要支持用户自主导入、导出、备份、恢复,企业通讯录管理系统需要支持管理员进行用户管理和权限控制等。
2. 数据整合需求通讯录管理系统需要支持将人员信息从不同的来源整合到一个集中的库中,这可以通过数据导入、数据同步、数据抓取等方式实现。
3. 可扩展性和可定制化需求通讯录管理系统应该具有良好的可扩展性和可定制化的能力,以满足企业和组织不同的需求。
4. 安全性需求通讯录管理系统需要具有安全性,防止数据泄漏和恶意攻击等安全问题,同时还要实现数据备份、数据恢复等功能。
五、通讯录管理系统的设计1. 系统结构设计通讯录管理系统应该是一个分层结构的系统,分为表示层、业务层、数据访问层和数据存储层四个层级。
其中,表示层为用户提供了用户界面,业务层处理用户请求,数据访问层为业务层提供数据访问接口,数据存储层则负责数据存储管理。
2. 系统模块设计通讯录管理系统主要包括三个模块:用户管理模块、通讯录管理模块和数据备份恢复模块。
通讯录管理系统毕业设计(两篇)2024

引言概述:通讯录管理系统是一种用于管理联系人信息的软件,它能够为用户提供便捷的联系人管理和信息查询功能。
本文将继续介绍通讯录管理系统的设计和实现,重点关注系统的用户界面设计、数据存储与管理、通讯录的分类与搜索功能、用户权限管理以及通讯录系统的扩展与升级。
正文内容:1.用户界面设计1.1设计原则:用户友好性、易用性和美观性原则1.2主界面设计:主界面布局、功能模块展示、导航设计1.3交互设计:交互方式、操作流程、反馈机制1.4响应式设计:适配多种设备和屏幕分辨率2.数据存储与管理2.1数据库设计:确定实体和属性、建立表结构、定义关系2.2数据库连接:连接数据库、读写操作、异常处理2.3数据备份与恢复:数据备份策略、备份文件管理、数据恢复机制2.4数据安全性:权限控制、数据加密、数据完整性3.通讯录的分类与搜索功能3.1通讯录分类:基本分类和用户自定义分类3.2联系人添加与编辑:输入验证、字段定义、数据关联3.3联系人查询:关键字查询、条件过滤、多条件组合查询3.4联系人导入导出:支持多种数据格式、数据匹配与转换、导入导出策略3.5通讯录分享与同步:用户权限设置、跨设备同步、冲突解决4.用户权限管理4.1用户注册与登录:用户信息获取、身份验证、登录状态管理4.2用户权限分配:管理员与普通用户权限区分、权限控制细化4.3用户信息管理:个人信息修改、密码重置、账号注销4.4安全性保护:登录失败锁定、密码加密、会话管理5.通讯录系统的扩展与升级5.1模块化设计:可插拔式功能模块、模块间接口定义5.2扩展性设计:支持插件开发、动态加载与卸载5.3性能优化:数据索引优化、查询优化、缓存机制5.4系统升级:版本管理、更新提示、升级策略总结:通过上述的详细阐述,我们可以看到,通讯录管理系统涵盖了用户界面设计、数据存储与管理、通讯录的分类与搜索功能、用户权限管理以及通讯录系统的扩展与升级等多个关键领域。
在该系统的设计过程中,我们需要重点关注用户友好性、数据安全性和系统的可扩展性。
通讯录管理系统课程设计报告

通讯录管理系统课程设计报告一、引言通讯录管理系统是一种用于存储和管理联系人信息的应用程序,它可以帮助用户方便地记录和查找各种联系人信息。
在本课程设计报告中,我们将讨论通讯录管理系统的设计和实现过程,以及系统的功能特点和操作流程。
二、需求分析通讯录管理系统需要具备以下基本功能: 1. 添加联系人信息:用户可以输入姓名、电话号码、电子邮件地址等信息来添加新的联系人。
2. 查找联系人信息:用户可以通过姓名或电话号码等关键词来查找已添加的联系人信息。
3. 修改联系人信息:用户可以对已有联系人信息进行修改和更新。
4. 删除联系人信息:用户可以选择删除不需要的联系人信息。
5. 显示所有联系人信息:系统可以按照一定的格式将所有联系人信息展示给用户。
三、系统设计1. 数据结构为了存储联系人信息,我们可以使用一个包含姓名、电话号码、电子邮件地址等字段的结构体来表示每个联系人。
可以使用链表或数组来组织所有联系人信息。
2. 模块设计通讯录管理系统可以划分为以下几个模块: - 添加联系人模块:实现添加新联系人信息的功能。
- 查找联系人模块:实现根据关键词查找联系人信息的功能。
- 修改联系人模块:实现对已有联系人信息进行修改和更新的功能。
- 删除联系人模块:实现删除不需要的联系人信息的功能。
- 显示联系人模块:实现将所有联系人信息按照一定格式展示给用户的功能。
3. 用户界面设计用户界面应该简洁明了,包括各个功能的按钮或选项,以及输入框和显示信息的区域。
用户应该能够方便地进行各种操作和查看联系人信息。
四、系统实现1. 数据存储可以使用文件来存储联系人信息,也可以使用数据库来进行数据持久化。
2. 界面实现可以使用图形界面或命令行界面来实现用户交互功能,不同的界面设计会影响用户体验。
3. 功能实现根据需求分析中的功能,实现各个模块的功能代码,确保系统可以正确地完成相关操作。
五、功能测试在系统实现完毕后,需要进行功能测试,确保系统的各个功能都能正常运行,并且符合需求。
通讯录管理系统说明书

一、设计题目商品库存管理系统二、设计目的通过本课程设计所要求达到的目的是:通过该课程设计,学习java语言设计工具的使用,搞清程序设计的基本方法、步骤和数据库设计各阶段的任务,完成对某一小型设计和相应文档的编写工作。
使学生更加深入地掌握程序系统分析与设计的基本概念和基本方法,提高从事程序系统建设和管理工作的基本技能和能力。
商品库存管理是整个企业中重要的环节以及不可或缺的部分,是推动企业走向信息化、规范化的必要条件,而对于这些企业的资源管理,信息的存储和处理也显得迫切需要,要适应市场竞争,就需要有高效的处理方式和管理方法,它的内容对于企业的决策者和管理者来说都至关重要。
随着企业的不断扩大以及人们对商品日益增长的需求,。
要对这些货品进行统一、高效的管理,靠人工完成工作量庞大、难免有错漏之处,企业现有对商品库存管理主要是靠人利用计算机半手工操作,从生产出产品到送货到本公司的仓库,到入库登记,到销售出库的记录全由手工利用电脑的办公软件,加上计算机完成,这一管理不仅繁琐、效率低,而且缺乏库存管理的一些基本手段,给企业在一定程度上造成了管理方面的落后,以及经济利益上的损失,所以我们需要对货物的基本信息管理、出库入库管理进行完整的监控,也就是需要建立一个商品库存管理系统以提高企业对工作的管理效率,这样可以方便的进行货物进库入库、出库、查询、修改等各种信息,商品库存管理系统是典型的信息管理系统(MIS),其中主要包括后台数据库的建立和维护以及前端应用程序的开发两方面。
这样的一套管理系统具有很多无法比拟的优点,例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。
这些优点能够极大地提高仓库货物管理的效率,也是企业的科学化、正规化管理,与世界接轨的重要条件。
因此,使用自动化商品信息管理系统就显得势在必行,所以,开发一套这样的的管理软件是一件非常有必要的事情。
三、系统的需求分析3.1需求分析(1)数据需求通过与商品库存管理系统用户交谈等方式以及对商品库存管理的分析,可以得到商品库存管理数据库系统的数据需求。
通讯录管理系统需求分析

通讯录管理系统需求分析一、引言通讯录管理系统是一种用于管理个人或组织之间联系人信息的应用程序。
它通常包括存储联系人的基本信息,如姓名、电话号码、电子邮件地址等,并提供快速查找和编辑功能。
随着数字化时代的发展,通讯录管理系统在日常工作和生活中扮演着越来越重要的角色。
本文将对通讯录管理系统的需求进行详细分析。
二、功能需求1.添加联系人:用户应该能够通过系统向通讯录中添加新的联系人信息,包括姓名、电话号码、电子邮件地址等。
2.编辑联系人:用户可以对已有联系人信息进行编辑,修改或更新联系人的信息。
3.删除联系人:用户可以从通讯录中删除不再需要的联系人信息。
4.查找联系人:系统应该提供快速查找联系人的功能,用户可以通过姓名或其他关键词来查找特定联系人。
5.联系人分组:用户可以将联系人进行分组管理,方便对不同类别的联系人进行管理和查找。
6.导入导出联系人:系统应该支持从外部导入联系人信息,以及导出联系人信息到外部文件。
7.备份和恢复:系统应该具备备份和恢复通讯录数据的功能,以防止数据丢失或损坏。
三、性能需求1.安全性:通讯录管理系统应该保证用户联系人信息的隐私和安全性,防止未经授权的访问。
2.稳定性:系统应该具备良好的稳定性和可靠性,在高并发、大数据量的情况下也能够正常运行。
3.响应速度:系统应该具备较快的响应速度,用户在操作时能够获得即时的反馈。
4.易用性:系统应该具备良好的用户界面和友好的操作流程,方便用户快速上手并进行操作。
四、扩展性需求1.跨平台:通讯录管理系统应该具备跨平台的特性,支持在不同设备和操作系统上进行使用。
2.第三方应用集成:系统应该支持与第三方应用程序进行集成,例如与电子邮件客户端、日历应用等的数据互通。
3.自定义设置:用户可以根据自己的需求对系统进行定制设置,包括界面风格、提醒设置等。
五、总结通过对通讯录管理系统的功能、性能和扩展性需求进行分析,可以为系统的设计和开发提供指导。
在设计通讯录管理系统时,需要充分考虑用户的实际需求,保证系统的稳定性和易用性,满足用户对通讯录管理的各种需求。
通讯录管理系统课程设计报告Java

通讯录管理系统课程设计报告Java1. 简介通讯录管理系统是一种方便用户存储和管理联系人信息的工具。
本课程设计将使用Java语言开发一个简单的通讯录管理系统,实现对联系人信息的增删改查功能。
通过本项目的实践,学习者将掌握Java编程语言的基础知识和面向对象编程的技巧。
2. 功能需求通讯录管理系统应包含以下功能: - 添加联系人信息:用户可以输入联系人的姓名、电话号码、邮箱等信息添加到通讯录中。
- 显示所有联系人信息:系统能够展示所有已保存在通讯录中的联系人信息。
- 查找联系人信息:用户可以通过姓名或电话号码查找特定联系人的信息。
- 修改联系人信息:用户可以对已保存的联系人信息进行修改。
- 删除联系人信息:用户可以删除通讯录中的联系人信息。
实现以上功能需要设计相应的数据结构和算法,以及编写用户交互界面。
3. 技术实现3.1 数据结构在Java中,可以使用ArrayList或HashMap等数据结构来存储联系人信息。
ArrayList适用于有序的联系人列表,而HashMap适用于根据键值快速查找联系人信息。
3.2 用户交互界面用户交互界面可以通过Java的Swing或JavaFX等GUI工具包来实现。
设计一个简洁明了的界面,包含菜单栏、输入框、按钮等组件,以方便用户操作。
3.3 功能实现•添加联系人信息:用户输入信息后,将联系人信息添加到数据结构中。
•显示所有联系人信息:遍历数据结构,将所有联系人信息展示在界面上。
•查找联系人信息:根据用户输入的查询条件,在数据结构中查找对应的联系人信息。
•修改联系人信息:根据用户输入的修改信息,更新数据结构中相应的联系人信息。
•删除联系人信息:根据用户输入的删除条件,从数据结构中移除对应的联系人信息。
4. 总结通讯录管理系统是一个简单实用的应用程序,能够帮助用户有效管理联系人信息。
通过本课程设计,学习者将学习如何使用Java语言开发基本的应用程序,掌握面向对象编程的基本原理和技巧。
数据结构-通讯录管理系统的设计与实现汇总

数据结构-通讯录管理系统的设计与实现汇总简介本篇文档介绍了如何使用数据结构实现一个简单的通讯录管理系统。
包括系统的需求分析、数据结构选择、程序设计与实现等方面。
需求分析通讯录管理系统的核心功能是记录联系人信息,包括姓名、电话号码、电子邮件地址等。
该系统需要支持以下操作:1.添加联系人2.删除联系人3.查找联系人4.修改联系人信息5.显示所有联系人除了核心功能以外,通讯录管理系统还需要具有以下扩展功能:1.根据姓名或电话号码排序2.将联系人信息导入/导出文件3.显示某个分组的联系人数据结构选择为了支持以上功能,我们需要选择合适的数据结构来存储联系人信息。
常见的数据结构有数组、链表、栈、队列、哈希表等。
对于通讯录管理系统,我们可以使用链表来存储联系人信息。
每个节点包含一个指向下一节点的指针和联系人信息。
这种方式可以方便地插入、删除联系人信息,同时节省存储空间。
排序可以使用快速排序(QSort)、归并排序等算法实现。
导入/导出文件可以使用文件读写操作实现。
分组显示则可以使用多个链表来分别存储不同分组的联系人信息。
程序设计与实现以下是通讯录管理系统的程序设计与实现的主要流程:1.定义联系人结构体,包含姓名、手机号、邮箱等字段。
2.定义联系人节点结构体,包含指向下一节点的指针和联系人信息结构体。
3.实现通讯录管理系统功能函数,包括添加联系人、删除联系人、查找联系人、修改联系人信息、显示所有联系人等。
4.实现排序算法,如快速排序和归并排序。
5.实现文件读写操作,包括将联系人信息导入/导出文件。
6.实现分组显示功能,使用不同链表存储不同分组的联系人信息。
以上是通讯录管理系统的设计与实现汇总。
在数据结构的选择上,我们选择了链表作为存储通讯录联系人信息的数据结构,使用排序算法进行排序,使用文件读写操作进行导入/导出操作,使用多个链表实现分组显示功能。
在功能实现上,分别实现了添加联系人、删除联系人、查找联系人、修改联系人信息、显示所有联系人等核心功能以及排序、导入/导出、分组显示等扩展功能。
通讯录管理系统(2023版)

通讯录管理系统本文档涉及附件:⒈通过或附件提供通讯录管理系统的界面设计图。
⒉通过或附件提供通讯录管理系统的数据库设计文档。
通讯录管理系统文档一、介绍⑴目的通讯录管理系统是一个用于存储和管理联系人信息的平台,旨在帮助用户方便地管理及查找联系人信息。
⑵范围通讯录管理系统包含以下功能:●添加联系人:用户可以通过界面输入联系人的姓名、方式号码、电子邮件地质等信息,将其添加到通讯录中。
●编辑联系人:用户可以对已添加的联系人进行修改,并更新其信息。
●查找联系人:用户可以通过关键字搜索联系人的姓名或其他关联信息进行查找。
●删除联系人:用户可以删除通讯录中的联系人。
●分组管理:用户可以为联系人创建分组,并根据需要进行管理。
二、系统设计⑴界面设计通讯录管理系统的界面应具备以下功能:●登录界面:提供用户登录系统的入口,包括用户名和密码输入框。
●主界面:展示联系人列表,包含添加、编辑、查找和删除联系人的按钮。
●添加/编辑联系人界面:提供输入框以输入联系人信息,并保存或取消操作。
●查找联系人界面:提供搜索框以输入关键字,并展示匹配的联系人列表。
●删除确认界面:在删除联系人操作时,提示用户确认删除。
⑵数据库设计通讯录管理系统的数据库应包括以下表:●用户表(User):存储系统用户的信息,包括用户名和密码等。
●联系人表(Contact):存储联系人的信息,包括姓名、方式号码、电子邮件地质等。
●分组表(Group):存储联系人分组的信息,包括分组名称等。
●用户-联系人关联表(User_Contact):存储用户与联系人的关联关系。
●联系人-分组关联表(Contact_Group):存储联系人与分组的关联关系。
三、法律名词及注释●用户:使用通讯录管理系统的个人或组织。
●界面:通讯录管理系统的用户可视化界面,即用户与系统进行交互的界面。
●数据库:用于存储通讯录管理系统的用户信息、联系人信息和相关的关联关系的数据仓库。
●登录:用户使用有效的用户名和密码进行系统登录操作。
通讯录管理系统

通讯录管理系统随着社会的快速发展和信息化的进步,人们的沟通方式也在不断改变,电子通讯逐渐成为人们日常生活中不可或缺的一部分。
为了方便管理和利用联系人信息,通讯录管理系统应运而生。
通讯录管理系统是一种基于计算机技术的软件应用,其主要功能是帮助用户高效地存储、管理和检索联系人信息。
本文将就通讯录管理系统的构架、特点及应用领域进行详细介绍。
一、通讯录管理系统的构架通讯录管理系统由数据库、用户界面和核心功能模块组成。
1. 数据库:通讯录管理系统的核心是数据库,它用于存储用户的联系人信息。
数据库需要具备高效的存储和查询功能,并能保证数据的安全性。
同时,数据库还需要支持多用户的并发操作,以满足多人同时访问通讯录的需求。
2. 用户界面:用户界面是用户与通讯录管理系统进行交互的窗口,它需要提供简洁明了的操作界面,方便用户进行联系人的添加、编辑、删除和查询等操作。
用户界面还应该支持多种操作方式,如鼠标、键盘和触摸屏等,以适应不同用户的需求。
3. 核心功能模块:核心功能模块是通讯录管理系统的灵魂,它包括联系人信息的增删改查、联系人信息的导入导出、快速搜索、分组管理等功能。
核心功能模块还可以根据用户需求进行扩展,如通话记录、短信管理等附加功能。
二、通讯录管理系统的特点通讯录管理系统具有以下几个特点:1. 高效性:通讯录管理系统能够快速存储和查询大量的联系人信息,用户可以通过姓名、电话号码、公司名称等关键字进行快速搜索,并迅速找到所需的联系人信息。
2. 可扩展性:通讯录管理系统支持用户自定义字段,用户可以按照自己的需求添加额外的联系人信息,如生日、地址、邮箱等,以便更好地管理和利用联系人信息。
3. 多终端支持:通讯录管理系统可以在不同的终端设备上运行,如个人电脑、平板电脑、智能手机等。
用户可以随时随地访问和管理联系人信息,极大地提高了工作效率。
4. 数据安全性:通讯录管理系统通过多级权限控制和数据加密技术保证用户联系人信息的安全性。
单位员工通讯录管理系统

单位员工通讯录管理系统一、概述单位员工通讯录管理系统是一种用于管理企业内部员工通讯录的软件系统,它能够帮助企业快速便捷地查询和管理员工的相关信息,提高企业内部通讯效率和管理水平。
该系统可以适用于各种规模的企业,包括国有企业、民营企业、中小型企业等。
二、系统功能介绍1.员工信息管理:该功能可以实现对企业内部员工的基本信息管理,包括姓名、性别、职务、职称、工作地点、联系电话等等。
2.通讯录查询:员工通讯录管理系统可以通过员工名字或者职务等别查询员工联系方式,以达到快速通讯的目的。
3.通讯录更新:通讯录中员工的联系方式是会随时变化的,系统可以实现对通讯录的不断更新,确保通讯录信息的及时有效。
4.权限管理:系统可以根据用户权限分为普通员工和管理员两种权限。
管理员可以对系统的功能进行修改、添加或删除,而普通员工只能浏览通讯录信息。
5.备份与恢复:系统可以对数据进行备份和恢复,确保数据的安全性。
三、系统优势1.提高工作效率:在以往的传统管理模式下,企业要查询员工的联系方式需要耗费大量的时间,使用员工通讯录管理系统,可以快速、准确地查找到员工的信息,大大提高了工作效率。
2.数据安全:企业内部通讯录中包含员工的个人资料,必须要保护好这些数据不受到恶意攻击,员工通讯录管理系统拥有完善的权限管理机制和数据备份机制,提高了数据的安全性。
3.资源整合:使用员工通讯录管理系统,可以把所有员工的联系方式整合到一个统一的平台中,降低了管理成本,提高了资源利用效率。
四、系统部署方案1.运行环境要求:该系统需要在Windows操作系统上运行,对于Linux和MacOS操作系统需要借用专业软件进行兼容。
2.软件安装:企业管理员需要安装并配置企业自己的员工通讯录管理系统,包括数据库的配置、Web服务器的配置和系统的参数设置等等。
3.数据导入:管理员需要将企业内部所有员工的联系方式导入到员工通讯录管理系统中,以便员工快速查找使用。
五、系统维护方案1.软件更新:员工通讯录管理系统需要不断进行软件升级以保持软件的稳定性和完善性,企业可以定期检查软件发布的更新版本。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安科技大学数据库课程设计报告题目:通讯录管理系统班级:软件工程0902学号: 0908010224姓名:王浩2011年6月摘要基于数据库的通讯录管理系统,采用数据库原理、程序设计方法、数据结构等方面的知识结合vc++的mfc类库进行综合设计,具有基本联系人资料管理以及对于登陆用户的管理,权限设置以及数据的备份和恢复等功能。
采用SQL sever 作为通讯录管理系统的后台数据库,使得通讯录管理系统具有更高的稳定性及安全性,也方便了数据库中数据的备份以及发生故障时的还原。
关键词:数据库通讯录管理系统 SQL-sever 后台目录目录 (3)1.绪论 (1)1.1课程设计目的以及意义 (1)1.2课程设计内容 (1)2.需求分析 (2)2.1功能需求 (2)2.2数据分析 (2)3.数据库设计 (3)3.1概念结构设计 (3)3.2逻辑结构设计 (3)3.3物理结构设计 (4)4.系统功能设计 (5)5.系统实现 (6)5.1系统的开发环境 (6)5.2代码部分 (6)6.总结 (57)1.绪论1.1课程设计目的以及意义通过本课程设计,培养学生具有C/S模式的数据库应用软件系统的设计和开发能力;熟练掌握SQL Server数据库的使用,熟练掌握使用VC++开发工具开发数据库应用的能力;为毕业设计打下坚实的基础。
根据所学的数据库原理与程序设计的知识,能够针对一个小型的数据库管理系统,进行系统的需求分析,系统设计,数据库设计,编码,测试等,完成题目要求的功能,从而达到掌握开发一个小型数据库的目的。
根据所学的数据库原理与程序设计的知识, 通过对一个实际问题的分析,设计与实现,将原理与应用相结合,使我学会如何把书本上学到的知识用于解决实际问题,培养自己的动手能力;另一方面,使我能深入理解和灵活掌握教学内容。
1.2课程设计内容通讯录管理系统主要的数据表:用户信息表,联系人信息表等;2.需求分析2.1功能需求该程序要实现以下基本功能:用户管理:管理系统操作人员,设置操作人员口令和权限。
在满足不同系统用户的操作需求基础上,提高系统的安全性。
基础数据管理:维护通讯录每个联系人相关的基础数据信息。
主要包括以下几个功能:增加联系人及其信息、删除联系人及其信息、按条件查找联系人及其信息、以及更改联系人的信息数据库管理:对现有的数据库进行管理,包括数据备份和恢复,以方便用户对数据库的管理和维护工作,提高系统的数据安全性。
2.2数据分析一个普通的通讯录一般而言使用者需要的信息有一下这些:姓名、性别、民族、与用户的关系、生日、手机、备用手机、qq、邮箱、个人简历、以及当前所在单位。
为了方便管理需要添加编号这样的主键属性,同时出于安全性的考虑,除了管理员权限的用户都仅能看到自己所创建的信息,所以在联系人信息中应再加上创建者的属性,该属性应作为用户信息表的外键,在用户表中充当主键不能重复。
其中姓名性别以及和用户的关系是不可缺少的属性应定为非空。
3.数据库设计3.1概念结构设计用户联系人创建1N用户名主键密码权限手机备用手机QQ电子邮箱所在单位编号外键主键姓名性别民族关系个人简历生日图3-1 通讯录管理系统E-R 图3.2逻辑结构设计将通讯录管理系统E-R 图转换为关系模型为: 用户(用户名,密码,权限)联系人(编号,姓名,性别,民族,关系,生日,个人简历,手机,备用手机,QQ ,电子邮件,所在单位,用户名) 此关系模型 已经达到3NF3.3物理结构设计表3-1 用户表User结构字段含义类型长度约束条件Uusername 用户名varchar 30 主键Upassword 密码varchar 12 Not NULL Uaccess 权限varchar 6 Not NULL表3-2 联系人表Information结构字段含义类型长度约束条件Ino 编号varchar 10 主键Iname 姓名varchar 20 Not NULL Isex 性别varchar 2 '男' or'女' Ination 民族varchar 30Iresume 个人简历nvarchar 1000Imobile 手机char 11Ismobile 备用手机char 11Iunit 所在单位varchar 50Iqq QQ varchar 15Iemile 电子邮件varchar 50Irel 关系varchar 8 Not NULLIbirthday 生日 datetime 8 Uusername创建者varchar30外键4.系统功能设计程序登陆框判断账号密码是否正确确认不正确程序主窗口对话框查询操作查询条件选择查询内容输入增加联系人对话框联系人信息输入注销修改手动改编辑框信息点击列表框选择联系人点击查询删除联系人备份还原用户管理对话框添加新用户对话框输入新用户信息点击列表框选择用户删除用户手动修改编辑框信息修改图4-1 主程序工作流程图程序具有登陆框,登陆成功进入主程序框架,可以选择添加删除修改备份还原以及用户管理操作,当不同用户登陆时检测权限,普通用户用户管理按钮打不开,此时查询修改仅能对自己所创建的内容进行修改删除插入,管理员用户中admin是不可删除的系统初管理员,管理员用户可以修改任何用户所创建的数据,并对用户实行管理。
5.系统实现5.1系统的开发环境硬件环境:处理器:Inter Core2 Duo T6600 2.20GHz内存:2GB硬盘空间:320GB显卡:Nvidia GeForce GT 220M软件环境:操作系统:Windows XP sp3数据库:Microsoft SQL sever 2000编程环境:Microsoft Visual C++5.2代码部分1.按照物理结构设计建立数据库取名为通讯录表5-1 用户表User结构字段含义类型长度约束条件Uusername 用户名varchar 30 主键Upassword 密码varchar 12 Not NULL Uaccess 权限varchar 6 Not NULL表5-2 联系人表Information结构字段含义类型长度约束条件Ino 编号varchar 10 主键Iname 姓名varchar 20 Not NULL Isex 性别varchar 2 '男' or'女' Ination 民族varchar 30Iresume 个人简历nvarchar 1000Imobile 手机char 11Ismobile 备用手机char 11Iunit 所在单位varchar 50Iqq QQ varchar 15Iemile 电子邮件varchar 50Irel 关系varchar 8 Not NULL Ibirthday 生日datetime 8Uusername 创建者varchar 30 外键之后打开查询分析器输入存储过程建立的语句用来结束当前数据库连接use mastergoif exists(select 1 from sysobjects where id=object_id('p_killspid') and xtype='P')beginexec('drop procedure p_killspid')endgocreate proc p_killspid@dbname sysnameasdeclare @s nvarchar(1000)declare tb cursor local forselect s='kill '+cast(spid as varchar)from master..sysprocesseswhere dbid=db_id(@dbname)open tbfetch next from tb into @swhile @@fetch_status=0beginexec(@s)fetch next from tb into @sendclose tbdeallocate tbgo并建立数据源取名为tongxunlu 选择windows NT验证且默认数据库选择通讯录2.添加类CLoginSet 派生于CRecordset类选择数据源tongxunlu 在Recordset Type里选择Dynaset确定后选择er 表确定同理添加CInfoSet类选择的表为rmation3.新建mfc项目工程取名为tongxunlu 选择对话框删掉系统给的几个控件按下图建立新的控件图5-1 登陆框控件如下表更改ID 添加变量关联表5-3 登陆框控件表ID 控件类型内容变量关联ID_OK CButton 登陆ID_EXIT CButton 退出ID_USERNAME CComboBox m_CtrUsername ID_USERNAME CString m_user ID_PASSWORD CEdit m_CtrPassword ID_PASSWORD CString m_password4.在函数BOOL CTongxunluDlg::OnInitDialog()中添加如下代码//引入用户表内数据到组合框中CLoginSet recordset;CString strSQL;UpdateData(TRUE);strSQL="select * from [User]";if(!recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)){MessageBox("打开数据库失败!","数据库错误",MB_OK);return FALSE;}while(! recordset.IsEOF()){m_CtrUsername.AddString(recordset.m_Uusername);recordset.MoveNext();}recordset.Close();5.为登陆按钮添加消息响应函数void CTongxunluDlg::OnOk(){// TODO: Add your control notification handler code here CLoginSet recordset;CString strSQL;UpdateData(TRUE);if(m_user.IsEmpty()){//检测用户名是否为空AfxMessageBox("请输入用户名!");m_CtrUsername.SetFocus();return;}if(m_password.IsEmpty()){//检测密码是否为空AfxMessageBox("请输入密码!");m_CtrPassword.SetFocus();return;}strSQL.Format("select * from [User] where Uusername='%s' AND Upassword='%s'",m_user,m_password);if(!recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)){MessageBox("打开数据库失败","数据库错误",MB_OK);return;}if(recordset.GetRecordCount()==0){//如果没有一条记录和输入相同无法进入recordset.Close();MessageBox("密码错误请重新输入!");m_password="";m_CtrPassword.SetFocus();UpdateData(FALSE);}else{//账户密码输入正确进入后recordset.Close();CConnectDlg dlg;CDialog::OnOK();UpdateData(TRUE);//当前用户名dlg.m_nowuser=m_user;dlg.DoModal();}}6.为退出按钮添加消息响应函数void CTongxunluDlg::OnExit(){// TODO: Add your control notification handler code here //点击退出退出程序exit(0);}7.重载PreTranslateMessage()函数添加如下代码if(pMsg->message == WM_KEYDOWN){switch(pMsg->wParam){case VK_RETURN://屏蔽回车// OnKeyDown(VK_SPACE, LOWORD(pMsg ->lParam), HIWORD(pMsg->lParam));return TRUE;case VK_ESCAPE://屏蔽Escreturn TRUE;}}8.在资源管理器中插入对话框资源并如图建立相应的控件图5-2 主界面控件图表5-4 主界面控件表ID 控件类型内容变量关联ID_SELFUN CComboBox m_Ctrselfun ID_BACKUP CButton 备份ID_DELETE CButton 删除ID_INSERT CButton 插入联系人ID_LIST CListCtrl m_list ID_NOWUSER CString m_nowuser ID_RESTORE CButton 还原ID_SELECT CButton 查询ID_SELFUN CComboBox m_Ctrslefun ID_SELROM CString m_selrom ID_UPDATE CButton 修改ID_USERMANAGE CButton 用户管理ID_ZHUXIAO CButton 注销IDE_BIRTHDAY CString m_birthday IDE_EMAIL CString m_email IDE_MOBILE CString m_mobile IDE_NAME CString m_name IDE_NATION CString m_nationg IDE_QQ CString m_qq IDE_REL CString m_relIDE_RESUME CString m_resume IDE_SEX CString m_sex IDE_SMOBILE CString m_smobile IDE_UNIT CString m_unit 并为此对话框创建类,CConnectDlg类9.重载OnInitDialog() 函数,在函数中添加如下代码//初始化列表框m_list.InsertColumn(0,"编号");m_list.InsertColumn(1,"姓名");//平分列表框为两列RECT rectList;m_list.GetWindowRect(&rectList);int wid=rectList.right-rectList.left;m_list.SetColumnWidth(0,wid/2);m_list.SetColumnWidth(1,wid/2);m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);//初始化组合框内容查询条件m_Ctrselfun.AddString("按姓名查询");m_Ctrselfun.AddString("按性别查询");m_Ctrselfun.AddString("按民族查询");m_Ctrselfun.AddString("按关系查询");m_Ctrselfun.AddString("全部查找");m_Ctrselfun.SetCurSel(4);m_CtrSelRom.EnableWindow(FALSE);//刷新数据库将已存在的数据添加于列表框内CLoginSet log;CString strSQL,SQL;strSQL.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser); SQL.Format("select Ino,Iname from Information where Uusername='%s'",m_nowuser); log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(log.m_Uaccess=="DBA"){m_usermanage.EnableWindow(TRUE);RefreshList("select Ino,Iname from Information");}else{m_usermanage.EnableWindow(FALSE);RefreshList(SQL);}log.Close();10.添加成员函数RefreshList(CString strSQL)void CConnectDlg::RefreshList(CString strSQL){//按sql语句刷新列表框UpdateData(FALSE);CDatabase db;CInfoSet m_infoset;m_list.DeleteAllItems();m_infoset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);int i=0;while(!m_infoset.IsEOF()){CString temp;m_list.InsertItem(i,temp);m_list.SetItemText(i,0,m_infoset.m_Ino);m_list.SetItemText(i,1,m_infoset.m_Iname);m_infoset.MoveNext();i++;}m_infoset.Close();db.Close();UpdateData(FALSE);}11.重载PreTranslateMessage函数,添加如下代码//屏蔽回车键和esc键if(pMsg->message == WM_KEYDOWN){switch(pMsg->wParam){case VK_RETURN://屏蔽回车return TRUE;case VK_ESCAPE://屏蔽Escreturn TRUE;}}12.对查询按钮添加消息响应函数添加如下代码//选择查询方式并查询int n=m_Ctrselfun.GetCurSel();CString strSQL;UpdateData(TRUE);switch (n){//按关系查询case 0:if(m_selrom=="")AfxMessageBox("请输入查询内容!",MB_OK);else{CString strSQL,SQL;CLoginSet log;strSQL.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser);SQL.Format("select Ino,Iname from Information where Uusername='%s' and Irel ='%s'",m_nowuser,m_selrom);log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(log.m_Uaccess=="DBA"){strSQL.Format("select Ino,Iname from Information where Irel = '%s'",m_selrom);RefreshList(strSQL);}if(log.m_Uaccess=="normal")RefreshList(SQL);log.Close();}break;case 1:if(m_selrom=="")AfxMessageBox("请输入查询内容!",MB_OK);else{//按民族查询CString strSQL,SQL;CLoginSet log;strSQL.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser);SQL.Format("select Ino,Iname from Information where Uusername='%s' and Ination='%s'",m_nowuser,m_selrom);log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(log.m_Uaccess=="DBA"){strSQL.Format("select Ino,Iname from Information where Ination = '%s'",m_selrom);RefreshList(strSQL);}if(log.m_Uaccess=="normal")RefreshList(SQL);log.Close();}break;case 2://按姓名查询if(m_selrom=="")AfxMessageBox("请输入查询内容!",MB_OK);else{CString strSQL,SQL;CLoginSet log;strSQL.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser);SQL.Format("select Ino,Iname from Information where Uusername='%s' and Iname ='%s'",m_nowuser,m_selrom);log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(log.m_Uaccess=="DBA"){strSQL.Format("select Ino,Iname from Information where Iname = '%s'",m_selrom);RefreshList(strSQL);if(log.m_Uaccess=="normal")RefreshList(SQL);log.Close();}break;case 3://按性别查询if(m_selrom=="")AfxMessageBox("请输入查询内容!",MB_OK);else{CString strSQL,SQL;CLoginSet log;strSQL.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser);SQL.Format("select Ino,Iname from Information where Uusername='%s' and Isex = '%s'",m_nowuser,m_selrom);log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(log.m_Uaccess=="DBA")strSQL.Format("select Ino,Iname from Information where Isex = '%s'",m_selrom);RefreshList(strSQL);}if(log.m_Uaccess=="normal")RefreshList(SQL);log.Close();}break;case 4://全部查询{CString strSQL,SQL;CLoginSet log;strSQL.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser);SQL.Format("select Ino,Iname from Information where Uusername='%s'",m_nowuser);log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(log.m_Uaccess=="DBA")RefreshList("select Ino,Iname from Information");if(log.m_Uaccess=="normal")RefreshList(SQL);log.Close();}break;default:AfxMessageBox("请选择查询条件",MB_OK);}13.对列表框添加双击的消息响应函数,代码如下void CConnectDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult) {// TODO: Add your control notification handler code here//双击列表框显示数据int i=m_list.GetSelectionMark();if(i<0){MessageBox("无内容");return;}else{m_name=m_list.GetItemText(i,1);CString strSQL;strSQL.Format("select * from Information where Iname='%s'",m_name);CInfoSet info;info.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);m_sex=info.m_Isex;m_nation=info.m_Ination;CString str;str.Format("%d-%d-%d",info.m_Ibirthday.GetYear(),info.m_Ibirthday.GetMonth(),info.m_Ib irthday.GetDay());m_birthday=str;m_rel=info.m_Irel;m_resume=info.m_Iresume;m_mobile=info.m_Imobile;m_smobile=info.m_Ismobile;m_email=info.m_Iemile;m_unit=info.m_Iunit;m_qq=info.m_Iqq;UpdateData(FALSE);info.Close();}*pResult = 0;}14.为添加联系人按钮添加消息响应函数代码如下CInsertDlg dlg;dlg.Set(m_nowuser);if(dlg.DoModal()==IDOK){//添加过之后重新刷新列表框CString strSQL,SQL;CLoginSet log;strSQL.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser);SQL.Format("select Ino,Iname from Information where Uusername='%s'",m_nowuser);log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);if(log.m_Uaccess=="DBA")RefreshList("select Ino,Iname from Information");if(log.m_Uaccess=="normal")RefreshList(SQL);log.Close();}15.为删除联系人按钮添加消息响应函数,代码如下//获得当前选择的数据记录int i=m_list.GetSelectionMark();if(i<0){MessageBox("请选择一条记录进行删除!");}m_name=m_list.GetItemText(i,1);//删除当前数据记录CString sda;CDatabase db;db.Open(_T("tongxunlu"));sda.Format("delete from Information where Iname='%s'",m_name); db.ExecuteSQL(sda);db.Close();RefreshList("select Ino,Iname from Information");m_birthday = _T("");m_email = _T("");m_mobile = _T("");m_name = _T("");m_nation = _T("");m_qq = _T("");m_resume = _T("");m_sex = _T("");m_smobile = _T("");m_unit = _T("");m_rel = _T("");UpdateData(FALSE);16.为组合框查询方式添加选择函数,代码如下void CConnectDlg::OnSelchangeSelfun(){// TODO: Add your control notification handler code here//当切换查询方式时选到全部查询查询内容编辑框禁用每次更改清空查询内容int i=m_Ctrselfun.GetCurSel();if(i==4){m_CtrSelRom.EnableWindow(FALSE);}else{m_CtrSelRom.EnableWindow(TRUE);m_CtrSelRom.Clear();}m_selrom="";UpdateData(FALSE);}17.为修改按扭添加消息响应函数代码如下UpdateData(TRUE);//得到当先选择的数据记录int i= m_list.GetSelectionMark();m_name=m_list.GetItemText(i,1);CString temp;temp=m_name;if(i<0){MessageBox("请选择一条记录进行修改","错误");return;}CString strSQL;CInfoSet info;strSQL.Format("select * from Information where Iname='%s'",temp);if(!info.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)){MessageBox("打开数据库失败!","数据库错误");return;}//更改数据UpdateData(FALSE);info.Edit();info.m_Isex=m_sex;info.m_Ination=m_nation;info.m_Irel=m_rel;info.m_Imobile=m_mobile;info.m_Ismobile=m_smobile;info.m_Iqq=m_qq;info.m_Iemile=m_email;info.m_Iunit=m_unit;info.m_Iresume=m_resume;info.Update();info.Close();//按权限刷新列表CString strSQL1,SQL;CLoginSet log;strSQL1.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser); SQL.Format("select Ino,Iname from Information where Uusername='%s'",m_nowuser); log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL1);if(log.m_Uaccess=="DBA")RefreshList("select Ino,Iname from Information");if(log.m_Uaccess=="normal")RefreshList(SQL);log.Close();UpdateData(FALSE);18.为用户管理按钮添加消息响应函数//调用用户管理对话框CUserManage dlg;dlg.DoModal();19.给备份按钮添加消息响应函数,代码如下//设置备份文件路径CFileDialog dlg(FALSE,NULL,"联系人.bak",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"备份文件(*.bak) | *.bak|All(*.*) | *.*||");if(dlg.DoModal()==IDOK){UpdateData();m_path=dlg.GetPathName();UpdateData(FALSE);elsereturn;//进行备份CString strSQL;strSQL.Format("backup database 通讯录to disk='%s'",m_path);CDatabase db;if(!db.Open(_T("tongxunlu"))){MessageBox("数据库连接错误","错误");return;}db.ExecuteSQL(strSQL);db.Close();AfxMessageBox("备份完成");20.为还原按钮添加消息响应函数代码如下//获得备份文件的路径保存于m_path中CFileDialog dlg(TRUE,NULL,"联系人.bak",OFN_HIDEREADONL Y | OFN_OVERWRITEPROMPT,"备份文件(*.bak) | *.bak|All(*.*) | *.*||");if(dlg.DoModal()==IDOK)UpdateData();m_path=dlg.GetPathName();UpdateData(FALSE);}elsereturn;CDatabase m_database;//设置数据库连接时间m_database.SetLoginTimeout(600);m_database.SetQueryTimeout(600);if(!m_database.IsOpen()){if(!m_database.Open(_T( "tongxunlu")))MessageBox( "不能打开到该数据源的连接! "); }//在master下执行杀死与通讯录数据库连接的存储过程CString strSQL1;strSQL1="use master exec p_killspid '通讯录'";m_database.ExecuteSQL(strSQL1);//从所得路径回复数据库CString strSQL;strSQL.Format("restore database 通讯录from disk='%s'",m_path);m_database.ExecuteSQL(strSQL);//关闭数据库连接m_database.Close();AfxMessageBox("数据库还原成功!");//刷新列表框CLoginSet log;CString SQL;m_database.Open(_T("tongxunlu"));strSQL1="";strSQL1.Format("select Uaccess from [User] where Uusername='%s'",m_nowuser); SQL.Format("select Ino,Iname from Information where Uusername='%s'",m_nowuser); log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL1);if(log.m_Uaccess=="DBA"){m_usermanage.EnableWindow(TRUE);RefreshList("select Ino,Iname from Information");}else{m_usermanage.EnableWindow(FALSE);RefreshList(SQL);}log.Close();m_database.Close();21.为注销按钮添加消息响应函数,代码如下CTongxunluApp *ptheApp=(CTongxunluApp*)AfxGetApp(); //获得登陆框的app指针CDialog::OnCancel(); //关闭当前通讯录框架对话框ptheApp->InitInstance(); //打开登陆框对话框22.插于对话框资源如图添加对话框控件图5-4 增加联系人控件图表5-5 增加联系人控件表ID 控件类型内容变量关联ID_ADD CButton 增加ID_ESCAPE CButton 取消IDE_ADBIRTHDAY CTime m_addbirthday IDE_ADDEMAIL CString m_addemail IDE_ADDMOBILE CString m_addmobile IDE_ADDNAME CString m_addname IDE_ADDNATION CString m_addnation IDE_ADDQQ CString m_addqqIDE_ADDREL CString m_addrel IDE_ADDRESUME CString m_addresume IDE_ADDSEX CString m_addsex IDE_ADDSMOBILE CString m_addsmobile IDE_ADDUNIT CString m_addunit IDE_INO CString m_addno 并给对话框添加新类CInsertDlg23.重载OnInitDialog()函数,添加如下代码BOOL CInsertDlg::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization hereUpdateData(TRUE);CString InitNo;InitNo="select Ino from Information";CInfoSet tt;tt.Open(AFX_DB_USE_DEFAULT_TYPE,InitNo);tt.MoveLast();int x=atoi(tt.m_Ino);x+=1;CString xx;xx.Format("%d",x);m_addno=xx;UpdateData(FALSE);return TRUE;// return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE}24.给增加按钮添加消息响应函数,添加代码如下UpdateData(TRUE);CString strSQL,SQL;SQL.Format("select Uaccess from [User] where Uusername='%s'",m_createname);CLoginSet log;if(!log.Open(AFX_DB_USE_DEFAULT_TYPE,SQL)){MessageBox("连接数据库失败","错误");return;}CInfoSet info;UpdateData();if(m_addno==""){MessageBox("请输入编号","错误!");return;}if(m_addname==""){MessageBox("请输入姓名","错误!");return;}if(m_addrel==""){MessageBox("请输入关系","错误!");return;}if(m_addsex==""){MessageBox("请输入性别","错误!");return;}strSQL.Format("select Ino from Information where Ino='%s'",m_addno); CInfoSet templog;templog.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);int i=templog.GetRecordCount();templog.Close();if(!info.Open(AFX_DB_USE_DEFAULT_TYPE)){MessageBox("打开数据库失败!","数据库错误",MB_OK);return;}info.SetFieldNull(NULL);info.AddNew();if(i==0)info.m_Ino=m_addno;else{MessageBox("有重复的编号,请更改");return;}info.m_Iname=m_addname;info.m_Isex=m_addsex;info.m_Ination=m_addnation;info.m_Irel=m_addrel;info.m_Ibirthday=m_addbirthday;info.m_Imobile=m_addmobile;info.m_Ismobile=m_addsmobile;info.m_Iqq=m_addqq;info.m_Iemile=m_addemail;info.m_Iunit=m_addunit;info.m_Iresume=m_addresume;info.m_Uusername=m_createname;info.Update();info.Close();CDialog::OnOK();25.给取消按钮添加消息响应函数,添加代码如下CDialog::OnCancel();26.添加成员函数Set(CString m_user),函数内容如下void CInsertDlg::Set(CString m_user){m_createname=m_user;}27.重载PreTranslateMessage函数,添加如下代码if(pMsg->message == WM_KEYDOWN){switch(pMsg->wParam){case VK_RETURN://屏蔽回车// OnKeyDown(VK_SPACE, LOWORD(pMsg ->lParam), HIWORD(pMsg->lParam));return TRUE;case VK_ESCAPE://屏蔽Escreturn TRUE;}}28.如图插入对话框并修改对话框上的控件图5-5 用户管理控件图表5-6 用户管理控件表ID 控件类型内容变量关联ID_ADDUSER CButton 添加ID_UCACLE CButton 取消ID_UPDATEPASS CButton 修改IDC_DELETEUSER CButton 删除ID_USERLIST CListCtrl m_userlist IDC_ACCESS CComboBox m_ctraccess IDC_GPASSWORD CString m_gpassword IDC_GUSERNAME CString m_gusername 并创建新类CuserManage29.重载OnInitDialog函数并添加如下代码m_userlist.InsertColumn(0,"用户名");m_userlist.InsertColumn(1,"密码");m_userlist.InsertColumn(2,"权限");RECT rectList;m_userlist.GetWindowRect(&rectList);int wid=rectList.right-rectList.left;m_userlist.SetColumnWidth(0,wid/3);m_userlist.SetColumnWidth(1,wid/3);m_userlist.SetColumnWidth(2,wid/3);m_userlist.SetExtendedStyle(LVS_EX_FULLROWSELECT);RefreshList("select * from [User]");m_ctraccess.AddString("普通用户");m_ctraccess.AddString("管理员");30.为添加按钮添加消息响应函数,添加如下代码CInsertNewUser dlg;if(dlg.DoModal()==IDOK)RefreshList("select * from [User]");UpdateData(FALSE);31.为列表添加单击相应,添加如下代码void CUserManage::OnClickUserlist(NMHDR* pNMHDR, LRESULT* pResult) {// TODO: Add your control notification handler code hereint i=m_userlist.GetSelectionMark();m_gusername=m_userlist.GetItemText(i,0);CString strSQL;strSQL.Format("select * from [User] where Uusername='%s'",m_gusername);CLoginSet log;log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);m_gpassword=log.m_Upassword;if(m_gusername=="admin"){m_ctraccess.EnableWindow(FALSE);UpdateData(FALSE);}else{m_ctraccess.EnableWindow(TRUE);UpdateData(FALSE);}CString temp;temp=log.m_Uaccess;if(temp=="DBA")m_ctraccess.SetCurSel(0);elsem_ctraccess.SetCurSel(1);UpdateData(FALSE);*pResult = 0;}32.为修改按钮添加消息响应函数,添加如下代码UpdateData(TRUE);CLoginSet log;CString strSQL;strSQL.Format("select * from [User] where Uusername='%s'",m_gusername);if(!log.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)){。