1.运行结果
1.1-1管理员登陆
1.1-2管理员添加书籍信息
1.1-3查询所有书籍信息
1.1-4指定查询某种书籍信息
1.1-5修改书籍信息
1.1-6删除书籍信息
1.1-7会员登陆
1.1-8会员查询书籍信息
1.1-9会员购买书籍
1.2-1会员修改密码
1.2-2会员注销账号
1.2-3会员注册账号
2.项目基本描述和实现过程
1.项目描述:该项目实现了管理员和会员的登录,管理员登陆系统后能够对书籍的信息进行增删改查等一系列操作,同时管理员的账号是无法自主注册的,是一开始就添加到数据库中的,会员登陆后只能查询书籍信息、购买书籍和修改自己信息等操作,无法对书籍信息进行操作
2.项目实现:
2.1:创建客户端和服务端,让两端建立联系可以相互通信传递信息
2.2:创建数据库,将存储图书信息、管理员信息和会员信息的结构体存入数据库中
2.3:管理员和会员登陆的实现是通过将登录信息通过客户端传给服务端,服务端会将数据库的信息与之比较,正确登陆成功,错误登录失败。同时系统也对管理员和会员进行区分,管理员的账号无法自己注册
2.4:管理员进入图书管理系统后能够通过不同指令来达到对图书信息的增删改查等一系列操作,而会员进入图书系统后只能查询书籍的信息、购买书籍和修改会员信息等操作,无法对图书信息进行操作
3. 项目部分源码
3.1客户端源码
#include "../include/net.h"
int main(int argc, const char *argv[])
{
if(argc<3)
{
printf("输入参数有误\n");
return -1;
}
int socket_fd=tcp_send(argv[1],atoi(argv[2]));
char buf[D]={0};
int op=0;
Admini s1;
Vip c1;
//sqlite3 *vipdb=vipsqlite();
int ret;
while(1)
{
menu1();
printf("请输入选项:\n");
scanf("%d",&op);
if(-1==op)
{
printf("退出成功\n");
send(socket_fd,"quit",D,0);
break;
}
switch(op)
{
case 1:
send(socket_fd,"guanliyuandenglu",D,0);
printf("请输入管理员账号和密码:\n");
scanf("%s%s",s1.number,s1.code);
send(socket_fd,&s1,sizeof(Admini),0);
recv(socket_fd,&ret,4,0);//接受命令对错的结果
if(ret==0)//密码正确
{
Adsend(socket_fd);
}
else
{
printf("密码错误或该管理员账号不存在!\n");
}
break;
case 2:
send(socket_fd,"huiyuandenglu",D,0);
printf("请输入会员用户名和密码:\n");
scanf("%s%s",c1.username,c1.vipcode);
send(socket_fd,&c1,sizeof(Vip),0);
recv(socket_fd,&ret,4,0);
if(ret==0)
{
vipsend(socket_fd);
}
else
{
printf("密码错误或用户名不存在!\n");
}
break;
case 3:
send(socket_fd,"huiyuanzhuce",D,0);
printf("请添加要注册的会员信息:\n");
scanf("%s%s",c1.username,c1.vipcode);
//insertVip(socket_fd,vipdb,c1);
send(socket_fd,&c1,sizeof(Vip),0);
printf("添加会员信息成功!\n");
break;
default :
printf("输入选项错误\n");
}
}
close(socket_fd);
return 0;
}
3.2服务端源码
#include "../include/net.h"
int main(int argc, const char *argv[])
{
//1.入参判断
if(argc<3)
{
printf("输入参数有误\n");
return -1;
}
int i,listenfd,connfd,maxfd;
char n[D];
char buf[D];
Book btemp;
Vip vtemp;
Admini atemp;
sqlite3 *adminidb=adsqlite();
sqlite3 *bookdb=bksqlite();
sqlite3 *vipdb=vipsqlite();
fd_set rdfs,temp;
listenfd=tcp_recv(argv[1],atoi(argv[2]));
FD_ZERO(&rdfs);
FD_ZERO(&temp);
FD_SET(listenfd,&rdfs);
maxfd=listenfd;
int ret;
while(1)
{
temp=rdfs;
if(select(FD_SETSIZE,&temp,NULL,NULL,NULL)<0)
{
perror("select error");
return -1;
}
for(i=0;i<=FD_SETSIZE;i++)
{
if(FD_ISSET(i,&temp))
{
if(i==listenfd)
{
connfd=accept(listenfd,NULL,NULL);
printf("NEW connection is coming %d\n",connfd);
FD_SET(connfd,&rdfs);
}
else
{
ret=recvcom(i,bookdb,vipdb,adminidb);
if(ret<0)
{
FD_CLR(i,&rdfs);
close(i);
}
}
}
}
}
return 0;
}
3.4部分功能模块的源码
3.4.1建立客户端服务端的联系
#include "../include/net.h"
//服务器连接客户端的子函数
//参数1:自己的IP地址
//参数2:自己的端口号
//返回值:成功返回0,失败返回-1
int tcp_recv(const char *ip,int port)
{
//创建socket对象
int listenfd;
struct sockaddr_in myaddr;
if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("fail to socket");
return -1;
}
printf("socket ok\n");
bzero(&myaddr,sizeof(myaddr));
//设置自己的IP地址和端口号
myaddr.sin_family=AF_INET;
myaddr.sin_port=htons(port);
myaddr.sin_addr.s_addr=inet_addr(ip);
//绑定自己的IP地址和端口号
if(bind(listenfd,(struct sockaddr *)&myaddr,sizeof(myaddr))<0)
{
perror("fail to bind");
exit(-1);
}
printf("bing ok\n");
//监听是否有人请求连接
if(listen(listenfd,5)<0)
{
perror("fail to listen");
return -1;
}
printf("listen ok\n");
return listenfd;
}
//客户端与服务端连接的子函数
//参数1:对方的IP地址
//参数2:对方的端口号
int tcp_send(const char *ip,int port)
{
//创建socket对象
int socket_fd;
if((socket_fd=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("create socket error");
return -1;
}
//设置对方的IP地址和端口号
struct sockaddr_in server;
memset(&server,0,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(port);
server.sin_addr.s_addr=inet_addr(ip);
//请求连接
if(connect(socket_fd,(struct sockaddr *)&server,sizeof(server))<0)
{
perror("connect error");
return -1;
}
printf("连接成功\n");
return socket_fd;
}
3.4.2创建数据库的源码
//创建存储管理员信息的数据库和表
sqlite3 * adsqlite(void)
{
//创建数据库
sqlite3 *db;
char *zErrMsg=0;
int rc;
rc=sqlite3_open("admini.db",&db);
if(rc)
{
return NULL;
}
printf("admini.db open success\n");
//创建表
char sql[100]={0};
sprintf(sql,"create table admini(number text primary key not null,code text not null)");
printf("%s\n",sql);
rc=sqlite3_exec(db,sql,NULL,NULL,NULL);
if(rc==SQLITE_OK)
{
printf("table create ok\n");
}
return db;
}
//创建存储会员信息的数据库和表
sqlite3 * vipsqlite(void)
{
//创建数据库
sqlite3 *db;
char *zErrMsg=0;
int rc;
rc=sqlite3_open("vip.db",&db);
if(rc)
{
return NULL;
}
printf("vip.db open success\n");
//创建表
char sql[100]={0};
sprintf(sql,"create table vip (username text primary key not null,vipcode text not null)");
printf("%s\n",sql);
rc=sqlite3_exec(db,sql,NULL,NULL,&zErrMsg);
if(rc==SQLITE_OK)
{
printf("table create ok\n");
}
else if(rc!=SQLITE_OK)
{
printf("%s",zErrMsg);
}
return db;
}
//创建存储书籍信息的数据库和表
sqlite3 * bksqlite(void)
{
//创建数据库
sqlite3 *db;
char *zErrMsg=0;
int rc;
rc=sqlite3_open("book.db",&db);
if(rc)
{
return NULL;
}
printf("book.db open success\n");
//创建表
char sql[500]={0};
sprintf(sql,"create table book(name text primary key not null,author text not null,serial int not null,release text not null,press text not null,count int not null,status text not null,price real not null)");
printf("%s\n",sql);
rc=sqlite3_exec(db,sql,NULL,NULL,NULL);
if(rc==SQLITE_OK)
{
printf("table create ok\n");
}
return db;
}
3.4.3服务端对所有命令处理的源码
//服务器对所有命令的处理
int recvcom(int connfd,sqlite3 *bookdb,sqlite3 *vipdb,sqlite3 *adminidb)
{
char buf[200]={0};
int ret;
recv(connfd,buf,D,0);
printf("%s\n",buf);
Vip vtemp;
Admini atemp;
if(!strcmp(buf,"guanliyuandenglu"))
{
recv(connfd,&atemp,sizeof(Admini),0);
ret=findAd(adminidb,atemp,connfd);
}
if(!strcmp(buf,"huiyuandenglu"))
{
recv(connfd,&vtemp,sizeof(Vip),0);
ret=findVip(vipdb,vtemp,connfd);
}
if(!strcmp(buf,"huiyuanzhuce"))
{
recv(connfd,&vtemp,sizeof(Vip),0);
insert1_2(connfd,vipdb,vtemp);
}
//管理员添加书籍信息
if(!strcmp(buf,"insert"))
{
insert1(connfd,bookdb);
}
//管理员查询所有书籍
if(!strcmp(buf,"select1"))
{
select11(connfd,bookdb);
}
//管理员查询某种书籍
if(!strcmp(buf,"select"))
{
select1(connfd,bookdb);
}
//管理员删除图书信息
if(!strcmp(buf,"delete"))
{
delete1(connfd,bookdb);
}
//管理员修改书籍编号
if(!strcmp(buf,"updatese"))
{
update1(connfd,bookdb);
}
//管理员修改书籍数量
if(!strcmp(buf,"updatec"))
{
update1(connfd,bookdb);
}
//管理员修改书籍价格
if(!strcmp(buf,"updatep"))
{
update1(connfd,bookdb);
}
//管理员修改书籍状态
if(!strcmp(buf,"updatest"))
{
update1(connfd,bookdb);
}
//会员查询
if(!strcmp(buf,"selectv"))
{
select1(connfd,bookdb);
}
//会员购买书籍
if(!strcmp(buf,"buycomv"))
{
buycom1(connfd,bookdb);
}
//会员修改信息
if(!strcmp(buf,"updatev"))
{
update_1(connfd,vipdb);
}
//会员修改密码
if(!strcmp(buf,"updatem"))
{
update_1(connfd,vipdb);
}
//会员注销
if(!strcmp(buf,"deletem"))
{
update_1(connfd,vipdb);
}