基于sqlite3数据库简易“仓库管理系统”

1、sqlite3数据库概要

        SQLite3是一个轻量级、跨平台的关系型数据库。SQLite的很小,它的数据库就是一个文件,但是它并不缺乏功能。不需要复杂的安装或管理。SQLite事务是完全兼容ACID的,允许从多个进程或线程安全访问。因此sqlit3十分适合进行嵌入式开发。

官网SQLite Home Page

2、开发环境

         运行环境:Ubuntu + linux操作系统

3、基本功能

  1、查看仓库信息:
               显示仓库所有的货物的信息[例如 货物的编号  货物的名字 货物的价格 货物的剩余量 等]
  2、入库功能:
               增加现有货物的库存量(货物编号,增加数量)
  3、 出库功能:
               减少现有货物的库存量(货物编号,减少数量)
  4、维护功能[管理功能]:
               维护货物信息[例如 增加新货物种类 修改货物的名字 等]
  5、离开
    
 额外功能:
   A 进入系统需要输入密码 [区分普通用户 和 管理员]
   B 记录所有出库 和 入库 的信息 [包含 出库货物编号 、 时间、和操作员信息 等]
   C 管理员可以有高级选项,比如新增用户,禁止用户,查询货物的进出库历史记录

4、代码段

新手操作可能有点代码冗余,请见谅,用于学习记录

sqlite.c

#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
#include <stdlib.h>
#include <unistd.h>

sqlite3 *pdb = NULL;//数据库引擎
char *errmsg = NULL;//错误提示
char *tmp[2];		//保存一次查询的结果
int select_flag = 1;
int back_ret = 0;
struct db_goods
{
	int gid;
	int g_num;
}db_user;

/*
	函数名:callback
	函数功能:sqlite3_exex()的回调函数,用于获取select查询结果,他说逐行查询的
	参数:
		void* arg:调用时向回调函数传递的参数
		column_num:该条结果有多少列
		char* column_value[]:每一列的值
		char* column_name[]:每一列的列名、
	返回值:
		返回0表示继续查询打印
*/
int callback(void* arg,int column_num,char *column_value[],char* column_name[])
{
	int *id = NULL;
	if(arg != NULL)
	{
		 id = arg;
	}
	if(select_flag == 1)
	{
		select_flag = 0;
		for(int i = 0;i < column_num;i++)
		{
			printf("%-10s",column_name[i]);
		}
		putchar('\n');
	}
	for(int i = 0;i<column_num; i++)
	{
		printf("%-10s",column_value[i]);
		/*单独只查找id的情况*/
 		if(column_num == 1)
	 	{	//printf("tmp = %s,%d\n",tmp,atoi(tmp));
	 		if(arg != NULL)
	 		{
	 			strcpy(tmp[i],column_value[i]);
	 			char buf[20];
	 			sprintf(buf,"%d",*id);
	 			if(strcmp(tmp[0],buf) == 0)
	 			{
	 				back_ret = 999;
	 				return back_ret;
	 			}
	 		}
	 	}
	 	else/*通过id查找数量的情况*/
	 	{
			if(arg != NULL)
	 		{
	 			strcpy(tmp[i],column_value[i]);
	 			char buf[20];
	 			sprintf(buf,"%d",*id);
	 			if(i != 0 &&strcmp(tmp[0],buf) == 0)
	 			{
	 				back_ret = 999;
	 				return back_ret;
	 			}
	 		}
	 	}
 	}
 	putchar('\n');
 	return 0;//表示继续查询打印
 }

 /*检查密码是否正确*/
 int callback2(void* arg,int column_num,char *column_value[],char* column_name[])
 {
 	char *pw = arg;
 	if(select_flag == 1)
 	{
 		select_flag = 0;
 		for(int i = 0;i < column_num;i++)
 		{
			printf("%-10s",column_name[i]);
		}
		putchar('\n');
	}
	for(int i = 0;i<column_num; i++)
	{
		printf("%-10s",column_value[i]);
		strcpy(tmp[i],column_value[i]);
		if(strcmp(tmp[0],pw) == 0)
		{
			back_ret = 999;
			return back_ret;
		}
	}
	putchar('\n');
	return 0;//表示继续查询打印
}

/*链接数据库*/
int sqlite_init()
{
	int r = sqlite3_open("warehouse.db",&pdb);
	if(r != SQLITE_OK)
	{
		printf("sqlite3 open failed\n");
		return -1;
	}
	printf("sqlite 连接成功\n");
	for(int i= 0;i < 2;i++)
		tmp[i] = (char *)malloc(sizeof(32));
	
	return 0;
}

/*断开数据库链接*/
void sqlite_uninit()
{
	for(int i= 0;i < 2;i++)
		free(tmp[i]);
	sqlite3_close(pdb);
}

/*查找gid是否存在*/
int select_gid(int gid)
{
	char buf[100];
	memset(buf,0,sizeof(buf));
	select_flag = 1;		//打开打印首行的标志位
	back_ret = 0;
	sprintf(buf,"select gid from db_goods where gid=%d;",gid);
	int r = sqlite3_exec(pdb,buf,callback,&gid,&errmsg);
	if(back_ret == 999)//说明存在该商品
	{
		return 0;
	}
	else
	{
		return -1;
	}
}

//查找货物标号为gid的货物的数量
int select_one_goods(int gid)
{
	char buf[100];
	memset(buf,0,sizeof(buf));
	select_flag = 1;		//打开打印首行的标志位
	back_ret = 0;
	sprintf(buf,"select gid,g_num from db_goods where gid=%d;",gid);
	int r = sqlite3_exec(pdb,buf,callback,&gid,&errmsg);
	if(back_ret == 999)
	{
		int num = atoi(tmp[1]);
		return num;
	}
	else
	{
		printf("select_one_goods sqlite3 select failed\n");
		return -1;
	}
	
}

//增加货物数量
int increase_goods(int gid,int num)
{
	char buf[100];
	int r = 0;	//接收返回值
	int old_num = select_gid(gid);
	if(old_num == -1)	//没有这个货物则创建
	{
		printf("请补充货物名:");
		char name[50];
		scanf("%s",name);
		printf("请补充货物单价:");
		int price=0;
		scanf("%d",&price);
		sprintf(buf,"insert into db_goods values(%d,'%s',%d,%d);",gid,name,price,num);
		r = sqlite3_exec(pdb,buf,NULL,NULL,&errmsg);
		if(r != 0)
		{
			printf("increase_goods sqlite3 insert failed\n");
			return -1;
		}
		printf("感谢您添加成功\n");
		sleep(2);
		return 0;
	}
	old_num = select_one_goods(gid);
	int new_num = num + old_num;
	
	/*修改数据库的货物数量*/
	memset(buf,0,sizeof(buf));
	sprintf(buf,"update db_goods set g_num=%d where gid=%d;",new_num,gid);
	r = sqlite3_exec(pdb,buf,NULL,NULL,&errmsg);
	if(r != 0)
	{
		printf("increase_goods sqlite3 update failed\n");
		return -1;
	}
	printf("感谢您添加成功\n");
	return 0;
}

//减少货物数量
int decrease_goods(int gid,int num)
{
	char buf[100];
	int old_num = select_gid(gid);//查看该商品是否存在
	if(old_num == -1)
	{
		printf("商品不存在\n");
		return -1;
	}
	old_num = select_one_goods(gid);
	int new_num = old_num - num;
	/*存货不足时*/
	if(new_num < 0)
	{
		printf("十分抱歉存货不足,先给您%d件,缺少%d件\n",old_num,-new_num);
		new_num = 0;
	}

	/*修改数据库的货物数量*/
	memset(buf,0,sizeof(buf));
	sprintf(buf,"update db_goods set g_num=%d where gid=%d;",new_num,gid);
	int r = sqlite3_exec(pdb,buf,NULL,NULL,&errmsg);
	if(r != 0)
	{
		printf("decrease_goods sqlite3 update failed\n");
		return -1;
	}
	return 0;
}

//显示仓库所以货物及相关信息
void show_warehouse()
{
	char buf[100];
	memset(buf,0,100);
	select_flag = 1;		//打开打印首行的标志位
	sprintf(buf,"select * from db_goods;");
	int r = sqlite3_exec(pdb,buf,callback,NULL,&errmsg);
	if(r != 0)
	{
		printf("show_warehouse sqlite3 show failed\n");
	}
}


/*--------------------------用户表操作-----------------------------------*/

/*注册一个用户*/
int enroll_user()
{
	int id;
	char pw[100];
	char name[100];
	printf("请输入您要注册的id号:");
	scanf("%d",&id);
	printf("请输入您密码:");
	scanf("%s",pw);
	printf("请输入您的名称:");
	scanf("%s",name);
	printf("请稍等\n");
	char buf[100];
	memset(buf,0,100);
	select_flag = 1;		//打开打印首行的标志位
	back_ret = 0;
	sprintf(buf,"select id from db_user where id=%d;",id);
	int r = sqlite3_exec(pdb,buf,callback,&id,&errmsg);
	/*找不到id相同的则注册*/
	if(back_ret != 999)
	{
		memset(buf,0,100);
		sprintf(buf,"insert into db_user values(%d,'%s','%s');",id,pw,name);
		r = sqlite3_exec(pdb,buf,NULL,NULL,&errmsg);
		if(r != 0)
		{
			printf("enroll_user sqlite3 insert failed\n");
			return -1;
		}
		else
		{
			printf("注册成功\n");
			sleep(1);
		}
	}
	else 
	{
		printf("id已注册\n");
		return -1;
	}
	return 0;
}

/*普通用户登录*/
int login_goods(int id,char *pw)
{
	char buf[100];
	memset(buf,0,100);
	select_flag = 1;		//打开打印首行的标志位
	back_ret = 0;
	sprintf(buf,"select id from db_user where id=%d;",id);
	int r = sqlite3_exec(pdb,buf,callback,&id,&errmsg);

	/*表示数据库中有该账户*/
	if(back_ret == 999)
	{
		printf("账号正确...\n");
		memset(buf,0,100);
		select_flag = 1;		//打开打印首行的标志位
		back_ret = 0;
		sprintf(buf,"select pw from db_user where pw=%s AND id=%d;",pw,id);
		int r = sqlite3_exec(pdb,buf,callback2,pw,&errmsg);
		if(back_ret == 999)
		{
			printf("密码正确...\n");
			return 0;
		}
		else
		{
			printf("密码错误...\n");
			return -1;
		}
	}
	else
	{
		printf("查无此id...\n");
		return -1;
	}
}


/*注销id账号*/
void logout_id(int id)
{
	char buf[100];
	memset(buf,0,100);
	select_flag = 1;		//打开打印首行的标志位
	back_ret = 0;
	sprintf(buf,"select id from db_user where id=%d;",id);
	int r = sqlite3_exec(pdb,buf,callback,&id,&errmsg);
	if(back_ret == 999)
	{
		memset(buf,0,100);
		select_flag = 1;		//打开打印首行的标志位
		back_ret = 0;
		sprintf(buf,"delete from db_user where id=%d;",id);
		r = sqlite3_exec(pdb,buf,NULL,NULL,&errmsg);
		if(r == 0)
		{
			printf("注销成功\n");
		}
		else
		{
			printf("注销成功\n");
		}
	}
	else
	{
		printf("账号不存在\n");
	}
}

















 client.c

#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
#include"sqlite.h"
#include<stdlib.h>

int sel;




/*登录后客户端初始化界面*/
void client_init()
{
	
	while(1)
	{
		system("clear");
		printf("+---------------------------------------+\n");
	    printf("|                登录成功               |\n");
	    printf("|1.查看仓库货物信息                		|\n");//已完成
	    printf("|2.购买货物                          	|\n");//已完成
	    printf("|3.售卖货物				    			|\n");//已完成
	    printf("|4.退出							        |\n");//已完成
	    printf("+---------------------------------------+\n");//已完成
	    scanf("%d",&sel);
		switch (sel)
		{
			case 1:	{ 	//显示当前仓库的货物信息
						show_warehouse();
						printf("按0重新返回登录界面,按其他任意键退出系统\n");
						scanf("%d",&sel);
						if(sel != 0)
							return;
					}
					break;
			case 2:	
					{
						int gid;
						int num;
						show_warehouse();
						printf("请输入您要购买的货物的ID号:");
						scanf("%d",&gid);
						printf("请输入您要购买的货物数量:");
						scanf("%d",&num);
						decrease_goods(gid,num);
					}
					break;
			case 3:	
					{
						int gid;
						int num;
						printf("请输入您要售卖的货物的ID号:");
						scanf("%d",&gid);
						printf("请输入您要售卖的货物数量:");
						scanf("%d",&num);
						increase_goods(gid,num);
					}
					;break;
			case 4:	return;
		}
	}
}


void client_join()
{
	int id;
	char pw[20];
	
	while(1)
	{
		printf("请输入您的账户id:");
		scanf("%d",&id);
		printf("请输入您的账户密码:");
		scanf("%s",pw);
		int r = login_goods(id,pw);
		if(r == -1)
		{
			printf("按0重新返回登录界面,按其他任意键退出系统\n");
			scanf("%d",&sel);
			if(sel != 0)
				return;
		}
		else
		{
			client_init();
			break;
		}
		
	}
}



  super_user_join.c

#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
#include"sqlite.h"
#include<stdlib.h>


int sel;


void souper_user_init()
{
	while(1)
	{
		system("clear");
		printf("+---------------------------------------+\n");
	    printf("|                登录成功               |\n");
	    printf("|1.查看仓库货物信息                		|\n");//已完成
	    printf("|2.删除货物                          	|\n");//已完成
	    printf("|3.增加货物				    			|\n");//已完成
	    printf("|4.退出							        |\n");//已完成
	    printf("+---------------------------------------+\n");//已完成
	    scanf("%d",&sel);
	    switch (sel)
		{
			case 1:	{ 	//显示当前仓库的货物信息
						show_warehouse();
						printf("按0重新返回登录界面,按其他任意键退出系统\n");
						scanf("%d",&sel);
						if(sel != 0)
							return;
					}
					break;
			case 2:	
					{
						int gid;
						int num;
						show_warehouse();
						printf("请输入您要减少的货物的ID号:");
						scanf("%d",&gid);
						printf("请输入您要购买的货物数量:");
						scanf("%d",&num);
						decrease_goods(gid,num);
					}
					break;
			case 3:	
					{
						int gid;
						int num;
						printf("请输入您要增加的货物的ID号:");
						scanf("%d",&gid);
						printf("请输入您要售卖的货物数量:");
						scanf("%d",&num);
						increase_goods(gid,num);
					}
					;break;
			case 4:	return;
		}
	}

}




void souper_user_join()
{
	int id;
	char pw[20];
	
	while(1)
	{
		printf("请输入您的账户id:");
		scanf("%d",&id);
		printf("请输入您的账户密码:");
		scanf("%s",pw);
		if(id != 12138)
		{
			printf("账号id输入错误\n");
			printf("<------------------->\n\n");
			printf("按0重新返回登录界面,按其他任意键退出系统\n");
			scanf("%d",&sel);
			if(sel != 0)
				return;
			else
			{
				continue;
			}
		}
		if(strcmp(pw,"admin") != 0)
		{
			printf("账号密码输入错误\n");
			printf("<------------------->\n\n");
			printf("按0重新返回登录界面,按其他任意键退出系统\n");
			scanf("%d",&sel);
			if(sel != 0)
				return;
			else
			{
				continue;
			}
		}
		souper_user_init();
	}

}



main.c

#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
#include<stdlib.h>
#include"sqlite.h"
#include"client.h"
#include"souper_user_join.h"

int sel;
void Choose()
{
	
	while(1)
	{
		system("clear");
		printf("+---------------------------------------+\n");
	    printf("|\t  欢迎来到仓库管理系统\t\t|\n");
	    printf("|\t1.登陆账号\t\t\t|\n");//已完成
	    printf("|\t2.注册账号\t\t\t|\n");//已完成
	    printf("|\t3.注销账号信息\t\t\t|\n");//已完成
	    printf("|\t4.管理员登陆\t\t\t|\n");//已完成
	    printf("|\t5.退出登陆\t\t\t|\n");//已完成
	    printf("+---------------------------------------+\n");//已完成
	    scanf("%d",&sel);
		switch(sel)
		{
			case 1:	{
						client_join();
					};
					break;
			case 2:	{
						int r = enroll_user();
						if(r == -1)
						{
							printf("按0重新返回登录界面,按其他任意键退出系统\n");
							scanf("%d",&sel);
							if(sel != 0)
								return;
						}
					}
					break;
			case 3:	{
						printf("请输入注销的id\n");
						scanf("%d",&sel);
						logout_id(sel);
						printf("按0重新返回登录界面,按其他任意键退出系统\n");
							scanf("%d",&sel);
							if(sel != 0)
								return;
					}break;
			case 4:	souper_user_join();break;
			case 5:	{
						printf("欢迎下次登录\n");
						return;
					}
		}
	}
}


int main()
{
	sqlite_init();
	Choose();
	

	sqlite_uninit();
}



  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值