以前拿php写与数据库相关的东西,这次用c写,还是感觉很神奇的。
老实说,真不知道原来c还可以这么弄,只要把需要的头文件包括进来,瞬间天地就开阔了。
当然,语言的限制,用C写还是比用php麻烦很多啦,
需要先mysql_query(&mysql_conn,sql)一下
然后用mysql_store_result(&mysql_conn)获取res资源指针,相对php多了一步,可是就是这一步真是让我开了眼界。
这种思路真的很exciting。不过不得不承认,有点小麻烦。
不过最麻烦的还是sql的拼接。在php里sql考虑的更多的是注意单双引号的问题,而且我想像js,php这些语言之所以引入单双引号,或许就是为了方便sql、html等的嵌入编写。
c可是够麻烦的,不能用+或者.拼接。每次都要strcat,一个sql好多好多strcat - -。
还有一个比较麻烦的就是输入流中的回车问题。实在有点不太懂啊,经常就是上一个字符串的输入完成后按的回车被后一个待输入的str给接收了,然后就是各种问题啊。恰恰这次又不停的循环清屏,每次都不知道结果是啥就一闪而过。后来上网查了下,用setbuf(stdin,NULL)清空输入流,这个大招一用,效果太好了。不过,还是很困惑到底在什么情况下需要使用这个。时间比较紧,没有很详细的思考啊,于是就使劲的setbuf NULL;
还学到了字符串和数字之间的转换函数。当然,这些在php里是不会出现的,不过在严格的c里,的确是把我吓到了,好久没经历过需要手动转换的了。
两类函数
字符串到数字,int atoi(str), float atof(str),a就是ascii码吧,i,f就是int,float,还是挺好记得;
数字到字符串,itoa(int,str,10)之类的,最后一个10表示基数10 来转,上下两个函数不对称,嗯,容易搞混啊。
还有学到的就是按位取反~符号,这些平时基本不会遇到的。开始我问炯哥哥,他告诉我说是通过与二进制的’11111111‘来异或实现,我反应大半天稍微有点懂;然后他说’11111111‘不知道对应ascii多少,就用’00000001‘这个二进制对应的字符,通过8次循环移位,每次移位后与字符异或,由于与1以后为相反,与0异或为本身,所以就能实现按位取非了。啊,当时我就晕了 - -。差距啊,虽说这么是麻烦,可是从中透露的东西,可见一斑啊。计组得好好学啊。
大概就是这样,感觉还是学到好多东西。有好久没写代码了,手太残啊,一直打不好字。
下午的时候有点困,边写歌边写代码,那些熟悉的歌和着敲键盘的节奏,我快要疯了,恨不得把音量开到最大!!
好久没有这么痛快!
贴上代码。
main.c
#ifndef __LCC__
#define __LCC__
#endif
#include "shoppingcart.h"
int main(int argc, char **argv)
{
MYSQL mysql_conn ;
if(mysql_init(&mysql_conn) == NULL)
{
printf("Initialization fails. \n") ;
return -1 ;
}
if(mysql_real_connect(&mysql_conn,"localhost","root","","shoppingCartApp",MYSQL_PORT,NULL,0) == NULL)
{
printf("Connect databases faild.\n") ;
return -1 ;
}
//开始输出首页
while(!system("CLS"))//该函数返回false
{
printInCenter("购物车") ;
char mainMenu[100] = "\n1.管理员登陆\n2.用户登陆或注册\n3.退出\n" ;
printLeftJustify(mainMenu) ;
char id[100] ;
char password[20] ;
int choice ;
scanf("%d",&choice) ;
switch(choice)
{
case 1:
adminMoudle(mysql_conn,id,password) ;
break ;
case 2:
userMoudle(mysql_conn,id,password) ;
break ;
case 3:
return 0 ;
default:
return 0 ;
}
}
return 0;
}
shoppingcart.h
#ifndef SHOPPINGCART_H_INCLUDED
#define SHOPPINGCART_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
#include <windows.h>
#include <time.h>
#define ADMIN 20
#define USER 30
#define true 1
#define false 0
//用户模块
void userMoudle(MYSQL mysql_conn,char * id,char * password) ;
void userManageMenu(MYSQL mysql_conn,char * id) ;
void addShoppingCart(MYSQL mysql_conn,char * id) ;
void manageShoppingCart(MYSQL mysql_conn,char * id) ;
void printForm(MYSQL mysql_conn,char * id) ;
void modifyEmail(MYSQL mysql_conn,char * id) ;
//管理员模块
void adminMoudle(MYSQL mysql_conn,char * id,char * password) ;
void Manage(MYSQL mysql_conn,char * id) ;
void itemManage(MYSQL mysql_conn) ;
void saleStatistics(MYSQL mysql_conn) ;
int itemList(MYSQL mysql_conn) ;
//打印函数
int printInCenter(char * str) ;
int printLeftJustify(char* str) ;
int printHR() ;
//其他
int login(MYSQL mysql_conn,int loginType,char * id,char * password) ;
void getDate(char * xxDate) ;
void encrypt(char * password) ;
void adminMoudle(MYSQL mysql_conn,char * id,char * password)
{
system("CLS") ;
printInCenter("管理员登陆") ;
int loginResult = login(mysql_conn,ADMIN,id,password) ;
if(loginResult == false)
{
printf("用户名或密码输入错误\n") ;
int choice ;
char options[200] = "1.重新输入\n2.退出\n" ;
printLeftJustify(options) ;
scanf("%d",&choice) ;
if(choice == 1)
{
int times = 2 ;
while(times >0&&(login(mysql_conn,ADMIN,id,password) == false))
{
printf("输入错误,还有%d次机会\n",times-1) ;
times-- ;
}
if(times == 0)
{
printf("达到错误次数\n") ;
return ;
}
}
else
{
return ;
}
}
//登陆成功
Manage(mysql_conn,id) ;
}
void userMoudle(MYSQL mysql_conn,char * id,char * password)
{
int choice ;
while(!system("CLS"))
{
printInCenter("用户登陆、注册") ;
printLeftJustify("\n1.登陆\n2.注册\n3.退出\n") ;
scanf("%d",&choice) ;
if(choice == 1)
{
int loginResult = login(mysql_conn,USER,id,password) ;
if(loginResult == false)
{
printf("用户名或密码输入错误\n") ;
int choice ;
char options[200] = "1.重新输入\n2.退出\n" ;
printLeftJustify(options) ;
scanf("%d",&choice) ;
if(choice == 1)
{
int times = 2 ;
while(times >0&&(login(mysql_conn,ADMIN,id,password) == false))
{
printf("输入错误,还有%d次机会\n",times-1) ;
times-- ;
}
if(times == 0)
{
printf("达到错误次数\n") ;
return ;
}
}
else
{
return ;
}
}
//登陆成功
userManageMenu(mysql_conn,id) ;
}
else if(choice == 2)
{
char rePass[20] ;
printf("请输入账户名(登陆邮箱):\n") ;
scanf("%s",id) ;
while(printf("请输入密码:\n"))
{
scanf("%s",password) ;
printf("请再次输入密码:\n") ;
scanf("%s",rePass) ;
if(strcmp(rePass,password) == 0)
{
break ;
}
else
{
printf("两次密码不一致,请重新输入\n") ;
}
}
encrypt(password) ; //加密
char name[20] ;
printf("请输入姓名:\n") ;
scanf("%s",name) ;
char sql_2[200] = "insert into user values('" ;
strcat(sql_2,id) ;
strcat(sql_2,"','") ;
strcat(sql_2,password) ;
strcat(sql_2,"','") ;
strcat(sql_2,name) ;
strcat(sql_2,"')") ;
if(mysql_query(&mysql_conn,sql_2) == 0)
{
printf("注册成功\n") ;
}
else
{
printf("注册失败\n") ;
}
}
else if(choice == 3)
{
return ;
}
else
{
printf("无效的选项\n") ;
}
}
}
int login(MYSQL mysql_conn,int loginType,char * id,char * password)
{
if(loginType == ADMIN)
{
printf("请输入账户名(登陆邮箱):\n") ;
scanf("%s",id) ;
printf("请输入密码:\n") ;
scanf("%s",password) ;
char sql_1[200] = "select * from admin where id = '" ;
strcat(sql_1,id) ;
strcat(sql_1,"' and password='") ;
strcat(sql_1,password) ;
strcat(sql_1,"'") ;
MYSQL_RES * res ;
if(mysql_query(&mysql_conn,sql_1) != 0)
{
printf(mysql_error(&mysql_conn)) ;
return -1 ;
}
res = mysql_store_result(&mysql_conn) ;
int row_num = mysql_num_rows(res) ;
if(row_num == 0)
return false ;
else
return true ;
}
else
{
printf("请输入账户名(登陆邮箱):\n") ;
scanf("%s",id) ;
printf("请输入密码:\n") ;
scanf("%s",password) ;
encrypt(password) ;
char sql_1[200] = "select * from user where id = '" ;
strcat(sql_1,id) ;
strcat(sql_1,"' and password='") ;
strcat(sql_1,password) ;
strcat(sql_1,"'") ;
MYSQL_RES * res ;
if(mysql_query(&mysql_conn,sql_1) != 0)
{
printf(mysql_error(&mysql_conn)) ;
return -1 ;
}
res = mysql_store_result(&mysql_conn) ;
int row_num = mysql_num_rows(res) ;
if(row_num == 0)
return false ;
else
return true ;
}
}
void Manage(MYSQL mysql_conn,char * id)
{
char sql_1[200] = "select name from user where id='" ;
strcat(sql_1,id) ;
strcat(sql_1,"'") ;
MYSQL_RES * res ;
if(mysql_query(&mysql_conn,sql_1) != 0)
{
printf(mysql_error(&mysql_conn)) ;
return ;
}
res = mysql_store_result(&mysql_conn) ;
int row_num = mysql_num_rows(res) ;
if(row_num == 0)
{
printf("无效的用户名\n") ;
return ;
}
MYSQL_ROW name_row = mysql_fetch_row(res) ;
char name[20] ;
strcpy(name,name_row[0]) ;
while(!system("CLS") )
{
printInCenter("管理选项");
printf("欢迎您,%s\n",name) ;
printLeftJustify("您可以\n1.管理商品\n2.销售统计\n3.退出管理\n") ;
int choice ;
scanf("%d",&choice) ;
switch(choice)
{
case 1 :
itemManage(mysql_conn) ;
break ;
case 2 :
saleStatistics(mysql_conn) ;
break ;
case 3:
return ;
default :
printf("无效的选项\n") ;
}
}
}
int itemList(MYSQL mysql_conn)
{
char sql[200] = "SELECT * FROM item ORDER BY number asc" ;
if(mysql_query(&mysql_conn,sql) != 0)
{
printf(mysql_error(&mysql_conn)) ;
return false;
}
MYSQL_RES * res ;
res = mysql_store_result(&mysql_conn) ;
int row_num = mysql_num_rows(res) ;
if(row_num == 0)
{
printf("暂无商品\n") ;
return true;
}
MYSQL_ROW row ;
printHR() ;
printf("商品编号\t商品名称\t类别\t描述\t\t价格\t库存量 \n") ;
printHR() ;
int i ;
for( i = 0 ; i < row_num ; i++)
{
row = mysql_fetch_row(res) ;
printf("%-8s\t%-8s\t%-4s\t%-12.12s\t%-4s\t%-6s\n",row[0],row[1],row[2],row[3],row[4],row[5]) ;
}
printHR() ;
return true ;
}
void itemManage(MYSQL mysql_conn)
{
system("CLS") ;
while(printInCenter("商品管理")&&itemList(mysql_conn) == true)
{
printLeftJustify("1.添加商品信息\n2.修改商品价格和库存\n3.删除商品\n4.退出商品管理\n") ;
int choice ;
scanf("%d",&choice) ;
if(choice == 1)
{
printf("\n请依次输入商品的名称,类别,描述,价格,以及库存量(以回车分隔)\n") ;
char name[20],category[20],description[400],price[10],stock[10];
getchar() ;//捕捉来自choice输入后输入流中的回车
gets(name) ;
gets(category) ;
gets(description) ;
gets(price) ;
gets(stock) ;
char sql_1[500] = "insert into item(name,category,description,price,stock)values('" ;
strcat(sql_1,name) ;
strcat(sql_1,"','") ;
strcat(sql_1,category) ;
strcat(sql_1,"','") ;
strcat(sql_1,description) ;
strcat(sql_1,"',") ;
strcat(sql_1,price) ;
strcat(sql_1,",") ;
strcat(sql_1,stock) ;
strcat(sql_1,")") ;
if(mysql_query(&mysql_conn,sql_1) != 0)
{
printf(sql_1) ;
printf(mysql_error(&mysql_conn)) ;
return ;
}
printf("\n商品添加成功\n") ;
}
else if(choice == 2)
{
getchar() ;
printf("\n请输入要修改的商品编号\n") ;
char itemId[10] ;
gets(itemId) ;
char price[10] ;
char stock[10] ;
char sql_3[100] = "update item set " ;
printf("\n请输入该商品新的价格(回车表示不变):\n") ;
gets(price) ;
if(strcmp(price,"") != 0)
{
strcat(sql_3,"price=") ;
strcat(sql_3,price) ;
strcat(sql_3,",") ;
}
printf("\n请输入该商品目前库存量:\n") ;
gets(stock) ;
strcat(sql_3,"stock=") ;
strcat(sql_3,stock) ;
strcat(sql_3," where number=") ;
strcat(sql_3,itemId) ;
if(mysql_query(&mysql_conn,sql_3) != 0)
{
printf(sql_3) ;
printf(mysql_error(&mysql_conn)) ;
return ;
}
int affected_rows = mysql_affected_rows(&mysql_conn) ;
if(affected_rows == 0)
{
printf("\n无效的商品编号,修改失败\n") ;
}
else
{
printf("\n修改信息成功\n") ;
}
}
else if(choice == 3)
{
getchar() ;
printf("\n请输入要删除的商品编号\n") ;
char itemId[10] ;
gets(itemId) ;
char sql_2[100] = "delete from item where number = " ;
strcat(sql_2,itemId) ;
if(mysql_query(&mysql_conn,sql_2) != 0)
{
printf(mysql_error(&mysql_conn)) ;
return ;
}
int affected_rows = mysql_affected_rows(&mysql_conn) ;
if(affected_rows == 0)
{
printf("\n无效的商品编号,删除失败\n") ;
}
else
{
printf("\n删除成功\n") ;
}
}
else if(choice == 4)
{
return ;
}
else
{
printf("无效的选项\n") ;
}
}
}
void saleStatistics(MYSQL mysql_conn)
{
while(!system("CLS"))
{
printInCenter("销售统计") ;
printLeftJustify("\n1.统计每种商品在一个时间段内的销售情况\n2.统计每类商品在一个时间段内的销售情况\n3.查看某件商品的详细销售情况\n4.退出销售统计\0" ) ;
setbuf(stdin,NULL) ;
char choice ;
setbuf(stdin,NULL) ;
scanf("%c",&choice) ;
MYSQL_RES * res ;
int row_num ;
MYSQL_ROW row ;
switch(choice)
{
case '1' :
{
char startDate[9] ,endDate[9] ;
printf("请输入起始日期(格式示例如:20130808)\n") ;
scanf("%s",startDate) ;
printf("请输入结束日期(格式示例如:20130909)\n") ;
scanf("%s",endDate) ;
setbuf(stdin,NULL) ;
system("CLS") ;
char sql_name[300] = "select number,name,ordertime,sum(orderquantity),sum(orderquantity*orderprice) from item,orderform where number = itemnumber and ordertime between '" ;
strcat(sql_name,startDate) ;
strcat(sql_name,"' and '") ;
strcat(sql_name,endDate) ;
strcat(sql_name,"' group by number") ;
if(mysql_query(&mysql_conn,sql_name) != 0)
{
printf(sql_name) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
res = mysql_store_result(&mysql_conn) ;
row_num = mysql_num_rows(res) ;
char title[40] = "每种商品在" ;
strcat(title,startDate) ;
strcat(title,"到") ;
strcat(title,endDate) ;
strcat(title,"时间段内的销售情况") ;
printInCenter(title) ;
printHR() ;
printf("商品编号\t商品名称\t订单日期\t总销量\t总金额\n") ;
printHR() ;
if(row_num == 0)
{
printf("暂无订单\n") ;
}
else
{
int i ;
for(i = 0 ; i < row_num ; i++)
{
row = mysql_fetch_row(res) ;
printf("%-8s\t%-8s\t%-8s\t%6s\t%10.2f\n",row[0],row[1],row[2],row[3],atof(row[4])) ;
}
}
printHR() ;
printf("按任意键返回\n") ;
setbuf(stdin,NULL) ;
getchar() ;
}
break ;
case '2' :
{
char startDate[9] ,endDate[9] ;
printf("请输入起始日期(格式示例如:20130808)\n") ;
scanf("%s",startDate) ;
printf("请输入结束日期(格式示例如:20130909)\n") ;
scanf("%s",endDate) ;
setbuf(stdin,NULL) ;
system("CLS") ;
char sql_name[300] = "select category,sum(orderquantity),sum(orderquantity*orderprice) from item,orderform where number = itemnumber and ordertime between '" ;
strcat(sql_name,startDate) ;
strcat(sql_name,"' and '") ;
strcat(sql_name,endDate) ;
strcat(sql_name,"' group by category") ;
if(mysql_query(&mysql_conn,sql_name) != 0)
{
printf(sql_name) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
res = mysql_store_result(&mysql_conn) ;
row_num = mysql_num_rows(res) ;
char title[40] = "每类商品在" ;
strcat(title,startDate) ;
strcat(title,"到") ;
strcat(title,endDate) ;
strcat(title,"时间段内的销售情况") ;
printInCenter(title) ;
printHR() ;
printf("商品类型\t\t总销量\t\t总金额\n") ;
printHR() ;
if(row_num == 0)
{
printf("暂无订单\n") ;
}
else
{
int i ;
for(i = 0 ; i < row_num ; i++)
{
row = mysql_fetch_row(res) ;
printf("%-8s\t\t%6s\t\t%10.2f\n",row[0],row[1],atof(row[2])) ;
}
}
printHR() ;
printf("按任意键返回\n") ;
setbuf(stdin,NULL) ;
getchar() ;
}
break ;
case '3' :
{
itemList(mysql_conn) ;
printf("请输入商品编号\n") ;
setbuf(stdin,NULL) ;
char number[10] ;
scanf("%s",number) ;
system("CLS") ;
printInCenter("商品详细销售情况") ;
printHR() ;
printf("订单编号\t订单人\t\t\t订单日期\t订单数量\t总额\n") ;
char sql[200] = "select ordernumber,userid,ordertime,orderquantity,orderquantity*orderprice from item,orderform where itemnumber = number and number = " ;
strcat(sql,number) ;
if(mysql_query(&mysql_conn,sql) != 0)
{
printf(sql) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
res = mysql_store_result(&mysql_conn) ;
row_num = mysql_num_rows(res) ;
if(row_num == 0)
{
printf("没有相关订单\n") ;
}
else
{
int i ;
for(i = 0 ; i < row_num ; i++)
{
row = mysql_fetch_row(res) ;
printf("%-8s\t%-18.18s\t%-8s\t%8s%10.2f\n",row[0],row[1],row[2],row[3],atof(row[4])) ;
}
}
printHR() ;
printf("按任意键返回\n") ;
getchar() ;
}
break ;
case '4' :
return ;
default:
printf("没有这个选项\n") ;
}
getchar() ;
}
}
void userManageMenu(MYSQL mysql_conn,char * id)
{
char sql_1[200] = "select name from user where id='" ;
strcat(sql_1,id) ;
strcat(sql_1,"'") ;
MYSQL_RES * res ;
if(mysql_query(&mysql_conn,sql_1) != 0)
{
printf(mysql_error(&mysql_conn)) ;
return ;
}
res = mysql_store_result(&mysql_conn) ;
int row_num = mysql_num_rows(res) ;
if(row_num == 0)
{
printf("无效的用户名\n") ;
return ;
}
MYSQL_ROW name_row = mysql_fetch_row(res) ;
char name[20] ;
strcpy(name,name_row[0]) ;
char title[40] ;
strcpy(title,name) ;
strcat(title," 的用户管理中心") ;
while( !system("CLS"))
{
printInCenter(title) ;
printf("\n欢迎您,%s",name) ;
printLeftJustify("您可以:\n1.查询商品、加入到购物车\n2.管理购物车(查看,修改,删除,下单)\n3.查看已完成订单\n4.添加或删除辅助邮箱\n5.修改密码\n6.退出管理中心\n") ;
int choice ;
scanf("%d",&choice) ;
if(choice == 1)
{
addShoppingCart(mysql_conn,id) ;
}
else if(choice == 2)
{
manageShoppingCart(mysql_conn,id) ;
}
else if(choice == 3)
{
printForm(mysql_conn,id) ;
}
else if(choice == 4)
{
modifyEmail(mysql_conn,id) ;
}
else if(choice == 5)
{
setbuf(stdin,NULL) ;
printf("请输入原密码\n") ;
char password[20] ;
scanf("%s",password) ;
char sql_ensure[200] = "select count(*) from user where id = '" ;
strcat(sql_ensure,id) ;
strcat(sql_ensure,"' and password = '") ;
encrypt(password) ;
strcat(sql_ensure,password) ;
strcat(sql_ensure,"'") ;
if(mysql_query(&mysql_conn,sql_ensure) != 0)
{
printf(sql_ensure) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
MYSQL_RES *res ;
MYSQL_ROW row ;
res = mysql_store_result(&mysql_conn) ;
row = mysql_fetch_row(res) ;
if(row[0] == 0)
{
printf("密码输入错误\n按任意键返回") ;
setbuf(stdin,NULL) ;
getchar() ;
}
else
{
while(printf("请输入新密码\n"))
{
scanf("%s",password) ;
printf("请再次输入\n") ;
char rePass[20] ;
scanf("%s",rePass) ;
if(strcmp(password,rePass) == 0)
{
break ;
}
else
{
printf("两次密码不一致,请重新输入\n") ;
}
}
encrypt(password) ;
char sql_modify[200] = "update user set password = '" ;
strcat(sql_modify,password) ;
strcat(sql_modify,"' where id = '") ;
strcat(sql_modify,id) ;
strcat(sql_modify,"'") ;
if(mysql_query(&mysql_conn,sql_modify) != 0)
{
printf(sql_modify) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
printf("修改成功\n按任意键返回") ;
setbuf(stdin,NULL) ;
getchar() ;
}
}
else if(choice == 6)
{
return ;
}
else
{
printf("没有这个选项啊\n") ;
Sleep(2000) ;
}
}
}
void addShoppingCart(MYSQL mysql_conn,char * id)
{
char keyWord[20] ;
printf("请输入一个关键词:") ;
scanf("%s",keyWord) ;
printf("\n搜索结果:\n") ;
printf("商品编号\t商品名称\t类别\t描述\t\t价格\t库存量\n") ;
//根据名称
char sql_2[200] = "select * from item where name like '%" ;
strcat(sql_2,keyWord) ;
strcat(sql_2,"%'") ;
if(mysql_query(&mysql_conn,sql_2) != 0)
{
printf(mysql_error(&mysql_conn)) ;
return ;
}
MYSQL_RES * res = mysql_store_result(&mysql_conn) ;
printInCenter("按名称搜索") ;
printHR() ;
int row_num = mysql_num_rows(res) ;
MYSQL_ROW row ;
if(row_num == 0)
{
printInCenter("暂无结果") ;
}
else
{
int i ;
for(i = 0 ; i < row_num ; i++)
{
row = mysql_fetch_row(res) ;
printf("%-8s\t%-8s\t%-4s\t%-12.12s\t%-4s\t%-6s\n",row[0],row[1],row[2],row[3],row[4],row[5]) ;
}
}
printHR() ;
printInCenter("按描述搜索") ;
printHR() ;
char sql_3[200] = "select * from item where description like '%" ;
strcat(sql_3,keyWord) ;
strcat(sql_3,"%'") ;
if(mysql_query(&mysql_conn,sql_3) != 0)
{
printf(mysql_error(&mysql_conn)) ;
return ;
}
res = mysql_store_result(&mysql_conn) ;
int row_num_des = mysql_num_rows(res) ;
if(row_num_des == 0)
{
printInCenter("暂无结果") ;
}
else
{
int i ;
for( i = 0 ; i < row_num_des ; i++)
{
row = mysql_fetch_row(res) ;
printf("%-8s\t%-8s\t%-4s\t%-12.12s\t%-4s\t%-6s\n",row[0],row[1],row[2],row[3],row[4],row[5]) ;
}
}
printHR() ;
if(row_num == 0 && row_num_des == 0)
{
printf("没有相关商品,按按任意键返回\n");
setbuf(stdin,NULL) ;
getchar() ;
}
else
{
char itemId[20] ;
printf("\n有想要的东西,就把商品编号输入进来吧(都不满意请输入回车)\n") ;
setbuf(stdin,NULL) ;//屏蔽回车
gets(itemId) ;
if(strcmp(itemId,"") != 0)
{
char sql_4[200] = "select * from item where number = " ;
strcat(sql_4,itemId) ;
if(mysql_query(&mysql_conn,sql_4) != 0)
{
printf(sql_4) ;
printf(mysql_error(&mysql_conn)) ;
return ;
}
res = mysql_store_result(&mysql_conn) ;
int row_num_cart = mysql_num_rows(res) ;
if(row_num_cart == 0)
{
printf("找不到商品啊\n按任意键返回") ;
getchar() ;
}
else
{
printInCenter("\n您想加入购物车的商品信息\n") ;
printHR() ;
MYSQL_ROW itemRow ;
itemRow = mysql_fetch_row(res) ;
printf("商品名称:%s\n",itemRow[1]) ;
printf("商品类别:%s\n",itemRow[2]) ;
printf("商品描述: %s\n",itemRow[3]) ;
printf("商品价格:%s\n",itemRow[4]) ;
printf("商品库存:%s\n",itemRow[5]) ;
printHR() ;
printf("请输入想要购买的数量(不超过库存量):") ;
int quantity ;
int stock = atoi(itemRow[5]) ; //把字符串转换为整数
while(scanf("%d",&quantity))
{
if(quantity<= 0 || quantity > stock)
{
printf("输入的数量不对哦,请重新输入\n") ;
}
else
{
break ;
}
}
setbuf(stdin,NULL) ;
char quantity_str[20] ;
itoa(quantity,quantity_str,10) ; //将整形转换为字符串
char sql_5[200] = "insert into shoppingcart(userid,itemnumber,purchasequantity)values('" ;
strcat(sql_5,id) ;
strcat(sql_5,"','") ;
strcat(sql_5,itemId) ;
strcat(sql_5,"',") ;
strcat(sql_5,quantity_str) ;
strcat(sql_5,")") ;
if(mysql_query(&mysql_conn,sql_5) != 0)
{
printf(sql_5) ;
printf(mysql_error(&mysql_conn)) ;
return ;
}
printf("\n加入购物车成功,可以在订单管理中下单\n按任意键返回") ;
getchar() ;
}
}
}
}
void manageShoppingCart(MYSQL mysql_conn,char * id)
{
setbuf(stdin,NULL) ;
while(!system("CLS"))
{
printInCenter("购物车管理") ;
printHR() ;
char sql[200] = "select id,name,price,purchasequantity from shoppingcart ,item where shoppingcart.itemnumber = item.number and userid = '" ;
strcat(sql,id) ;
strcat(sql,"' order by id asc") ;
if(mysql_query(&mysql_conn,sql) != 0)
{
printf(sql) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
MYSQL_RES * res ;
res = mysql_store_result(&mysql_conn) ;
int row_num = mysql_num_rows(res) ;
if(row_num == 0)
{
printInCenter("购物车内还没有东西\n") ;
}
else
{
printf("编号\t商品名称\t商品价格\t购买数量\n") ;
int i ;
MYSQL_ROW row ;
for(i = 0 ; i < row_num ; i++)
{
row = mysql_fetch_row(res) ;
printf("%-4s\t%-8s\t%-8s\t%-8s\n",row[0],row[1],row[2],row[3]) ;
}
}
printHR() ;
if(row_num == 0)
{
printf("暂无商品,添加了商品再来哦\n按任意键返回\n") ;
getchar() ;
return ;
}
printLeftJustify("\n1.下单购买\n2.修改商品数量\n3.从购物车中删除商品\n4.退出购物车管理\n") ;
char choice ;
choice = getchar() ;
setbuf(stdin,NULL) ;
switch(choice)
{
case '1':
{
printf("请输入要购买的商品编号:\n") ;
char formId[10] ;
gets(formId) ;
setbuf(stdin,NULL) ;
char sql_1[200] = "select * from shoppingcart,item where itemnumber = number and id = " ;
strcat(sql_1,formId) ;
if(mysql_query(&mysql_conn,sql_1) != 0)
{
printf(sql_1) ;
printf(mysql_error(&mysql_conn)) ;
return ;
}
res = mysql_store_result(&mysql_conn) ;
row_num = mysql_num_rows(res) ;
MYSQL_ROW itemRow ;
itemRow = mysql_fetch_row(res) ;
if(row_num == 0)
{
printf("没有这个编号哦\n按任意键返回") ;
getchar() ;
break ;
}
if((atoi(itemRow[9]) - atoi(itemRow[3])) < 0 )
{
printf("商品的库存不够了,不能下单\n按任意键返回\n") ;
getchar() ;
break ;
}
printInCenter("\n要下单的商品信息\n") ;
printHR() ;
printf("商品名称:%s\n",itemRow[5]) ;
printf("商品类别:%s\n",itemRow[6]) ;
printf("商品描述: %s\n",itemRow[7]) ;
printf("商品价格:%s\n",itemRow[8]) ;
printf("购买数量:%s\n",itemRow[3]) ;
float singlePrice = atof(itemRow[8]) ;
int quantity = atoi(itemRow[3]) ;
float price = singlePrice * quantity ;
printHR() ;
printf("需要的总金额为:%.2f\n",price) ;
printHR() ;
printf("确认下单?(y/n)") ;
char option ;
option = getchar() ;
if(option == 'y' || option == 'Y')
{
setbuf(stdin,NULL) ;
char xxDate[9] ;
getDate(xxDate) ;
//向订单表中插入数据
char sql_form[200] = "insert into orderform(userid,itemnumber,ordertime,orderquantity,orderprice)values('" ;
strcat(sql_form,id) ;
strcat(sql_form,"',") ;
char itemNumber[20] ;
strcpy(itemNumber,itemRow[2]) ;
strcat(sql_form,itemNumber) ;
strcat(sql_form,",'") ;
strcat(sql_form,xxDate) ;
strcat(sql_form,"',") ;
strcat(sql_form,itemRow[3]) ;
strcat(sql_form,",") ;
strcat(sql_form,itemRow[8]) ;
strcat(sql_form,")") ;
if(mysql_query(&mysql_conn,sql_form) != 0)
{
printf(sql_form) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
//更新item表中库存
char sql_stock[200] = "update item set stock = stock - " ;
strcat(sql_stock,itemRow[3]) ;
strcat(sql_stock," where number = ") ;
strcat(sql_stock,itemNumber) ;
if(mysql_query(&mysql_conn,sql_stock) != 0)
{
printf(sql_stock) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
//删除购物车数据
char sql_cart[200] = "delete from shoppingcart where id = " ;
strcat(sql_cart,formId) ;
if(mysql_query(&mysql_conn,sql_cart) != 0)
{
printf(sql_cart) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
printf("购买成功\n按任意键返回") ;
getchar() ;
}
else
{
printf("没有下单购买\n按任意键返回\n") ;
getchar() ;
break ;
}
}
break ;
case '2':
{
printf("请输入要修改商品的编号:\n") ;
char formId[10] ;
gets(formId) ;
setbuf(stdin,NULL) ;
//获取库存量
char sql_getS[100] = "SELECT stock,purchasequantity FROM item,shoppingcart where itemnumber = number and id = " ;
strcat(sql_getS,formId) ;
if(mysql_query(&mysql_conn,sql_getS) != 0)
{
printf(sql_getS) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
MYSQL_RES * res ;
res = mysql_store_result(&mysql_conn) ;
//判断编号是否正确
if(mysql_num_rows(res) == 0)
{
printf("没有这个编号\n按任意键返回\n") ;
getchar() ;
}
else
{
MYSQL_ROW row = mysql_fetch_row(res) ;
int curentStock = atoi(row[0]) ;
printf("该商品现有库存为:%5d件,购买数量为%5s件\n",curentStock,row[1]) ;
printf("请输入新的购买数量\n") ;
char purchaseQuantity[10] ;
while(gets(purchaseQuantity))
{
setbuf(stdin,NULL) ;
//验证数量否有效
int purchaseQuantity_int = atoi(purchaseQuantity) ;
if(purchaseQuantity_int < 0 || purchaseQuantity_int > curentStock)
{
printf("数量不对哦,请重新输入:\n") ;
}
else if(purchaseQuantity_int == 0)
{
char sql_delete[200] = "delete from shoppingcart where id = " ;
strcat(sql_delete,formId) ;
if(mysql_query(&mysql_conn,sql_delete) != 0)
{
printf(sql_delete) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
printf("已将该商品从购物车中删除\n按任意键返回") ;
getchar() ;
break ;
}
else
{
char sql_modify[200] = "update shoppingcart set purchasequantity = " ;
strcat(sql_modify,purchaseQuantity) ;
strcat(sql_modify," where id = ") ;
strcat(sql_modify,formId) ;
if(mysql_query(&mysql_conn,sql_modify) != 0)
{
printf(sql_modify) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
printf("修改成功\n按任意键返回") ;
getchar() ;
break ;
}
}
}
}
break ;
case '3':
{
printf("请输入要删除商品的编号:\n") ;
char formId[10] ;
gets(formId) ;
setbuf(stdin,NULL) ;
char sql_delete[200] = "delete from shoppingcart where id = " ;
strcat(sql_delete,formId) ;
if(mysql_query(&mysql_conn,sql_delete) != 0)
{
printf(sql_delete) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
if(mysql_affected_rows(&mysql_conn) != 0)
{
printf("已将该商品从购物车中删除\n按任意键返回") ;
getchar() ;
}
else
{
printf("编号不对啊,按任意键返回\n") ;
getchar() ;
}
}
break ;
case '4':
return ;
default:
printf("没有这个选项\n") ;
}
}
}
void printForm(MYSQL mysql_conn,char * id)
{
system("CLS") ;
setbuf(stdin,NULL) ;
printInCenter("已完成的订单") ;
printHR() ;
printf("订单号\t购买商品\t下单时间\t购买数量\t商品单价\t合计\n") ;
char sql[200] = "select ordernumber,name,ordertime,orderquantity,orderprice,orderprice*orderquantity from orderform ,item where number = itemnumber and userid = '" ;
strcat(sql,id) ;
strcat(sql,"'") ;
if(mysql_query(&mysql_conn,sql) != 0)
{
printf(sql) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
MYSQL_RES * res ;
res = mysql_store_result(&mysql_conn) ;
if(mysql_num_rows(res) == 0)
{
printInCenter("没有订单") ;
}
else
{
int row_num = mysql_num_rows(res) ;
MYSQL_ROW row ;
int i ;
for( i = 0 ; i < row_num ; i++)
{
row = mysql_fetch_row(res) ;
printf("%-6s\t%-8.8s\t%-8s\t%8s\t%8s\t%8.2f\n",row[0],row[1],row[2],row[3],row[4],atof(row[5])) ;
}
}
printHR() ;
printf("按任意键返回\n") ;
getchar() ;
}
void modifyEmail(MYSQL mysql_conn,char * id)
{
while(!system("CLS"))
{
setbuf(stdin,NULL) ;
char sql_x[200] = "select email from email where userid = '" ;
strcat(sql_x,id) ;
strcat(sql_x,"'") ;
printInCenter("邮箱管理") ;
printHR() ;
if(mysql_query(&mysql_conn,sql_x) != 0)
{
printf(sql_x) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
MYSQL_RES * res = mysql_store_result(&mysql_conn) ;
int row_num = mysql_num_rows(res) ;
MYSQL_ROW row ;
char ** emails ;
if(row_num == 0)
{
printInCenter("没有辅助邮箱\n") ;
}
else
{
int i ;
emails = (char*)malloc(sizeof(char*)) ;//存储数据,删除时只需要输入编号即可
for(i = 0 ; i < row_num ; i++)
{
emails[i] = (char*)malloc(200*sizeof(char)) ;
}
for(i = 0 ; i < row_num ; i++)
{
row = mysql_fetch_row(res) ;
printf("\t%d.\t",i+1) ;
printf("\t%s\n",row[0]) ;
strcpy(emails[i],row[0]) ;
}
}
printHR() ;
printLeftJustify("1.添加辅助邮箱\n2.删除辅助邮箱\n3.退出邮箱管理\n") ;
char choice ;
setbuf(stdin,NULL) ;
choice = getchar() ;
switch(choice)
{
case '1' :
{
printf("请输入新邮箱\n") ;
char newEmail[200] ;
setbuf(stdin,NULL) ;
gets(newEmail) ;
char sql_add[200] = "insert into email values('" ;
strcat(sql_add,id) ;
strcat(sql_add,"','") ;
strcat(sql_add,newEmail) ;
strcat(sql_add,"')") ;
if(mysql_query(&mysql_conn,sql_add) != 0)
{
printf("添加失败.该邮箱已经存在\n") ;
}
else
{
printf("添加成功\n") ;
}
printf("按任意键返回") ;
setbuf(stdin,NULL) ;
getchar() ;
}
break ;
case '2' :
{
if(row_num != 0)
{
printf("请输入要删除邮箱的编号\n") ;
int num ;
scanf("%d",&num) ;
if(num<1 || num > row_num+1)
{
printf("编号不存在啊\n按任意键返回") ;
setbuf(stdin,NULL) ;
getchar() ;
}
else
{
printf("确定要删除%s吗?(y/n)",emails[num-1]) ;
char options ;
setbuf(stdin,NULL) ;
options = getchar() ;
if(options == 'y' || options == 'Y')
{
char sql_delete[200] =" delete from email where email = '" ;
strcat(sql_delete,emails[num-1]) ;
strcat(sql_delete,"'") ;
if(mysql_query(&mysql_conn,sql_delete) != 0)
{
printf(sql_delete) ;
printf(mysql_error(&mysql_conn)) ;
getchar() ;
return ;
}
printf("删除成功\n按任意键返回") ;
}
else
{
printf("邮箱未删除\n按任意键返回\n") ;
}
setbuf(stdin,NULL) ;
getchar() ;
}
}
else
{
printf("没有辅助邮箱\n按任意键返回") ;
setbuf(stdin,NULL) ;
getchar() ;
}
}
break ;
case '3' :
{
//释放内存
int i ;
for(i = 0 ; i < row_num ; i++)
{
free(emails[i]) ;
}
free(emails) ;
}
return ;
default :
printf("无效的选项,按任意键返回\n") ;
getchar() ;
}
}
}
int printInCenter(char * str)
{
int len = strlen(str) ;
int whiteNum = (80-len)/16 ;
int i ;
for(i = 0 ; i < whiteNum ; i++)
{
printf("\t") ;
}
printf("%s\n",str) ;
return true ;
}
int printLeftJustify(char* str)
{
int i = 0 ;
while(str[i] != '\0')
{
printf("\t\t\t") ;
while(str[i] != '\n' && str[i] != '\0')
{
putchar(str[i]) ;
i++ ;
}
putchar('\n') ;
putchar('\n') ;
i++ ;
}
return true ;
}
int printHR()
{
int i ;
for(i = 0 ; i < 40 ; i++)
{
putchar('-') ;
putchar(' ') ;
}
return true ;
}
void getDate(char * xxDate)
{
time_t t ;
struct tm * p ;
time(&t) ;//初始化
p = gmtime(&t) ;
int year = p->tm_year+1900 ;
int mon = p->tm_mon+1 ;
int day = p->tm_mday ;
int i = 0 ;
for(i = 0 ; i < 9 ; i++)
{
xxDate[i] = '\0' ;
}
char tmp[10] ;
itoa(year,tmp,10) ;
strcpy(xxDate,tmp) ;
if(mon <= 9)
{
strcat(xxDate,"0") ;
}
itoa(mon,tmp,10) ;
strcat(xxDate,tmp) ;
if(day<= 9)
{
strcat(xxDate,"0") ;
}
itoa(day,tmp,10) ;
strcat(xxDate,tmp) ;
}
void encrypt(char * password)
{
int len = strlen(password) ;
int i ;
for(i = 0 ; i < len ; i++)
{
password[i] = ~password[i] ;//按位取非 ~
}
}
#endif // SHOPPINGCART_H_INCLUDED