电子词典服务器
创始人
2024-03-16 10:07:27
0

func.c

#include "./func.h"//printf("%s  %d\n",__FILE__,__LINE__);//查找错误int deal_cli_msg(void* meg, sqlite3* db,int cfd)
{   if(0 == strcmp(((struct cli*)meg)->c.str,"reg")){//查找用户是否已经被注册or_reg(meg, db, cfd);}else if(0 == strcmp(((struct cli*)meg)->c.str,"loin")){//查找用户是否已经登录or_loin(meg, db, cfd);}else if(0 == strcmp(((struct cli*)meg)->c.str,"quit")){printf("将数据库中用户状态改为下线\n");do_update(((struct cli*)meg)->db, "0", "user", ((struct cli*)meg)->c.a.user);}else if(0 == strcmp(((struct cli*)meg)->c.str,"danci")){//单词查询danc(meg, db,cfd);}else if(0 == strcmp(((struct cli*)meg)->c.str,"gotoprint1")){printf("选择了返回一级菜单的功能\n");do_update(((struct cli*)meg)->db, "0", "user", ((struct cli*)meg)->c.a.user);}else if(0 == strcmp(((struct cli*)meg)->c.str,"recordlook")){printf("选择了查询用户历史记录的功能\n");recordlook(meg, db, cfd, "record");}}//注册和登录
int reguser(void* meg, sqlite3* db, int cfd, char* str)
{ssize_t res_rec;int num = 0;//接收用户名res_rec = msg_rec(cfd,meg);if(-1 == res_rec){return -1;}strcpy(((struct cli*)meg)->c.a.user,((struct cli*)meg)->massage);//接收密码res_rec = msg_rec(cfd,meg);if(-1 == res_rec){return -1;}strcpy(((struct cli*)meg)->c.a.passd,((struct cli*)meg)->massage);num = sql_reg(meg, db, str);return num;
}//获取时间函数
int time_fun(void* meg)
{time_t tim;time(&tim);struct tm* p = localtime(&tim);sprintf(((struct cli*)meg)->d.time,"%4d/%02d/%02d\t%02d:%02d",p->tm_year+1900,p->tm_mon+1, p->tm_mday, p->tm_hour, p->tm_min);return 0;
}//客户端退出后释放资源相关操作
int rel_sour(void* meg)
{do_update(((struct cli*)meg)->db, "0", "user", ((struct cli*)meg)->c.a.user);free((*(struct cli*)meg).massage);//free((*(struct cli*)meg).c.a.user);free((*(struct cli*)meg).c.a.passd);free((*(struct cli*)meg).c.a.online);free((*(struct cli*)meg).c.str);
}//查找用户是否已经被注册
int or_reg(void* meg, sqlite3* db,int cfd)
{int num = 0;char buf[40] = "";printf("数据库中查找用户是否已经被注册\n");num = reguser(meg, db, cfd, "user");if( num == 0){strcpy(buf, "user is exit!");msg_send(cfd, (void*)buf);}else if(num < 0){if(0 == do_insert(db, "user", meg))strcpy(buf, "user reg success!");msg_send(cfd,(void*)buf);}
}//查找用户是否已经登录
int or_loin(void* meg, sqlite3* db,int cfd)
{int num = 0;char buf[40] = "";printf("数据库中查找用户状态是否已被登录\n");num = reguser(meg, db, cfd, "loin");if( -2 == num){strcpy(buf, "user is loin!");msg_send(cfd, (void*)buf);}else if(-3 == num){strcpy(buf, "user or passd error!");msg_send(cfd, (void*)buf);}else if(0 == num){printf("%d\n",((struct cli*)meg)->flag);do_update(db, "1", "user", ((struct cli*)meg)->c.a.user);strcpy(buf, "user loin success!");msg_send(cfd,(void*)buf);printf("%s登录成功\n", ((struct cli*)meg)->c.a.user);}
}//单词查询
int danc(void* meg, sqlite3* db,int cfd)
{printf("选择了查询单词功能\n");msg_rec(cfd, meg);((struct cli*)meg)->d.b.eng = (char*)malloc(60);((struct cli*)meg)->d.b.chinese = (char*)malloc(60);((struct cli*)meg)->d.time = (char*)malloc(60);strcpy(((struct cli*)meg)->d.b.eng,((struct cli*)meg)->massage);dancilook(meg, db, cfd, "danci");printf("单词查询完毕\n");free(((struct cli*)meg)->d.b.eng);free(((struct cli*)meg)->d.b.chinese);free(((struct cli*)meg)->d.time);
}

ser_main.c

#include 
#include "./sql.h"
#include "./tcp_ser.h"//printf("%s  %d\n",__FILE__,__LINE__);//查找错误int main(int argc, const char *argv[])
{//1.数据库初始化sqlite3* db = (sqlite3*)sql_init();printf("数据库初始化完毕\n");//2.服务器初始化int sfd = ser_init(); printf("服务器初始化完毕\n");//2.等待客户端连接deal_connect(sfd, db);return 0;
}

sql.c

#include "./sql.h"//printf("%s  %d\n",__FILE__,__LINE__);//查找错误//初始化
void* do_open()
{sqlite3* db = NULL;char str[20] = "";//创建并打开数据库strcpy(str,"./my.db");//需要打开的数据库;if(sqlite3_open(str, &db) != SQLITE_OK){fprintf(stderr, "sqlite3_open:%s\t%d", sqlite3_errmsg(db), __LINE__);return NULL;}printf("database open success!\n");return (void*)db;
}//创建表
int do_create(sqlite3* db,char* str)
{char* sql = (char*)malloc(80);*sql = 0;char* errmsg = NULL;if(0 == strcmp(str,"user")){sprintf(sql,"create table if not exists %s (user char primary key, passd char, stat char);", str);//创建用户表}else if(0 == strcmp(str,"danci")){sprintf(sql,"create table if not exists %s (eng char, chinese char);",str);//创建单词表}else if(0 == strcmp(str,"record")){sprintf(sql,"create table if not exists %s (user char, eng char, chinese char, time char);",str);//创建历史记录表}//printf("%s",sql);if(sqlite3_exec(db, sql, NULL, NULL, &errmsg)){fprintf(stderr, "sqlite3_exec:%s\t%d\n", errmsg, __LINE__);puts(sql);return -1;}printf("create %s table success!\n", str);free(sql);return 0;
}//增
int do_insert(sqlite3* db, char* str, void* p)
{//插入表char* sql = (char*)malloc(200);char* errmsg = NULL;if(0 == strcmp(str,"user")){sprintf(sql,"insert into %s ('user', 'passd', 'stat') values (\"%s\", \"%s\", '0');", str, ((struct cli*)p)->c.a.user, ((struct cli*)p)->c.a.passd);}else if(0 == strcmp(str,"danci")){sprintf(sql,"insert into %s ('eng', 'chinese') values (\"%s\", \"%s\");", str, ((struct danciinfo*)p)->eng, ((struct danciinfo*)p)->chinese);}else if(0 == strcmp(str,"record")){sprintf(sql,"insert into %s ('user', 'eng', 'chinese', 'time') values (\"%s\", \"%s\", \"%s\", \"%s\");",str, ((struct cli*)p)->c.a.user, ((struct cli*)p)->d.b.eng, ((struct cli*)p)->d.b.chinese, ((struct cli*)p)->d.time);}//printf("%s\n",sql);if(sqlite3_exec(db, sql, NULL, NULL, &errmsg)){fprintf(stderr, "sqlite3_exec:%s\t%d\n", errmsg, __LINE__);fprintf(stderr,"%s\n",sql);return -1;}free(sql);return 0;
}//删
int do_delete(sqlite3* db, char* str, void* p)
{char* sql = (char*)malloc(60);sprintf(sql,"delete from %s where eng='%s';", str, ((struct danciinfo*)p)->eng);//printf("%s\n",sql);char* errmsg = NULL;if(sqlite3_exec(db, sql, NULL, NULL, &errmsg)){fprintf(stderr, "sqlite3_exec:%s\t%d", errmsg, __LINE__);return -1;}//printf("create table success!\n");free(sql);return 0;
}//查询函数调用
int handler(void *arg, int column, char** column_text, char** column_name) 	//void* arg = &flag
{//列数//printf("column=%d __%d__\n", column, __LINE__);//column_namechar online[1] = "0";char buf[40] = "";char* re = (char*)malloc(128);bzero(re,128);strcpy(((struct cli*)arg)->c.a.online,online);int i = 0;if(0 == (((struct cli*)arg)->flag)){for(i=0; iprintf("%s\t", column_name[i]);}printf("\n");(((struct cli*)arg)->flag) = 1;}//column_textfor(i=0; i//printf("i = %d  :%s\t", i, column_text[i]);if(0 == strcmp(((struct cli*)arg)->c.a.online, column_text[i])){((struct cli*)arg)->num = 0;}if(0 == strcmp(((struct cli*)arg)->buf,"danci")){((struct cli*)arg)->num++;msg_send(((struct cli*)arg)->cfd,column_text[i]);strcpy(((struct cli*)arg)->d.b.chinese ,column_text[i]);//printf("%s  %d\n",__FILE__,__LINE__);time_fun(arg);do_insert(((struct cli*)arg)->db, "record", arg);}if(0 == strcmp(((struct cli*)arg)->buf,"record")){((struct cli*)arg)->num++;sprintf(re,"%s %s ", re, column_text[i]);}}if(0 == strcmp(((struct cli*)arg)->buf,"record")){sprintf(re,"%s\n",re);msg_send(((struct cli*)arg)->cfd,re);printf("%s",re);}free(re);return 0;
}//查
int do_select(sqlite3* db, char* p, char* str, void* meg)
{char sql[128] = "";char* errmsg = NULL;((struct cli*)meg)->flag = 0;((struct cli*)meg)->num = 1;if(0 == strcmp(str,"user"))sprintf(sql,"select \"%s\" from \"%s\" where user=\"%s\";", "user", str, p);else if (0 == strcmp(str,"loin")){sprintf(sql,"select \"%s\" from \"%s\" where user=\"%s\" and passd = \"%s\";", "stat", "user", p, ((struct cli*)meg)->c.a.passd);}else if(0 == strcmp(str,"danci")){sprintf(sql,"select \"%s\" from \"%s\" where eng=\"%s\";", "chinese", "danci", ((struct cli*)meg)->d.b.eng);strcpy(((struct cli*)meg)->buf, "danci");puts(sql);}else if(0 == strcmp(str,"record")){sprintf(sql,"select * from \"%s\" where user=\"%s\";", "record", ((struct cli*)meg)->c.a.user);strcpy(((struct cli*)meg)->buf, "record");puts(sql);}//puts(sql);if(sqlite3_exec(db, sql, handler, meg, &errmsg) != SQLITE_OK){fprintf(stderr, "line:%d sqlite3_exec:%s\n", __LINE__, errmsg);return -1;}printf("查询完毕\n");return 0;
}//改
int do_update(sqlite3* db, char* p, char* str, char* username)
{char sql[128] = "";char* errmsg = NULL;sprintf(sql,"update \"%s\" set stat=\"%s\" where user=\"%s\";", str, p, username);if(sqlite3_exec(db, sql, NULL, NULL, &errmsg)){fprintf(stderr, "sqlite3_exec:%s\t%d", errmsg, __LINE__);return -1;}puts(sql);}//关闭
int do_close(sqlite3* db)
{//关闭数据库if(sqlite3_close(db) != SQLITE_OK){fprintf(stderr, "sqlite3_close:%s\t%d", sqlite3_errmsg(db), __LINE__);return -1;}}//将单词插入到数据库中
int danci_insert(sqlite3* db)
{FILE* fp = fopen("./1.txt","r");if(NULL == fp){perror("fopen");return -1;}char str[100];char* p;struct danciinfo danci;danci.chinese = (char*)malloc(50);danci.eng = (char*)malloc(50);while(1){bzero(str,sizeof(str));bzero(danci.chinese,50);bzero(danci.eng,50);p=str;if(NULL == fgets(str,sizeof(str),fp)){break;}str[strlen(str)-1] = 0;while(((*p) != ' ') || (*(p+1) != ' '))p++;*p = 0;p = p+3;strcpy(danci.eng,str);strcpy(danci.chinese,p);do_insert(db, "danci", (void*)&danci);//puts(str);//puts(p);}printf("单词导入成功!!!!\n");free(danci.chinese);free(danci.eng);
}
//初始化数据库
void* sql_init()
{sqlite3* db = (sqlite3*)do_open();   //打开一个数据库//do_create(db,"user");      //创建一个用户信息表//do_create(db,"danci");     //创建一个单词表//do_create(db,"record");    //创建一个历史记录表//将单词插入到数据库中//danci_insert(db);return (void*)db;
}//数据库中查找用户是否已经被注册  是否已经登录
int sql_reg(void* meg, sqlite3* db, char* str)
{char p[40] = "";if((0 == strcmp(str, "user"))||(0 == strcmp(str,"loin")))strcpy(p,((struct cli*)meg)->c.a.user);int num = do_select(db, p, str, meg);printf("数据库查找操作\n");if(0 == ((struct cli*)meg)->flag){if(((struct cli*)meg)->num)return -3;else	return -3;}else if(((struct cli*)meg)->flag > 0){if(((struct cli*)meg)->num){if(0 == strcmp(str, "user"))return 0;elsereturn -2;}elsereturn 0;	}
}//单词查询
int dancilook(void* meg, sqlite3* db, int cfd, char* p)
{do_select(db, "chinese", "danci", meg);//printf("%s  %d\n",__FILE__,__LINE__);if(((struct cli*)meg)->num > 1)msg_send(cfd,"123456");else if(1 == ((struct cli*)meg)->num)msg_send(cfd,"123456789");
}//历史记录
int recordlook(void* meg, sqlite3* db, int cfd, char* p)
{do_select(db, "*", "record", meg);if(((struct cli*)meg)->num > 1)msg_send(cfd,"123456");else if(1 == ((struct cli*)meg)->num)msg_send(cfd,"123456789");
}

tcp_ser.c

#include "./tcp_ser.h"//printf("%s  %d\n",__FILE__,__LINE__);//查找错误//线程执行体
void* callback(void* p)
{//线程分离pthread_detach(pthread_self());struct cli meg1 = *(struct cli*)p;void* meg = (void*)&meg1;//资源申请sou_ask(meg);int cfd = ((struct cli*)meg)->cfd;//信息处理xin(meg, cfd);//do_update(((struct cli*)meg)->db, "0", "user", ((struct cli*)meg)->c.a.user);printf("cfd = %d  退出了\n", cfd);close(cfd);printf("vfd = %d关闭成功\n",cfd);rel_sour(meg);printf("资源释放成功\n");pthread_exit(NULL);}int ser_init()
{int sfd;struct sockaddr_in server_addr;//1.创建流式套接字sfd = socket(AF_INET, SOCK_STREAM, 0);if (sfd < 0){ERROR("socket");return -1;}memset(&server_addr, 0, sizeof(struct sockaddr_in));//填充地址信息结构体server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);   //端口的网络字节序server_addr.sin_addr.s_addr = inet_addr(IP);  //IP的网络字节序//允许端口快速被重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse ,sizeof(reuse)) < 0){ERROR("setsockopt");return -1;}//2.将地址信息绑定到套接字上if (bind(sfd, (struct sockaddr *) &server_addr,sizeof(struct sockaddr_in)) < 0){ERROR("bind");return -1;}//3.将sfd设置为被动监听状态if (listen(sfd, 128) < 0){ERROR("listen");return -1;}printf("服务器正在监听....\n");return sfd;
}int deal_connect(int sfd, sqlite3* db)
{struct sockaddr_in server_addr,client_addr;socklen_t client_addr_size;int cfd;struct cli info;pthread_t tid;//创建线程用收发信息client_addr_size = sizeof(struct sockaddr_in);while(1){//4.从队列头获取一个客户的信息cfd = accept(sfd, (struct sockaddr *) &client_addr,&client_addr_size);if (cfd < 0){ERROR("accept");return -1;}printf("[%s:%d] cfd = %d 连接成功\n", \inet_ntoa(client_addr.sin_addr), \ntohs(client_addr.sin_port), cfd);//创建线程用于接待客户端info.cfd = cfd;info.client_addr = client_addr;info.db = db;if(pthread_create(&tid, NULL, callback,(void*)&info) < 0){ERROR("pthread_create");return -1;}}	
}int msg_send(int cfd,void* meg)
{char buf[MAX] = "";ssize_t res = 0;bzero(buf, sizeof(buf));strcpy(buf, (char*)meg);//6.发送来自客户端信息if((res = send(cfd, buf, sizeof(buf), 0)) < 0){ERROR("send");}return res;
}int msg_rec(int cfd,void* meg)
{struct sockaddr_in client_addr = ((struct cli*)meg)->client_addr;ssize_t res = 0;char buf[MAX] = "";//5.接收来自客户端信息res = recv(cfd,buf, sizeof(buf), 0);if(res < 0){ERROR("recv");return -1;}if(0 == res){do_update(((struct cli*)meg)->db, "0", "user", ((struct cli*)meg)->c.a.user);printf("客户端已关闭\n");return -1;}strcpy(((struct cli*)meg)->massage,buf);printf("[%s:%d]res = %ld  :%s\n",inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), res, (((struct cli*)meg)->massage));return res;
}//信息处理
int xin(void* meg, int cfd)
{ssize_t res_rec,res_send;while(1){//接收来自客户端的信息res_rec = msg_rec(cfd,meg);if(-1 == res_rec){break;}strcpy(((struct cli*)meg)->c.str,((struct cli*)meg)->massage);//处理来自客户端的信息deal_cli_msg(meg, ((struct cli*)meg)->db,cfd);}
}//资源申请
int sou_ask(void* meg)
{(*(struct cli*)meg).massage = (char*)malloc(40);(*(struct cli*)meg).c.a.user = (char*)malloc(40);(*(struct cli*)meg).c.a.passd = (char*)malloc(40);(*(struct cli*)meg).c.a.online = (char*)malloc(40);(*(struct cli*)meg).c.str = (char*)malloc(40);
}

Makefile

all:ser
ser: func.o ser_main.o sql.o tcp_ser.ogcc $^ -o ser -lsqlite3 -lpthread
%.o:%.cgcc -c $< -o $@
clean:rm *.o 

func.h

#ifndef __FUN_H__
#define __FUN_H__#include 
#include "./sql.h"
#include "./tcp_ser.h"
#include //处理消息
int deal_cli_msg(void* meg, sqlite3* db, int cfd);
//用户注册
int reguser(void* meg, sqlite3* db,int cfd, char* str);
//获取时间函数
int time_fun(void* meg);
//客户端退出后释放资源相关操作
int rel_sour(void* meg);
//查找用户是否已经被注册
int or_reg(void* meg, sqlite3* db,int cfd);
//查找用户是否已经登录
int or_loin(void* meg, sqlite3* db,int cfd);
//单词查询
int danc(void* meg, sqlite3* db,int cfd);#endif

sql.h

#ifndef __SQL_H__
#define __SQL_H__#include 
#include 
#include 
#include 
#include 
#include 
#include "./tcp_ser.h"struct userinfo
{char* user;char* passd;char* online;
};struct danciinfo
{char* eng;char* chinese;
};struct recordinfo
{char* user;struct danciinfo b;char* time;
};struct msga
{struct  userinfo a;char* str;
};struct cli
{int cfd;struct sockaddr_in client_addr;char *massage;sqlite3* db;struct msga c;int flag;struct recordinfo d;int num;char buf[4];
};//初始化数据库
void* sql_init(void);
//打开某一个数据库
void* do_open(void);
//创建表
int do_create(sqlite3* db, char* str);
//增
int do_insert(sqlite3* db, char* str, void* p);
//删
int do_delete(sqlite3* db, char* str,void* p);
//查
int do_select(sqlite3* db, char* p, char* str, void* meg);
//改
int do_update(sqlite3* db, char* p, char* str, char* username);
//关闭
int do_close(sqlite3* db);
//将单词插入到数据库中
int danci_insert(sqlite3* db);
//数据库中查找用户是否已经被注册
int sql_reg(void* meg, sqlite3* db, char* str);
//数据库中查找用户状态是否已被登录
int sql_loin(char* p, sqlite3* db);
//将数据库中用户状态改为下线
int sql_quit(char* p, sqlite3* db);
//单词查询
int dancilook(void* meg, sqlite3* db, int cfd, char* p);
//历史记录查询
int recordlook(void* meg, sqlite3* db, int cfd, char* p);#endif

tcp_ser.h

#ifndef __TCP_SER_H__
#define __TCP_SER_H__
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "./func.h"
#include "./sql.h"#define IP "192.168.8.101"    //服务器 IP
#define PORT 8888            //端口号
#define MAX 128#define ERROR(msg) do{\fprintf(stderr, "%s:__%d__", __FILE__,  __LINE__);\perror(msg);\
}while(0)//线程执行体
void* callback(void* meg);
//服务端初始化
int ser_init();
//等待客户端连接
int deal_connect(int sfd, sqlite3* db);
//发送信息
int msg_send(int cfd, void* meg);
//接收信息
int msg_rec(int cfd, void* meg);
//处理客户端发送的信息
int deal_msg(void* meg);
//信息处理
int xin(void* meg, int cfd);
//资源申请
int sou_ask(void* meg);#endif

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...